iobroker.laundrylens 0.4.30 → 0.4.31
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 +5 -0
- package/io-package.json +14 -14
- package/lib/washDataManager.js +15 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -132,6 +132,11 @@ This also works inside the conditional `[...]` blocks: `[🌡️ Outside: {state
|
|
|
132
132
|
|
|
133
133
|
### **WORK IN PROGRESS**
|
|
134
134
|
|
|
135
|
+
### 0.4.31 (2026-09-27)
|
|
136
|
+
- 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
|
+
- 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`)
|
|
138
|
+
- If you're seeing the stuck-state symptom right now: restarting the adapter clears it immediately without waiting for the next cycle to start
|
|
139
|
+
|
|
135
140
|
### 0.4.30 (2026-09-27)
|
|
136
141
|
- Fix: removed the `sinon` devDependency again - it's already provided transitively via `@iobroker/testing`, so listing it directly was flagged as redundant by the review checker (E0063)
|
|
137
142
|
- Fix: `tests/test_elapsed_time_unit.js`'s fake-adapter object (added in 0.4.29) made the same bare-global-timer mistake `test_restart_resume_low_power.js` had in 0.4.28 - reworked to use this suite's established native-setTimeout/setInterval alias pattern (E5004/E5005)
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "laundrylens",
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.31",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.4.31": {
|
|
7
|
+
"en": "Fix: a real bug report - 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 (which 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 but never notified the rest of the adapter about it - so the state/stateText/running/program/phase data points stayed frozen on their last value from before the drop, even though the live status the admin tab reads was already correct. Fixed by firing the same notification the normal end-of-cycle transition already fires. If you're seeing this right now, restarting the adapter clears the stuck values immediately without waiting for the next cycle.",
|
|
8
|
+
"de": "Fix: ein realer Fehlerbericht - der Admin-Tab zeigte den Trockner als aus an, waehrend der Status-Datenpunkt noch \"Running\" anzeigte. Ursache: der Anti-Knitter-Schnellabschluss des Trockners (der einen Zyklus 45 Sekunden nach einem ploetzlichen Leistungsabfall zwangsbeendet, um schneller zu reagieren als die volle Ausschaltverzoegerung abzuwarten) setzte den internen Status direkt auf aus, benachrichtigte aber nie den Rest des Adapters darueber - daher blieben die Datenpunkte state/stateText/running/program/phase auf ihrem letzten Wert vor dem Abfall eingefroren, obwohl der Live-Status, den der Admin-Tab liest, bereits korrekt war. Behoben, indem dieselbe Benachrichtigung ausgeloest wird, die der normale Zyklusende-Uebergang ohnehin schon ausloest. Wer das gerade sieht: ein Neustart des Adapters raeumt die haengengebliebenen Werte sofort auf, ohne auf den naechsten Zyklus warten zu muessen.",
|
|
9
|
+
"ru": "Исправление: реальный отчёт об ошибке - вкладка администратора показывала сушилку выключенной, тогда как датапоинт состояния всё ещё показывал \"Running\". Причина: путь быстрого завершения цикла сушилки при защите от сминания (\"power drop\" - принудительно завершает цикл через 45 секунд после резкого падения мощности, чтобы реагировать быстрее полной задержки отключения) устанавливал внутреннее состояние в off напрямую, но никогда не уведомлял остальную часть адаптера об этом - поэтому датапоинты state/stateText/running/program/phase оставались замороженными на последнем значении до падения, хотя живой статус, который читает вкладка администратора, уже был корректен. Исправлено вызовом того же уведомления, которое уже вызывает обычный переход в конце цикла. Если вы видите это прямо сейчас, перезапуск адаптера немедленно устраняет зависшие значения без ожидания следующего цикла.",
|
|
10
|
+
"pt": "Correcao: um relato real de bug - a aba de administracao mostrava a secadora como desligada enquanto o data point de estado ainda mostrava \"Running\". Causa raiz: o caminho de finalizacao rapida por queda de energia (anti-amarrotamento) da secadora (que forca o fim de um ciclo 45s apos uma queda subita de energia, para reagir mais rapido do que esperar o atraso total de desligamento) definia o estado interno como desligado diretamente, mas nunca notificava o restante do adaptador sobre isso - entao os data points state/stateText/running/program/phase ficavam congelados no ultimo valor antes da queda, mesmo que o status ao vivo lido pela aba de administracao ja estivesse correto. Corrigido disparando a mesma notificacao que a transicao normal de fim de ciclo ja dispara. Se voce esta vendo isso agora, reiniciar o adaptador limpa os valores presos imediatamente, sem esperar pelo proximo ciclo.",
|
|
11
|
+
"nl": "Fix: een echte bugmelding - het admin-tabblad toonde de droger als uit terwijl het state-datapoint nog \"Running\" liet zien. Oorzaak: het kreukbeschermings-\"stroomval\"-snelafsluitpad van de droger (dat een cyclus 45s na een plotselinge stroomval geforceerd beeindigt om sneller te reageren dan de volledige uitschakelvertraging) zette de interne status direct op uit, maar informeerde de rest van de adapter daar nooit over - waardoor de datapoints state/stateText/running/program/phase bevroren bleven op hun laatste waarde van voor de val, terwijl de live status die het admin-tabblad leest al correct was. Opgelost door dezelfde melding te versturen die de normale cyclus-einde-overgang al verstuurt. Zie je dit nu, dan lost een herstart van de adapter de vastzittende waarden meteen op, zonder op de volgende cyclus te hoeven wachten.",
|
|
12
|
+
"fr": "Correction : un vrai signalement de bug - l'onglet admin affichait le secheur comme eteint alors que le data point d'etat indiquait encore \"Running\". Cause : le chemin de fin rapide anti-froissage du secheur (qui force la fin d'un cycle 45s apres une chute soudaine de puissance, pour reagir plus vite que d'attendre le delai d'arret complet) mettait l'etat interne a off directement, mais ne notifiait jamais le reste de l'adaptateur - les data points state/stateText/running/program/phase restaient donc figes sur leur derniere valeur d'avant la chute, alors que le statut en direct lu par l'onglet admin etait deja correct. Corrige en declenchant la meme notification que la transition normale de fin de cycle declenche deja. Si vous voyez ce cas maintenant, redemarrer l'adaptateur efface immediatement les valeurs bloquees sans attendre le prochain cycle.",
|
|
13
|
+
"it": "Correzione: una segnalazione reale di bug - la scheda admin mostrava l'asciugatrice come spenta mentre il data point di stato mostrava ancora \"Running\". Causa: il percorso di chiusura rapida anti-piega dell'asciugatrice (che forza la fine di un ciclo 45s dopo un calo improvviso di potenza, per reagire piu velocemente rispetto ad attendere il ritardo di spegnimento completo) impostava lo stato interno su off direttamente, ma non notificava mai il resto dell'adattatore - quindi i data point state/stateText/running/program/phase restavano bloccati sull'ultimo valore prima del calo, anche se lo stato live letto dalla scheda admin era gia corretto. Risolto attivando la stessa notifica gia attivata dalla normale transizione di fine ciclo. Se lo state vedendo ora, riavviare l'adattatore risolve subito i valori bloccati senza attendere il ciclo successivo.",
|
|
14
|
+
"es": "Correccion: un informe real de error - la pestana de administracion mostraba la secadora como apagada mientras el data point de estado aun mostraba \"Running\". Causa raiz: el camino de finalizacion rapida anti-arrugas de la secadora (que fuerza el fin de un ciclo 45s despues de una caida repentina de potencia, para reaccionar mas rapido que esperar el retraso de apagado completo) establecia el estado interno en apagado directamente, pero nunca notificaba al resto del adaptador - por lo que los data points state/stateText/running/program/phase quedaban congelados en su ultimo valor antes de la caida, aunque el estado en vivo que lee la pestana de administracion ya era correcto. Corregido disparando la misma notificacion que ya dispara la transicion normal de fin de ciclo. Si esta viendo esto ahora mismo, reiniciar el adaptador limpia los valores atascados de inmediato, sin esperar al proximo ciclo.",
|
|
15
|
+
"pl": "Poprawka: prawdziwe zgloszenie bledu - zakladka administratora pokazywala suszarke jako wylaczona, podczas gdy datapoint stanu nadal pokazywal \"Running\". Przyczyna: sciezka szybkiego zakonczenia cyklu suszarki przy ochronie przed gnieceniem (\"power drop\" - wymusza zakonczenie cyklu 45s po nagłym spadku mocy, aby zareagowac szybciej niz czekajac na pelne opoznienie wylaczenia) ustawiala stan wewnetrzny na wylaczony bezposrednio, ale nigdy nie powiadamiala o tym reszty adaptera - dlatego datapointy state/stateText/running/program/phase pozostawaly zamrozone na ostatniej wartosci sprzed spadku, mimo ze status na zywo odczytywany przez zakladke administratora byl juz poprawny. Naprawiono, wywolujac to samo powiadomienie, ktore wywoluje juz normalne przejscie konca cyklu. Jesli widzisz to teraz, ponowne uruchomienie adaptera natychmiast czysci utkniete wartosci bez czekania na kolejny cykl.",
|
|
16
|
+
"uk": "Виправлення: реальне повідомлення про помилку - вкладка адміністратора показувала сушарку вимкненою, тоді як датапоінт стану все ще показував \"Running\". Причина: шлях швидкого завершення циклу сушарки при захисті від зминання (\"power drop\" - примусово завершує цикл через 45 секунд після різкого падіння потужності, щоб реагувати швидше за повне очікування затримки вимкнення) встановлював внутрішній стан на вимкнено напряму, але ніколи не повідомляв про це решту адаптера - тому датапоінти state/stateText/running/program/phase залишалися замороженими на останньому значенні до падіння, хоча живий статус, який читає вкладка адміністратора, вже був коректним. Виправлено викликом того самого сповіщення, яке вже викликає звичайний перехід у кінці циклу. Якщо ви бачите це зараз, перезапуск адаптера негайно очищує застряглі значення без очікування наступного циклу.",
|
|
17
|
+
"zh-cn": "修复:一个真实的问题反馈——管理标签页显示烘干机已关闭,但状态数据点仍显示「Running」。根本原因:烘干机的防皱「功率骤降」快速结束路径(在功率突然下降 45 秒后强制结束周期,以比等待完整关闭延迟更快地做出反应)直接将内存中的状态设为关闭,但从未通知适配器的其余部分——因此 state/stateText/running/program/phase 数据点一直冻结在骤降前的最后一个值,尽管管理标签页读取的实时状态早已正确。修复方法是触发与正常周期结束转换相同的通知。如果你现在正遇到这个问题,重启适配器即可立即清除卡住的值,无需等待下一个周期。"
|
|
18
|
+
},
|
|
6
19
|
"0.4.30": {
|
|
7
20
|
"en": "Fix: elapsedTime declares role \"value.interval\", which requires its value in seconds, but it was computed and stored in minutes everywhere (the state definition's unit, the one-time migration for existing installs, main.js's periodic update, and the live snapshot the admin tab reads via getStatus). All four now consistently use seconds, matching timeRemaining/totalDuration. Fix: removed the sinon devDependency again - it's already provided transitively via @iobroker/testing, so listing it directly was redundant (review checker E0063). Fix: a second test file's fake-adapter timers reworked to use this suite's established native-setTimeout/setInterval alias pattern (review checker E5004/E5005).",
|
|
8
21
|
"de": "Fix: elapsedTime deklariert die Rolle \"value.interval\", die einen Wert in Sekunden erfordert, wurde aber ueberall in Minuten berechnet und gespeichert (die unit der State-Definition, die einmalige Migration fuer bestehende Installationen, das periodische Update in main.js sowie der Live-Snapshot, den der Admin-Tab ueber getStatus liest). Alle vier Stellen nutzen jetzt konsistent Sekunden, passend zu timeRemaining/totalDuration. Fix: die devDependency sinon wieder entfernt - sie wird bereits transitiv ueber @iobroker/testing bereitgestellt, die direkte Auflistung war daher ueberfluessig (Review-Checker E0063). Fix: die Fake-Adapter-Timer einer weiteren Testdatei auf das in dieser Suite etablierte native-setTimeout/setInterval-Alias-Muster umgestellt (Review-Checker E5004/E5005).",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Poprawiono dokładność pozostałego czasu/postępu, zwłaszcza dla suszarki: każdy program uczy się teraz również, jak bardzo jego rzeczywisty czas trwania różni się między cyklami. Szacowanie pozostałego czasu opiera się teraz bardziej na bieżącym tempie zużycia energii dla programów o znanej dużej zmienności, a bardziej na historycznej średniej czasowej dla stabilnych programów. Wyświetlany procent postępu jest teraz wyprowadzany z tego samego oszacowania. Dodano limit pozostałego czasu dla krótkiej fazy \"chłodzenia\" suszarki, podobnie jak istniejący już limit dla fazy \"wirowania\" pralki.",
|
|
81
94
|
"uk": "Покращено точність залишкового часу/прогресу, особливо для сушарки: кожна програма тепер також вивчає, наскільки сильно її реальна тривалість насправді відрізняється від циклу до циклу. Оцінка залишкового часу тепер більше спирається на поточний темп споживання енергії для програм із відомою високою мінливістю та більше на історичне середнє значення для стабільних програм. Відображений відсоток прогресу тепер визначається на основі тієї самої оцінки. Додано обмеження залишкового часу для короткої фази \"охолодження\" сушарки, за аналогією з наявним обмеженням \"віджиму\" пральної машини.",
|
|
82
95
|
"zh-cn": "改进了剩余时间/进度的准确性,尤其是烘干机:现在每个程序还会学习其实际时长在各周期之间的真实波动程度(例如烘干时间在很大程度上取决于负载大小/湿度,因此天然比恒温洗涤波动更大)。对于已知波动较大的程序,剩余时间估算现在更多依赖实时能耗节奏;对于稳定的程序,则更多依赖历史平均时长。显示的进度百分比现在基于同一估算得出,因此不会再与预计完成时间相矛盾。新增了烘干机简短\"冷却\"阶段的剩余时间上限,与洗衣机现有的\"脱水\"阶段上限保持一致。"
|
|
83
|
-
},
|
|
84
|
-
"0.4.23": {
|
|
85
|
-
"en": "Fix: a cycle interrupted by an ioBroker restart while the device's power had already returned to idle was silently orphaned - it stayed stuck showing \"running\" (with stale pre-restart values) forever, since the on-startup restore logic only handled the case where power was still high at restart. Combined with the offDelayMin fix in 0.4.22, this should resolve \"cycle never ends\" reports after a mid/post-cycle adapter restart. If a cycle still gets stuck after this, please share the adapter log so any remaining cause can be found.",
|
|
86
|
-
"de": "Fix: Ein Zyklus, der durch einen ioBroker-Neustart unterbrochen wurde, während die Leistung des Geräts bereits wieder im Leerlauf war, wurde stillschweigend vergessen - er blieb für immer als „läuft\" hängen (mit veralteten Werten von vor dem Neustart), da die Wiederherstellungs-Logik beim Start nur den Fall behandelte, dass die Leistung beim Neustart noch hoch war. Zusammen mit dem offDelayMin-Fix aus 0.4.22 sollte das Meldungen von „Zyklus endet nie\" nach einem Adapter-Neustart mitten im oder nach einem Zyklus beheben. Falls ein Zyklus danach weiterhin hängen bleibt, bitte das Adapter-Log teilen.",
|
|
87
|
-
"ru": "Исправление: цикл, прерванный перезапуском ioBroker в момент, когда мощность устройства уже вернулась к простою, незаметно забывался - он навсегда оставался в состоянии «работает» (с устаревшими значениями до перезапуска), поскольку логика восстановления при запуске обрабатывала только случай, когда мощность при перезапуске всё ещё была высокой. В сочетании с исправлением offDelayMin из 0.4.22 это должно устранить сообщения о том, что «цикл никогда не завершается» после перезапуска адаптера.",
|
|
88
|
-
"pt": "Correção: um ciclo interrompido por uma reinicialização do ioBroker enquanto a energia do dispositivo já havia voltado ao repouso era silenciosamente esquecido - ficava preso mostrando \"em execução\" para sempre (com valores desatualizados de antes da reinicialização), já que a lógica de restauração na inicialização só tratava o caso em que a energia ainda estava alta na reinicialização. Combinado com a correção do offDelayMin na 0.4.22, isso deve resolver relatos de \"ciclo nunca termina\" após uma reinicialização do adaptador.",
|
|
89
|
-
"nl": "Fix: een cyclus die werd onderbroken door een herstart van ioBroker terwijl het vermogen van het apparaat al was teruggekeerd naar inactief, werd stilzwijgend vergeten - deze bleef voor altijd \"actief\" tonen (met verouderde waarden van vóór de herstart), omdat de herstellogica bij het opstarten alleen het geval afhandelde waarin het vermogen bij herstart nog hoog was. Samen met de offDelayMin-fix in 0.4.22 zou dit meldingen van \"cyclus eindigt nooit\" na een herstart van de adapter moeten oplossen.",
|
|
90
|
-
"fr": "Correction : un cycle interrompu par un redémarrage d'ioBroker alors que la puissance de l'appareil était déjà revenue au repos était silencieusement oublié - il restait bloqué indéfiniment sur « en cours » (avec des valeurs obsolètes d'avant le redémarrage), car la logique de restauration au démarrage ne traitait que le cas où la puissance était encore élevée au redémarrage. Combiné à la correction d'offDelayMin dans la 0.4.22, cela devrait résoudre les rapports de « cycle qui ne se termine jamais » après un redémarrage de l'adaptateur.",
|
|
91
|
-
"it": "Correzione: un ciclo interrotto da un riavvio di ioBroker mentre la potenza del dispositivo era già tornata inattiva veniva silenziosamente dimenticato - rimaneva bloccato mostrando \"in esecuzione\" per sempre (con valori obsoleti precedenti al riavvio), poiché la logica di ripristino all'avvio gestiva solo il caso in cui la potenza fosse ancora alta al riavvio. Combinato con la correzione di offDelayMin nella 0.4.22, questo dovrebbe risolvere le segnalazioni di \"il ciclo non termina mai\" dopo un riavvio dell'adattatore.",
|
|
92
|
-
"es": "Corrección: un ciclo interrumpido por un reinicio de ioBroker mientras la energía del dispositivo ya había vuelto al reposo se olvidaba silenciosamente - se quedaba atascado mostrando \"en ejecución\" para siempre (con valores obsoletos previos al reinicio), ya que la lógica de restauración al inicio solo manejaba el caso en que la energía seguía alta en el reinicio. Combinado con la corrección de offDelayMin en la 0.4.22, esto debería resolver los informes de \"el ciclo nunca termina\" tras un reinicio del adaptador.",
|
|
93
|
-
"pl": "Poprawka: cykl przerwany przez ponowne uruchomienie ioBroker, gdy moc urządzenia już wróciła do stanu bezczynności, był po cichu zapominany - pozostawał na zawsze zablokowany, pokazując \"działa\" (z nieaktualnymi wartościami sprzed ponownego uruchomienia), ponieważ logika przywracania przy starcie obsługiwała tylko przypadek, gdy moc była nadal wysoka przy restarcie. W połączeniu z poprawką offDelayMin w 0.4.22 powinno to rozwiązać zgłoszenia \"cykl nigdy się nie kończy\" po ponownym uruchomieniu adaptera.",
|
|
94
|
-
"uk": "Виправлення: цикл, перерваний перезапуском ioBroker, коли потужність пристрою вже повернулася до простою, непомітно забувався - він назавжди залишався у стані \"працює\" (із застарілими значеннями до перезапуску), оскільки логіка відновлення під час запуску обробляла лише випадок, коли потужність усе ще була високою під час перезапуску. У поєднанні з виправленням offDelayMin у 0.4.22 це має вирішити повідомлення про те, що \"цикл ніколи не завершується\" після перезапуску адаптера.",
|
|
95
|
-
"zh-cn": "修复:当设备功率已恢复到空闲状态时,因 ioBroker 重启而中断的周期会被静默遗忘——它会永远卡在\"运行中\"状态(显示重启前的过期数值),因为启动时的恢复逻辑此前只处理了重启时功率仍然较高的情况。结合 0.4.22 中的 offDelayMin 修复,这应该能解决适配器重启后\"周期永不结束\"的问题。"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
package/lib/washDataManager.js
CHANGED
|
@@ -442,6 +442,21 @@ class WashDataManager {
|
|
|
442
442
|
this.detector.powerTrace = savedTrace;
|
|
443
443
|
this._onCycleFinished(eventData);
|
|
444
444
|
this.detector.powerTrace = [];
|
|
445
|
+
// This finish path bypasses the normal _onDetectorState()
|
|
446
|
+
// OFF transition entirely, so without this the
|
|
447
|
+
// onStateChange callback (which writes the state/
|
|
448
|
+
// stateText/running/program/phase data points in
|
|
449
|
+
// main.js's _onManagerState()) never fires here - the
|
|
450
|
+
// live in-memory state flips to "off" correctly (visible
|
|
451
|
+
// in the admin tab's real-time view), but the persisted
|
|
452
|
+
// state data point stays stuck on whatever it showed
|
|
453
|
+
// during the cycle ("running") until the next cycle
|
|
454
|
+
// starts. Found from a real report: admin tab showed the
|
|
455
|
+
// dryer as off while the state data point still read
|
|
456
|
+
// "Running".
|
|
457
|
+
if (typeof this.callbacks.onStateChange === "function") {
|
|
458
|
+
this.callbacks.onStateChange("off", this._buildStatus());
|
|
459
|
+
}
|
|
445
460
|
}, 45000);
|
|
446
461
|
return;
|
|
447
462
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.laundrylens",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.31",
|
|
4
4
|
"description": "ioBroker adapter that detects washing machine and dryer cycles via smart plug power measurement, matches them against learned programs and estimates remaining time",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "backfisch88",
|