iobroker.laundrylens 0.4.5 → 0.4.7

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
@@ -104,6 +104,13 @@ The defaults are tuned for Siemens iQ appliances. Detection threshold is a trade
104
104
 
105
105
  ### **WORK IN PROGRESS**
106
106
 
107
+ ### 0.4.7 (2026-08-16)
108
+ - Fix: on devices going through the generic phase-history branch (currently dryers), recorded phase timestamps could show wildly wrong values (often large negative numbers, e.g. from days-old previous cycles) because the internal phase-history buffer was never cleared between cycles - found via a production object-structure dump during the "add to latest" review
109
+ - Fix: repository checker finding - invalid state role `"value.percent"` on `cycleProgress` (not a valid ioBroker role), corrected to `"value"`
110
+
111
+ ### 0.4.6 (2026-08-16)
112
+ - No functional changes. Switched npm publishing to Trusted Publishing (OIDC) so releases are signed with provenance (repository checker E2008)
113
+
107
114
  ### 0.4.5 (2026-08-08)
108
115
  - Fix: a finished cycle could stay stuck showing "running" indefinitely if the power sensor stopped reporting after settling at a flat value (many sensors, incl. Shelly, only report on change) - the state machine is now re-evaluated periodically (heartbeat) so it can still finish on schedule
109
116
  - Fix: repository checker findings from issue #39 (real `test:package` validation instead of a no-op stub, corrected `adminUI.tab`/`materializeTab` config, responsive `jsonConfig.json` layout, various CI/tooling fixes)
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "laundrylens",
4
- "version": "0.4.5",
4
+ "version": "0.4.7",
5
5
  "news": {
6
+ "0.4.7": {
7
+ "en": "Fix: on devices going through the generic phase-history branch (currently dryers), recorded phase timestamps could show wildly wrong values (often large negative numbers) because the internal phase-history buffer was never cleared between cycles and kept accumulating entries from every past cycle since adapter start. Fix: repository checker finding (invalid state role \"value.percent\" on cycleProgress, corrected to \"value\").",
8
+ "de": "Fix: Bei Geräten, die über den generischen Phasenverlauf-Zweig laufen (aktuell Trockner), konnten aufgezeichnete Phasen-Zeitstempel völlig falsche Werte zeigen (oft große negative Zahlen), weil der interne Phasenverlauf-Puffer nie zwischen Zyklen geleert wurde und sich Einträge aus jedem früheren Zyklus seit Adapterstart ansammelten. Fix: Repository-Checker-Finding (ungültige State-Rolle „value.percent\" bei cycleProgress, korrigiert auf „value\").",
9
+ "ru": "Исправление: на устройствах, использующих универсальную ветку истории фаз (сейчас это сушильные машины), записанные временные метки фаз могли содержать совершенно неверные значения (часто большие отрицательные числа), поскольку внутренний буфер истории фаз никогда не очищался между циклами и накапливал записи всех прошлых циклов с момента запуска адаптера. Исправление: замечание repository checker (недопустимая роль состояния \"value.percent\" у cycleProgress, исправлено на \"value\").",
10
+ "pt": "Correção: em dispositivos que usam o ramo genérico de histórico de fases (atualmente secadoras), os carimbos de data/hora de fase registrados podiam mostrar valores completamente errados (frequentemente números negativos grandes), pois o buffer interno de histórico de fases nunca era limpo entre ciclos e acumulava entradas de todos os ciclos anteriores desde o início do adaptador. Correção: apontamento do repository checker (role de estado inválida \"value.percent\" em cycleProgress, corrigida para \"value\").",
11
+ "nl": "Fix: bij apparaten die de generieke fasegeschiedenis-tak gebruiken (momenteel drogers) konden opgeslagen fase-tijdstempels compleet verkeerde waarden tonen (vaak grote negatieve getallen), omdat de interne fasegeschiedenis-buffer nooit werd geleegd tussen cycli en zich vulde met vermeldingen van elke vorige cyclus sinds de start van de adapter. Fix: bevinding van de repository checker (ongeldige state-rol \"value.percent\" bij cycleProgress, gecorrigeerd naar \"value\").",
12
+ "fr": "Correction : sur les appareils utilisant la branche générique d'historique de phases (actuellement les sèche-linge), les horodatages de phase enregistrés pouvaient afficher des valeurs complètement erronées (souvent de grands nombres négatifs), car le buffer interne d'historique de phases n'était jamais réinitialisé entre les cycles et accumulait les entrées de tous les cycles précédents depuis le démarrage de l'adaptateur. Correction : remarque du repository checker (rôle d'état invalide \"value.percent\" sur cycleProgress, corrigé en \"value\").",
13
+ "it": "Correzione: sui dispositivi che utilizzano il ramo generico della cronologia delle fasi (attualmente asciugatrici), i timestamp di fase registrati potevano mostrare valori completamente errati (spesso grandi numeri negativi), poiché il buffer interno della cronologia delle fasi non veniva mai svuotato tra i cicli e accumulava voci di ogni ciclo precedente dall'avvio dell'adattatore. Correzione: rilievo del repository checker (ruolo di stato non valido \"value.percent\" su cycleProgress, corretto in \"value\").",
14
+ "es": "Corrección: en dispositivos que usan la rama genérica de historial de fases (actualmente secadoras), las marcas de tiempo de fase registradas podían mostrar valores completamente erróneos (a menudo números negativos grandes), porque el búfer interno de historial de fases nunca se vaciaba entre ciclos y acumulaba entradas de cada ciclo anterior desde el inicio del adaptador. Corrección: hallazgo del repository checker (rol de estado inválido \"value.percent\" en cycleProgress, corregido a \"value\").",
15
+ "pl": "Poprawka: na urządzeniach korzystających z ogólnej gałęzi historii faz (obecnie suszarki) zarejestrowane znaczniki czasu faz mogły pokazywać zupełnie błędne wartości (często duże liczby ujemne), ponieważ wewnętrzny bufor historii faz nigdy nie był czyszczony między cyklami i gromadził wpisy z każdego poprzedniego cyklu od uruchomienia adaptera. Poprawka: uwaga repository checkera (nieprawidłowa rola stanu \"value.percent\" dla cycleProgress, poprawiona na \"value\").",
16
+ "uk": "Виправлення: на пристроях, що використовують загальну гілку історії фаз (наразі сушарки), записані часові мітки фаз могли показувати абсолютно неправильні значення (часто великі від'ємні числа), оскільки внутрішній буфер історії фаз ніколи не очищався між циклами і накопичував записи з кожного попереднього циклу з моменту запуску адаптера. Виправлення: зауваження repository checker (недійсна роль стану \"value.percent\" для cycleProgress, виправлено на \"value\").",
17
+ "zh-cn": "修复:在使用通用阶段历史分支的设备上(目前是烘干机),记录的阶段时间戳可能显示完全错误的值(通常是很大的负数),因为内部阶段历史缓冲区从未在各个周期之间清空,而是持续累积自适配器启动以来每个历史周期的条目。修复:仓库检查器(repository checker)发现的问题(cycleProgress 上的无效状态角色 \"value.percent\",已更正为 \"value\")。"
18
+ },
19
+ "0.4.6": {
20
+ "en": "No functional changes. Switched npm publishing to Trusted Publishing (OIDC) so this release is signed with provenance.",
21
+ "de": "Keine funktionalen Änderungen. npm-Veröffentlichung auf Trusted Publishing (OIDC) umgestellt, sodass dieses Release mit Provenance signiert ist.",
22
+ "ru": "Функциональных изменений нет. Публикация в npm переведена на Trusted Publishing (OIDC), поэтому этот релиз подписан с provenance.",
23
+ "pt": "Sem alterações funcionais. A publicação no npm foi alterada para Trusted Publishing (OIDC), então este lançamento é assinado com provenance.",
24
+ "nl": "Geen functionele wijzigingen. npm-publicatie omgezet naar Trusted Publishing (OIDC), waardoor deze release is ondertekend met provenance.",
25
+ "fr": "Aucun changement fonctionnel. La publication npm est passée à Trusted Publishing (OIDC), cette version est donc signée avec provenance.",
26
+ "it": "Nessuna modifica funzionale. La pubblicazione su npm è passata al Trusted Publishing (OIDC), quindi questa release è firmata con provenance.",
27
+ "es": "Sin cambios funcionales. La publicación en npm ahora usa Trusted Publishing (OIDC), por lo que esta versión está firmada con provenance.",
28
+ "pl": "Brak zmian funkcjonalnych. Publikacja w npm została przełączona na Trusted Publishing (OIDC), dzięki czemu to wydanie jest podpisane z provenance.",
29
+ "uk": "Функціональних змін немає. Публікацію в npm переведено на Trusted Publishing (OIDC), тому цей реліз підписано з provenance.",
30
+ "zh-cn": "无功能变更。npm 发布已切换为 Trusted Publishing(OIDC),因此本版本带有 provenance 签名。"
31
+ },
6
32
  "0.4.5": {
7
33
  "en": "Fix: a finished cycle could stay stuck showing \"running\" indefinitely if the power sensor stopped reporting after settling at a flat value (many sensors, incl. Shelly, only report on change) - the state machine is now re-evaluated periodically (heartbeat) so it can still finish on schedule. Fix: repository checker findings (real package validation test, admin config, responsive UI layout, tooling).",
8
34
  "de": "Fix: Ein beendeter Waschgang konnte dauerhaft als „läuft“ hängen bleiben, wenn der Stromsensor nach Erreichen eines stabilen Wertes keine weiteren Meldungen mehr sendete (viele Sensoren, u.a. Shelly, melden nur bei Änderung) - die Zustandsmaschine wird jetzt regelmäßig neu ausgewertet (Heartbeat), sodass der Zyklus trotzdem planmäßig endet. Fix: diverse Repository-Checker-Findings (echter Package-Validierungstest, Admin-Konfiguration, responsives UI-Layout, Tooling).",
@@ -15,84 +41,6 @@
15
41
  "pl": "Poprawka: zakończony cykl mógł na stałe utknąć w stanie „działa”, jeśli czujnik mocy przestawał raportować po ustabilizowaniu się na stałej wartości (wiele czujników, w tym Shelly, zgłasza tylko zmiany) - maszyna stanów jest teraz okresowo ponownie oceniana (heartbeat), dzięki czemu cykl mimo to kończy się zgodnie z planem. Poprawka: uwagi repository checkera (prawdziwy test walidacji pakietu, konfiguracja admin, responsywny układ UI, narzędzia).",
16
42
  "uk": "Виправлення: завершений цикл міг назавжди «зависнути» у статусі «працює», якщо датчик потужності переставав повідомляти нові значення після виходу на стабільне значення (багато датчиків, зокрема Shelly, повідомляють лише про зміни) - тепер машина станів періодично переоцінюється (heartbeat), тому цикл все одно завершується вчасно. Виправлення: зауваження repository checker (справжній тест валідації пакета, конфігурація admin, адаптивна верстка UI, інструментарій).",
17
43
  "zh-cn": "修复:如果功率传感器在稳定在某个数值后停止上报(许多传感器,包括Shelly,只在数值变化时上报),已完成的循环可能会一直卡在\"运行中\"状态 - 现在状态机会定期重新评估(心跳机制),因此循环仍能按计划结束。修复:仓库检查器(repository checker)发现的问题(真实的包验证测试、admin配置、响应式界面布局、工具链)。"
18
- },
19
- "0.4.1": {
20
- "en": "Fix: ReferenceError '_suggestedApplied is not defined' crashing the admin tab in some browsers/modes. Fix: some Admin instances (especially the newer React-based rendering) showed a 404 'File tab.html not found' instead of loading the admin tab correctly - caused by an earlier cleanup that removed the 'materializeTab' flag, which actually controls which filename (tab.html vs. tab_m.html) Admin resolves the custom tab to, not just a cosmetic setting as assumed.",
21
- "de": "Fix: ReferenceError „_suggestedApplied is not defined“, der den Admin-Tab in manchen Browsern/Modi zum Absturz brachte. Fix: Manche Admin-Instanzen (v.a. die neuere React-basierte Darstellung) zeigten einen 404-Fehler „File tab.html not found“ statt den Admin-Tab korrekt zu laden - verursacht durch ein früheres Aufräumen, das das „materializeTab“-Flag entfernt hatte, welches tatsächlich steuert, welchen Dateinamen (tab.html vs. tab_m.html) Admin für den eigenen Tab verwendet, nicht nur eine kosmetische Einstellung wie angenommen.",
22
- "ru": "Исправление: ReferenceError «_suggestedApplied is not defined», приводивший к сбою вкладки администратора в некоторых браузерах/режимах. Исправление: некоторые экземпляры Admin (особенно новый React-рендеринг) показывали ошибку 404 «File tab.html not found» вместо корректной загрузки вкладки администратора - причина в более раннем изменении, удалившем флаг «materializeTab», который на самом деле определяет, какое имя файла (tab.html или tab_m.html) использует Admin для вкладки, а не просто косметическую настройку, как предполагалось.",
23
- "pt": "Correção: ReferenceError '_suggestedApplied is not defined' que travava a aba de administração em alguns navegadores/modos. Correção: algumas instâncias do Admin (especialmente a renderização mais nova baseada em React) mostravam um erro 404 'File tab.html not found' em vez de carregar corretamente a aba de administração - causado por uma limpeza anterior que removeu a flag 'materializeTab', que na verdade controla qual nome de arquivo (tab.html vs. tab_m.html) o Admin usa para a aba personalizada, não apenas uma configuração cosmética como se supunha.",
24
- "nl": "Fix: ReferenceError '_suggestedApplied is not defined' die het admin-tabblad liet crashen in sommige browsers/modi. Fix: sommige Admin-instanties (vooral de nieuwere React-gebaseerde weergave) toonden een 404-fout 'File tab.html not found' in plaats van het admin-tabblad correct te laden - veroorzaakt door een eerdere opschoning die de 'materializeTab'-vlag verwijderde, die eigenlijk bepaalt welke bestandsnaam (tab.html vs. tab_m.html) Admin voor het aangepaste tabblad gebruikt, niet slechts een cosmetische instelling zoals aangenomen.",
25
- "fr": "Correction : ReferenceError « _suggestedApplied is not defined » faisant planter l'onglet d'administration dans certains navigateurs/modes. Correction : certaines instances d'Admin (notamment le nouveau rendu basé sur React) affichaient une erreur 404 « File tab.html not found » au lieu de charger correctement l'onglet d'administration - causé par un nettoyage antérieur ayant supprimé l'indicateur « materializeTab », qui détermine en fait quel nom de fichier (tab.html ou tab_m.html) Admin utilise pour l'onglet personnalisé, et non un simple réglage cosmétique comme supposé.",
26
- "it": "Correzione: ReferenceError '_suggestedApplied is not defined' che causava il crash della scheda di amministrazione in alcuni browser/modalità. Correzione: alcune istanze di Admin (in particolare il nuovo rendering basato su React) mostravano un errore 404 'File tab.html not found' invece di caricare correttamente la scheda di amministrazione - causato da una precedente pulizia che aveva rimosso il flag 'materializeTab', che in realtà controlla quale nome di file (tab.html o tab_m.html) Admin utilizza per la scheda personalizzata, non solo un'impostazione estetica come si presumeva.",
27
- "es": "Corrección: ReferenceError '_suggestedApplied is not defined' que bloqueaba la pestaña de administración en algunos navegadores/modos. Corrección: algunas instancias de Admin (especialmente el nuevo renderizado basado en React) mostraban un error 404 'File tab.html not found' en lugar de cargar correctamente la pestaña de administración - causado por una limpieza anterior que eliminó el indicador 'materializeTab', que en realidad controla qué nombre de archivo (tab.html o tab_m.html) usa Admin para la pestaña personalizada, no solo un ajuste cosmético como se suponía.",
28
- "pl": "Poprawka: ReferenceError '_suggestedApplied is not defined' powodujący awarię karty administracyjnej w niektórych przeglądarkach/trybach. Poprawka: niektóre instancje Admin (zwłaszcza nowsze renderowanie oparte na React) wyświetlały błąd 404 'File tab.html not found' zamiast poprawnie załadować kartę administracyjną - spowodowane wcześniejszym porządkowaniem, które usunęło flagę 'materializeTab', która w rzeczywistości kontroluje, jakiej nazwy pliku (tab.html czy tab_m.html) używa Admin dla własnej karty, a nie tylko ustawieniem kosmetycznym, jak zakładano.",
29
- "uk": "Виправлення: ReferenceError «_suggestedApplied is not defined», через яку вкладка адміністрування аварійно завершувалася в деяких браузерах/режимах. Виправлення: деякі екземпляри Admin (особливо новіший рендеринг на основі React) показували помилку 404 «File tab.html not found» замість коректного завантаження вкладки адміністрування - причина у попередньому чищенні, яке видалило прапорець «materializeTab», що насправді визначає, яке ім'я файлу (tab.html чи tab_m.html) Admin використовує для власної вкладки, а не просто косметичне налаштування, як передбачалося.",
30
- "zh-cn": "修复:ReferenceError“_suggestedApplied is not defined”导致某些浏览器/模式下管理标签页崩溃。修复:某些Admin实例(尤其是较新的基于React的渲染)显示404错误“File tab.html not found”,而不是正确加载管理标签页——原因是之前的清理工作删除了“materializeTab”标志,而该标志实际上控制Admin为自定义标签页解析哪个文件名(tab.html还是tab_m.html),而不仅仅是之前认为的外观设置。"
31
- },
32
- "0.4.0": {
33
- "en": "Full multilingual support: admin UI, notifications, and program phase names now translate automatically into 11 languages based on the ioBroker system language. All code comments translated to English. Fixed: the 'All devices' status column and default notification templates weren't going through translation. Infrastructure: full compliance with the official @iobroker/eslint-config (formatting + JSDoc), CI no longer needs a committed lockfile. Note: cycles recorded before this update show phases as an uncolored/unrecognized segment in the graph legend (the old German phase names no longer match the new internal phase keys) - purely cosmetic, only affects historical data, new cycles are unaffected.",
34
- "de": "Vollständige Mehrsprachigkeit: Admin-Oberfläche, Benachrichtigungen und Programmphasennamen übersetzen sich jetzt automatisch in 11 Sprachen anhand der ioBroker-Systemsprache. Alle Code-Kommentare auf Englisch übersetzt. Fix: Die Status-Spalte unter „Alle Geräte“ sowie die Standard-Benachrichtigungstexte liefen bisher nicht durch die Übersetzung. Infrastruktur: vollständige Konformität mit der offiziellen @iobroker/eslint-config (Formatierung + JSDoc), CI benötigt keine eingecheckte Lockfile mehr. Hinweis: Zyklen, die vor diesem Update aufgezeichnet wurden, zeigen Phasen als unfarbigen/nicht erkannten Bereich in der Graph-Legende (die alten deutschen Phasennamen passen nicht mehr zu den neuen internen Phasen-Schlüsseln) - rein kosmetisch, betrifft nur historische Daten, neue Zyklen sind nicht betroffen.",
35
- "ru": "Полная многоязычность: интерфейс администратора, уведомления и названия фаз программ теперь автоматически переводятся на 11 языков в зависимости от системного языка ioBroker. Все комментарии в коде переведены на английский. Исправление: столбец состояния во «Всех устройствах» и шаблоны уведомлений по умолчанию не проходили через перевод. Инфраструктура: полное соответствие официальному @iobroker/eslint-config (форматирование + JSDoc), CI больше не требует зафиксированного lock-файла. Примечание: циклы, записанные до этого обновления, показывают фазы как нераскрашенный/неопознанный сегмент в легенде графика (старые немецкие названия фаз больше не соответствуют новым внутренним ключам фаз) - чисто косметически, затрагивает только исторические данные, новые циклы не затронуты.",
36
- "pt": "Suporte multilíngue completo: a interface de administração, notificações e nomes de fase de programa agora são traduzidos automaticamente para 11 idiomas com base no idioma do sistema ioBroker. Todos os comentários de código traduzidos para inglês. Correção: a coluna de status em 'Todos os dispositivos' e os modelos de notificação padrão não passavam pela tradução. Infraestrutura: conformidade total com o @iobroker/eslint-config oficial (formatação + JSDoc), o CI não precisa mais de um lockfile versionado. Nota: os ciclos gravados antes desta atualização mostram as fases como um segmento sem cor/não reconhecido na legenda do gráfico (os antigos nomes de fase em alemão não correspondem mais às novas chaves internas de fase) - puramente cosmético, afeta apenas dados históricos, novos ciclos não são afetados.",
37
- "nl": "Volledige meertaligheid: de beheerinterface, meldingen en programmafasenamen worden nu automatisch vertaald in 11 talen op basis van de ioBroker-systeemtaal. Alle codecommentaar vertaald naar het Engels. Fix: de statuskolom bij 'Alle apparaten' en de standaard meldingssjablonen gingen voorheen niet door de vertaling. Infrastructuur: volledige naleving van de officiële @iobroker/eslint-config (opmaak + JSDoc), CI heeft geen vastgelegd lockbestand meer nodig. Opmerking: cycli die vóór deze update zijn opgenomen, tonen fasen als een ongekleurd/onherkend segment in de graaflegenda (de oude Duitse fasenamen komen niet meer overeen met de nieuwe interne fase-sleutels) - puur cosmetisch, betreft alleen historische gegevens, nieuwe cycli zijn niet beïnvloed.",
38
- "fr": "Prise en charge multilingue complète : l'interface d'administration, les notifications et les noms de phases de programme sont désormais automatiquement traduits en 11 langues selon la langue système d'ioBroker. Tous les commentaires de code traduits en anglais. Correction : la colonne de statut dans « Tous les appareils » et les modèles de notification par défaut ne passaient pas par la traduction. Infrastructure : conformité totale avec le @iobroker/eslint-config officiel (formatage + JSDoc), le CI n'a plus besoin d'un fichier de verrouillage validé. Remarque : les cycles enregistrés avant cette mise à jour affichent les phases comme un segment non coloré/non reconnu dans la légende du graphique (les anciens noms de phase allemands ne correspondent plus aux nouvelles clés de phase internes) - purement cosmétique, n'affecte que les données historiques, les nouveaux cycles ne sont pas concernés.",
39
- "it": "Supporto multilingue completo: l'interfaccia di amministrazione, le notifiche e i nomi delle fasi del programma vengono ora tradotti automaticamente in 11 lingue in base alla lingua di sistema di ioBroker. Tutti i commenti del codice tradotti in inglese. Correzione: la colonna di stato in 'Tutti i dispositivi' e i modelli di notifica predefiniti non passavano attraverso la traduzione. Infrastruttura: piena conformità con l'ufficiale @iobroker/eslint-config (formattazione + JSDoc), la CI non necessita più di un lockfile committato. Nota: i cicli registrati prima di questo aggiornamento mostrano le fasi come un segmento non colorato/non riconosciuto nella legenda del grafico (i vecchi nomi di fase tedeschi non corrispondono più alle nuove chiavi di fase interne) - puramente estetico, riguarda solo i dati storici, i nuovi cicli non sono interessati.",
40
- "es": "Soporte multilingüe completo: la interfaz de administración, las notificaciones y los nombres de fase del programa ahora se traducen automáticamente a 11 idiomas según el idioma del sistema de ioBroker. Todos los comentarios del código traducidos al inglés. Corrección: la columna de estado en 'Todos los dispositivos' y las plantillas de notificación predeterminadas no pasaban por la traducción. Infraestructura: conformidad total con el @iobroker/eslint-config oficial (formato + JSDoc), la CI ya no necesita un lockfile confirmado. Nota: los ciclos grabados antes de esta actualización muestran las fases como un segmento sin color/no reconocido en la leyenda del gráfico (los antiguos nombres de fase en alemán ya no coinciden con las nuevas claves de fase internas) - puramente cosmético, solo afecta a los datos históricos, los nuevos ciclos no se ven afectados.",
41
- "pl": "Pełne wsparcie wielojęzyczności: interfejs administracyjny, powiadomienia i nazwy faz programu są teraz automatycznie tłumaczone na 11 języków w oparciu o język systemowy ioBroker. Wszystkie komentarze w kodzie przetłumaczone na angielski. Poprawka: kolumna statusu w 'Wszystkie urządzenia' oraz domyślne szablony powiadomień nie przechodziły przez tłumaczenie. Infrastruktura: pełna zgodność z oficjalnym @iobroker/eslint-config (formatowanie + JSDoc), CI nie wymaga już zatwierdzonego pliku lock. Uwaga: cykle zarejestrowane przed tą aktualizacją pokazują fazy jako niekolorowy/nierozpoznany segment w legendzie wykresu (stare niemieckie nazwy faz nie pasują już do nowych wewnętrznych kluczy faz) - czysto kosmetyczne, dotyczy tylko danych historycznych, nowe cykle nie są dotknięte.",
42
- "uk": "Повна багатомовність: інтерфейс адміністрування, сповіщення та назви фаз програми тепер автоматично перекладаються на 11 мов залежно від системної мови ioBroker. Усі коментарі в коді перекладено англійською. Виправлення: стовпець стану в «Усі пристрої» та стандартні шаблони сповіщень раніше не проходили через переклад. Інфраструктура: повна відповідність офіційному @iobroker/eslint-config (форматування + JSDoc), CI більше не потребує зафіксованого lock-файлу. Примітка: цикли, записані до цього оновлення, показують фази як нерозфарбований/невпізнаний сегмент у легенді графіка (старі німецькі назви фаз більше не відповідають новим внутрішнім ключам фаз) - суто косметично, стосується лише історичних даних, нові цикли не постраждали.",
43
- "zh-cn": "完整的多语言支持:管理界面、通知和程序阶段名称现在会根据ioBroker系统语言自动翻译成11种语言。所有代码注释已翻译成英文。修复:“所有设备”中的状态列以及默认通知模板此前未经过翻译处理。基础设施:完全符合官方@iobroker/eslint-config规范(格式化+JSDoc),CI不再需要提交锁定文件。 注意:在此更新之前记录的周期在图表图例中会将阶段显示为无颜色/无法识别的片段(旧的德语阶段名称不再与新的内部阶段键匹配)——纯粹是外观问题,仅影响历史数据,新周期不受影响。"
44
- },
45
- "0.3.0": {
46
- "en": "Beta: proper dishwasher phase detection (live + historical), email notification support (ioBroker.email), fixed instance URL parameter and hash deep-linking, fixed Anti-Knitter checkbox polarity (was inverted - 'ignorieren' checked/unchecked did the opposite of what it should), fixed immediate cycle cutoff when no Anti-Knitter reference exists, added Anti-Knitter reference delete button, migrated to the official @iobroker/eslint-config, added a real package-lock.json and integration test, restructured CI to the current ioBroker workflow template.",
47
- "de": "Beta: richtige Spülmaschinen-Phasenerkennung (live + historisch), E-Mail-Benachrichtigungen (ioBroker.email), instance-URL-Parameter und Hash-Deep-Linking gefixt, Anti-Knitter-Checkbox-Polarität gefixt (war invertiert - 'ignorieren' an/aus hat das Gegenteil von dem gemacht, was es sollte), sofortiger Zyklusabbruch ohne Anti-Knitter-Referenzmuster gefixt, Löschen-Button fürs Anti-Knitter-Muster ergänzt, Umstieg auf die offizielle @iobroker/eslint-config, echte package-lock.json und Integrationstest ergänzt, CI auf aktuelles ioBroker-Workflow-Template umgestellt.",
48
- "ru": "Бета: правильное определение фаз посудомоечной машины (в реальном времени и в истории), поддержка уведомлений по email (ioBroker.email), исправлен параметр instance в URL и переход по хешу, исправлена полярность чекбокса Anti-Knitter (было инвертировано), исправлено немедленное прерывание цикла при отсутствии эталонного образца Anti-Knitter, добавлена кнопка удаления эталона Anti-Knitter, переход на официальный @iobroker/eslint-config, добавлены настоящий package-lock.json и интеграционный тест, обновлён CI по актуальному шаблону ioBroker.",
49
- "pt": "Beta: detecção correta de fase da lava-louças (ao vivo + histórico), suporte a notificações por email (ioBroker.email), corrigido parâmetro instance na URL e navegação por hash, corrigida polaridade da checkbox Anti-Knitter (estava invertida), corrigido corte imediato do ciclo quando não existe padrão de referência Anti-Knitter, adicionado botão para excluir a referência Anti-Knitter, migração para o @iobroker/eslint-config oficial, adicionado package-lock.json real e teste de integração, CI reestruturado conforme o modelo atual do ioBroker.",
50
- "nl": "Bèta: correcte fasedetectie voor vaatwassers (live + historisch), ondersteuning voor e-mailmeldingen (ioBroker.email), instance-URL-parameter en hash-deeplinking gerepareerd, polariteit van de Anti-Knitter-checkbox gerepareerd (was omgekeerd), directe cyclusafbreking zonder Anti-Knitter-referentiepatroon gerepareerd, verwijderknop voor Anti-Knitter-referentie toegevoegd, migratie naar de officiële @iobroker/eslint-config, echte package-lock.json en integratietest toegevoegd, CI vernieuwd volgens het huidige ioBroker-workflowsjabloon.",
51
- "fr": "Bêta : détection correcte des phases du lave-vaisselle (en direct + historique), prise en charge des notifications par e-mail (ioBroker.email), correction du paramètre instance de l'URL et de la navigation par hash, correction de la polarité de la case Anti-Knitter (était inversée), correction de l'arrêt immédiat du cycle en l'absence de motif de référence Anti-Knitter, ajout d'un bouton de suppression du motif Anti-Knitter, migration vers @iobroker/eslint-config officiel, ajout d'un vrai package-lock.json et d'un test d'intégration, CI restructurée selon le modèle actuel d'ioBroker.",
52
- "it": "Beta: corretto rilevamento delle fasi della lavastoviglie (in tempo reale e storico), supporto notifiche email (ioBroker.email), corretto il parametro instance dell'URL e il deep-linking tramite hash, corretta la polarità della casella Anti-Knitter (era invertita), corretta l'interruzione immediata del ciclo in assenza di un modello di riferimento Anti-Knitter, aggiunto pulsante per eliminare il riferimento Anti-Knitter, migrazione a @iobroker/eslint-config ufficiale, aggiunti un vero package-lock.json e un test di integrazione, CI ristrutturata secondo l'attuale modello di workflow ioBroker.",
53
- "es": "Beta: detección correcta de fases del lavavajillas (en vivo e histórico), soporte de notificaciones por email (ioBroker.email), corregido el parámetro instance de la URL y el enlace directo por hash, corregida la polaridad de la casilla Anti-Knitter (estaba invertida), corregido el corte inmediato del ciclo cuando no existe un patrón de referencia Anti-Knitter, añadido botón para eliminar la referencia Anti-Knitter, migración al @iobroker/eslint-config oficial, añadidos un package-lock.json real y una prueba de integración, CI reestructurado según la plantilla actual de ioBroker.",
54
- "pl": "Beta: prawidłowe wykrywanie faz zmywarki (na żywo i historyczne), obsługa powiadomień e-mail (ioBroker.email), naprawiono parametr instance w URL oraz nawigację przez hash, naprawiono odwróconą logikę checkboxa Anti-Knitter, naprawiono natychmiastowe przerywanie cyklu przy braku wzorca referencyjnego Anti-Knitter, dodano przycisk usuwania wzorca Anti-Knitter, migracja do oficjalnego @iobroker/eslint-config, dodano prawdziwy package-lock.json oraz test integracyjny, przebudowano CI zgodnie z aktualnym szablonem ioBroker.",
55
- "uk": "Бета: правильне визначення фаз посудомийної машини (у реальному часі та в історії), підтримка сповіщень електронною поштою (ioBroker.email), виправлено параметр instance в URL та навігацію за хешем, виправлено полярність чекбоксу Anti-Knitter (була інвертована), виправлено миттєве переривання циклу за відсутності еталонного зразка Anti-Knitter, додано кнопку видалення еталону Anti-Knitter, перехід на офіційний @iobroker/eslint-config, додано справжній package-lock.json та інтеграційний тест, CI перебудовано за актуальним шаблоном ioBroker.",
56
- "zh-cn": "测试版:修复了洗碗机阶段检测(实时和历史)、支持邮件通知(ioBroker.email)、修复了实例URL参数和哈希深度链接、修复了防皱复选框极性反转的问题、修复了没有防皱参考图案时周期立即中断的问题、新增了删除防皱参考图案的按钮、迁移到官方的@iobroker/eslint-config、添加了真实的package-lock.json和集成测试、按照当前ioBroker工作流模板重构了CI。"
57
- },
58
- "0.2.8": {
59
- "en": "New: proper phase detection for dishwashers, both in the historical cycle graph and the live status display (Vorspülen/Hauptspülgang/Klarspülgang/Trocknen based on ordinal heating-block count, instead of a flat per-reading power threshold that mislabeled every heat spike as 'Aufheizen'). Fix: instance URL param was ignored for initial device pre-selection in the admin tab. Fix attempt: hash-based deep-linking no longer triggers premature data loading before device discovery completes.",
60
- "de": "Neu: richtige Phasenerkennung für Spülmaschinen, sowohl im historischen Zyklus-Graph als auch in der Live-Anzeige (Vorspülen/Hauptspülgang/Klarspülgang/Trocknen anhand der Anzahl der Heizblöcke, statt einer reinen Momentanwert-Schwelle, die jede Heizspitze als 'Aufheizen' bezeichnet hat). Fix: instance-URL-Parameter wurde bei der Geräte-Vorauswahl im Admin-Tab ignoriert. Fix-Versuch: Hash-basiertes Deep-Linking löst keine verfrühte Datenladung mehr aus, bevor die Geräteerkennung abgeschlossen ist.",
61
- "ru": "Новое: правильное определение фаз посудомоечной машины как в реальном времени, так и на графике истории циклов. Исправление: параметр instance в URL игнорировался при предварительном выборе устройства. Попытка исправления: переход по хешу больше не запускает загрузку данных раньше времени.",
62
- "pt": "Novo: detecção correta de fase para lava-louças, tanto ao vivo quanto no gráfico histórico do ciclo. Correção: o parâmetro instance da URL era ignorado na pré-seleção inicial do dispositivo. Tentativa de correção: a navegação por hash não dispara mais o carregamento prematuro de dados.",
63
- "nl": "Nieuw: correcte fasedetectie voor vaatwassers, zowel live als in de historische cyclusgrafiek. Reparatie: de instance-URL-parameter werd genegeerd bij de initiële apparaatselectie. Poging tot reparatie: hash-gebaseerde deeplinking start niet meer voortijdig met gegevens laden.",
64
- "fr": "Nouveau : détection correcte des phases pour les lave-vaisselle, en direct et dans le graphique historique du cycle. Correction : le paramètre instance de l'URL était ignoré lors de la présélection initiale de l'appareil. Tentative de correction : la navigation par hash ne déclenche plus le chargement prématuré des données.",
65
- "it": "Novità: corretto rilevamento delle fasi per lavastoviglie, sia in tempo reale che nel grafico storico del ciclo. Correzione: il parametro instance dell'URL veniva ignorato nella preselezione iniziale del dispositivo. Tentativo di correzione: il deep-linking tramite hash non avvia più il caricamento prematuro dei dati.",
66
- "es": "Novedad: detección correcta de fases para lavavajillas, tanto en vivo como en el gráfico histórico del ciclo. Corrección: el parámetro instance de la URL se ignoraba en la preselección inicial del dispositivo. Intento de corrección: el enlace directo por hash ya no dispara la carga prematura de datos.",
67
- "pl": "Nowość: prawidłowe wykrywanie faz zmywarek, zarówno na żywo, jak i na historycznym wykresie cyklu. Poprawka: parametr instance w URL był ignorowany przy wstępnym wyborze urządzenia. Próba poprawki: nawigacja przez hash nie wywołuje już przedwczesnego ładowania danych.",
68
- "uk": "Нове: правильне визначення фаз посудомийної машини як у реальному часі, так і на графіку історії циклу. Виправлення: параметр instance в URL ігнорувався при попередньому виборі пристрою. Спроба виправлення: навігація за хешем більше не запускає завантаження даних завчасно.",
69
- "zh-cn": "新增:正确的洗碗机阶段检测,包括实时和历史周期图表。修复:实例URL参数在设备初始预选时被忽略。修复尝试:基于哈希的深度链接不再在设备发现完成前触发数据加载。"
70
- },
71
- "0.2.7": {
72
- "en": "Attempted fix: hash-based deep-linking no longer triggers data loading (getCycleHistory/getProfiles/etc.) for the target tab before device discovery has completed - only a visual tab switch happens immediately, data loading is deferred until devices are actually known. This addresses a suspected race where early sendTo() calls with an empty deviceId may have interfered with the getDevices flow.",
73
- "de": "Versuchter Fix: Hash-basiertes Deep-Linking löst keine Datenladung (getCycleHistory/getProfiles/etc.) für den Ziel-Tab mehr aus, bevor die Geräteerkennung abgeschlossen ist - es passiert zunächst nur ein visueller Tab-Wechsel, die Datenladung erfolgt erst sobald Geräte bekannt sind. Dies adressiert eine vermutete Race Condition, bei der frühe sendTo()-Aufrufe mit leerer deviceId den getDevices-Ablauf gestört haben könnten.",
74
- "ru": "Попытка исправления: переход по хешу больше не запускает загрузку данных (getCycleHistory/getProfiles и т.д.) для целевой вкладки до завершения обнаружения устройств — сразу происходит только визуальное переключение вкладки, загрузка данных откладывается.",
75
- "pt": "Tentativa de correção: a navegação por hash não dispara mais o carregamento de dados (getCycleHistory/getProfiles/etc.) para a aba de destino antes que a descoberta de dispositivos seja concluída - apenas a troca visual da aba ocorre imediatamente, o carregamento de dados é adiado.",
76
- "nl": "Poging tot reparatie: hash-gebaseerde deeplinking activeert niet langer het laden van gegevens (getCycleHistory/getProfiles/etc.) voor het doeltabblad voordat de apparaatdetectie is voltooid - alleen een visuele tabwissel gebeurt direct, het laden van gegevens wordt uitgesteld.",
77
- "fr": "Tentative de correction : la navigation par hash ne déclenche plus le chargement des données (getCycleHistory/getProfiles/etc.) pour l'onglet cible avant que la détection des appareils ne soit terminée - seul un changement visuel d'onglet se produit immédiatement, le chargement des données est différé.",
78
- "it": "Tentativo di correzione: il deep-linking tramite hash non avvia più il caricamento dei dati (getCycleHistory/getProfiles/ecc.) per la scheda di destinazione prima che il rilevamento dei dispositivi sia completato - avviene subito solo il cambio visivo della scheda, il caricamento dei dati viene rimandato.",
79
- "es": "Intento de corrección: el enlace directo por hash ya no dispara la carga de datos (getCycleHistory/getProfiles/etc.) para la pestaña de destino antes de que finalice la detección de dispositivos - solo ocurre inmediatamente el cambio visual de pestaña, la carga de datos se pospone.",
80
- "pl": "Próba poprawki: nawigacja przez hash nie wywołuje już ładowania danych (getCycleHistory/getProfiles itp.) dla docelowej karty przed zakończeniem wykrywania urządzeń - natychmiast następuje tylko wizualna zmiana karty, ładowanie danych jest opóźnione.",
81
- "uk": "Спроба виправлення: навігація за хешем більше не запускає завантаження даних (getCycleHistory/getProfiles тощо) для цільової вкладки до завершення виявлення пристроїв - одразу відбувається лише візуальна зміна вкладки, завантаження даних відкладається.",
82
- "zh-cn": "修复尝试:基于哈希的深度链接不再在设备发现完成前为目标标签页触发数据加载(getCycleHistory/getProfiles等)——只立即进行标签页的视觉切换,数据加载被推迟。"
83
- },
84
- "0.2.6": {
85
- "en": "Fix: hash-based deep-linking (#1-#6) could get stuck showing an empty page when device loading was slow or failed (e.g. standalone access outside Admin). Tab switching via hash now happens immediately on page load, independent of the device data pipeline.",
86
- "de": "Fix: Hash-basiertes Deep-Linking (#1-#6) konnte bei langsamer oder fehlgeschlagener Geräteladung (z.B. Standalone-Aufruf außerhalb von Admin) in einer leeren Seite hängen bleiben. Tab-Wechsel per Hash passiert jetzt sofort beim Laden, unabhängig von der Geräte-Datenladung.",
87
- "ru": "Исправление: переход по хешу (#1-#6) мог зависать с пустой страницей, если загрузка устройств была медленной или неудачной. Переключение вкладок по хешу теперь происходит сразу при загрузке страницы.",
88
- "pt": "Correção: a navegação por hash (#1-#6) podia travar mostrando uma página vazia quando o carregamento do dispositivo era lento ou falhava. A troca de aba por hash agora ocorre imediatamente ao carregar a página.",
89
- "nl": "Reparatie: hash-gebaseerde deeplinking (#1-#6) kon vastlopen met een lege pagina wanneer het laden van apparaten traag was of mislukte. Tabwisseling via hash gebeurt nu direct bij het laden van de pagina.",
90
- "fr": "Correction : la navigation par hash (#1-#6) pouvait rester bloquée sur une page vide lorsque le chargement de l'appareil était lent ou échouait. Le changement d'onglet par hash se produit désormais immédiatement au chargement de la page.",
91
- "it": "Correzione: il deep-linking tramite hash (#1-#6) poteva bloccarsi mostrando una pagina vuota quando il caricamento del dispositivo era lento o falliva. Il cambio di scheda tramite hash avviene ora immediatamente al caricamento della pagina.",
92
- "es": "Corrección: el enlace directo por hash (#1-#6) podía quedarse atascado mostrando una página vacía cuando la carga del dispositivo era lenta o fallaba. El cambio de pestaña por hash ahora ocurre inmediatamente al cargar la página.",
93
- "pl": "Poprawka: nawigacja przez hash (#1-#6) mogła utknąć, pokazując pustą stronę, gdy ładowanie urządzenia było wolne lub nieudane. Zmiana karty przez hash następuje teraz natychmiast podczas ładowania strony.",
94
- "uk": "Виправлення: навігація за хешем (#1-#6) могла зависати з порожньою сторінкою, якщо завантаження пристрою було повільним або невдалим. Перемикання вкладок за хешем тепер відбувається одразу під час завантаження сторінки.",
95
- "zh-cn": "修复:当设备加载缓慢或失败时(例如在Admin之外独立访问),基于哈希的深度链接(#1-#6)可能会卡在空白页面。现在通过哈希切换标签页会在页面加载时立即发生。"
96
44
  }
97
45
  },
98
46
  "titleLang": {
@@ -987,6 +987,13 @@ class WashDataManager {
987
987
  }));
988
988
  }
989
989
 
990
+ // _phaseHistory is only ever lazily initialized, never cleared between
991
+ // cycles - without this reset, entries from every past cycle since
992
+ // adapter start keep accumulating and get re-timestamped relative to
993
+ // the *current* cycleStartTime above, producing wildly wrong (often
994
+ // large negative) tMs values for anything but the most recent phases.
995
+ this._phaseHistory = [];
996
+
990
997
  // Save the trace in compressed form
991
998
  if (trace.length >= 2) {
992
999
  this.traceStore.saveTrace(
package/main.js CHANGED
@@ -1822,7 +1822,7 @@ class WashdataAdapter extends utils.Adapter {
1822
1822
  id: "cycleProgress",
1823
1823
  name: "Fortschritt",
1824
1824
  type: "number",
1825
- role: "value.percent",
1825
+ role: "value",
1826
1826
  def: 0,
1827
1827
  write: false,
1828
1828
  unit: "%",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.laundrylens",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
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",
@@ -40,6 +40,8 @@
40
40
  "@iobroker/adapter-dev": "^1.5.0",
41
41
  "@alcalzone/release-script": "^5.2.1",
42
42
  "@alcalzone/release-script-plugin-iobroker": "^5.2.0",
43
+ "@alcalzone/release-script-plugin-license": "^5.2.2",
44
+ "@alcalzone/release-script-plugin-manual-review": "^5.2.0",
43
45
  "@tsconfig/node22": "^22.0.5",
44
46
  "@types/node": "^22.0.0"
45
47
  },