iobroker.laundrylens 0.4.17 → 0.4.19

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,14 @@ This also works inside the conditional `[...]` blocks: `[🌡️ Outside: {state
132
132
 
133
133
  ### **WORK IN PROGRESS**
134
134
 
135
+ ### 0.4.19 (2026-09-05)
136
+ - Fix: use `node:`-prefixed built-in module imports (`node:fs`, `node:path`) consistently everywhere (`lib/displayLabels.js`, `test/integration.js`, `test/package.js`), not just in `main.js`
137
+ - Fix: updated `@iobroker/adapter-core` to the currently required minimum version (3.4.3)
138
+ - Fix: three incomplete Dutch/Polish/Ukrainian changelog translations for 0.4.12 that were noticeably shorter than the English original
139
+
140
+ ### 0.4.18 (2026-09-02)
141
+ - Fix: the dryer anti-crease lock period (learned duration + a fixed 10-minute buffer) could expire while the dryer was still genuinely doing its anti-crease tumbling - real anti-crease duration varies cycle to cycle, so a fixed length occasionally ran out mid-tumble, letting the tail end trigger a false new-cycle detection. The lock now extends when a genuine tumble spike occurs near its expiry, capped at 90 minutes total from the beep
142
+
135
143
  ### 0.4.17 (2026-08-31)
136
144
  - New: `phaseText`, `stateText`, `programText` data points - localized, ready-to-display versions of the existing language-neutral `phase`/`state`/`program`, useful for a VIS dashboard without building your own translation table
137
145
  - New: "Display language" setting per device (defaults to the ioBroker system language)
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "laundrylens",
4
- "version": "0.4.17",
4
+ "version": "0.4.19",
5
5
  "news": {
6
+ "0.4.19": {
7
+ "en": "Fix: use node: prefixed built-in module imports (node:fs, node:path) consistently everywhere, not just in main.js. Updated @iobroker/adapter-core to the currently required minimum version. Corrected three incomplete Dutch/Polish/Ukrainian changelog translations for 0.4.12 that were noticeably shorter than the English original.",
8
+ "de": "Fix: node:-Präfix für eingebaute Node.js-Module (node:fs, node:path) jetzt konsequent überall verwendet, nicht nur in main.js. @iobroker/adapter-core auf die aktuell benötigte Mindestversion angehoben. Drei unvollständige niederländische/polnische/ukrainische Changelog-Übersetzungen für 0.4.12 korrigiert, die merklich kürzer als das englische Original waren.",
9
+ "ru": "Исправление: везде последовательно используются встроенные модули с префиксом node: (node:fs, node:path), а не только в main.js. Обновлён @iobroker/adapter-core до требуемой минимальной версии. Исправлены три неполных перевода changelog для 0.4.12 (нидерландский, польский, украинский), которые были заметно короче английского оригинала.",
10
+ "pt": "Correção: uso consistente de módulos internos com prefixo node: (node:fs, node:path) em todos os lugares, não só no main.js. @iobroker/adapter-core atualizado para a versão mínima atualmente exigida. Corrigidas três traduções incompletas do changelog (neerlandês/polonês/ucraniano) da 0.4.12, notavelmente mais curtas que o original em inglês.",
11
+ "nl": "Fix: overal consequent node:-voorvoegsel gebruikt voor ingebouwde Node.js-modules (node:fs, node:path), niet alleen in main.js. @iobroker/adapter-core bijgewerkt naar de momenteel vereiste minimumversie. Drie onvolledige changelog-vertalingen (Nederlands/Pools/Oekraïens) voor 0.4.12 gecorrigeerd, die merkbaar korter waren dan het Engelse origineel.",
12
+ "fr": "Correction : utilisation cohérente du préfixe node: pour les modules intégrés (node:fs, node:path) partout, pas seulement dans main.js. @iobroker/adapter-core mis à jour vers la version minimale actuellement requise. Correction de trois traductions incomplètes du changelog (néerlandais/polonais/ukrainien) pour la 0.4.12, nettement plus courtes que l'original anglais.",
13
+ "it": "Correzione: uso coerente del prefisso node: per i moduli integrati (node:fs, node:path) ovunque, non solo in main.js. @iobroker/adapter-core aggiornato alla versione minima attualmente richiesta. Corrette tre traduzioni incomplete del changelog (olandese/polacco/ucraino) per la 0.4.12, notevolmente più brevi dell'originale inglese.",
14
+ "es": "Corrección: uso consistente del prefijo node: para módulos integrados (node:fs, node:path) en todas partes, no solo en main.js. @iobroker/adapter-core actualizado a la versión mínima actualmente requerida. Corregidas tres traducciones incompletas del changelog (neerlandés/polaco/ucraniano) de la 0.4.12, notablemente más cortas que el original en inglés.",
15
+ "pl": "Poprawka: konsekwentne używanie prefiksu node: dla wbudowanych modułów (node:fs, node:path) wszędzie, nie tylko w main.js. Zaktualizowano @iobroker/adapter-core do aktualnie wymaganej minimalnej wersji. Poprawiono trzy niekompletne tłumaczenia dziennika zmian (niderlandzkie/polskie/ukraińskie) dla 0.4.12, które były wyraźnie krótsze niż oryginał angielski.",
16
+ "uk": "Виправлення: послідовне використання префікса node: для вбудованих модулів (node:fs, node:path) скрізь, а не лише в main.js. Оновлено @iobroker/adapter-core до поточної необхідної мінімальної версії. Виправлено три неповні переклади журналу змін (нідерландська/польська/українська) для 0.4.12, які були помітно коротшими за англійський оригінал.",
17
+ "zh-cn": "修复:在所有位置(不仅是 main.js)统一使用带 node: 前缀的内置模块引用(node:fs、node:path)。已将 @iobroker/adapter-core 更新到当前所需的最低版本。修正了 0.4.12 中三处明显短于英文原文的荷兰语/波兰语/乌克兰语更新日志翻译。"
18
+ },
19
+ "0.4.18": {
20
+ "en": "Fix: the dryer anti-crease lock period (which prevents anti-crease tumbling after the beep from being mistaken for a new cycle) had a fixed length - learned duration plus a 10-minute buffer. Real anti-crease duration varies cycle to cycle, so the lock could occasionally expire while the dryer was still genuinely tumbling, letting the tail end trigger a false new-cycle detection. The lock is now adaptive: a genuine anti-crease tumble spike extends it further, capped at 90 minutes total from the beep.",
21
+ "de": "Fix: Die Anti-Knitter-Sperrzeit beim Trockner (verhindert, dass Nachlauf-Tummeln nach dem Piepton als neuer Zyklus fehlinterpretiert wird) hatte eine feste Länge - gelernte Dauer plus 10 Minuten Puffer. Die reale Anti-Knitter-Dauer variiert von Zyklus zu Zyklus, wodurch die Sperre gelegentlich ablaufen konnte, während der Trockner noch tatsächlich tummelte, sodass das Ende fälschlich als neuer Zyklus erkannt wurde. Die Sperre ist jetzt adaptiv: Ein echter Tummel-Spike verlängert sie weiter, insgesamt begrenzt auf 90 Minuten ab dem Piepton.",
22
+ "ru": "Исправление: период блокировки защиты от сминания у сушильной машины (предотвращает ошибочное распознавание остаточного вращения после сигнала как нового цикла) имел фиксированную длину - изученная длительность плюс 10-минутный буфер. Реальная длительность варьируется от цикла к циклу, поэтому блокировка иногда истекала, пока сушилка ещё действительно вращалась. Теперь блокировка адаптивная: настоящий всплеск вращения продлевает её, максимум 90 минут от сигнала.",
23
+ "pt": "Correção: o período de bloqueio anti-amarrotamento da secadora (evita que o movimento residual após o sinal seja confundido com um novo ciclo) tinha duração fixa - duração aprendida mais um buffer de 10 minutos. A duração real varia de ciclo para ciclo, então o bloqueio podia expirar enquanto a secadora ainda estava girando de verdade. Agora o bloqueio é adaptativo: um pico genuíno de movimento o estende, limitado a 90 minutos no total desde o sinal.",
24
+ "nl": "Fix: de anti-kreukvergrendelingsperiode van de droger (voorkomt dat na-tuimelen na de piep als nieuwe cyclus wordt gezien) had een vaste lengte - geleerde duur plus 10 minuten buffer. De echte duur varieert per cyclus, waardoor de vergrendeling soms afliep terwijl de droger nog echt aan het tuimelen was. De vergrendeling is nu adaptief: een echte tuimelpiek verlengt hem verder, met een maximum van 90 minuten vanaf de piep.",
25
+ "fr": "Correction : la période de verrouillage anti-froissage du sèche-linge (empêche que le mouvement résiduel après le bip soit confondu avec un nouveau cycle) avait une durée fixe - durée apprise plus un tampon de 10 minutes. La durée réelle varie d'un cycle à l'autre, le verrouillage pouvait donc parfois expirer alors que le sèche-linge tournait encore réellement. Le verrouillage est désormais adaptatif : un vrai pic de mouvement le prolonge, plafonné à 90 minutes au total depuis le bip.",
26
+ "it": "Correzione: il periodo di blocco anti-piega dell'asciugatrice (evita che il movimento residuo dopo il segnale venga scambiato per un nuovo ciclo) aveva una durata fissa - durata appresa più un buffer di 10 minuti. La durata reale varia da ciclo a ciclo, quindi il blocco poteva scadere mentre l'asciugatrice stava ancora davvero girando. Ora il blocco è adattivo: un vero picco di movimento lo estende, con un limite massimo di 90 minuti totali dal segnale.",
27
+ "es": "Corrección: el período de bloqueo antiarrugas de la secadora (evita que el movimiento residual tras el pitido se confunda con un nuevo ciclo) tenía una duración fija - duración aprendida más un margen de 10 minutos. La duración real varía de un ciclo a otro, por lo que el bloqueo podía expirar mientras la secadora aún seguía girando realmente. Ahora el bloqueo es adaptativo: un pico genuino de movimiento lo extiende, con un límite máximo de 90 minutos desde el pitido.",
28
+ "pl": "Poprawka: okres blokady ochrony przed gnieceniem w suszarce (zapobiega myleniu doczesywania po sygnale z nowym cyklem) miał stały czas trwania - wyuczony czas plus 10-minutowy bufor. Rzeczywisty czas różni się między cyklami, więc blokada mogła czasem wygasnąć, gdy suszarka nadal faktycznie się kręciła. Blokada jest teraz adaptacyjna: prawdziwy skok ruchu przedłuża ją, maksymalnie do 90 minut łącznie od sygnału.",
29
+ "uk": "Виправлення: період блокування захисту від зминання сушарки (запобігає помилковому розпізнаванню залишкового обертання після сигналу як нового циклу) мав фіксовану тривалість - вивчена тривалість плюс 10-хвилинний буфер. Реальна тривалість відрізняється від циклу до циклу, тому блокування могло вичерпатися, поки сушарка ще справді оберталася. Тепер блокування адаптивне: справжній сплеск обертання продовжує його, максимум 90 хвилин від сигналу.",
30
+ "zh-cn": "修复:烘干机防皱锁定期(防止提示音后的残余滚动被误判为新周期)此前是固定时长——学习到的时长加 10 分钟缓冲。实际防皱时长因周期而异,因此锁定有时会在烘干机仍在真实滚动时提前到期,导致尾声被误判为新周期。现在锁定改为自适应:真实的滚动波动会延长锁定,总时长从提示音起最多延长至 90 分钟。"
31
+ },
6
32
  "0.4.17": {
7
33
  "en": "New: three localized, ready-to-display data points - phaseText, stateText, programText - alongside the existing language-neutral ones (phase/state/program). Useful for showing status directly in a VIS dashboard without building your own translation table. Language defaults to the ioBroker system language, overridable per device via the new \"Display language\" setting. The phase-translation table (already used for the admin tab's cycle graph legend) is now a single shared file used by both the admin UI and these new data points, instead of two separately maintained copies.",
8
34
  "de": "Neu: drei lokalisierte, fertig anzeigbare Datenpunkte - phaseText, stateText, programText - zusätzlich zu den bisherigen sprachneutralen (phase/state/program). Nützlich, um den Status direkt in einem VIS-Dashboard anzuzeigen, ohne selbst eine Übersetzungstabelle zu bauen. Die Sprache ist standardmäßig die ioBroker-Systemsprache, pro Gerät überschreibbar über die neue Einstellung „Anzeigesprache\". Die Phasen-Übersetzungstabelle (bisher schon für die Legende des Zyklus-Graphen im Admin-Tab genutzt) ist jetzt eine einzige gemeinsame Datei für Admin-Oberfläche und diese neuen Datenpunkte, statt zweier getrennt gepflegter Kopien.",
@@ -67,32 +93,6 @@
67
93
  "pl": "Poprawka: nazwa stanu \"running\" na istniejących instalacjach nadal była niemiecka (\"Läuft\"), mimo że kod od dawna używa \"Running\" - po prostu brakowało jej na liście migracji nazw stanów dodanej w 0.4.12. Znalezione dzięki nowemu zrzutowi obiektów. Dodano test sprawdzający, czy każdy identyfikator stanu jest objęty migracją.",
68
94
  "uk": "Виправлення: назва стану \"running\" на наявних інсталяціях досі була німецькою (\"Läuft\"), хоча код уже давно каже \"Running\" - її просто бракувало в списку міграції назв станів, доданому в 0.4.12. Знайдено через свіжий дамп об'єктів. Додано тест, який перевіряє, що кожен ідентифікатор стану охоплено міграцією.",
69
95
  "zh-cn": "修复:现有安装中\"running\"状态的名称仍为德文(\"Läuft\"),尽管代码早已使用\"Running\"——它只是在 0.4.12 中添加的状态名称迁移列表中被遗漏了。通过最新的对象转储发现此问题。新增了一个测试,用于检查每个状态 ID 是否都被迁移覆盖,以便日后自动发现此类遗漏。"
70
- },
71
- "0.4.12": {
72
- "en": "Fixes from the ioBroker.repositories manual review (PR #6459): all log messages and state names are now in English (previously several were German); the forceFinish button state now correctly has read: false; existing installations are automatically migrated to the corrected English state names on next start; README requirements section corrected to match the actually enforced Node.js/js-controller versions, plus documentation on why the adapter ships a custom admin tab and a link to the recommended Shelly EM hardware. Also fixed a bug that made running multiple devices on one adapter instance (via native config's \"devices\" array) effectively impossible: the single configured device and the devices array were treated as mutually exclusive instead of combined. A dedicated admin UI for adding devices this way is still being worked on separately.",
73
- "de": "Fixes aus dem manuellen Review von ioBroker.repositories (PR #6459): alle Log-Meldungen und State-Namen sind jetzt auf Englisch (vorher waren mehrere auf Deutsch); der forceFinish-Button-State hat jetzt korrekt read: false; bestehende Installationen werden beim nächsten Start automatisch auf die korrigierten englischen State-Namen migriert; README-Anforderungen korrigiert, damit sie zu den tatsächlich vorausgesetzten Node.js-/js-controller-Versionen passen, außerdem Dokumentation, warum der Adapter einen eigenen Admin-Tab mitbringt, sowie ein Link zur empfohlenen Shelly-EM-Hardware. Außerdem einen Fehler behoben, der es praktisch unmöglich machte, mehrere Geräte auf einer Adapter-Instanz laufen zu lassen (über das „devices\"-Array in der nativen Konfiguration): Das einzelne konfigurierte Gerät und das Geräte-Array wurden als sich gegenseitig ausschließend behandelt statt kombiniert. Eine eigene Admin-Oberfläche zum Hinzufügen von Geräten auf diesem Weg wird noch separat entwickelt.",
74
- "ru": "Исправления по итогам ручной проверки ioBroker.repositories (PR #6459): все сообщения журнала и имена состояний теперь на английском; состояние-кнопка forceFinish теперь корректно имеет read: false; существующие установки автоматически переводятся на исправленные английские имена состояний при следующем запуске; исправлен раздел требований README. Также исправлена ошибка, из-за которой запуск нескольких устройств на одной инстанции адаптера был практически невозможен. Отдельный интерфейс администратора для этого пока в разработке.",
75
- "pt": "Correções da revisão manual do ioBroker.repositories (PR #6459): todas as mensagens de log e nomes de estados agora estão em inglês; o estado de botão forceFinish agora tem corretamente read: false; instalações existentes são migradas automaticamente na próxima inicialização; seção de requisitos do README corrigida. Também corrigido um bug que tornava praticamente impossível executar vários dispositivos em uma única instância do adaptador. Uma interface de administração dedicada para isso ainda está sendo desenvolvida separadamente.",
76
- "nl": "Fixes uit de handmatige review van ioBroker.repositories (PR #6459): alle logberichten en statenamen zijn nu in het Engels; de forceFinish-knopstatus heeft nu correct read: false; bestaande installaties worden bij de volgende start automatisch gemigreerd; README-vereisten gecorrigeerd. Ook een bug opgelost die het praktisch onmogelijk maakte om meerdere apparaten op één adapterinstantie te laten draaien. Een aparte admin-UI hiervoor wordt nog afzonderlijk ontwikkeld.",
77
- "fr": "Corrections suite à la revue manuelle de ioBroker.repositories (PR #6459) : tous les messages de journal et noms d'états sont désormais en anglais ; l'état bouton forceFinish a maintenant correctement read: false ; les installations existantes sont automatiquement migrées au prochain démarrage ; section des prérequis du README corrigée. Correction également d'un bug qui rendait pratiquement impossible l'exécution de plusieurs appareils sur une seule instance d'adaptateur. Une interface d'administration dédiée pour cela est encore en cours de développement séparément.",
78
- "it": "Correzioni dalla revisione manuale di ioBroker.repositories (PR #6459): tutti i messaggi di log e i nomi degli stati sono ora in inglese; lo stato pulsante forceFinish ora ha correttamente read: false; le installazioni esistenti vengono migrate automaticamente al prossimo avvio; sezione dei requisiti del README corretta. Corretto anche un bug che rendeva praticamente impossibile eseguire più dispositivi su una singola istanza dell'adattatore. Un'interfaccia admin dedicata per questo è ancora in fase di sviluppo separato.",
79
- "es": "Correcciones de la revisión manual de ioBroker.repositories (PR #6459): todos los mensajes de registro y nombres de estados ahora están en inglés; el estado de botón forceFinish ahora tiene correctamente read: false; las instalaciones existentes se migran automáticamente en el próximo inicio; sección de requisitos del README corregida. También se corrigió un error que hacía prácticamente imposible ejecutar varios dispositivos en una sola instancia del adaptador. Una interfaz de administración dedicada para esto todavía se está desarrollando por separado.",
80
- "pl": "Poprawki z ręcznej recenzji ioBroker.repositories (PR #6459): wszystkie komunikaty dziennika i nazwy stanów są teraz w języku angielskim; stan przycisku forceFinish ma teraz poprawnie read: false; istniejące instalacje są automatycznie migrowane przy następnym uruchomieniu; poprawiono sekcję wymagań README. Naprawiono też błąd, który praktycznie uniemożliwiał obsługę wielu urządzeń na jednej instancji adaptera. Dedykowany interfejs administratora do tego jest wciąż opracowywany osobno.",
81
- "uk": "Виправлення за результатами ручної перевірки ioBroker.repositories (PR #6459): усі повідомлення журналу та назви станів тепер англійською; стан-кнопка forceFinish тепер коректно має read: false; наявні інсталяції автоматично мігрують під час наступного запуску; виправлено розділ вимог README. Також виправлено помилку, яка робила практично неможливим запуск кількох пристроїв на одній інстанції адаптера. Окремий інтерфейс адміністратора для цього ще розробляється.",
82
- "zh-cn": "来自 ioBroker.repositories 人工审查(PR #6459)的修复:所有日志消息和状态名称现在均为英文;forceFinish 按钮状态现在正确设置为 read: false;现有安装将在下次启动时自动迁移;已更正 README 的要求部分。同时修复了一个使单个适配器实例上运行多个设备实际上不可能实现的错误。用于此目的的专用管理界面仍在单独开发中。"
83
- },
84
- "0.4.11": {
85
- "en": "Fix: audited every remaining admin UI setting for the same class of bug fixed in 0.4.10 (a field silently never reaching the code that uses it) and found one more: \"Notify also for probable program\" (notifyOnProbable) was read in code but never returned by the internal device-config lookup, so checking it had no effect - Telegram updates always waited for the full auto-confirm threshold regardless of this setting. The regression test from 0.4.10 was extended to also check this class of field (read from the device-config lookup directly, not just fields passed into WashDataManager), so this category of bug should now be caught automatically going forward.",
86
- "de": "Fix: alle übrigen Admin-Einstellungen auf dieselbe Fehlerart geprüft, die in 0.4.10 behoben wurde (ein Feld, das nie beim nutzenden Code ankommt) - und noch einen Fall gefunden: „Auch bei wahrscheinlichem Programm benachrichtigen\" (notifyOnProbable) wurde im Code gelesen, aber vom internen Geräte-Konfigurations-Lookup nie zurückgegeben, sodass die Checkbox wirkungslos war - Telegram-Updates warteten immer auf die volle Auto-Bestätigungs-Schwelle, unabhängig von dieser Einstellung. Der Regressionstest aus 0.4.10 wurde erweitert, um auch diese Art von Feld zu prüfen (direkt aus dem Geräte-Konfigurations-Lookup gelesen, nicht nur an WashDataManager übergebene Felder) - dieser Fehlertyp sollte künftig automatisch auffallen.",
87
- "ru": "Исправление: проверены все оставшиеся настройки админ-интерфейса на тот же тип ошибки, что был исправлен в 0.4.10 (поле, которое незаметно никогда не доходит до использующего его кода) - и найден ещё один случай: «Уведомлять также при вероятной программе» (notifyOnProbable) считывался в коде, но никогда не возвращался внутренним поиском конфигурации устройства, поэтому включение этого флажка не имело эффекта - уведомления Telegram всегда ждали полного порога автоподтверждения независимо от этой настройки. Регрессионный тест из 0.4.10 расширен для проверки и этого класса полей.",
88
- "pt": "Correção: auditadas todas as demais configurações da interface admin em busca do mesmo tipo de bug corrigido na 0.4.10 (um campo que silenciosamente nunca chega ao código que o usa) - e encontrado mais um caso: \"Notificar também para programa provável\" (notifyOnProbable) era lido no código, mas nunca retornado pela busca interna de configuração do dispositivo, então marcá-lo não tinha efeito - as atualizações do Telegram sempre esperavam o limite total de confirmação automática, independentemente dessa configuração. O teste de regressão da 0.4.10 foi ampliado para também verificar essa classe de campo.",
89
- "nl": "Fix: alle overige admin-instellingen gecontroleerd op hetzelfde soort bug dat in 0.4.10 is opgelost (een veld dat stilletjes nooit bij de gebruikende code terechtkomt) - en nog één geval gevonden: \"Ook melden bij waarschijnlijk programma\" (notifyOnProbable) werd in de code gelezen, maar nooit geretourneerd door de interne apparaat-configuratie-opzoeking, waardoor het aanvinken geen effect had - Telegram-updates wachtten altijd op de volledige auto-bevestigingsdrempel, ongeacht deze instelling. De regressietest uit 0.4.10 is uitgebreid om ook dit soort veld te controleren.",
90
- "fr": "Correction : audit de tous les autres réglages de l'interface admin pour le même type de bug corrigé dans la 0.4.10 (un champ qui n'atteint silencieusement jamais le code qui l'utilise) - et un cas de plus trouvé : « Notifier aussi pour un programme probable » (notifyOnProbable) était lu dans le code mais jamais renvoyé par la recherche interne de configuration de l'appareil, donc cocher la case n'avait aucun effet - les mises à jour Telegram attendaient toujours le seuil complet d'auto-confirmation, quel que soit ce réglage. Le test de régression de la 0.4.10 a été étendu pour vérifier aussi cette catégorie de champ.",
91
- "it": "Correzione: verificate tutte le altre impostazioni dell'interfaccia admin per lo stesso tipo di bug corretto nella 0.4.10 (un campo che silenziosamente non raggiunge mai il codice che lo usa) - e trovato un altro caso: \"Notifica anche per programma probabile\" (notifyOnProbable) veniva letto nel codice ma mai restituito dalla ricerca interna della configurazione del dispositivo, quindi selezionarlo non aveva alcun effetto - gli aggiornamenti Telegram attendevano sempre la soglia completa di auto-conferma, indipendentemente da questa impostazione. Il test di regressione della 0.4.10 è stato esteso per verificare anche questa categoria di campo.",
92
- "es": "Corrección: auditadas todas las demás configuraciones de la interfaz de administración en busca del mismo tipo de error corregido en la 0.4.10 (un campo que silenciosamente nunca llega al código que lo usa) - y se encontró un caso más: \"Notificar también para programa probable\" (notifyOnProbable) se leía en el código pero nunca era devuelto por la búsqueda interna de configuración del dispositivo, por lo que marcarlo no tenía efecto - las actualizaciones de Telegram siempre esperaban el umbral completo de auto-confirmación, sin importar esta configuración. La prueba de regresión de la 0.4.10 se amplió para verificar también esta clase de campo.",
93
- "pl": "Poprawka: sprawdzono wszystkie pozostałe ustawienia interfejsu admina pod kątem tego samego rodzaju błędu naprawionego w 0.4.10 (pole, które nigdy po cichu nie dociera do kodu, który go używa) - i znaleziono jeszcze jeden przypadek: \"Powiadamiaj też przy prawdopodobnym programie\" (notifyOnProbable) było odczytywane w kodzie, ale nigdy nie było zwracane przez wewnętrzne wyszukiwanie konfiguracji urządzenia, więc zaznaczenie go nie miało efektu - powiadomienia Telegram zawsze czekały na pełny próg auto-potwierdzenia, niezależnie od tego ustawienia. Test regresyjny z 0.4.10 został rozszerzony, by sprawdzać także tę klasę pól.",
94
- "uk": "Виправлення: перевірено всі інші налаштування адмін-інтерфейсу на той самий тип бага, виправленого в 0.4.10 (поле, яке непомітно ніколи не доходить до коду, що його використовує) - і знайдено ще один випадок: «Сповіщати також при ймовірній програмі» (notifyOnProbable) зчитувалося в коді, але ніколи не поверталося внутрішнім пошуком конфігурації пристрою, тому позначення прапорця не мало ефекту - сповіщення Telegram завжди чекали повного порогу автопідтвердження, незалежно від цього налаштування. Регресійний тест з 0.4.10 розширено для перевірки й цього класу полів.",
95
- "zh-cn": "修复:审查了所有其余的管理界面设置,寻找与 0.4.10 中修复的同类错误(某字段悄悄地从未到达使用它的代码)——又发现了一个:\"可能程序也通知\"(notifyOnProbable)在代码中被读取,但内部设备配置查找从未返回它,因此勾选它没有任何效果——无论此设置如何,Telegram 更新始终等待完整的自动确认阈值。0.4.10 中的回归测试已扩展,以便也检查这一类字段。"
96
96
  }
97
97
  },
98
98
  "titleLang": {
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
- const fs = require("fs");
4
- const path = require("path");
3
+ const fs = require("node:fs");
4
+ const path = require("node:path");
5
5
 
6
6
  // Static, read-only reference data - safe as a module-level const even
7
7
  // under compact mode (unlike per-instance mutable caches such as the
@@ -19,6 +19,14 @@ const PROGRESS_RESET_MS = 5 * 60 * 1000;
19
19
  const STUCK_POWER_MS = 10 * 60 * 1000;
20
20
  const MIN_CYCLE_MS = 2 * 60 * 1000;
21
21
  const MIN_CONFIDENCE_FOR_SET = 0.6; // Minimum average score to set a program via accumulation - deliberately strict (better "detecting..." than a wrong match)
22
+ // Dryer anti-crease lock: how far a genuine anti-crease tumble spike pushes
23
+ // the lock's expiry forward, and the absolute ceiling (from when the lock
24
+ // was first set) that extensions can never exceed - real anti-crease
25
+ // duration varies cycle to cycle (load size, dampness), so a purely fixed
26
+ // lock length (learned duration + buffer) can run out while the dryer is
27
+ // still actually tumbling, letting the tail end be mistaken for a new cycle.
28
+ const ANTI_CREASE_LOCK_REFRESH_MS = 10 * 60 * 1000;
29
+ const ANTI_CREASE_LOCK_MAX_MS = 90 * 60 * 1000;
22
30
 
23
31
  /**
24
32
  * Central orchestrator: wires the CycleDetector, ProfileStore, and
@@ -75,6 +83,7 @@ class WashDataManager {
75
83
  // Dryer Anti-Knitter
76
84
  this._dryerDropTriggered = false;
77
85
  this._dryerLockUntil = null;
86
+ this._dryerLockStartedAt = null; // when the lock was first set - for the absolute ceiling
78
87
  this._dryerHighStart = null;
79
88
  this._antiKnitter = null; // { maxWatts, durationMs } – loaded from profileStore
80
89
  }
@@ -307,6 +316,7 @@ class WashDataManager {
307
316
  `${this._name}: anti-crease protection inactive (disabled or no pattern) – existing lock discarded`,
308
317
  );
309
318
  this._dryerLockUntil = null;
319
+ this._dryerLockStartedAt = null;
310
320
  this._dryerDropTriggered = false;
311
321
  this._dryerHighStart = null;
312
322
  }
@@ -317,6 +327,7 @@ class WashDataManager {
317
327
  `${this._name}: anti-crease lock period expired`,
318
328
  );
319
329
  this._dryerLockUntil = null;
330
+ this._dryerLockStartedAt = null;
320
331
  this._dryerDropTriggered = false;
321
332
  this._dryerHighStart = null;
322
333
  } else {
@@ -340,6 +351,7 @@ class WashDataManager {
340
351
  `${this._name}: real new cycle detected after the beep (>${realThreshold}W for 30s) – lock lifted`,
341
352
  );
342
353
  this._dryerLockUntil = null;
354
+ this._dryerLockStartedAt = null;
343
355
  this._dryerDropTriggered = false;
344
356
  this._dryerHighStart = null;
345
357
  // Continue with normal processing
@@ -353,6 +365,23 @@ class WashDataManager {
353
365
  );
354
366
  }
355
367
  this._dryerHighStart = null;
368
+ // A meaningful spike (motor tumble, not just idle standby noise)
369
+ // is itself evidence the dryer is still actually doing its
370
+ // anti-crease thing - push the lock's expiry forward instead of
371
+ // letting a fixed-length lock run out mid-tumble, capped at an
372
+ // absolute ceiling from when the lock was first set.
373
+ if (watts > 10 && this._dryerLockStartedAt) {
374
+ const extended = Math.min(
375
+ ts + ANTI_CREASE_LOCK_REFRESH_MS,
376
+ this._dryerLockStartedAt + ANTI_CREASE_LOCK_MAX_MS,
377
+ );
378
+ if (extended > this._dryerLockUntil) {
379
+ this.adapter.log.debug(
380
+ `${this._name}: anti-crease still active (${watts.toFixed(0)}W) – lock extended to ${Math.round((extended - ts) / 60000)} min from now`,
381
+ );
382
+ this._dryerLockUntil = extended;
383
+ }
384
+ }
356
385
  this.adapter.log.debug(
357
386
  `${this._name}: anti-crease spike ignored (${watts.toFixed(0)}W < ${realThreshold}W threshold)`,
358
387
  );
@@ -394,6 +423,7 @@ class WashDataManager {
394
423
  );
395
424
  this._dryerDropTriggered = true;
396
425
  this._dryerLockUntil = ts + lockMs;
426
+ this._dryerLockStartedAt = ts;
397
427
  this._dryerCooldownEnd = Date.now() + 45000;
398
428
  // Wait 45 seconds – trace keeps recording for a nicer-looking graph
399
429
  // Detector stays active so further points get collected
@@ -1524,6 +1554,7 @@ class WashDataManager {
1524
1554
  // Also immediately lift any currently active lock period, so the
1525
1555
  // next cycle can be recorded without interference.
1526
1556
  this._dryerLockUntil = null;
1557
+ this._dryerLockStartedAt = null;
1527
1558
  this._dryerDropTriggered = false;
1528
1559
  this._dryerHighStart = null;
1529
1560
  this.adapter.log.info(`${this._name}: anti-crease pattern deleted`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.laundrylens",
3
- "version": "0.4.17",
3
+ "version": "0.4.19",
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",
@@ -32,7 +32,7 @@
32
32
  "release": "release-script"
33
33
  },
34
34
  "dependencies": {
35
- "@iobroker/adapter-core": "^3.4.1"
35
+ "@iobroker/adapter-core": "^3.4.3"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@iobroker/testing": "^5.3.0",