Multilarm.config.xml to edit, or configure from scratch and save.
Use the ▼ Sections buttons below to expand/collapse. Every tag is always written to the output XML.
Connect to a running Multilarm instance on your network to load its current settings into this editor, make changes, then save them back. Multilarm applies changes immediately.
<DateIdentifier>MM<DateDelimiter>DD rather than <DateIdentifier>DD<DateDelimiter>MM.
False (default, UK/EU style): DD-MM e.g. *1-1 = 1st January
True (American style): MM-DD e.g. *1-1 = January 1st*"*"
Indicates the character(s) marking the beginning of the date field in DateAndTimeData (9). Every date entry must begin with this marker.
This is not evaluated / not necessary if RecurEveryDay (1) is set to True.
Example: With * as DateIdentifier and data *1-1|6:26|8:20, the * marks the start of the entry for 1st January.-"-"
Indicates the character(s) marking the split between the day and month value in the date field in DateAndTimeData (9).
This is only evaluated if the DateAndTimeData (9) is considered for the whole year, i.e. RecurEveryMonth (3), RecurEveryWeek (2) and RecurEveryDay (1) are all set as False.
Example: In *1-1|6:26, the - splits day 1 from month 1 (January 1st).|"|"
Indicates the character(s) marking the split between the date field and time data, and also between individual time fields in DateAndTimeData (9).
Example: In *1-1|6:26|8:20|12:11, the | separates the date 1-1 from the first alarm time, and also separates each alarm time from the next.
Note: It is advised not to use line feed as a delimiter as this is parsed differently across Windows and Linux.Adds the time to the matching date entry if it exists, or creates a new entry. Reads MonthFirst (4), DateIdentifier (5), DateDelimiter (6) and TimeDelimiter (7) live.
<DateIdentifier><DD><DateDelimiter><MM><TimeDelimiter><HH:MM>...
Example: *1-1|6:26|8:20|12:11 = 1st January, alarms at 06:26, 08:20, 12:11
The default data is UK Sheffield prayer times for the year.
RecurEveryMonth:
<DateIdentifier><D><TimeDelimiter><HH:MM>...
Date field is a day number only (1–31). DateDelimiter not used.
Example: *1|6:26|8:20 = day 1, recycled every month.
RecurEveryWeek:
<DateIdentifier><day><TimeDelimiter><HH:MM>...
Date field is mon/tue/wed/thu/fri/sat/sun (case-insensitive, 3-letter or full name).
Example: *mon|6:26|8:20 = Monday, recycled every week.
RecurEveryDay:
<HH:MM><TimeDelimiter><HH:MM>...
No date field at all. All entries are times for a single day, recycled daily.
Example: 6:26|8:20|12:11
Priority if multiple Recur flags enabled:
RecurEveryMonth > RecurEveryWeek > RecurEveryDay
Duplicate detection (panel below the text box):
A red banner means a date identifier appears more than once in the data.
Tips:
• Use Microsoft Word Find/Replace to clean timetable data before pasting (use ^p for line feed in Find/Replace).
• For February in full-year mode, use 29 days to cover leap years.
• Ensure daylight savings adjustments are applied after March or October ends.
| as delimiter)
Uses DateIdentifier (5) as the marker before the start of each date / month / day-of-week entry, DateDelimiter (6) as the divider between the day and month parts of the date field, and TimeDelimiter (7) as the delimiter between the date field and the times, and between the individual time fields themselves.
Example (default, Full Year mode): *1-1|6:26|8:20|12:11|1:44|4:00|5:48
Here * is the DateIdentifier, 1-1 is the date field (1st January), - is the DateDelimiter, and | is the TimeDelimiter separating the date from each alarm time and each alarm time from the next.
Time order and 12/24-hour parsing:
Times should be listed in ascending order. Either 12-hour or 24-hour clock notation is accepted. Any time whose hour value is less than that of the preceding time is automatically parsed as PM � for example, if 1:44 follows 12:11, it is treated as 13:44 in 24-hour terms. Time after midnight should be written as 00:<mm> rather than 12:<mm>.
Default value: UK Sheffield prayer times for the full year.
*1-1|6:26|8:20|12:11|1:44|4:00|5:48*2-1|6:26|8:20|12:11|1:45|4:01|5:49*�
Format depends on active Recur mode:
Full Year (RecurEveryMonth (3), RecurEveryWeek (2) and RecurEveryDay (1) all False):
<DateIdentifier><DD><DateDelimiter><MM><TimeDelimiter><HH:MM>�
Date field contains day and month separated by DateDelimiter. MonthFirst (4) controls whether day or month comes first.
Example: *1-1|6:26|8:20|12:11 = 1st January, alarms at 06:26, 08:20, 12:11
RecurEveryMonth (3):
<DateIdentifier><D><TimeDelimiter><HH:MM>�
Date field is a day-of-month number only (1�31). DateDelimiter is not used. The same data is recycled every month.
Example: *1|6:26|8:20 = day 1, recycled every month.
RecurEveryWeek (2):
<DateIdentifier><day><TimeDelimiter><HH:MM>�
Date field is the day of the week: mon, tue, wed, thu, fri, sat, sun (case-insensitive; 3-letter abbreviation or full name both accepted). The same data is recycled every week.
Example: *mon|6:26|8:20 = Monday, recycled every week.
RecurEveryDay (1):
<HH:MM><TimeDelimiter><HH:MM>�
No date field at all. The entire contents of DateAndTimeData are treated as a flat list of alarm times for a single day, recycled every day.
Example: 6:26|8:20|12:11
Priority if multiple Recur flags are enabled:
RecurEveryMonth (3) > RecurEveryWeek (2) > RecurEveryDay (1)
Tips:
� Use the Quick Entry Builder tab to compose individual date entries with picked times, then insert them into the data.
� Use the Calendar Quick Add tab to append a single time to an existing date entry, or create a new one, by selecting month and day from dropdowns.
� Use the Sort All button to re-order all entries into chronological sequence after editing.
� Use the Adjust all times control to shift every alarm time forward or backward by a fixed number of minutes in one operation.
� Use Microsoft Word Find/Replace to clean timetable data before pasting (use ^p for line feed in Find/Replace).
� For February in Full Year mode, include a 29th day entry to cover leap years.
� Ensure UK daylight savings adjustments are applied after March or October ends when UKDaylightSavings (8) is active.
� The duplicate date detector (panel directly below the text box) highlights in red any date identifier that appears more than once in the data.53.3833, Lng -1.4667.
2. Set the year you want to generate times for.
3. Choose your calculation Method, Asr madhab and High Latitude Rule.
4. Press Generate Calendar.
5. Press ✓ Insert → Replace Field 9 to replace DateAndTimeData entirely, or + Append to Field 9 to add the new data after any existing data.
Calculation Methods:
• MWL — Muslim World League (Fajr 18°, Isha 17°). Widely used in Europe, Far East, parts of USA.
• ISNA — Islamic Society of North America (Fajr 15°, Isha 15°). Used in North America.
• Egypt — Egyptian General Authority (Fajr 19.5°, Isha 17.5°). Used in Africa, Syria, Lebanon, Malaysia.
• Makkah — Umm Al-Qura University, Makkah (Fajr 18.5°, Isha fixed 90 min after Maghrib). Used in Arabian Peninsula.
• Karachi — University of Islamic Sciences, Karachi (Fajr 18°, Isha 18°). Used in Pakistan, Afghanistan, Bangladesh, India.
Asr Madhab:
• Shafi (Standard) — Shadow length = object height + noon shadow.
• Hanafi — Shadow length = 2× object height + noon shadow. Gives a later Asr time.
High Latitude Rule (important for UK and similar latitudes):
• Middle of Night — Fajr/Isha split the night half-half. Recommended for latitudes below 48°N.
• 1/7 of Night — Fajr/Isha each take 1/7 of night. Recommended for UK (latitude > 48°N).
• Twilight Angle — Uses the method's own angles directly; can fail at extreme latitudes.
Output format:
The generated data uses the same format as the default DateAndTimeData: *D-M|HH:MM|HH:MM|… with six prayer times per day (Fajr, Sunrise, Dhuhr, Asr, Maghrib, Isha). This matches the default delimiters (* DateIdentifier, - DateDelimiter, | TimeDelimiter).
Tip: For UK locations, MWL method + Hanafi Asr + 1/7 of Night high-latitude rule is a common combination. After inserting into Field 9, use the Sort All button in the Quick Entry Builder tab to re-order entries if needed.2+10 or 3-5, joined with |.| as delimiter)
Default: 1-5|1|2|2+10|3-10|3|4|5-7|5|6
This string effectively and dynamically modifies DateAndTimeData (9) for a particular day and renders a new set of time data for that day.
The first part of each token is a 1-based index of the time fields for a particular day. The second part adds (+) or subtracts (-) the following number of minutes from that indexed time.
Example: With times 6:26|8:20|12:11|1:44|4:00|5:48 for a day and default FormatInEffect 1-5|1|2|2+10|3-10|3|4|5-7|5|6:
• 1-5 → time slot 1 minus 5 min = 6:26 - 5 = 6:21
• 1 → time slot 1 as-is = 6:26
• 2 → time slot 2 as-is = 8:20
• 2+10 → time slot 2 plus 10 min = 8:20 + 10 = 8:30
• 3-10 → time slot 3 minus 10 min = 12:11 - 10 = 12:01
• …and so on.
The resulting effective time string is then sorted in ascending order before being used for alarm scheduling.
Per-day scope lines (optional): The raw value may contain multiple newline-separated lines, each optionally prefixed with *scope|. The most-specific scope that matches the current day wins; an unscoped line is the default fallback. Scope grammar mirrors DateAndTimeData:
• *tu| or *tuesday| — every Tuesday (weekday)
• *15| — 15th of every month (day of month)
• *15-10| — 15 October (specific date; honours MonthFirst)
• *mo,we,fr| — comma list of weekdays
Example:
1-5|1|2|2+10|3-10|3|4|5-7|5|6
*tu|1-5|1|2|2+10|3-10|3|4|5-7|5|6|7
— Tuesday gets an extra 7th output slot; every other day uses the 10-slot default.
The visual editor above edits the default line only and preserves any per-day lines in the raw value.N, N+M, N-M (1-based slot, optional minute offset).
Filters: slot=, t=HH:MM[-HH:MM], w=, nw=, m=, d=, ld. Prefix with ! to negate.
Example: payload 5+10 with filters slot=5 and w=fr → on Fridays push the 5th output slot 10 minutes later.
5+10
<payload>;<filter>,<filter>…<payload>;<filter>,<filter>…
• payload — same grammar as one FormatInEffect slot token: N, N-M, N+M (1-based source slot, optional minute offset)
• filters — all must match (AND), rules are evaluated top-to-bottom (first match wins)
Filter vocabulary:
• slot=N / slot=N-M — restrict to output slot (1-based, or range)
• t=HH:MM / t=HH:MM-HH:MM — restrict by the source slot's time-of-day
• w=mo-fr / w=mo,we — weekday list or range
• nw=2mo / nw=lastfr — nth weekday of the month
• m=1,3,12 — month list
• d=1-7,15 — day-of-month list
• ld — last day of month
• Prefix a filter with ! to negate
Example:
3+15;slot=3,w=fr
— Friday only, push the 3rd output slot 15 minutes later.{app}=App install dir, {home}=User profile, {docs}=Documents, {data}=App config, {local}=Local data, {temp}=System temp{app} for cross-platform paths. Paths are saved |-delimited. Index in AlarmIndexData (14) refers to position here (1-based).| as delimiter)
Default: {app}\Adhan|{app}\Bleep
Indicates the path to folders containing alarm audio files. Any number of folders can be listed, delimited with |.
The file at AmbienceFile (31) and any zero-length files are excluded from playing as alarm audio. Only files with formats listed in AlarmFileFormat (13) will be included for playing.
Important: Only the top-level directories listed here are searched — subfolders are not included automatically. Add subfolders as separate entries in this list.
Playing several files per alarm. Each entry may also be a single file, a filename pattern, or a chain — see the Audio sequences section (fields 74–75) for the full grammar. In short: add >all to play every file in the folder, >seq to step through one per day, >shuffle*2 for two random ones, and join sources with a spaced +:
{app}\Adhan\Bleep\ding.mp3 + {app}\Adhan
A plain folder path (no >, no +) keeps picking one file at random exactly as before.
Tip: Use folder tags like {app}, {home}, {docs} etc. which are replaced at runtime with the appropriate system path for your platform. See the tag reference table in Tips and Tricks.
Index reference: AlarmIndexData (14) uses 1-based indices into this list to determine which folder is used for each alarm time slot.mp*). Saved with ; delimiter.;)
Default: mp3
Specifies the audio file formats for the alarm audio library. Only files with formats listed here will be included for playing.
Supported formats: MPEG (MP3, MP1, MP2), OGG, WAV, AIFF, FLAC.
To combine more than one format, join them with ; (e.g. wav;mp3).
Wildcards (*) are allowed both in filename and extension:
• *abc.mp* matches filenames ending with "abc" and extensions starting with "mp" (mp2, mp3, etc.)
• mp* matches any extension starting with "mp"
Note: Only the top directory/directories mentioned in AlarmPath (12) are searched — subfolders are not included (add them separately in AlarmPath).| between slots, , within a group)
Default: 2|1|2|2|2|1|1|2|1|1
For a corresponding DateAndTimeData (9) entry for the current day, a random file from the folder specified by the index (1-based) from AlarmPath (12) is played.
Example: Consider 6:26|8:20|12:11|1:44|4:00|5:48 as the times for the day, and default AlarmPath of Adhan|Bleep with default AlarmIndexData 2|1|2|2|2|1|1|2|1|1:
• At 6:26 → index 2 → random file from Bleep folder
• At 8:20 → index 1 → random file from Adhan folder
• At 12:11 → index 2 → random file from Bleep folder
…and so on.
Each column in the editor represents one alarm time slot in order.
Per-day scope lines (optional): The raw value may contain multiple newline-separated lines, each optionally prefixed with *scope| (scope grammar mirrors DateAndTimeData: *tu|, *15|, *15-10|, *mo,we,fr|). The most-specific matching scope wins; an unscoped line is the default fallback. The visual editor above edits the default line only and preserves per-day lines in the raw value.SLOT:FOLDERINDEX pairs joined by |.
Filters: slot=, t=HH:MM[-HH:MM], w=, nw=, m=, d=, ld. Prefix with ! to negate.
Example: payload 1:1|2:1|3:2 with filter w=fr → on Fridays slot 1&2 use folder 1, slot 3 uses folder 2.
SLOT:FOLDERINDEX; multiple joined with |)SLOT:FOLDERINDEX[|SLOT:FOLDERINDEX...][;filter,filter…]SLOT:FOLDERINDEX[|SLOT:FOLDERINDEX...][;<filter>,<filter>…]
• SLOT — 1-based output slot number
• FOLDERINDEX — 1-based AlarmPath folder index
• filters — same grammar as TextDataRules / OffsetRules; all must match (AND); rules are evaluated top-to-bottom (first match per slot wins)
Examples:
1:1|2:1|3:2;w=fr
4:2;m=3,4,5,6,7,8,9,10
1:1;t=06:00-07:300
Duration in milliseconds for the alarm (Adhan) audio to fade in from silence to full volume when playback begins. A value of 0 means instant playback at full volume (no fade-in).
• Typical range: 0–3000 ms.
• Applies only to Priority 1 (Adhan alarm) playback.1
Number of times the same randomly-chosen alarm audio file is played each time an alarm triggers. The file is selected once per trigger and then replayed AlarmRepeatCount times in succession, separated by AlarmRepeatGap seconds of silence.
• 1 = play once (default behaviour).
• Higher values are useful for insistent wake-up alarms.0
Duration of silence (in seconds) inserted between successive plays when AlarmRepeatCount is greater than 1. Only meaningful when AlarmRepeatCount > 1.
• 0 = back-to-back playback with no gap.
• Typical range: 0–60 seconds.Ctrl+R in the console interface.
Console key commands:
• Ctrl+S — Test play current display text from TTSPath
• Ctrl+R — Record unique words from TextData for TTS playback6:26|8:20|12:11|1:44|4:00|5:48 and TextData A|B|C|D|E|F:
• Before 6:26 → "A" is displayed
• From 6:26 to 08:20 → "B" is displayed
• …and so on.
Supported surrogate tokens in text:
• #ALARM+1# — the next alarm time (e.g. 8:20)
• #TIMETOALARM+1# — time remaining until the next alarm (e.g. 1 hour(s) and 20 minute(s))
• #ALARM+2# — the alarm after next
• #TIMETOALARM+2# — time to the alarm after next from now
• #NOW# — current time in 24-hour format
Example substitution at 07:00 with times 6:26|8:20|12:11:
• #ALARM+1# → 8:20
• #TIMETOALARM+1# → 1 hour(s) and 20 minute(s)
• #ALARM+2# → 12:11
• #TIMETOALARM+2# → 4 hour(s) and 11 minute(s)
TTS note: For text-to-speech covering any time data, you need recorded audio for words covering numbers 0–20, 30, 40 and 50 — a total of 24 files. While recording TTS words (Ctrl+R in the console), allow approximately 250ms pause after each word for clearer playback.
Per-day scope lines (optional): The raw value may contain multiple newline-separated lines, each optionally prefixed with *scope| (scope grammar mirrors DateAndTimeData: *tu|, *15|, *15-10|, *mo,we,fr|). The most-specific matching scope wins; an unscoped line is the default fallback. The visual editor above edits the default line only and preserves per-day lines in the raw value. For cross-cutting, condition-based overrides (e.g. Friday-only Jumu'ah message) use TextDataRules (19b) instead.|"|"
Separates text data into groups to be index-matched with DateAndTimeData (9) for a particular day for displaying on the console.
Important: This character must not appear within any individual text entry in TextData (20), as it will be interpreted as a separator.
Note: It is advised not to use line feed as a delimiter, as this is parsed differently across Windows and Linux.#ALARM+1#, #TIMETOALARM+1#, #ALARM+2#, #TIMETOALARM+2#, #NOW#.
Filters: slot=, t=HH:MM[-HH:MM], w=, nw=, m=, d=, ld. Prefix with ! to negate.
Example: payload Jumu'ah Mubarak. Khutbah at #ALARM+1#. with filters w=fr and slot=7 → Fridays' Dhuhr slot announces a Jumu'ah message instead of the default.
<payload>;<filter>,<filter>…<payload>;<filter>,<filter>…
• payload — the text to display (may contain #ALARM+1#, #TIMETOALARM+1#, #NOW#, etc.)
• filters — all must match (AND), rules are evaluated top-to-bottom (first match wins)
Filter vocabulary:
• slot=N / slot=N-M — restrict to output slot (1-based, or range)
• t=HH:MM / t=HH:MM-HH:MM — restrict by the firing time-of-day
• w=mo-fr / w=mo,we — weekday list or range
• nw=2mo / nw=lastfr — nth weekday of the month
• m=1,3,12 — month list
• d=1-7,15 — day-of-month list
• ld — last day of month
• Prefix a filter with ! to negate
Example:
Jumu'ah Mubarak! Khutbah begins at #ALARM+1#.;slot=7,w=fr
— Friday Dhuhr slot displays a Jumu'ah-specific message instead of the default Dhuhr text.
Note: Use line-feeds to separate rules (multi-line textarea). The ; character separates the payload from the filter list, and , separates individual filters. Commas inside filter values (e.g. m=1,3,12) are handled specially and do not split the rule.{app}=App install dir, {home}=User profile, {docs}=Documents, {data}=App config, {local}=Local data, {temp}=System temp{app} for cross-platform paths.{app}\TTS
Indicates the location of the word audio library for console text-to-speech operation. Only files with formats listed in TTSFileFormat (24) will be included for playing.
Only the top directory mentioned here is searched — subfolders are not included.
Tip: Use folder tags like {app}, {home}, {docs} etc. which are replaced at runtime with the appropriate system path for your platform. See the tag reference table in Tips and Tricks.
Recording TTS words: Press Ctrl+R in the Multilarm console to initiate the recording interface. The audio is saved in the selected format in this TTSPath folder. Allow approximately 250ms pause after each word for clear, natural-sounding playback.
Required word count: For TTS to cover any time data, you need audio recordings for numbers 0–20, 30, 40 and 50 — a total of 23 files.mp*). Saved with ; delimiter.;)
Default: mp3
Specifies the audio file formats for the word audio library. Only files with formats listed here will be included for TTS playback.
Supported formats: MPEG (MP3, MP1, MP2), OGG, WAV, AIFF, FLAC.
To combine more than one format, join them with ; (e.g. wav;mp3).
Wildcards (*) are allowed in extension (e.g. mp* matches mp2, mp3 etc.).
Only the top directory mentioned in TTSPath (23) is searched — subfolders are not included.(empty) — no chime
Path to a short audio file played immediately before each TTS speech announcement. This is useful as an attention signal before spoken text. Leave empty to disable.
Use the tag buttons above to insert path placeholders (e.g. {app}\Adhan\Chime.mp3).
Multi-tone chimes. This field takes the same source-spec grammar as AlarmPath (12) — see the Audio sequences section (fields 74–75). Point it at a folder with >all to play a fixed multi-tone motif in filename order ({app}\Adhan\Bleep>all), or chain files with a spaced +. Multiple chime files play one after another, with SequenceGapMs (74) between them, and the speech follows. A single file behaves exactly as before.Builtin, Kokoro, KokoroFillsWords)
Default: Builtin
Selects how Multilarm produces spoken announcements:
Ctrl+R → K in the console, the POST /api/tts/fill endpoint, or the cloud dashboard's TTS Word Library card.bm_george
Name of the Kokoro voice used by TTSEngine = Kokoro or KokoroFillsWords. Voices are loaded from the combined voices-v1.0.bin file shipped with the model. Common voices:
bm_george, bm_lewis — British malebf_emma, bf_isabella — British femaleam_michael, am_adam, am_eric — American maleaf_heart, af_bella, af_sarah — American femalekokoro-v1.0.uint8.onnx, voices-v1.0.bin, kokoro.vocab.json, g2p.phoneme_dict.json) are auto-resolved from the Multilarm exe folder, the repo root, or %LOCALAPPDATA%\Multilarm\models\. Run MultilarmTTS\download_kokoro_models.ps1 to fetch them. Ignored entirely when TTSEngine = Builtin.0.2–3.0. Lower = slower (e.g. 0.85 ≈ deliberate). Higher = faster (e.g. 1.2 ≈ brisk). 1.0 = natural pace baked into the voice.0.2 – 3.0)
Default: 1.0 (the voice's natural pace)
Speech speed multiplier passed directly to the Kokoro ONNX speed input. Common settings:
0.8 – 0.9: deliberate (good for elderly audiences / noisy rooms)1.0: natural (recommended for prayer-time announcements and general use)1.1 – 1.3: brisk (good for announcements that need to fit a short window)0.2–3.0 are clamped at load. Hot-reloads — the next announcement uses the new speed without restarting Multilarm. Ignored when TTSEngine = Builtin.0 = no pause (sentences run on); 0.2 ≈ natural breath pause; 0.5+ = noticeable beat.≥0)
Default: 0.2
Length of the silent gap inserted between sentence chunks when Kokoro synthesises a multi-sentence announcement. Useful for letting listeners absorb each sentence before the next begins. Set higher for elderly or non-native audiences; set to 0 for very short announcements where the pause feels unnatural.
Ignored when TTSEngine = Builtin.{app}=App install dir, {home}=User profile, {docs}=Documents, {data}=App config, {local}=Local data, {temp}=System temp{app} for cross-platform paths. Supports MP3, MP2, MP1, OGG, WAV, AIFF.{app}\Adhan\Ambience.mp3
Indicates the path with file name and extension to be played as ambient sound. A random duration (AmbienceDuration (32)) of this file at a specified interval (AmbienceInterval (33)) is played if PlayAmbience (30) is set to True.
Tip: Use folder tags like {app}, {home}, {docs} etc. which are replaced at runtime with the appropriate system path for your platform. See the tag reference table in Tips and Tricks. Supports MP3, MP2, MP1, OGG, WAV, AIFF formats.10 (10 seconds)
Indicates the time duration in seconds to play from a random location of the file at AmbienceFile (31). A random starting point within the ambient file is chosen each time.180 (3 minutes)
Indicates the time interval in seconds between subsequent playing of portions of the file at AmbienceFile (31).
Note: The default of 180 means the ambient clip plays every 3 minutes.Local, Online, Disabled)
Default: Local
Local — Multilarm operates as a virtual radio station by continuously playing audio from the library at RadioFolder (35) during the time windows defined by RadioScheduleRules (38). Any value in RadioStreamURL (36) is ignored. The player uses a subfolder-aware shuffle: each round visits subfolders in a randomised order, taking one file per subfolder before any repeats. Once all files are exhausted, the library is rescanned and the cycle restarts.
Online — opens the Shoutcast/Icecast HTTP(S) URL from RadioStreamURL (36) via the miniaudio HTTP/ICY client during every active window in RadioScheduleRules (38). If the connection fails or drops mid-window, falls back to RadioFolder (35) shuffle automatically so the device doesn't go silent — the fallback is logged to Multilarm.error.log and emits a radio.stream-fallback webhook so the operator can see when fallback is live. The stream is retried every ~10s while fallback is active.
Disabled — radio off entirely. RadioFolder, RadioStreamURL, and RadioScheduleRules are ignored.
Alarm events interrupt and then resume the radio automatically in Local and Online modes.
Back-compat: legacy configs with True load as Local; False loads as Disabled. Values are persisted in canonical form on next save.{app}=App install dir, {home}=User profile, {docs}=Documents, {data}=App config, {local}=Local data, {temp}=System temp{app}\Radio
Path to the root directory of the audio library used by the virtual radio. Used directly when PlayRadio (34) is Local, and used as the fallback target when PlayRadio is Online and the stream connection fails or drops. All audio files under this directory and its subfolders matching RadioFileFormat (37) are included.
The player groups files by their immediate parent directory and uses a subfolder-aware shuffle: each playback round visits subfolders in a freshly randomised order, selecting one file per subfolder before any subfolder contributes a second file, so tracks from different subfolders interleave and no file repeats until every file in every subfolder has played at least once. When all files are exhausted, the full directory tree is rescanned and the cycle restarts.
Tip: Use folder tags like {app} for cross-platform paths.https://qurango.net/radio/mix
When PlayRadio (34) is Online, Virtual Radio opens this URL via the miniaudio HTTP/ICY client during every active window in RadioScheduleRules (38) — useful for mosques and institutions that want to rebroadcast a 24/7 Quran/Islamic stream instead of running a local audio library. Ignored when PlayRadio is Local (folder-only) or Disabled.
Fallback & reconnect. If the connection fails or drops mid-window, Virtual Radio falls back to RadioFolder (35) shuffle so the device doesn't go silent, then retries the stream every ~10 seconds. Schedule rules apply identically to either source.
ICY metadata. Track titles broadcast by the station are appended to Multilarm.playlist.log as STREAM | <title> lines.
Skip behaviour. Ctrl+N (and the dashboard Skip button) tear down and reconnect the stream when in stream mode (since "next file" has no meaning); they advance to the next shuffled file when in folder mode.
Leave this field empty to disable the stream and use RadioFolder shuffle exclusively. The default URL is qurango.net's main 24/7 Quran feed.mp*). Saved with ; delimiter.;)
Default: mp3
Specifies the audio file formats for the virtual radio library. Only files with formats listed here will be included.
Supported formats: MPEG (MP3, MP1, MP2), OGG, WAV, AIFF, FLAC, M4A.
Join multiple formats with ; (e.g. mp3;flac). Wildcards (*) are allowed in both filename and extension (e.g. *abc.mp*).|. Midnight-crossing ranges (e.g. 22:00-06:00) are supported. Overlapping ranges are consolidated automatically.;. Radio plays when any rule matches. Default 00:00-00:00,m=* = active 24 h all year.; as rule delimiter, | between time ranges within a rule, , between a time range block and its filters)
Default: 00:00-00:00,m=* (radio active at all times, all year)
Defines when the virtual radio is active when PlayRadio (34) is Local or Online. Each rule has the form:
HH:MM-HH:MM[|HH:MM-HH:MM][,filter=value][,!filter=value]
Multiple time ranges within one rule are separated by | and merged where they overlap. Multiple rules are separated by ;, and the radio is active if any rule matches.
Supported filters:
m= — Month(s) 1–12. Ranges (e.g. m=3-6) and comma-lists (e.g. m=1,3,12) accepted. * or omitted = all months.
d= — Day(s) of the month 1–31. Ranges and comma-lists accepted.
w= — Weekday(s): su mo tu we th fr sa. Ranges (e.g. w=mo-fr) wrap correctly across Sunday.
nw= — Nth weekday: nw=2mo = second Monday; nw=lastfr = last Friday.
ld — Last day of the month only.
Prefix any filter with ! to exclude (e.g. !w=su excludes Sundays).
Time ranges crossing midnight (e.g. 22:00-02:00) are handled correctly. Setting both endpoints equal (e.g. 00:00-00:00) activates the radio for the full 24 hours.
Example with multiple time ranges in one rule:
07:00-09:00|12:00-14:00|17:00-21:00,w=mo-fr
Radio active during morning, lunchtime and evening on weekdays.
Example with multiple rules:
08:00-20:00,w=mo-fr;09:00-17:00,w=sa,!m=8
Weekday office hours plus Saturday mornings, except August.QuoteFile once and persists the silence-boundary map to a .boundaries.json sidecar next to it. Thresholds are derived adaptively from the file's own audio — there are no operator knobs to tune. Delete the sidecar to force a rescan after replacing the audio.{app}=App install dir, {home}=User profile, {docs}=Documents, {data}=App config, {local}=Local data, {temp}=System temp{app}\Adhan\Quote.mp3
Path to the audio file used for random quote playback. A random full speech segment is selected from within the file and played each time. Works best with long spoken-word recordings where varied excerpts are preferred.
Tip: Use folder tags like {app} for cross-platform paths. Supports MP3, MP2, MP1, OGG, WAV, AIFF formats.180 (3 minutes)
Time in seconds between successive random quote playbacks from QuoteFile (40).QuoteFile once and writes a .boundaries.json sidecar next to it. Delete the sidecar to force a rescan.
|. Midnight-crossing ranges (e.g. 22:00-06:00) are supported. Overlapping ranges are consolidated automatically.;. Quotes play when any rule matches. Default 00:00-00:00,m=* = active 24 h all year.; as rule delimiter, | between time ranges within a rule, , between a time range block and its filters)
Default: 00:00-00:00,m=* (quotes active at all times, all year)
Defines when periodic quote playback from QuoteFile (40) is allowed when PlayQuote (39) is True. The timer set by QuoteInterval (41) still fires at the configured interval, but playback is skipped if the current date and time do not match any rule here.
Uses the same rule format as RadioScheduleRules (38). Each rule has the form:
HH:MM-HH:MM[|HH:MM-HH:MM][,filter=value][,!filter=value]
Multiple rules are separated by ;. A quote plays if any rule matches.
Supported filters:
m= — Month(s) 1–12. Ranges (e.g. m=3-6) and comma-lists (e.g. m=1,3,12) accepted. * or omitted = all months.
d= — Day(s) of the month 1–31. Ranges and comma-lists accepted.
w= — Weekday(s): su mo tu we th fr sa. Ranges (e.g. w=mo-fr) wrap correctly across Sunday.
nw= — Nth weekday: nw=2mo = second Monday; nw=lastfr = last Friday.
ld — Last day of the month only.
Prefix any filter with ! to exclude (e.g. !m=9 excludes September).
Time ranges crossing midnight (e.g. 22:00-06:00) are handled correctly. Setting both endpoints equal (e.g. 00:00-00:00) activates quotes for the full 24 hours.
Examples:
08:00-22:00,w=mo-fr;09:00-17:00,w=sa
Quotes on weekday daytime and Saturday mornings only. Silent on Sundays.
05:00-23:00,!m=9
Quotes from 5 AM to 11 PM every day, except September.
00:00-06:00;06:30-12:00;12:30-16:00;16:30-18:00;18:30-00:00
Quotes at all hours except 30-minute windows around each prayer time.-1 = system default, 0 = disable audio playback, 1+ = 1-based index of audio output devices.-1
Specifies the audio device to be used for playback.
• -1 — System-default audio device
• 0 — Disables audio playback entirely
• 1 and above — 1-based indices for audio output devices present in the system
Console commands for audio testing:
• Ctrl+A — Test play AmbienceFile for AmbienceDuration
• Ctrl+T — Test play a random audio file from a random AlarmPath folder
• Ctrl+L — List audio files played during the past hour-1 = system default, 0+ = 0-based index of recording devices.-1
Specifies the audio device to be used for recording TTS (text-to-speech) audio.
• -1 — System-default recording device
• 0 and above — 0-based indices for recording devices present in the system
Note: Unlike the playback device (field 43) which uses 1-based indexing from 1, this recording device uses 0-based indexing from 0.
Used when recording word audio via Ctrl+R in the console interface.Ctrl+O in the running Multilarm console to list every audio device (one table for playback, one for recording) with the exact indices to add here.
PlaybackDevice — field 43) that every sound also plays through, giving you a simultaneous multi-speaker mirror set-up. Leave empty for single-device playback.(empty)
Multi-speaker mirroring: plays every alarm, radio, ambience, TTS and voice-broadcast sound simultaneously through one or more additional output devices in parallel to the primary PlaybackDevice (field 43). The miniaudio engine decodes each sound once and attaches every target device — the primary plus every mirror — as a secondary output sharing the source clock, so all targets receive the same audio at the same time, frame-aligned.
Entering values — the easy way:
Type a device index in the Device # box above and click + Add device (or press Enter). Each index appears as a removable pill. Duplicates are rejected automatically, and if you try to add the same index as your primary PlaybackDevice you'll be asked to confirm. The Raw value field below stays in sync for power-user edits and bulk paste — commas, semicolons and spaces are all auto-normalised to pipes on blur, so pasting 1, 3, 5 works just as well as 1|3|5.
How to discover the right indices — Ctrl+O:
Press Ctrl+O in the running Multilarm console. Multilarm prints a snapshot of every audio device on the host — one table for playback, one for recording — each row showing:
<idx>: <device name> [default]
The first column is the device index, which is exactly the integer to enter here. The header lines also echo the currently configured PlaybackDevice, RecordDevice and MirrorDevices values, so you can confirm the live assignment at a glance. Ctrl+O is read-only — it never changes configuration.
Flags in square brackets:
• [default] — the OS's default input / output device
• [disabled] — present but unavailable; do not use
• [init] — already initialised by Multilarm (playback list only; recording devices are RecordInit'd on demand)
Index conventions (same as PlaybackDevice and RecordDevice):
• -1 — system default (not useful here — pick a concrete hardware index)
• 0 — first enumerated playback device (system default on most hosts)
• 1+ — real hardware outputs in miniaudio enumeration order (on Windows, typically the Windows multimedia device order)
Examples:
1 — mirror to one extra device (index 1).
1|3 — mirror to devices 1 and 3.
2|4|7 — mirror to three extra devices simultaneously.
Behaviour: Volume, fade-in, crossfade, skip and stop operations apply to the underlying miniaudio sound handle and therefore affect the whole mirror group as one unit — you never end up with a lagging speaker or a device that is half a second behind. If a mirror device fails to initialise (missing hardware, already exclusive-locked, wrong driver), Multilarm logs a warning and continues with the devices that did succeed; if the primary fails, playback is skipped as usual.
Typical uses: line-out to an amplifier plus USB speaker for a secondary zone; built-in speakers plus Bluetooth headphones for quiet hours; multiple sound cards wired to different speaker sets throughout a building; FM transmitter output mirrored to an internet-stream encoder.
Tip: Combine with per-zone instances (--config <path> CLI flag — see the command-line arguments section) to build multi-zone installations where each instance owns its own physical audio chain while sharing a common alarm calendar.1.0
Master playback volume applied to all audio routed through ManagedPlayer (alarms, TTS, quotes, radio, ambience). A value of 1.0 is full volume; 0.0 is silent. This setting is applied at startup and affects all streams uniformly.1500
Duration of the volume crossfade (in milliseconds) when the virtual radio transitions between background tracks. A value of 0 disables crossfading and switches tracks instantly. Higher values produce smoother transitions.
• Typical range: 500–3000 ms.
• The crossfade also applies when background playback is interrupted by a priority item and later resumed.22:00-07:00) are supported. Overlapping ranges are consolidated automatically.;. First matching rule wins; when none match, master Volume (46) applies.; between rules, | between time ranges within a rule, , between a time-range block and its filters)
Default: (empty — master Volume always applies)
Per-schedule playback volume overrides. Every rule uses the same syntax as RadioScheduleRules (38), plus one extra filter — volume=<0.0-1.0> — which replaces the master Volume (46) while the rule is active. When no rule matches, the master Volume is used unchanged.
Rule form:
HH:MM-HH:MM[|HH:MM-HH:MM][,volume=X][,filter=value][,!filter=value]
Multiple time ranges in one rule are separated by | and merged where they overlap. Multiple rules are separated by ;. First matching rule wins; evaluation runs every second.
Supported filters (same as RadioScheduleRules):
volume= — Playback volume 0.0–1.0 for the time this rule is active. Omitting this filter means the rule matches a window but does not change volume (rarely useful by itself).
m= — Month(s) 1–12. Ranges (m=3-6) and comma-lists (m=1,3,12). * or omitted = all months.
d= — Day(s) of the month 1–31. Ranges and comma-lists accepted.
w= — Weekday(s): su mo tu we th fr sa. Ranges like w=mo-fr wrap correctly across Sunday.
nw= — Nth weekday: nw=2mo = second Monday; nw=lastfr = last Friday.
ld — Last day of the month only.
Prefix any filter with ! to exclude (e.g. !w=su excludes Sundays).
Time ranges crossing midnight (e.g. 22:00-07:00) are handled correctly. Setting both endpoints equal (00:00-00:00) activates the rule for the full 24 hours.
Examples:
22:00-07:00,volume=0.3
Quiet nights at 30%.
22:00-07:00,volume=0.3;12:00-14:00,volume=0.6,w=mo-fr
Quiet night at 30% plus a lunchtime dip to 60% on weekdays.
00:00-00:00,volume=0.5,m=12;22:00-06:00,volume=0.2
Throughout December, cap at 50%; otherwise quiet nights at 20%.http://<device-ip>:<port>/. You can view status, adjust volume, skip tracks, test alarms and edit all settings live.
On Windows, if you see an "access denied" error, run this command once as administrator to allow the server to listen on all network interfaces:
netsh http add urlacl url=http://+:6580/ user=Everyone6580
TCP port for the Web Remote HTTP server. Port 6580 is chosen to avoid conflicts with common applications. Change only if another application on your device uses the same port.(empty) — no authentication
Username for HTTP Basic Authentication on the Web Remote. When both WebRemoteUsername and WebRemotePassword are set, all API requests and dashboard access require valid credentials. Leave empty for open access (suitable for isolated local networks).(empty) — no authentication
Password for HTTP Basic Authentication. Both username and password must be set for authentication to be active. The password is transmitted as Base64-encoded text — use only over trusted local networks or behind HTTPS.(empty)
Cloud Relay is always enabled; set this token to connect to https://multilarm.com/cloud. The unique device token authenticates this Multilarm instance with the cloud server — generated when you add a device in the cloud dashboard. Each device has its own token. Keep this secret — anyone with the token can control this Multilarm instance. Leave empty to disable cloud connectivity.500
Free-space floor (MB) for the drive hosting Multilarm's audio library. Surfaced in the cloud-relay status push as health.disk and on Ctrl+I. When free space drops below this value the Cloud Dashboard fires the "disk low" alert (subject to the per-user email_alerts.on_disk_low setting). Set to 0 to disable the device-side flag entirely — the cloud then never sees diskLow=true and so never fires the alert.False
Opt-in automatic updates. When On, this device checks the published version manifest (https://multilarm.com/multilarm/latest.json) about once a day and, if a newer Multilarm build exists for this device’s platform, installs it on its own — no dashboard command needed. Every auto-update runs the same safety path as the manual “Update” button: the download is SHA-256 verified, the old binary is kept, and a watchdog automatically rolls back if the new version fails to come back online. A build that has just failed is not retried for 48 hours, so a bad release can never spin in a restart loop. When Off (default), the device only updates when an owner clicks Update in the cloud dashboard. You can also flip this from the dashboard’s Software row (it is delivered to the device as this config field).Kitchen PC, Garage Pi, Broadcast Room.Multilarm for Multilarm.config.xml, kitchen for kitchen.config.xml)
What it does: a pure display label. It has no effect on scheduling, audio, Hub routing, or peer matching — it only appears in three places:
• the card text on the Multilarm Hub grid (/hub on any instance started with --hub or promoted with Ctrl+H),
• the "name" field of this instance's heartbeat JSON under %LOCALAPPDATA%\Multilarm\instances\<InstanceId>.json,
• the Ctrl+I runtime status readout.
How multiple instances stitch together (hint: not by name):
%LOCALAPPDATA%\Multilarm\instances\, named <InstanceId>.json, refreshed every 15 s.lastHeartbeat is within the last 60 s./hub. The card shows its InstanceName but is keyed by InstanceId.Kitchen render as two separate cards with identical labels — confusing for the operator, but it won't break anything.
When to change it: whenever you run more than one Multilarm instance side-by-side. Give each one a short, unique name matching where it lives or what it does. Safe to edit any time — hot-reload rewrites the heartbeat JSON on the next tick (≤ 15 s) and the Hub card text updates on its next refresh. Never orphans a Hub row.
Worked example — three zones on one PC:
InstanceId. The ID is the internal stable identifier used by the Hub proxy path (/hub/instance/<id>/…) — Multilarm mints it on first run and persists it in a small sidecar file <activeconfig>.iid next to the active config (e.g. Multilarm.config.xml.iid), so peers and the Hub dashboard address this instance stably across restarts. The ID is not a config field and never appears in config.xml — copying both files together preserves the Hub row; deleting the .iid mints a fresh ID on next start. The name is what you see; changing it never orphans heartbeat history.(empty)
Path to the JSON file holding LAN + MQTT trigger profiles and bearer tokens.
Default-resolution mirrors how the active config XML is resolved. If left empty, Multilarm derives the base name from the active config file and looks for <baseName>.triggers.json in the same writable directory:
{app} on perMachine MSI installs falls back to {data}\Multilarm).
Override path supports the standard tag set: {app} {temp} {home} {docs} {data} {local}.
JSON schema:
{
"tokens": [
{ "token": "...", "label": "nurse-call",
"key_allowlist": ["nurse-1","nurse-2"],
"rate_per_min": 60, "enabled": true }
],
"profiles": [
{ "key": "nurse-1", "name": "Ward A call",
"action": "play-random", "target": "",
"cooldown_sec": 0, "enabled": true }
]
}
Reloaded automatically on the next config XML save (or restart). Missing file is fine — the LAN surface simply rejects everything until profiles exist.False
When On, MqttBridge connects to the customer-provided broker at MqttHost:MqttPort and subscribes to <MqttBaseTopic>/trigger (JSON) and <MqttBaseTopic>/trigger-audio/+ (raw audio bytes, key in topic suffix). Heartbeats are published to <MqttBaseTopic>/status; per-fire envelopes go to <MqttBaseTopic>/events. Multilarm does not run a broker — bring your own (Mosquitto, HiveMQ, vendor broker).(empty)
Broker hostname or IP. No scheme — just broker.example.com or 10.0.0.5, not tcp://... or mqtt://.... Empty disables the bridge regardless of MqttEnabled.1883
Broker TCP port. Conventional defaults: 1883 (plain) or 8883 (TLS). When MqttUseTls is On and you leave MqttPort at the default, the bridge falls back to 8883. Set explicitly for cloud-hosted brokers (HiveMQ Cloud, EMQX Serverless) which often use non-standard ports.False
Wraps the broker connection in TLS. Uses the OS trust store for certificate validation (Windows certificate store on win-x64 builds). For self-signed broker certificates, install the broker CA into the OS trust store before enabling.(empty)
Optional broker login. Leave empty for anonymous brokers. Identity at the broker level — trigger-key authorisation is enforced separately by TriggerStore.(empty)
Optional broker password. Stored in Multilarm.config.xml in plain text — protect the file. Redacted to ******** by GET /api/config; the placeholder is stripped before save so an unedited round-trip leaves the stored value untouched.multilarm
Topic prefix. Bridge subscribes to <base>/trigger and <base>/trigger-audio/+; publishes to <base>/status and <base>/events. For multi-device estates use a unique base per device (e.g. multilarm/ward-a) so brokers can apply per-device ACLs.[]) disables the feature.
JSON array of outbound webhook endpoint objects. Each entry has shape {Url, Secret?, Events?, TimeoutMs?, Retries?, Headers?}. Multilarm POSTs JSON event envelopes to every configured endpoint whose Events filter matches (or whose Events is empty, meaning subscribe-to-everything). HTTPS or RFC1918 private-IP URLs only. Set to [] or leave empty to disable. Hot-reload safe: workers diff by Url, so an unchanged endpoint keeps its in-flight queue across config edits.filename,rule entry and add it to the list above{app}=App install dir, {home}=User profile, {docs}=Documents, {data}=App config, {local}=Local data, {temp}=System temp. A bare filename resolves relative to the app directory.filename,rule pair. Entries are saved joined with |. Evaluated once at midnight; the first matching entry wins.filename,rule pairs
Default: (empty — default config always used)
Date-scoped config switching: Multilarm can load an entirely different Multilarm.config.xml-style file for specific days of the year (e.g. Ramadan, Hajj, weekends, winter schedule). Each entry consists of a filename and a rule separated by a single comma, and entries are joined with | on save.
Entry form:
<filename>,<HH:MM-HH:MM>[,filter=value][,!filter=value]
The filename is either a bare name (resolved next to the executable) or a path using any supported tag: {app}, {home}, {docs}, {data}, {local}, {temp}. Tags are expanded at runtime. The rule portion uses the same time + date filter syntax as RadioScheduleRules (38) — see that field for the full filter reference.
Evaluation: runs once at midnight each day (and once at startup). Entries are scanned top-to-bottom and the first matching entry wins. When no entry matches, Multilarm reverts to the default Multilarm.config.xml. Missing or unreadable files fall back to default silently, with a warning in the log.
Examples:
multilarm.ramadan.xml,00:00-23:59,m=3
Switch to the Ramadan config file all of March.
multilarm.ramadan.xml,00:00-23:59,m=3|multilarm.weekend.xml,00:00-23:59,w=sa,su
Ramadan config in March; weekend config on Saturdays/Sundays the rest of the year.
{app}\configs\multilarm.friday.xml,00:00-23:59,w=fr|{data}\Multilarm\multilarm.winter.xml,00:00-23:59,m=12-2
Friday-specific config from an {app} subfolder; winter (Dec–Feb) config from the user's AppData.
Notes: Because evaluation is daily, time ranges other than 00:00-23:59 or 00:00-00:00 rarely add value — a day either uses the alternate config or it doesn't. Use the date filters (m=, d=, w=, nw=, ld) to pick the matching days.1=Bell 2=ZoneMuteA 3=ZoneMuteB 4=EmergencyLed, button debounce 500 ms, hold-to-reset 3 s, and the two-zone mute map (ZoneA ↔ ZoneB). (empty — relay off)
Serial device of the USB relay board and the feature's on/off switch (same pattern as CloudDeviceToken: presence = enabled). CH340-based boards enumerate as /dev/ttyUSB0 on the Pi (check with ls /dev/ttyUSB*); the Multilarm Box image script also installs a stable /dev/multilarm-relay udev symlink that works here.
Do not set this until the board's byte protocol has been confirmed with the Ctrl+G relay test (see RelayProtocol, 69). While empty, bell rules parse but never fire, zone targeting is ignored, and the web Hardware panel shows the feature as disabled. Baud rate is fixed at 9600 (every cheap relay board); channel assignment is fixed as 1=Bell, 2=ZoneMuteA, 3=ZoneMuteB, 4=EmergencyLed, 5=ZoneMuteC, 6=ZoneMuteD — wire the board to match. A 4-channel board covers bell + 2 zones + emergency LED; use an 8-channel board for 3–4 zones (ZoneMuteC/D on channels 5/6).A0 | FF) · Default: A0
Byte framing the board expects. Cheap CH340 USB relay boards (4- or 8-channel) ship at least two incompatible protocols:
A0 — {A0, channel, state, checksum} per channel (most LCTECH / SainSmart CH340 boards).
FF — {FF, 01, channel} to open, {FF, 01, 00} closes all (some ELEGOO boards).
Confirm against the physical board before going live: connect the board, set RelayPort (66) on a test config, and press Ctrl+G at the Multilarm console — the relay test pulses each channel and prints the states. If nothing clicks, switch protocol and repeat. Wrong protocol is harmless (the board just ignores the bytes) but the bell will not ring.HH:MM[,dur=ms][,date filters]); entries are saved joined with ;. Each pulses relay channel 1 (Bell) at that minute. (empty — no bells)
Point-in-time school/institution bell schedule. Each entry is:
HH:MM[,dur=NNNN][,w=..][,nw=..][,m=..][,d=..][,ld]
HH:MM is 24-hour fire time; dur= is the relay pulse length in milliseconds (default 1000, clamped 100–60000); the date filters are the same vocabulary as RadioScheduleRules (38). The bell is a relay pulse only — it plays no audio and never interrupts announcements.
Example school day:
08:45,dur=1500,w=mo-fr;09:00,dur=1500,w=mo-fr;12:00,dur=2000,w=mo-fr;15:15,dur=3000,w=mo-fr;
Rules parse and log but never pulse while RelayPort (66) is empty or the board is unplugged — each skipped fire is recorded in the log.-1 = emergency button off. Set a BCM pin number (17 typical) to arm it.-1
BCM GPIO number the emergency button is wired to and the feature's on/off switch (same convention as PlaybackDevice's -1). GPIO 17 = physical pin 11 is the documented wiring. Wire a momentary normally-open button between this pin and GND — Multilarm enables the Pi's internal pull-up in software, so no external resistor is required (an external 10kΩ to 3.3V remains good practice for long cable runs). Avoid GPIO 18–21 if a HiFiBerry DAC is fitted (used by I2S audio).
When the button pulls the pin low, Multilarm immediately interrupts all audio, plays EmergencyAudioFile (70) on loop at top priority, suppresses every scheduled alarm/announcement/bell, and turns on the EmergencyLed relay channel until reset. Debounce (500 ms) and hold-to-reset (3 s) are fixed in code. Reset from the web Hardware panel or by holding the button; the panel's “Test emergency” button exercises the identical chain without hardware. (empty)
Audio file played on loop at top priority while the emergency is active. Any format Multilarm plays (wav/mp3/ogg/flac/aiff); a short clear file (≤30 s, e.g. “Attention — please evacuate…”) loops cleanly. Missing/empty file logs a warning and the emergency still activates the relay LED and suppresses the schedule — a silent emergency beats a crashed one. Record one with the Voice Broadcast card and save it, or synthesise one with the TTS engine.ZoneA or ZoneB (fixed names: targeting ZoneA opens relay ch3 to mute Zone B's amplifier; ZoneB opens ch2).
Filters: slot=, t=HH:MM[-HH:MM], w=, nw=, m=, d=, ld. Prefix with ! to negate.
Rules are scanned top to bottom — first match wins; announcements matching no rule play in all zones.
<ZoneA|ZoneB|ZoneC|ZoneD>;<filter>,<filter> overlay rules — first match wins. (empty — all announcements play everywhere)
Decides which announcements are zone-targeted. Each rule is <zone>;<filter>,<filter> with the standard filter vocabulary (slot=, t=HH:MM[-HH:MM], w=, nw=, m=, d=, ld, ! to negate); rules are scanned top to bottom and the first match wins. Up to four zones are supported — ZoneA, ZoneB, ZoneC, ZoneD — with the mute map fixed: targeting a zone opens the mute relay of every other zone you use, so only the chosen zone is heard (ZoneMuteA–D on channels 2, 3, 5, 6). Two zones run on a 4-channel relay board; three or four need an 8-channel board. The mutes always release afterwards — even if playback fails.
Example: ZoneA;slot=7 — the slot-7 announcement plays in Zone A only. Announcements matching no rule play in all zones with no relay activity; bells always ring everywhere.True
Master switch for the cloud dashboard / Android app “Start emergency drill” command. When On (default), an owner can start an emergency broadcast remotely (after a confirmation). When Off, the device refuses a remote start — only the physical emergency button (EmergencyGpioPin, 69) can begin one — while remote reset is always honoured so a stuck emergency can still be cleared from afar. The on-device button and the LAN Web Remote Hardware panel are unaffected either way. Only relevant when the emergency feature is configured (EmergencyGpioPin set).AlarmPath entry, and the whole of TTSChimePath, may take the form:
<path>[>mode][*count]
<path> can be:
• a folder — e.g. {app}\Adhan (what it has always been)
• a single file — e.g. {app}\Adhan\Bleep\ding.mp3
• a folder plus a filename pattern — e.g. {app}\Adhan\bell*.mp3
>mode decides how many files that path contributes, and in what order:
• >one — one file picked at random. This is the default, so a bare folder path means >one and nothing changes for existing configs.
• >all — every file in the folder, in filename order (so 1-intro.mp3, 2-adhan.mp3, 3-outro.mp3 play in that order).
• >shuffle — every file, in a fresh random order each time.
• >seq — one file per alarm, stepping through the folder in order and wrapping at the end. Use this to play a different recitation each day. The position is remembered across restarts; adding or removing files restarts it cleanly.
*count caps how many files come from that path. >shuffle*2 = two different random files. >seq*3 = the next three in the rotation.
Chaining several sources — join them with a plus sign surrounded by spaces:
{app}\Adhan\Bleep\intro.mp3 + {app}\Adhan + {app}\Adhan\Bleep\outro.mp3
…plays the intro bleep, then a random adhan, then the outro bleep — all as one announcement, with the radio suppressed throughout and the spoken announcement (if any) following at the end. The spaces matter, because + is a legal character in filenames: Rock+Roll is a folder name, a + b is a chain. Write \+ if you genuinely need a spaced plus inside a path.
Worked examples
• Bleep, then adhan: {app}\Adhan\Bleep\ding.mp3 + {app}\Adhan
• A fixed three-tone chime: set TTSChimePath to {app}\Adhan\Bleep>all
• A different adhan every day: {app}\Adhan>seq
• Two random bleeps before a random adhan: {app}\Adhan\Bleep>shuffle*2 + {app}\Adhan
Notes
• A typo in a mode (>shufle) is reported as an error at startup and in the health check — it never silently falls back to a random pick.
• AlarmRepeatCount (18) repeats the whole sequence; AlarmRepeatGap (19) is the silence between those repeats; SequenceGapMs (74) is the silence between the different files inside one pass.
• The ambience file is always excluded from a folder's files, as before.0
Silence inserted between different files inside a single announcement — between the bleep and the adhan, or between the tones of a >all chime. 0 (default) plays them back to back.
Do not confuse this with AlarmRepeatGap (19), which is the silence between repeats of the whole announcement. Both apply on the same fire and are independent: with three files, a 500 ms sequence gap, AlarmRepeatCount=2 and a 60 s repeat gap, you get file 1 · 0.5s · file 2 · 0.5s · file 3 · 60s · file 1 · 0.5s · file 2 · 0.5s · file 3.
If you use zone targeting (ZoneRules, 71), the zone mutes are held for the whole sequence including these gaps — you do not need to account for it.600 (10 minutes)
Hard ceiling on how long one announcement may run — all its files, all its repeats. When the cap is reached the remaining files are skipped and a line is written to the log saying so.
This exists to stop a mistake being expensive. Pointing >all at a folder of 400 tracks would otherwise hold the speakers, suppress the radio, and block every alarm behind it for hours. Ten minutes is generous for a bleep-adhan-bleep announcement and short enough to keep a misconfiguration from ruining a day.
Set 0 for no limit if you deliberately want a long announcement — a full recitation as the alarm, for example. The startup health check also warns (without stopping anything) when a single source resolves to more than 20 files. (empty — off)
The hostname or IP address of the PBX / phone system this device should register with, optionally with a port (5060 is assumed). Examples: pbx.example.local, 192.168.1.20:5060.
Empty means off, exactly like RelayPort (66) and EmergencyGpioPin (69). Nothing about SIP starts until you put an address here, so a config with the rest of this section filled in is still completely inert. (empty)
The SIP account name Multilarm registers with. Ask whoever runs your phone system to create a normal extension for it — it needs no special privileges, only the ability to receive calls.
Give it a name that is obviously not a person, such as multilarm-pa or tannoy, so it is clear in the phone system’s logs what the extension is for. (empty)
The password for SipUsername (77).
Like WebRemotePassword and MqttPassword, this is treated as a site secret: it is stored in the config file on the device, but it is never handed back by the status or config APIs (a read shows ********), and it is stripped out of the configuration snapshots kept in the cloud. Restoring an older snapshot leaves the live password untouched rather than wiping it. (empty)
The extension number people dial to make an announcement, e.g. 700.
This field is documentation, not routing: the call reaches Multilarm because your phone system sends it to the SipUsername (77) account. Recording the number here means the dashboard, the diagnostics report and the commissioning certificate can all tell an engineer — or the next person to look after the system — what to dial, without them having to go digging in the PBX.* for any caller. (empty — deny all)
Which extensions are allowed to make an announcement. Separate them with | or ,. A single trailing * is a wildcard:
• 201|202 — only reception and the office
• 30* — any extension starting 30 (300–309, 3011…)
• * — anyone who can dial the extension
An empty list rejects everyone. That is deliberate and it is the opposite of how most settings here behave. Anything that can speak to a whole building should not answer the world simply because a field was left blank — so you have to say who is allowed, even if what you mean is “everyone” (*).
Bear in mind that caller ID comes from your phone system, and a PBX that accepts calls from outside can be told to present any number at all. If external calls can reach this extension, keep the list tight and ask your phone provider to block inbound calls to it.True
When On (default), a permitted call is answered straight away and the caller is live on the PA as soon as they hear the connection.
When Off, every inbound call is politely refused. Useful as a temporary stop — during an exam, an event, or while you are testing — without having to clear SipServer (76) and lose the rest of the configuration.
Note that a call being answered is not the same as it being heard immediately: if an alarm or emergency broadcast is already playing, the page waits for it to finish rather than cutting it off.120
How long each registration with the phone system lasts before it is renewed. The default of two minutes suits almost every site and you should only change it if your phone system asks for something specific.
The trade-off is simple: a shorter time means the device notices a dropped registration sooner, but it also means more traffic to the PBX. A longer time is quieter, but after a phone-system restart there can be a gap where a call to the paging extension goes nowhere. Values outside 30–3600 are clamped.5060
The UDP port the Multilarm SIP companion listens on for calls from your phone system.
Leave it at 5060 unless something else on the device already uses that port. A fixed port matters for two practical reasons: your firewall needs a rule that stays valid, and some phone systems send calls straight to an address and port rather than to whatever address the device last registered from.
Setting 0 lets the operating system pick any free port. That works when the phone system only ever calls back to the registered contact, but the port then changes every time the companion restarts — so a firewall rule written today stops matching tomorrow. Only use it if you know you need it.False
Lets the device measure how loud the room is, and recognise the standard fire-alarm sound pattern.
No audio is kept. Every twenty seconds a short clip is captured, measured, and deleted before it is even analysed. Nothing is written to disk, nothing is sent to the cloud, and there is no way to play any of it back — the feature produces numbers, not recordings. That is a design decision rather than a setting you can change: if you want audio kept, that is RecordScheduleRules (86) below, a separate feature you have to turn on separately.
What the measurement is for: it feeds AdaptiveGainEnabled (85), so announcements can match the room; it drives the “room is louder/quieter than” automation triggers; and it can raise an alert when it hears a smoke alarm on a site where nobody may be present to hear it.
Turning this on is worth telling people about. In many places a device that listens to a room — even one that keeps nothing — is something the people in that room are entitled to know about, and in a workplace it may be something you are required to tell them. Leave it off unless you actually want what it does.False
Raises announcements in a noisy room and lowers them in a quiet one, so a message set for an empty hall is not inaudible once it fills up — and does not startle anyone at six in the morning.
Needs ListenEnabled (84). With no measurement to work from it changes nothing at all; it does not fail or warn, it simply has no input and leaves the volume alone.
It never quietens an alarm or an emergency broadcast. The adjustment applies to scheduled announcements, the radio and ambience. Anything at alarm or emergency priority plays at its configured volume regardless of what the room sounds like — a system that could talk itself into a whisper during a fire would be worse than no system at all.
The adjustment is bounded, so a single loud bang cannot send the PA to maximum: it moves within a limited range around your configured Volume (46) and returns to it as the room settles. (empty — never records)
When to record the room. This uses exactly the same grammar as RadioScheduleRules (38) and QuoteScheduleRules (42), so there is nothing new to learn:
• 09:00-10:00,w=mo-fr — the ten o’clock hour, weekdays only
• 09:00-10:00,w=mo-fr;14:30-15:00 — and an afternoon slot every day as well
• 00:00-00:00,m=* — continuously
Recordings are saved as WAV next to your config file in a Recordings folder, named by start time (rec-20260824-090000.wav). Leave this empty and no recording ever happens.
Recording never interrupts playback. It only reads the microphone; announcements, alarms and emergency broadcasts use the output and are untouched.
It does give up the microphone, though. There is one microphone and several things want it, so if an operator starts push-to-talk or a voice broadcast during a scheduled recording, the recording stops and the part already recorded is kept — a truncated recording is more use than none. It in turn takes the microphone from room listening, which nobody is waiting on.
Recording a room is not the same as measuring it. This produces files that persist, can be copied and can be listened to. Where you are and who is in the room decide whether you may do it, and whether you have to tell them; the software cannot make that judgement for you.14
How long a recording is kept before it is deleted automatically. The tidy-up runs whenever nothing is being recorded, so a device left alone keeps its own disk under control.
0 means keep everything for ever. That is a real choice and it is honoured exactly, but understand what it commits you to: continuous recording at the default quality is roughly 0.3 GB a day, so a year of it is over 100 GB. On an SD card that ends in a full disk, and a full disk is a device that cannot log, cannot update and may not start. If you need indefinite retention, copy the recordings somewhere else on a schedule rather than letting them pile up here.
The default of 14 days suits the common reason for recording at all — being able to go back and check something that happened recently — without accumulating an archive nobody asked for.Off | Server | Room) · Default: Off · Takes effect on restart
Which part this device plays in a multi-room group.
• Off — nothing changes. No port is opened, nothing is sent, nothing is listened for. This is the default and it is what every existing installation keeps doing.
• Server — this device carries on exactly as before, and in addition sends a copy of everything it plays to any room that joins. Set this on the device that holds the schedule.
• Room — this device plays what the sending device is playing. It also keeps its own schedule, its own emergency button and its own settings.
You need exactly one Server. Two sending devices on one network is not an error the software can detect for you — each room joins whichever it finds first, and the result is a building playing two things.
Why this needs a restart. Changing role mid-session would mean taking the audio path apart underneath whatever is playing. Multilarm will not silence a room to apply a setting, so the change waits for the next start.
An unrecognised value is treated as Off. Not as a guess — a wrong guess either opens a port nobody asked for or silences a device that was working.7451 · Takes effect on restart
The TCP port the sending device listens on and the rooms connect to. It has to be the same number on every device in the group.
Finding the sending device automatically uses the next port up (7452, UDP broadcast) and is not configurable — it is derived from this one so there is only ever one number to get right.
If your network has a firewall between the devices, this is the port to allow. Multi-room does not work across the internet and is not meant to: it is a local-network feature, and the traffic is uncompressed audio. (empty) · Takes effect on restart
A shared word that decides which devices may join the group. Put the same value on the sending device and on every room.
Blank means any Multilarm on this network may join. That is the right default for a house and the wrong one for a shared, office or guest network — on those, set a key.
Be clear about what this is. It is a check, not encryption. The audio itself travels the local network in the clear. That is a deliberate choice: this carries programme audio the building is already broadcasting out loud through speakers, and putting a certificate handshake in front of an emergency announcement would be trading something that matters for something that does not. If the audio itself must be private, multi-room is not the feature to use. (empty — search the network) · Takes effect on restart
Where a room should look for the sending device.
Left blank, the room broadcasts a short question on the network at startup and uses whichever sending device answers. That is the normal case and needs no configuration at all.
Fill it in when automatic discovery cannot work or should not be relied on:
• the devices are on different subnets or VLANs (broadcasts do not cross them);
• the network blocks UDP broadcast, as some managed switches and most guest wireless networks do;
• you want the room to be certain which device it follows.
Use a fixed address or a name your network resolves reliably. A room that is pointed at an address does not search; if that address does not answer, the room says so in the log and stays quiet rather than joining something else.
This field is ignored on the sending device.400
The deliberate delay a room adds before playing what it has been sent. It is the one number that buys network reliability, and it costs immediacy.
Every room must use the same value. Two rooms set differently are, by definition, out of step with each other by the difference. If you change it, change it everywhere.
Choosing a value:
• 400 (default) — comfortable on ordinary wired or good wireless networks, and unnoticeable for scheduled sounds, announcements and music.
• Raise it towards 800–1500 if a room stutters or drops out. That is almost always a busy or weak wireless link, and a bigger buffer is the correct fix for it.
• Lower it towards 150–250 only on a wired network, and only if the delay is genuinely a problem — for instance a live microphone where the operator can hear a distant speaker while talking.
Below about 150 ms on wireless you are asking every packet to arrive early every time, and the audible result of missing that deadline is a gap, which is far more noticeable than the delay you saved. (empty — falls back to InstanceName)
A label, and nothing more. It appears when the room joins or leaves, in the log on both ends, and wherever the sending device lists the rooms following it.
It has no effect on routing, on which sounds the room plays, or on anything else. Give rooms the names the building uses — Kitchen, Warehouse, Reception — so that a line in a log a year from now still tells you where something happened.
Left blank, the room uses its device name (InstanceName, 55), which is usually the right answer already.False · Takes effect on restart
Makes this device visible on the local network as something people can play music, a recording or a radio app to, straight from their own phone, tablet or computer — without touching the Multilarm.
It advertises itself using DLNA / UPnP AV, which is what Android's cast picker uses in many media apps, and what VLC, BubbleUPnP, foobar2000, Windows "Cast to Device", Kodi, Plex and most NAS media servers speak.
Where the sound sits. What arrives becomes the background sound — exactly the place the Virtual Radio occupies — so every rule you have already set still applies, with nothing new to learn: scheduled items and announcements duck it, priority interrupts it, the volume profile shapes it, and an emergency overrides it outright. A phone can never make the building quieter than the schedule intends. Casting and the radio want the same channel, so the most recent request wins, and the radio comes back when the cast stops.
What is deliberately not supported. AirPlay 2, Bluetooth A2DP and Spotify Connect. The first two have no implementation available that a proprietary product may use (and AirPlay additionally requires an Apple MFi licence); the third requires a commercial Spotify SDK licence. These are honest answers, not a roadmap. Where a phone must reach the speakers over Bluetooth, pair it with the operating system of the machine running Multilarm and take the audio in on the sound card's line input — Multilarm treats that as an ordinary input. (empty — falls back to InstanceName) · Takes effect on restart
What this device is called in someone's cast list.
Name it after the space it fills rather than the machine that fills it — Main Hall Speakers, Shop Floor, Playground — because the person choosing it is looking at the room, not at your equipment list.
Left blank it uses the device name (InstanceName, 55), which is often the right answer already.7453 · Takes effect on restart
The TCP port that serves the device description and the control and event endpoints a sender talks to.
Being found is a separate thing and uses the standard 1900/UDP, which is deliberately not configurable: a sender that cannot look on the standard port cannot find the device at all.
Change this only if something else on the machine already holds it. If a firewall sits between the phones and this device, this is the port to allow (along with 1900/UDP for discovery). A value outside the range falls back to the default. (empty — anyone on the network) · Takes effect on restart
Who is allowed to play sound through this device.
Be clear about what you are turning on. DLNA has no authentication of any kind. That is a fact about the standard, not a gap here: anyone who can reach the port can start audio in the building. On a home or a closed office network that is usually fine and is how every other DLNA speaker on the market behaves.
Where it is not fine, list the addresses that may send — either exactly:
192.168.1.50, 192.168.1.51
or as a prefix ending in a dot, meaning "everything in this range":
192.168.1.
Anything else is refused and the refusal is written to the log, so a phone that has stopped working tells you why.
If playing sound through the building genuinely needs to be an authenticated act, the honest answer is to leave CastEnabled off and use the Web Remote, which has accounts and passwords.False · Takes effect immediately
Turns on a small processing chain on each physical output: a level trim, up to eight tone filters, a delay, and a peak limiter, in that order.
This is what a separate rack DSP is normally bought for. It exists here because the three jobs it does are the three that decide whether a building's announcements are actually intelligible: correcting the speakers you have rather than the ones the room deserved, time-aligning a distant run so a word does not arrive twice, and holding peaks back so a horn is not driven past what it can take.
Off means untouched. Not “processed with neutral settings” — the chain is bypassed sample-for-sample, so an installation that never opens this section sounds exactly as it did before the feature existed.
Where it sits. The processing runs after the multi-room tap, so a room listening over a Multilarm link hears what this device played, not this device's amplifier correction and speaker delay. That is the whole point of per-output tuning: the correction belongs to the amplifier and the room it feeds, and travels with neither.
It shapes audio. It can never start, stop or silence anything — an emergency is unaffected by every setting here except its loudness. Multilarm is not fire-alarm equipment and is not certified to any fire-alarm standard.0 · Takes effect immediately
A fixed level adjustment on this output, in decibels, applied before everything else in the chain.
Use it to match outputs to each other, not to set the overall volume — that is what Volume (46) and the volume profile (48) are for. The usual case is a second amplifier that is simply louder than the first: trim the loud one down a few dB here and the two zones finally sound like one building.
Every 6 dB is roughly a halving or doubling of level. Boosting is available up to +24 dB, but boost gives the limiter and the ceiling more work to do; if you need a lot of it, the honest fix is at the amplifier's own gain control.type,frequency,gain,width, separated by semicolons. Blank = no tone shaping. (empty) · Takes effect immediately
The tone controls, written out. Each band is four values separated by commas, and bands are separated by semicolons:
type,frequency,gain,width
type — one of peak, lowshelf, highshelf, lowpass, highpass.lowpass and highpass, which cut rather than tilt.0.707 is the gentle, textbook default; 3 is narrow and surgical; 18 is a notch.
A worked example for speech through ceiling speakers:
highpass,120,0,0.707;peak,3150,4,1.2;highshelf,8000,-6,0.707
— drop the rumble the speakers cannot reproduce anyway, lift the consonant range that carries intelligibility, and take the hiss off the top.
These are the standard cookbook filters every measurement rig and every rack DSP implements, so a curve worked out on other equipment behaves here the way you expect.
A band the device cannot read is rejected in full, and the whole EQ is cleared rather than half-applied, with the reason written to the log. A typo that quietly leaves a high-pass off a 100 V line is the kind of fault that gets discovered by ear, in front of a room. (empty — no delay anywhere) · Takes effect immediately
Holds each output back by a set number of milliseconds so speakers at different distances reach a listener together.
The order is positional. The first entry is the main output (PlaybackDevice, 43); each entry after it lines up with the additional outputs (MirrorDevices, 45), in the order they are listed there. A short list is not an error — outputs it does not mention are simply not delayed.
0|35|70 — main output on time, the second output held 35 ms, the third 70 ms.
How much. Sound covers roughly a metre every 3 ms. A zone whose speakers sit 20 m further from the listener than the near ones needs about 60 ms on the near zone, not the far one — you delay the sound that would otherwise arrive first. Getting this right is the difference between a corridor that echoes every word and one that simply sounds loud.
Maximum 500 ms per output, which is far more than any building needs and is there for a video sync case rather than an acoustic one.False · Takes effect immediately
Catches peaks that would otherwise clip, and rides them down instead.
Why bother. A clipped waveform carries far more high-frequency energy than the music or speech it came from, and that energy goes into the tweeter or the horn driver as heat. Clipping is how compression drivers die. On a 100 V line feeding fixed installation speakers, a limiter is cheap insurance for hardware nobody wants to get a ladder out for.
It grabs quickly (about 1.5 ms) and lets go slowly, so one loud syllable does not duck the rest of the announcement behind it.
Measured on the bench, holding a 1 kHz tone 2.9 dB below its natural level, the added distortion is about 0.01 % THD — inaudible, and orders of magnitude below what clipping the same peak would produce.
A hard ceiling sits behind the limiter regardless of this setting, because a limiter is fast but not clairvoyant. When the ceiling has to act it is counted, not hidden, and shows in the diagnostics.-3 · Takes effect immediately
Where the ceiling sits, in decibels below full scale.
-3 leaves a little headroom and is the sensible default: it catches the genuine peaks and leaves everything else alone.-6 is a firm limit for a delicate speaker run or an amplifier you know is undersized.120 · Takes effect immediately
How long the limiter takes to let go once the loud passage has passed.
Short values (under about 50 ms) make the output sound louder and busier, and on speech they can pump audibly between words. Long values (over about 400 ms) sound smooth and unobtrusive but let the whole announcement sit quieter after a single bang.
120 suits speech and music alike and is why it is the default. This is the one control in this section worth leaving alone until something specifically bothers you about how the system sounds.True · Takes effect immediately
The Pronunciation Workbench (the device's own /pronunciations page) lists every unique word this system can say, marks the ones the neural voice is only guessing at, and lets you correct them.
Most of those words come from the schedule — TextData (20) and the announcement templates. But plenty of announcements are typed on the spot: a page from the dashboard, a message from the phone app, a line sent over MQTT. With this True, the words of those ad-hoc announcements are remembered too, so a name you keep having to announce turns up in the list instead of staying invisible.
Only the words are kept, in memory, capped at a few thousand and oldest-first — never the sentences, never the audio, and nothing is written to disk. Set it False if you would rather the list showed only what is in the configuration file.5 · Takes effect immediately
In the Workbench you can say a word into your phone or laptop and have the system work out how to pronounce it. Your recording is not played on air — it is only used as a target. Multilarm measures it, searches for pronunciations that sound like it, then synthesises the best ones in the Kokoro voice and ranks them against your recording. You pick the one that sounds right and it is saved as a normal dictionary entry.
This is how many readings you are offered to choose from. It is not a speed dial: measured on a Raspberry Pi 400, the same word took 30.7 s at 2 and 30.4 s at 10. The device always works up a shortlist of eight; this setting decides how many of them you see. Lowering it will not speed up a slow Pi. Raise it above 8 for an awkward name none of the first few gets right — those extra candidates really are worked out, and on a long word each one adds about 3½ seconds. On a short word it costs nothing and changes nothing: only a handful of sensible readings exist and you are already shown all of them.
5 is a good balance. Lower it on a Pi 3 or an appliance that is already busy; raise it for an awkward name that none of the first few candidates gets right.True · Takes effect immediately
The short recordings made in the Workbench — one word at a time, a second or two each — are kept on the device so it can work out how to say that word. They are training material, never announcement audio, and are never played through the speakers.
With this True, the cloud dashboard and the phone app can list those recordings, delete them, and send a new one for a word. That is what makes it possible to teach a word from your phone while standing in the hall, rather than having to be on the device's own network.
Set it False and the device refuses all three of those commands with a plain explanation. The Workbench on the local network still works exactly as before; only the off-site route is closed. The pronunciations themselves are dictionary text and are unaffected either way.;; the schedule is active if any rule matches.
m=1-6 (months), w=mo-fr (weekdays), d=1-15 (day of month),
nw=2mo (Nth weekday), ld (last day). Prefix with ! to exclude.