iobroker.laundrylens 0.4.31 → 0.4.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -132,6 +132,19 @@ This also works inside the conditional `[...]` blocks: `[🌡️ Outside: {state
132
132
 
133
133
  ### **WORK IN PROGRESS**
134
134
 
135
+ ### 0.4.33 (2026-10-02)
136
+ - Fix: reported live with logs + a screenshot - a brand new cycle could show a leftover best-candidate guess from the *previous*, already-finished cycle for several minutes (e.g. "~30 Speed (76%)" right at the start of a new washing-machine cycle, matching exactly what the previous cycle had matched), before that new cycle's own matching had run even once. Root cause: `_onDetectorState()`'s `STARTING` case reset about a dozen per-cycle fields but not `_bestCandidate`, the field driving both the admin tab's live preview and, at the next confirmed transition, the persisted `program`/`programText`/`confidence` data points. The `STARTING` transition is now the single, authoritative reset point for every per-cycle field (also added the phase-tracking fields as defensive redundancy) - a new cycle can no longer show anything left over from the one before it
137
+ - Fix: `cycleProgress` stayed stuck at its last value (often 100%) after a cycle finished, instead of resetting to 0. The reset call reused `_onTime()`, which has a guard that only writes `cycleProgress` when `progressPct > 0` (meant to ignore a brief non-match mid-cycle) - the deliberate reset-to-0 call was silently swallowed by that same guard. `_onTime()` now takes a `forceWrite` parameter that the reset call uses to bypass the guard
138
+ - Fix: an uncaught exception during cycle-finish post-processing (notably the post-hoc phase analysis that only washing machines/dishwashers run, more complex than the dryer's live phase tracking) could silently skip the `onStateChange` callback that keeps the `state`/`stateText`/`running`/`program`/`phase` data points in sync - the same class of bug as 0.4.31's dryer-specific case, but for any device type and any exception source. Now guarded with try/catch so a failure in post-processing can never block the state-sync callback
139
+ - New option **"Show probable program before confirmation"**: off by default (unchanged behavior - `program`/`programText` show `"detecting..."` until a match is actually confirmed). When enabled, a live best-candidate guess reaching at least 40% confidence is shown immediately, prefixed with `"≈"` (e.g. `"≈ 30 Speed"`), updated continuously as confidence changes - not just the admin tab's own preview anymore, but the actual data points too
140
+ - New option **"Text data points without emoji"**: off by default. When enabled, `phaseText`/`stateText` omit their emoji (e.g. `"Washing"` instead of `"🫧 Washing"`) - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully
141
+ - All four issues found via a live report (screenshots + debug logs) and fixed with full regression test coverage, including reverting each fix and confirming its test fails first
142
+
143
+ ### 0.4.32 (2026-09-27)
144
+ - Fix: follow-up to 0.4.31 - a restart alone did not clear an *already*-stale `state` data point (e.g. stuck on "Running"), even with 0.4.31 installed. `onReady()` only re-wrote the `state`/`stateText`/`running`/`program`/`phase` data points when a restore branch fired (sensor currently drawing power, or a saved cycle needs resuming/finishing) - with neither true (the common case: an idle device whose last cycle already finished cleanly), nothing touched them at all, so a stale leftover value would survive any number of restarts
145
+ - Fixed by unconditionally re-syncing these data points with the manager's actual resolved state (`manager.currentState`/`manager.getStatus()`) at the end of every device's startup, regardless of which restore branch fired or didn't. Covered by a new source-inspection regression test (`tests/test_startup_state_sync.js`); also re-ran the full js-controller integration test since this touches `onReady()`
146
+ - If you're still seeing a stuck status after installing 0.4.31: this release should finally clear it on the next restart
147
+
135
148
  ### 0.4.31 (2026-09-27)
136
149
  - Fix: reported live - the admin tab showed the dryer as off while the `state` data point still read "Running". Root cause: the dryer's anti-crease "power drop" quick-finish path (`WashDataManager.processPowerReading()` - force-ends a cycle 45s after a sudden power drop, to react faster than waiting for the full off-delay) set the in-memory state to `off` directly and called the internal `_onCycleFinished()`, but - unlike the normal `_onDetectorState()` OFF transition - never invoked the `onStateChange` callback afterwards. That callback is what `main.js`'s `_onManagerState()` uses to write the `state`/`stateText`/`running`/`program`/`programText`/`phase`/`phaseText` data points, so they stayed frozen on their last value from before the drop even though the live status the admin tab reads (`WashDataManager._buildStatus()` via `getStatus`) was already correct. `lastCycle`/`lastCycleProgram`/etc. were unaffected (a separate callback), which is why cycle history looked fine while only the live status data points were stuck
137
150
  - Fixed by firing `onStateChange` after the quick-finish, exactly as the normal end-of-cycle transition already does. Covered by a new regression test (`tests/test_dryer_drop_finish_state_callback.js`)
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} fertig!\n⏱️ Gesamtlaufzeit: {duration} min\n📊 Programm: {program}\n⚡ Verbrauch: {energy} kWh",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} läuft\n⏳ Zeit wird ermittelt…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} Update\n✅ Fertig um {endTime} Uhr\n[↩️ Vorher: {prevTime}]\n📊 Programm: {program}\n📈 Fortschritt: {progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} Update\n✅ Fertig um {endTime} Uhr\n📊 Programm: {program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} Update\n✅ Fertig um {endTime} Uhr\n📊 Programm: {program}",
217
+ "Show probable program before confirmation": "Wahrscheinliches Programm vor Bestätigung anzeigen",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "AUS (Standard): Die Datenpunkte program/programText zeigen \"detecting...\", bis ein Treffer tatsächlich bestätigt ist. EIN: Sobald eine Live-Vermutung mindestens 40% Konfidenz erreicht, wird sie sofort mit dem Präfix \"≈\" angezeigt (z. B. \"≈ 30 Speed\") - fortlaufend aktualisiert, nicht erst nach Bestätigung.",
219
+ "Text data points without emoji": "Text-Datenpunkte ohne Emoji",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "AUS (Standard): Die Datenpunkte phaseText/stateText enthalten ein voran-/nachgestelltes Emoji (z. B. \"🫧 Washing\", \"Läuft ⚙️\"). EIN: Das Emoji wird weggelassen - nützlich für Dashboards, Sprachausgabe oder überall, wo Emoji nicht sinnvoll dargestellt werden."
217
221
  }
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} running\n⏳ Determining time…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}",
217
+ "Show probable program before confirmation": "Show probable program before confirmation",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.",
219
+ "Text data points without emoji": "Text data points without emoji",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully."
217
221
  }
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} listo!\n⏱️ Duración total: {duration} min\n📊 Programa: {program}\n⚡ Consumo: {energy} kWh",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} en marcha\n⏳ Determinando el tiempo…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} actualización\n✅ Listo a las {endTime}\n[↩️ Antes: {prevTime}]\n📊 Programa: {program}\n📈 Progreso: {progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} actualización\n✅ Listo a las {endTime}\n📊 Programa: {program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} actualización\n✅ Listo a las {endTime}\n📊 Programa: {program}",
217
+ "Show probable program before confirmation": "Mostrar programa probable antes de la confirmación",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "APAGADO (predeterminado): los data points program/programText muestran \"detecting...\" hasta que una coincidencia se confirma realmente. ENCENDIDO: en cuanto una estimación en vivo del mejor candidato alcanza al menos un 40% de confianza, se muestra de inmediato, precedida de \"≈\" (p. ej. \"≈ 30 Speed\") - actualizada continuamente a medida que cambia la confianza, no solo una vez confirmada.",
219
+ "Text data points without emoji": "Data points de texto sin emoji",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "APAGADO (predeterminado): los data points phaseText/stateText incluyen un emoji al inicio/final (p. ej. \"🫧 Washing\", \"Running ⚙️\"). ENCENDIDO: se omite el emoji - útil para paneles, texto a voz, o donde los emoji no se muestren de forma útil."
217
221
  }
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} terminé !\n⏱️ Durée totale : {duration} min\n📊 Programme : {program}\n⚡ Consommation : {energy} kWh",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} en marche\n⏳ Détermination du temps…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} mise à jour\n✅ Terminé à {endTime}\n[↩️ Avant : {prevTime}]\n📊 Programme : {program}\n📈 Progression : {progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} mise à jour\n✅ Terminé à {endTime}\n📊 Programme : {program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} mise à jour\n✅ Terminé à {endTime}\n📊 Programme : {program}",
217
+ "Show probable program before confirmation": "Afficher le programme probable avant confirmation",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "DÉSACTIVÉ (par défaut) : les points de données program/programText affichent \"detecting...\" jusqu'à ce qu'une correspondance soit réellement confirmée. ACTIVÉ : dès qu'une estimation du meilleur candidat en direct atteint au moins 40 % de confiance, elle est affichée immédiatement, précédée de \"≈\" (ex. \"≈ 30 Speed\") - mise à jour en continu à mesure que la confiance évolue, pas seulement une fois confirmée.",
219
+ "Text data points without emoji": "Points de données texte sans emoji",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "DÉSACTIVÉ (par défaut) : les points de données phaseText/stateText incluent un emoji en début/fin (ex. \"🫧 Washing\", \"Running ⚙️\"). ACTIVÉ : l'emoji est omis - utile pour les tableaux de bord, la synthèse vocale, ou partout où les emoji ne s'affichent pas utilement."
217
221
  }
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} completato!\n⏱️ Durata totale: {duration} min\n📊 Programma: {program}\n⚡ Consumo: {energy} kWh",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} in funzione\n⏳ Determinazione del tempo…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} aggiornamento\n✅ Completato alle {endTime}\n[↩️ Prima: {prevTime}]\n📊 Programma: {program}\n📈 Avanzamento: {progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} aggiornamento\n✅ Completato alle {endTime}\n📊 Programma: {program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} aggiornamento\n✅ Completato alle {endTime}\n📊 Programma: {program}",
217
+ "Show probable program before confirmation": "Mostra il programma probabile prima della conferma",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "OFF (predefinito): i data point program/programText mostrano \"detecting...\" finché una corrispondenza non viene effettivamente confermata. ON: non appena una stima del miglior candidato in tempo reale raggiunge almeno il 40% di confidenza, viene mostrata subito, preceduta da \"≈\" (es. \"≈ 30 Speed\") - aggiornata continuamente al variare della confidenza, non solo una volta confermata.",
219
+ "Text data points without emoji": "Data point di testo senza emoji",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "OFF (predefinito): i data point phaseText/stateText includono un'emoji iniziale/finale (es. \"🫧 Washing\", \"Running ⚙️\"). ON: l'emoji viene omessa - utile per dashboard, sintesi vocale, o ovunque le emoji non vengano rese in modo utile."
217
221
  }
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} klaar!\n⏱️ Totale looptijd: {duration} min\n📊 Programma: {program}\n⚡ Verbruik: {energy} kWh",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} actief\n⏳ Tijd wordt bepaald…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} update\n✅ Klaar om {endTime}\n[↩️ Voorheen: {prevTime}]\n📊 Programma: {program}\n📈 Voortgang: {progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} update\n✅ Klaar om {endTime}\n📊 Programma: {program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} update\n✅ Klaar om {endTime}\n📊 Programma: {program}",
217
+ "Show probable program before confirmation": "Waarschijnlijk programma tonen voor bevestiging",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "UIT (standaard): de datapoints program/programText tonen \"detecting...\" totdat een match daadwerkelijk is bevestigd. AAN: zodra een live beste-kandidaat-gok minstens 40% betrouwbaarheid bereikt, wordt deze direct getoond, voorafgegaan door \"≈\" (bijv. \"≈ 30 Speed\") - continu bijgewerkt naarmate de betrouwbaarheid verandert, niet pas na bevestiging.",
219
+ "Text data points without emoji": "Tekst-datapoints zonder emoji",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "UIT (standaard): de datapoints phaseText/stateText bevatten een emoji aan het begin/einde (bijv. \"🫧 Washing\", \"Running ⚙️\"). AAN: de emoji wordt weggelaten - handig voor dashboards, tekst-naar-spraak, of overal waar emoji niet nuttig worden weergegeven."
217
221
  }
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} gotowe!\n⏱️ Całkowity czas: {duration} min\n📊 Program: {program}\n⚡ Zużycie: {energy} kWh",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} działa\n⏳ Określanie czasu…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} aktualizacja\n✅ Gotowe o {endTime}\n[↩️ Wcześniej: {prevTime}]\n📊 Program: {program}\n📈 Postęp: {progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} aktualizacja\n✅ Gotowe o {endTime}\n📊 Program: {program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} aktualizacja\n✅ Gotowe o {endTime}\n📊 Program: {program}",
217
+ "Show probable program before confirmation": "Pokaż prawdopodobny program przed potwierdzeniem",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "WYŁ. (domyślnie): datapointy program/programText pokazują \"detecting...\", dopóki dopasowanie nie zostanie faktycznie potwierdzone. WŁ.: gdy tylko aktualne przypuszczenie najlepszego kandydata osiągnie co najmniej 40% pewności, jest natychmiast pokazywane z przedrostkiem \"≈\" (np. \"≈ 30 Speed\") - aktualizowane na bieżąco wraz ze zmianą pewności, a nie dopiero po potwierdzeniu.",
219
+ "Text data points without emoji": "Datapointy tekstowe bez emoji",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "WYŁ. (domyślnie): datapointy phaseText/stateText zawierają emoji na początku/końcu (np. \"🫧 Washing\", \"Running ⚙️\"). WŁ.: emoji jest pomijane - przydatne w dashboardach, syntezie mowy lub wszędzie tam, gdzie emoji nie są sensownie wyświetlane."
217
221
  }
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} concluído!\n⏱️ Duração total: {duration} min\n📊 Programa: {program}\n⚡ Consumo: {energy} kWh",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} em funcionamento\n⏳ Determinando o tempo…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} atualização\n✅ Concluído às {endTime}\n[↩️ Antes: {prevTime}]\n📊 Programa: {program}\n📈 Progresso: {progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} atualização\n✅ Concluído às {endTime}\n📊 Programa: {program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} atualização\n✅ Concluído às {endTime}\n📊 Programa: {program}",
217
+ "Show probable program before confirmation": "Mostrar programa provável antes da confirmação",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "DESLIGADO (padrão): os data points program/programText mostram \"detecting...\" até que uma correspondência seja realmente confirmada. LIGADO: assim que um palpite de melhor candidato ao vivo atingir ao menos 40% de confiança, ele é mostrado imediatamente, prefixado com \"≈\" (ex. \"≈ 30 Speed\") - atualizado continuamente conforme a confiança muda, não apenas quando confirmado.",
219
+ "Text data points without emoji": "Data points de texto sem emoji",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "DESLIGADO (padrão): os data points phaseText/stateText incluem um emoji no início/fim (ex. \"🫧 Washing\", \"Running ⚙️\"). LIGADO: o emoji é omitido - útil para painéis, texto para fala, ou onde os emojis não sejam renderizados de forma útil."
217
221
  }
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} готово!\n⏱️ Общее время: {duration} мин\n📊 Программа: {program}\n⚡ Потребление: {energy} кВтч",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} работает\n⏳ Определение времени…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} обновление\n✅ Готово в {endTime}\n[↩️ Ранее: {prevTime}]\n📊 Программа: {program}\n📈 Прогресс: {progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} обновление\n✅ Готово в {endTime}\n📊 Программа: {program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} обновление\n✅ Готово в {endTime}\n📊 Программа: {program}",
217
+ "Show probable program before confirmation": "Показывать вероятную программу до подтверждения",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "ВЫКЛ (по умолчанию): датапоинты program/programText показывают \"detecting...\", пока совпадение не подтверждено. ВКЛ: как только текущая наиболее вероятная догадка достигает минимум 40% уверенности, она сразу показывается с префиксом \"≈\" (например, \"≈ 30 Speed\") - обновляется непрерывно, а не только после подтверждения.",
219
+ "Text data points without emoji": "Текстовые датапоинты без эмодзи",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "ВЫКЛ (по умолчанию): датапоинты phaseText/stateText содержат эмодзи в начале/конце (например, \"🫧 Washing\", \"Running ⚙️\"). ВКЛ: эмодзи опускается - полезно для дашбордов, синтеза речи или везде, где эмодзи не отображаются корректно."
217
221
  }
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} готово!\n⏱️ Загальний час: {duration} хв\n📊 Програма: {program}\n⚡ Споживання: {energy} кВтгод",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} працює\n⏳ Визначення часу…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} оновлення\n✅ Готово о {endTime}\n[↩️ Раніше: {prevTime}]\n📊 Програма: {program}\n📈 Прогрес: {progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} оновлення\n✅ Готово о {endTime}\n📊 Програма: {program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} оновлення\n✅ Готово о {endTime}\n📊 Програма: {program}",
217
+ "Show probable program before confirmation": "Показувати ймовірну програму до підтвердження",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "ВИМК (за замовчуванням): датапоінти program/programText показують \"detecting...\", поки збіг не буде дійсно підтверджено. УВІМК: щойно поточне припущення найкращого кандидата досягає принаймні 40% впевненості, воно одразу показується з префіксом \"≈\" (наприклад, \"≈ 30 Speed\") - оновлюється безперервно зі зміною впевненості, а не лише після підтвердження.",
219
+ "Text data points without emoji": "Текстові датапоінти без емодзі",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "ВИМК (за замовчуванням): датапоінти phaseText/stateText містять емодзі на початку/в кінці (наприклад, \"🫧 Washing\", \"Running ⚙️\"). УВІМК: емодзі опускається - корисно для дашбордів, синтезу мовлення або будь-де, де емодзі не відображаються коректно."
217
221
  }
@@ -213,5 +213,9 @@
213
213
  "🧺 {device} done!\n⏱️ Total runtime: {duration} min\n📊 Program: {program}\n⚡ Consumption: {energy} kWh": "🧺 {device} 完成!\n⏱️ 总运行时间:{duration} 分钟\n📊 程序:{program}\n⚡ 消耗:{energy} 千瓦时",
214
214
  "🧺 {device} running\n⏳ Determining time…": "🧺 {device} 运行中\n⏳ 正在确定时间…",
215
215
  "🧺 {device} update\n✅ Done at {endTime}\n[↩️ Before: {prevTime}]\n📊 Program: {program}\n📈 Progress: {progress}%": "🧺 {device} 更新\n✅ 完成于 {endTime}\n[↩️ 之前:{prevTime}]\n📊 程序:{program}\n📈 进度:{progress}%",
216
- "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} 更新\n✅ 完成于 {endTime}\n📊 程序:{program}"
216
+ "🧺 {device} update\n✅ Done at {endTime}\n📊 Program: {program}": "🧺 {device} 更新\n✅ 完成于 {endTime}\n📊 程序:{program}",
217
+ "Show probable program before confirmation": "确认前显示可能的程序",
218
+ "OFF (default): the program/programText data points show \"detecting...\" until a match is actually confirmed. ON: as soon as a live best-candidate guess reaches at least 40% confidence, it is shown immediately, prefixed with \"≈\" (e.g. \"≈ 30 Speed\") - updated continuously as matching confidence changes, not just once confirmed.": "关闭(默认):在真正确认匹配之前,program/programText 数据点显示「detecting...」。开启:一旦实时的最佳候选猜测达到至少 40% 的置信度,就会立即显示,并带有「≈」前缀(例如「≈ 30 Speed」)——随着置信度变化持续更新,而不仅仅是在确认后才显示。",
219
+ "Text data points without emoji": "文本数据点不含表情符号",
220
+ "OFF (default): the phaseText/stateText data points include a leading/trailing emoji (e.g. \"🫧 Washing\", \"Running ⚙️\"). ON: the emoji is omitted - useful for dashboards, text-to-speech, or anywhere emoji don't render usefully.": "关闭(默认):phaseText/stateText 数据点包含前置/后置表情符号(例如「🫧 Washing」「Running ⚙️」)。开启:省略表情符号——适用于仪表盘、文本转语音,或任何表情符号无法正常显示的场景。"
217
221
  }