iobroker.miele-local 0.3.39 → 0.3.41

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
@@ -47,6 +47,14 @@ so the page stops at a spinning wheel and you read the address out of the browse
47
47
  GroupID and GroupKey are then stored in the instance configuration, the key encrypted. You never
48
48
  need this procedure again.
49
49
 
50
+ **Login fails with `invalid_request … unknown contextId`?** Miele's login service switches between
51
+ two domains during sign-in and loses its session when an ad blocker or strict third-party cookie
52
+ protection interferes. Open the login page in a private window without extensions.
53
+
54
+ **Moving to another system.** GroupID and GroupKey never change. A backup of the ioBroker
55
+ configuration (e.g. BackItUp) carries them over; on a fresh system repeating the login takes two
56
+ minutes. The admin page shows the key only as a placeholder.
57
+
50
58
  ## What you get
51
59
 
52
60
  Every appliance becomes one device with its serial number as the ID. Below it:
@@ -123,7 +131,9 @@ Every field carries its explanation underneath it in the admin; this page does n
123
131
  | outbound | TCP 443 → miele-iot.com | fetch the GroupKey | login only |
124
132
 
125
133
  Without push **no inbound port** is needed. For mDNS, ioBroker and the appliances must sit in the
126
- same broadcast segment.
134
+ same broadcast segment. Separate IoT WLANs or VLANs, firewalls (including the Windows firewall on
135
+ a test machine) and routers that filter multicast stop discovery just as well. In all these cases
136
+ the manual IP list is the reliable way.
127
137
 
128
138
  **Docker.** In a container with bridge networking multicast is not forwarded, so discovery finds
129
139
  nothing — enter the IP addresses by hand, polling then works normally. Push does not work there at
@@ -227,6 +237,17 @@ engineering work of the projects `MieleRESTServer` (akappner),
227
237
  ### **WORK IN PROGRESS**
228
238
  -->
229
239
 
240
+ ### 0.3.41
241
+
242
+ - (SmarthomeElektroniker) Device types corrected: 16 is the microwave (was: steam oven combi), 67 the dialog oven (was: dish warmer, now 25), the washer-dryer (24) uses the washing machine programs, the oven with microwave (13) its own phases
243
+ - (SmarthomeElektroniker) New device types: semi-professional/professional washers, dryers and dishwashers, robot vacuum (23), steam oven combi (31), steam oven with microwave (45, 418 programs), steam oven MK2 (73); dishwasher program 5 added
244
+ - (SmarthomeElektroniker) Programs without a German name are shown readably ("Artichokes small") instead of as raw identifier
245
+ - (SmarthomeElektroniker) Credits for the tables taken over from Home Assistant, ha-miele-at-lan and ioBroker.miele-unbound
246
+
247
+ ### 0.3.40
248
+
249
+ - (SmarthomeElektroniker) README: hints for a failing login (ad blocker), moving to another system and why mDNS may find nothing; clearer log message when no appliance is found (#12, thanks @meistermopper)
250
+
230
251
  ### 0.3.39
231
252
 
232
253
  - (SmarthomeElektroniker) Unknown program or phase IDs are now shown as "Programm 201" / "Phase 1234" instead of keeping the text of the previous program (#13)
@@ -466,6 +487,15 @@ Most of the above was contributed by [meistermopper](https://github.com/meisterm
466
487
 
467
488
  [Older changelog entries can be found here](CHANGELOG_OLD.md)
468
489
 
490
+ ## Credits
491
+
492
+ The program and phase tables in `lib/enums.js` and the mapping of device types to tables come
493
+ from [Home Assistant](https://github.com/home-assistant/core) (Apache License 2.0, © Home Assistant
494
+ Authors), taken over via [ha-miele-at-lan](https://github.com/tiehfood/ha-miele-at-lan) (MIT, ©
495
+ tiehfood) and cross-checked against
496
+ [ioBroker.miele-unbound](https://github.com/meistermopper/ioBroker.miele-unbound) (MIT, ©
497
+ meistermopper). Thanks to all three projects.
498
+
469
499
  ## License
470
500
 
471
501
  MIT License
package/README_de.md CHANGED
@@ -49,6 +49,15 @@ selbst aus dem Browser heraus.
49
49
  GroupID und GroupKey stehen danach in der Instanzkonfiguration, der Schlüssel verschlüsselt.
50
50
  Diese Prozedur braucht man nie wieder.
51
51
 
52
+ **Anmeldung scheitert mit `invalid_request … unknown contextId`?** Mieles Anmeldedienst wechselt
53
+ beim Login zwischen zwei Domains und verliert die Sitzung, wenn ein Werbeblocker oder ein strenger
54
+ Schutz vor Drittanbieter-Cookies dazwischenfunkt. Die Login-Seite dann in einem privaten Fenster
55
+ ohne Erweiterungen öffnen.
56
+
57
+ **Umzug auf ein anderes System.** GroupID und GroupKey ändern sich nie. Eine Sicherung der
58
+ ioBroker-Konfiguration (etwa mit BackItUp) nimmt sie mit; auf einem frischen System dauert der
59
+ Login erneut zwei Minuten. Die Admin-Seite zeigt den Schlüssel nur als Platzhalter.
60
+
52
61
  ## Was dabei herauskommt
53
62
 
54
63
  Jedes Gerät wird ein Objekt mit seiner Seriennummer als Kennung. Darunter:
@@ -125,7 +134,9 @@ Jedes Feld trägt seine Erklärung im Admin direkt unter sich; diese Seite wiede
125
134
  | ausgehend | TCP 443 → miele-iot.com | GroupKey abrufen | nur bei der Anmeldung |
126
135
 
127
136
  Ohne Push ist **kein eingehender Port** nötig. Für mDNS müssen ioBroker und die Geräte im selben
128
- Broadcast-Segment liegen.
137
+ Broadcast-Segment liegen. Getrennte IoT-WLANs oder VLANs, Firewalls (auch die Windows-Firewall auf
138
+ einem Testrechner) und Router, die Multicast filtern, verhindern die Suche genauso. In all diesen
139
+ Fällen ist die manuelle IP-Liste der verlässliche Weg.
129
140
 
130
141
  **Docker.** In einem Container mit Bridge-Netz wird Multicast nicht weitergereicht, die Suche
131
142
  findet also nichts – die IP-Adressen von Hand eintragen, das Abfragen läuft dann normal. Push
@@ -344,6 +355,15 @@ Reverse-Engineering-Arbeit der Projekte `MieleRESTServer` (akappner),
344
355
 
345
356
  [Ältere Einträge sind hier zu finden](CHANGELOG_OLD.md)
346
357
 
358
+ ## Danksagung
359
+
360
+ Die Programm- und Phasentabellen in `lib/enums.js` und die Zuordnung der Gerätetypen stammen aus
361
+ [Home Assistant](https://github.com/home-assistant/core) (Apache License 2.0, © Home Assistant
362
+ Authors), übernommen über [ha-miele-at-lan](https://github.com/tiehfood/ha-miele-at-lan) (MIT, ©
363
+ tiehfood) und abgeglichen mit
364
+ [ioBroker.miele-unbound](https://github.com/meistermopper/ioBroker.miele-unbound) (MIT, ©
365
+ meistermopper). Danke an alle drei Projekte.
366
+
347
367
  ## Lizenz
348
368
 
349
369
  MIT License - Copyright (c) 2026 Immanuel <github@freitag.online>
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "miele-local",
4
- "version": "0.3.39",
4
+ "version": "0.3.41",
5
5
  "titleLang": {
6
6
  "en": "Miele@local",
7
7
  "de": "Miele@local",
@@ -52,6 +52,32 @@
52
52
  "readme": "https://github.com/SmarthomeElektroniker/ioBroker.miele-local/blob/main/README.md",
53
53
  "loglevel": "info",
54
54
  "news": {
55
+ "0.3.41": {
56
+ "en": "Device types corrected (16 microwave, 67 dialog oven, 25 dish warmer, washer-dryer uses washing machine programs); new types: robot vacuum, steam oven combi, steam oven with microwave (418 programs), professional appliances. Credits for tables from Home Assistant.",
57
+ "de": "Gerätetypen berichtigt (16 Mikrowelle, 67 Dialoggarer, 25 Wärmeschublade, Waschtrockner mit Waschmaschinenprogrammen); neue Typen: Saugroboter, Dampfbackofen, Dampfgarer mit Mikrowelle (418 Programme), Profi-Geräte. Danksagung für die Tabellen aus Home Assistant.",
58
+ "ru": "Исправлены типы устройств (16 микроволновка, 67 Dialog-печь, 25 подогреватель посуды, стирально-сушильная машина с программами стиральной машины); новые типы: робот-пылесос, пароконвектомат, пароварка с микроволновкой (418 программ), профессиональные приборы. Благодарность Home Assistant за таблицы.",
59
+ "pt": "Tipos de aparelho corrigidos (16 micro-ondas, 67 forno Dialog, 25 aquecedor de loiça, máquina de lavar e secar com programas de lavagem); novos tipos: aspirador robô, forno a vapor combinado, forno a vapor com micro-ondas (418 programas), aparelhos profissionais. Créditos pelas tabelas do Home Assistant.",
60
+ "nl": "Apparaattypes gecorrigeerd (16 magnetron, 67 Dialog-oven, 25 servieswarmer, was-droogcombinatie met wasmachineprogramma's); nieuwe types: robotstofzuiger, combi-stoomoven, stoomoven met magnetron (418 programma's), professionele apparaten. Dank aan Home Assistant voor de tabellen.",
61
+ "fr": "Types d'appareils corrigés (16 micro-ondes, 67 four Dialog, 25 chauffe-vaisselle, lave-linge séchant avec programmes de lave-linge) ; nouveaux types : aspirateur robot, four vapeur combiné, four vapeur avec micro-ondes (418 programmes), appareils professionnels. Remerciements à Home Assistant pour les tables.",
62
+ "it": "Tipi di apparecchio corretti (16 microonde, 67 forno Dialog, 25 scaldavivande, lavasciuga con programmi della lavatrice); nuovi tipi: robot aspirapolvere, forno a vapore combinato, forno a vapore con microonde (418 programmi), apparecchi professionali. Ringraziamenti a Home Assistant per le tabelle.",
63
+ "es": "Tipos de aparato corregidos (16 microondas, 67 horno Dialog, 25 calientaplatos, lavadora-secadora con programas de lavadora); nuevos tipos: robot aspirador, horno de vapor combinado, horno de vapor con microondas (418 programas), aparatos profesionales. Agradecimientos a Home Assistant por las tablas.",
64
+ "pl": "Poprawiono typy urządzeń (16 mikrofalówka, 67 piekarnik Dialog, 25 podgrzewacz naczyń, pralko-suszarka z programami pralki); nowe typy: robot sprzątający, piekarnik parowy kombi, piekarnik parowy z mikrofalą (418 programów), urządzenia profesjonalne. Podziękowania dla Home Assistant za tabele.",
65
+ "uk": "Виправлено типи пристроїв (16 мікрохвильова піч, 67 піч Dialog, 25 підігрівач посуду, прально-сушильна машина з програмами пральної машини); нові типи: робот-пилосос, комбі-пароварка, пароварка з мікрохвильовою піччю (418 програм), професійні прилади. Подяка Home Assistant за таблиці.",
66
+ "zh-cn": "修正设备类型(16 微波炉、67 Dialog 烤箱、25 暖碟机、洗干一体机使用洗衣机程序);新增类型:扫地机器人、蒸烤箱、微波蒸箱(418 个程序)、专业设备。感谢 Home Assistant 提供的表格。"
67
+ },
68
+ "0.3.40": {
69
+ "en": "README: hints for a failing login (ad blocker), moving to another system and why mDNS may find nothing; clearer log message when no appliance is found (#12).",
70
+ "de": "README: Hinweise bei scheiterndem Login (Werbeblocker), zum Umzug auf ein anderes System und warum mDNS nichts findet; deutlichere Logmeldung, wenn kein Gerät gefunden wird (#12).",
71
+ "ru": "README: подсказки при неудачном входе (блокировщик рекламы), при переносе на другую систему и о том, почему mDNS ничего не находит; более понятное сообщение в журнале, если устройство не найдено (#12).",
72
+ "pt": "README: dicas para um login falhado (bloqueador de anúncios), para mudar para outro sistema e porque o mDNS pode não encontrar nada; mensagem de registo mais clara quando nenhum aparelho é encontrado (#12).",
73
+ "nl": "README: tips bij een mislukte login (adblocker), bij verhuizing naar een ander systeem en waarom mDNS niets vindt; duidelijkere logmelding als er geen apparaat wordt gevonden (#12).",
74
+ "fr": "README : conseils en cas d'échec de connexion (bloqueur de publicités), pour migrer vers un autre système et pourquoi mDNS ne trouve rien ; message de journal plus clair lorsqu'aucun appareil n'est trouvé (#12).",
75
+ "it": "README: suggerimenti per un login non riuscito (blocco pubblicità), per il trasferimento su un altro sistema e perché mDNS non trova nulla; messaggio di log più chiaro quando non viene trovato alcun apparecchio (#12).",
76
+ "es": "README: consejos para un inicio de sesión fallido (bloqueador de anuncios), para migrar a otro sistema y por qué mDNS no encuentra nada; mensaje de registro más claro cuando no se encuentra ningún aparato (#12).",
77
+ "pl": "README: wskazówki przy nieudanym logowaniu (bloker reklam), przy przenoszeniu na inny system i dlaczego mDNS nic nie znajduje; czytelniejszy komunikat w dzienniku, gdy nie znaleziono urządzenia (#12).",
78
+ "uk": "README: підказки при невдалому вході (блокувальник реклами), при перенесенні на іншу систему та чому mDNS нічого не знаходить; зрозуміліше повідомлення в журналі, якщо пристрій не знайдено (#12).",
79
+ "zh-cn": "README:登录失败(广告拦截器)、迁移到其他系统以及 mDNS 找不到设备原因的提示;未找到设备时日志信息更清晰 (#12)。"
80
+ },
55
81
  "0.3.39": {
56
82
  "en": "Unknown program or phase IDs are shown as \"Programm 201\" instead of keeping the text of the previous program. Dishwasher program IDs of the G7771 added (#13).",
57
83
  "de": "Unbekannte Programm- oder Phasennummern erscheinen als „Programm 201“, statt den Text des vorigen Programms stehen zu lassen. Programmnummern des Geschirrspülers G7771 ergänzt (#13).",
package/lib/enums.js CHANGED
@@ -1,5 +1,12 @@
1
1
  'use strict';
2
- // Auto-generiert aus der RE-Referenz (ha-miele-at-lan/enums.py). Klartext-Dekodierung.
2
+ // Klartext-Dekodierung. Die Tabellen und die Zuordnung Geraetetyp -> Tabelle stammen aus
3
+ // Home Assistant (homeassistant/components/miele/const.py, Apache-2.0, (c) Home Assistant
4
+ // Authors), uebernommen ueber ha-miele-at-lan (custom_components/miele_lan/enums.py und
5
+ // sensor.py, MIT, (c) 2026 tiehfood). Abgeglichen mit ioBroker.miele-unbound
6
+ // (src/lib/definitions.ts, MIT, (c) 2026 meistermopper). Eigene Ergaenzungen sind im Text
7
+ // gekennzeichnet (etwa die 200er-Reihe der Spuelmaschinen).
8
+ // https://github.com/home-assistant/core - Apache License 2.0
9
+ // https://github.com/tiehfood/ha-miele-at-lan - MIT License
3
10
  //
4
11
  // ANMERKUNG ZU StateStatus 12 ("service"), am Geraet geprueft am 25.08.2026:
5
12
  // Der Wert meldet nicht, dass das Geraet gewartet wird, sondern dass jemand am Geraet das
@@ -330,6 +337,7 @@ const TABLES = {
330
337
  1: 'intensive',
331
338
  2: 'maintenance',
332
339
  3: 'eco',
340
+ 5: 'normal',
333
341
  6: 'automatic',
334
342
  7: 'automatic',
335
343
  9: 'solar_save',
@@ -820,20 +828,509 @@ const TABLES = {
820
828
  2: 'medium',
821
829
  3: 'high',
822
830
  },
831
+ // Dampfgarer mit Mikrowelle (45)
832
+ SteamOvenMicroProgramId: {
833
+ '-1': 'no_program',
834
+ 0: 'no_program',
835
+ 8: 'steam_cooking',
836
+ 19: 'microwave',
837
+ 53: 'popcorn',
838
+ 54: 'quick_mw',
839
+ 72: 'sous_vide',
840
+ 75: 'eco_steam_cooking',
841
+ 77: 'rapid_steam_cooking',
842
+ 326: 'descale',
843
+ 330: 'menu_cooking',
844
+ 2018: 'reheating_with_steam',
845
+ 2019: 'defrosting_with_steam',
846
+ 2020: 'blanching',
847
+ 2021: 'bottling',
848
+ 2022: 'sterilize_crockery',
849
+ 2023: 'prove_dough',
850
+ 2027: 'soak',
851
+ 2029: 'reheating_with_microwave',
852
+ 2030: 'defrosting_with_microwave',
853
+ 2031: 'artichokes_small',
854
+ 2032: 'artichokes_medium',
855
+ 2033: 'artichokes_large',
856
+ 2034: 'eggplant_sliced',
857
+ 2035: 'eggplant_diced',
858
+ 2036: 'cauliflower_whole_small',
859
+ 2039: 'cauliflower_whole_medium',
860
+ 2042: 'cauliflower_whole_large',
861
+ 2046: 'cauliflower_florets_small',
862
+ 2048: 'cauliflower_florets_medium',
863
+ 2049: 'cauliflower_florets_large',
864
+ 2051: 'green_beans_whole',
865
+ 2052: 'green_beans_cut',
866
+ 2053: 'yellow_beans_whole',
867
+ 2054: 'yellow_beans_cut',
868
+ 2055: 'broad_beans',
869
+ 2056: 'common_beans',
870
+ 2057: 'runner_beans_whole',
871
+ 2058: 'runner_beans_pieces',
872
+ 2059: 'runner_beans_sliced',
873
+ 2060: 'broccoli_whole_small',
874
+ 2061: 'broccoli_whole_medium',
875
+ 2062: 'broccoli_whole_large',
876
+ 2064: 'broccoli_florets_small',
877
+ 2066: 'broccoli_florets_medium',
878
+ 2068: 'broccoli_florets_large',
879
+ 2069: 'endive_halved',
880
+ 2070: 'endive_quartered',
881
+ 2071: 'endive_strips',
882
+ 2072: 'chinese_cabbage_cut',
883
+ 2073: 'peas',
884
+ 2074: 'fennel_halved',
885
+ 2075: 'fennel_quartered',
886
+ 2076: 'fennel_strips',
887
+ 2077: 'kale_cut',
888
+ 2080: 'potatoes_in_the_skin_waxy_small_steam_cooking',
889
+ 2081: 'potatoes_in_the_skin_waxy_small_rapid_steam_cooking',
890
+ 2083: 'potatoes_in_the_skin_waxy_medium_steam_cooking',
891
+ 2084: 'potatoes_in_the_skin_waxy_medium_rapid_steam_cooking',
892
+ 2086: 'potatoes_in_the_skin_waxy_large_steam_cooking',
893
+ 2087: 'potatoes_in_the_skin_waxy_large_rapid_steam_cooking',
894
+ 2088: 'potatoes_in_the_skin_floury_small',
895
+ 2091: 'potatoes_in_the_skin_floury_medium',
896
+ 2094: 'potatoes_in_the_skin_floury_large',
897
+ 2097: 'potatoes_in_the_skin_mainly_waxy_small',
898
+ 2100: 'potatoes_in_the_skin_mainly_waxy_medium',
899
+ 2103: 'potatoes_in_the_skin_mainly_waxy_large',
900
+ 2106: 'potatoes_waxy_whole_small',
901
+ 2109: 'potatoes_waxy_whole_medium',
902
+ 2112: 'potatoes_waxy_whole_large',
903
+ 2115: 'potatoes_waxy_halved',
904
+ 2116: 'potatoes_waxy_quartered',
905
+ 2117: 'potatoes_waxy_diced',
906
+ 2118: 'potatoes_mainly_waxy_small',
907
+ 2119: 'potatoes_mainly_waxy_medium',
908
+ 2120: 'potatoes_mainly_waxy_large',
909
+ 2121: 'potatoes_mainly_waxy_halved',
910
+ 2122: 'potatoes_mainly_waxy_quartered',
911
+ 2123: 'potatoes_mainly_waxy_diced',
912
+ 2124: 'potatoes_floury_whole_small',
913
+ 2125: 'potatoes_floury_whole_medium',
914
+ 2126: 'potatoes_floury_whole_large',
915
+ 2127: 'potatoes_floury_halved',
916
+ 2128: 'potatoes_floury_quartered',
917
+ 2129: 'potatoes_floury_diced',
918
+ 2130: 'german_turnip_sliced',
919
+ 2131: 'german_turnip_cut_into_batons',
920
+ 2132: 'german_turnip_diced',
921
+ 2133: 'pumpkin_diced',
922
+ 2134: 'corn_on_the_cob',
923
+ 2135: 'mangel_cut',
924
+ 2136: 'bunched_carrots_whole_small',
925
+ 2137: 'bunched_carrots_whole_medium',
926
+ 2138: 'bunched_carrots_whole_large',
927
+ 2139: 'bunched_carrots_halved',
928
+ 2140: 'bunched_carrots_quartered',
929
+ 2141: 'bunched_carrots_diced',
930
+ 2142: 'bunched_carrots_cut_into_batons',
931
+ 2143: 'bunched_carrots_sliced',
932
+ 2144: 'parisian_carrots_small',
933
+ 2145: 'parisian_carrots_medium',
934
+ 2146: 'parisian_carrots_large',
935
+ 2147: 'carrots_whole_small',
936
+ 2148: 'carrots_whole_medium',
937
+ 2149: 'carrots_whole_large',
938
+ 2150: 'carrots_halved',
939
+ 2151: 'carrots_quartered',
940
+ 2152: 'carrots_diced',
941
+ 2153: 'carrots_cut_into_batons',
942
+ 2155: 'carrots_sliced',
943
+ 2156: 'pepper_halved',
944
+ 2157: 'pepper_quartered',
945
+ 2158: 'pepper_strips',
946
+ 2159: 'pepper_diced',
947
+ 2160: 'parsnip_sliced',
948
+ 2161: 'parsnip_diced',
949
+ 2162: 'parsnip_cut_into_batons',
950
+ 2163: 'parsley_root_sliced',
951
+ 2164: 'parsley_root_diced',
952
+ 2165: 'parsley_root_cut_into_batons',
953
+ 2166: 'leek_pieces',
954
+ 2167: 'leek_rings',
955
+ 2168: 'romanesco_whole_small',
956
+ 2169: 'romanesco_whole_medium',
957
+ 2170: 'romanesco_whole_large',
958
+ 2171: 'romanesco_florets_small',
959
+ 2172: 'romanesco_florets_medium',
960
+ 2173: 'romanesco_florets_large',
961
+ 2175: 'brussels_sprout',
962
+ 2176: 'beetroot_whole_small',
963
+ 2177: 'beetroot_whole_medium',
964
+ 2178: 'beetroot_whole_large',
965
+ 2179: 'red_cabbage_cut',
966
+ 2180: 'black_salsify_thin',
967
+ 2181: 'black_salsify_medium',
968
+ 2182: 'black_salsify_thick',
969
+ 2183: 'celery_pieces',
970
+ 2184: 'celery_sliced',
971
+ 2185: 'celeriac_sliced',
972
+ 2186: 'celeriac_cut_into_batons',
973
+ 2187: 'celeriac_diced',
974
+ 2188: 'white_asparagus_thin',
975
+ 2189: 'white_asparagus_medium',
976
+ 2190: 'white_asparagus_thick',
977
+ 2192: 'green_asparagus_thin',
978
+ 2194: 'green_asparagus_medium',
979
+ 2196: 'green_asparagus_thick',
980
+ 2197: 'spinach',
981
+ 2198: 'pointed_cabbage_cut',
982
+ 2199: 'yam_halved',
983
+ 2200: 'yam_quartered',
984
+ 2201: 'yam_strips',
985
+ 2202: 'swede_diced',
986
+ 2203: 'swede_cut_into_batons',
987
+ 2204: 'teltow_turnip_sliced',
988
+ 2205: 'teltow_turnip_diced',
989
+ 2206: 'jerusalem_artichoke_sliced',
990
+ 2207: 'jerusalem_artichoke_diced',
991
+ 2208: 'green_cabbage_cut',
992
+ 2209: 'savoy_cabbage_cut',
993
+ 2210: 'courgette_sliced',
994
+ 2211: 'courgette_diced',
995
+ 2212: 'snow_pea',
996
+ 2214: 'perch_whole',
997
+ 2215: 'perch_fillet_2_cm',
998
+ 2216: 'perch_fillet_3_cm',
999
+ 2217: 'gilt_head_bream_whole',
1000
+ 2220: 'gilt_head_bream_fillet',
1001
+ 2221: 'codfish_piece',
1002
+ 2222: 'codfish_fillet',
1003
+ 2224: 'trout',
1004
+ 2225: 'pike_fillet',
1005
+ 2226: 'pike_piece',
1006
+ 2227: 'halibut_fillet_2_cm',
1007
+ 2230: 'halibut_fillet_3_cm',
1008
+ 2231: 'codfish_fillet',
1009
+ 2232: 'codfish_piece',
1010
+ 2233: 'carp',
1011
+ 2234: 'salmon_fillet_2_cm',
1012
+ 2235: 'salmon_fillet_3_cm',
1013
+ 2238: 'salmon_steak_2_cm',
1014
+ 2239: 'salmon_steak_3_cm',
1015
+ 2240: 'salmon_piece',
1016
+ 2241: 'salmon_trout',
1017
+ 2244: 'iridescent_shark_fillet',
1018
+ 2245: 'red_snapper_fillet_2_cm',
1019
+ 2248: 'red_snapper_fillet_3_cm',
1020
+ 2249: 'redfish_fillet_2_cm',
1021
+ 2250: 'redfish_fillet_3_cm',
1022
+ 2251: 'redfish_piece',
1023
+ 2252: 'char',
1024
+ 2253: 'plaice_whole_2_cm',
1025
+ 2254: 'plaice_whole_3_cm',
1026
+ 2255: 'plaice_whole_4_cm',
1027
+ 2256: 'plaice_fillet_1_cm',
1028
+ 2259: 'plaice_fillet_2_cm',
1029
+ 2260: 'coalfish_fillet_2_cm',
1030
+ 2261: 'coalfish_fillet_3_cm',
1031
+ 2262: 'coalfish_piece',
1032
+ 2263: 'sea_devil_fillet_3_cm',
1033
+ 2266: 'sea_devil_fillet_4_cm',
1034
+ 2267: 'common_sole_fillet_1_cm',
1035
+ 2270: 'common_sole_fillet_2_cm',
1036
+ 2271: 'atlantic_catfish_fillet_1_cm',
1037
+ 2272: 'atlantic_catfish_fillet_2_cm',
1038
+ 2273: 'turbot_fillet_2_cm',
1039
+ 2276: 'turbot_fillet_3_cm',
1040
+ 2277: 'tuna_steak',
1041
+ 2278: 'tuna_fillet_2_cm',
1042
+ 2279: 'tuna_fillet_3_cm',
1043
+ 2280: 'tilapia_fillet_1_cm',
1044
+ 2281: 'tilapia_fillet_2_cm',
1045
+ 2282: 'nile_perch_fillet_2_cm',
1046
+ 2283: 'nile_perch_fillet_3_cm',
1047
+ 2285: 'zander_fillet',
1048
+ 2288: 'soup_hen',
1049
+ 2291: 'poularde_whole',
1050
+ 2292: 'poularde_breast',
1051
+ 2294: 'turkey_breast',
1052
+ 2302: 'chicken_tikka_masala_with_rice',
1053
+ 2312: 'veal_fillet_whole',
1054
+ 2313: 'veal_fillet_medaillons_1_cm',
1055
+ 2315: 'veal_fillet_medaillons_2_cm',
1056
+ 2317: 'veal_fillet_medaillons_3_cm',
1057
+ 2324: 'goulash_soup',
1058
+ 2327: 'dutch_hash',
1059
+ 2328: 'stuffed_cabbage',
1060
+ 2330: 'beef_tenderloin',
1061
+ 2333: 'beef_tenderloin_medaillons_1_cm_steam_cooking',
1062
+ 2334: 'beef_tenderloin_medaillons_2_cm_steam_cooking',
1063
+ 2335: 'beef_tenderloin_medaillons_3_cm_steam_cooking',
1064
+ 2339: 'silverside_5_cm',
1065
+ 2342: 'silverside_7_5_cm',
1066
+ 2345: 'silverside_10_cm',
1067
+ 2348: 'meat_for_soup_back_or_top_rib',
1068
+ 2349: 'meat_for_soup_leg_steak',
1069
+ 2350: 'meat_for_soup_brisket',
1070
+ 2353: 'viennese_silverside',
1071
+ 2354: 'whole_ham_steam_cooking',
1072
+ 2355: 'whole_ham_reheating',
1073
+ 2359: 'kasseler_piece',
1074
+ 2361: 'kasseler_slice',
1075
+ 2363: 'knuckle_of_pork_fresh',
1076
+ 2364: 'knuckle_of_pork_cured',
1077
+ 2367: 'pork_tenderloin_medaillons_3_cm',
1078
+ 2368: 'pork_tenderloin_medaillons_4_cm',
1079
+ 2369: 'pork_tenderloin_medaillons_5_cm',
1080
+ 2429: 'pumpkin_soup',
1081
+ 2430: 'meat_with_rice',
1082
+ 2431: 'beef_casserole',
1083
+ 2450: 'pumpkin_risotto',
1084
+ 2451: 'risotto',
1085
+ 2453: 'rice_pudding_steam_cooking',
1086
+ 2454: 'rice_pudding_rapid_steam_cooking',
1087
+ 2461: 'amaranth',
1088
+ 2462: 'bulgur',
1089
+ 2463: 'spelt_whole',
1090
+ 2464: 'spelt_cracked',
1091
+ 2465: 'green_spelt_whole',
1092
+ 2466: 'green_spelt_cracked',
1093
+ 2467: 'oats_whole',
1094
+ 2468: 'oats_cracked',
1095
+ 2469: 'millet',
1096
+ 2470: 'quinoa',
1097
+ 2471: 'polenta_swiss_style_fine_polenta',
1098
+ 2472: 'polenta_swiss_style_medium_polenta',
1099
+ 2473: 'polenta_swiss_style_coarse_polenta',
1100
+ 2474: 'polenta',
1101
+ 2475: 'rye_whole',
1102
+ 2476: 'rye_cracked',
1103
+ 2477: 'wheat_whole',
1104
+ 2478: 'wheat_cracked',
1105
+ 2480: 'gnocchi_fresh',
1106
+ 2481: 'yeast_dumplings_fresh',
1107
+ 2482: 'potato_dumplings_raw_boil_in_bag',
1108
+ 2483: 'potato_dumplings_raw_deep_frozen',
1109
+ 2484: 'potato_dumplings_half_half_boil_in_bag',
1110
+ 2485: 'potato_dumplings_half_half_deep_frozen',
1111
+ 2486: 'bread_dumplings_boil_in_the_bag',
1112
+ 2487: 'bread_dumplings_fresh',
1113
+ 2488: 'ravioli_fresh',
1114
+ 2489: 'spaetzle_fresh',
1115
+ 2490: 'tagliatelli_fresh',
1116
+ 2491: 'schupfnudeln_potato_noodels',
1117
+ 2492: 'tortellini_fresh',
1118
+ 2493: 'red_lentils',
1119
+ 2494: 'brown_lentils',
1120
+ 2495: 'beluga_lentils',
1121
+ 2496: 'green_split_peas',
1122
+ 2497: 'yellow_split_peas',
1123
+ 2498: 'chick_peas',
1124
+ 2499: 'white_beans',
1125
+ 2500: 'pinto_beans',
1126
+ 2501: 'red_beans',
1127
+ 2502: 'black_beans',
1128
+ 2503: 'hens_eggs_size_s_soft',
1129
+ 2504: 'hens_eggs_size_s_medium',
1130
+ 2505: 'hens_eggs_size_s_hard',
1131
+ 2506: 'hens_eggs_size_m_soft',
1132
+ 2507: 'hens_eggs_size_m_medium',
1133
+ 2508: 'hens_eggs_size_m_hard',
1134
+ 2509: 'hens_eggs_size_l_soft',
1135
+ 2510: 'hens_eggs_size_l_medium',
1136
+ 2511: 'hens_eggs_size_l_hard',
1137
+ 2512: 'hens_eggs_size_xl_soft',
1138
+ 2513: 'hens_eggs_size_xl_medium',
1139
+ 2514: 'hens_eggs_size_xl_hard',
1140
+ 2515: 'swiss_toffee_cream_100_ml',
1141
+ 2516: 'swiss_toffee_cream_150_ml',
1142
+ 2518: 'toffee_date_dessert_several_small',
1143
+ 2520: 'cheesecake_several_small',
1144
+ 2521: 'cheesecake_one_large',
1145
+ 2522: 'christmas_pudding_cooking',
1146
+ 2523: 'christmas_pudding_heating',
1147
+ 2524: 'treacle_sponge_pudding_several_small',
1148
+ 2525: 'treacle_sponge_pudding_one_large',
1149
+ 2526: 'sweet_cheese_dumplings',
1150
+ 2527: 'apples_whole',
1151
+ 2528: 'apples_halved',
1152
+ 2529: 'apples_quartered',
1153
+ 2530: 'apples_sliced',
1154
+ 2531: 'apples_diced',
1155
+ 2532: 'apricots_halved_steam_cooking',
1156
+ 2533: 'apricots_halved_skinning',
1157
+ 2534: 'apricots_quartered',
1158
+ 2535: 'apricots_wedges',
1159
+ 2536: 'pears_halved',
1160
+ 2537: 'pears_quartered',
1161
+ 2538: 'pears_wedges',
1162
+ 2539: 'sweet_cherries',
1163
+ 2540: 'sour_cherries',
1164
+ 2541: 'pears_to_cook_small_whole',
1165
+ 2542: 'pears_to_cook_small_halved',
1166
+ 2543: 'pears_to_cook_small_quartered',
1167
+ 2544: 'pears_to_cook_medium_whole',
1168
+ 2545: 'pears_to_cook_medium_halved',
1169
+ 2546: 'pears_to_cook_medium_quartered',
1170
+ 2547: 'pears_to_cook_large_whole',
1171
+ 2548: 'pears_to_cook_large_halved',
1172
+ 2549: 'pears_to_cook_large_quartered',
1173
+ 2550: 'mirabelles',
1174
+ 2551: 'nectarines_peaches_halved_steam_cooking',
1175
+ 2552: 'nectarines_peaches_halved_skinning',
1176
+ 2553: 'nectarines_peaches_quartered',
1177
+ 2554: 'nectarines_peaches_wedges',
1178
+ 2555: 'plums_whole',
1179
+ 2556: 'plums_halved',
1180
+ 2557: 'cranberries',
1181
+ 2558: 'quinces_diced',
1182
+ 2559: 'greenage_plums',
1183
+ 2560: 'rhubarb_chunks',
1184
+ 2561: 'gooseberries',
1185
+ 2562: 'mushrooms_whole',
1186
+ 2563: 'mushrooms_halved',
1187
+ 2564: 'mushrooms_sliced',
1188
+ 2565: 'mushrooms_quartered',
1189
+ 2566: 'mushrooms_diced',
1190
+ 2567: 'cep',
1191
+ 2568: 'chanterelle',
1192
+ 2569: 'oyster_mushroom_whole',
1193
+ 2570: 'oyster_mushroom_strips',
1194
+ 2571: 'oyster_mushroom_diced',
1195
+ 2572: 'saucisson',
1196
+ 2573: 'bruehwurst_sausages',
1197
+ 2574: 'bologna_sausage',
1198
+ 2575: 'veal_sausages',
1199
+ 2577: 'crevettes',
1200
+ 2579: 'prawns',
1201
+ 2581: 'king_prawns',
1202
+ 2583: 'small_shrimps',
1203
+ 2585: 'large_shrimps',
1204
+ 2587: 'mussels',
1205
+ 2589: 'scallops',
1206
+ 2591: 'venus_clams',
1207
+ 2592: 'goose_barnacles',
1208
+ 2593: 'cockles',
1209
+ 2594: 'razor_clams_small',
1210
+ 2595: 'razor_clams_medium',
1211
+ 2596: 'razor_clams_large',
1212
+ 2597: 'mussels_in_sauce',
1213
+ 2598: 'bottling_soft',
1214
+ 2599: 'bottling_medium',
1215
+ 2600: 'bottling_hard',
1216
+ 2601: 'melt_chocolate',
1217
+ 2602: 'dissolve_gelatine',
1218
+ 2603: 'sweat_onions',
1219
+ 2604: 'cook_bacon',
1220
+ 2605: 'heating_damp_flannels',
1221
+ 2606: 'decrystallise_honey',
1222
+ 2607: 'make_yoghurt',
1223
+ 2687: 'toffee_date_dessert_one_large',
1224
+ 2694: 'beef_tenderloin_medaillons_1_cm_low_temperature_cooking',
1225
+ 2695: 'beef_tenderloin_medaillons_2_cm_low_temperature_cooking',
1226
+ 2696: 'beef_tenderloin_medaillons_3_cm_low_temperature_cooking',
1227
+ 3373: 'wild_rice',
1228
+ 3376: 'wholegrain_rice',
1229
+ 3380: 'parboiled_rice_steam_cooking',
1230
+ 3381: 'parboiled_rice_rapid_steam_cooking',
1231
+ 3383: 'basmati_rice_steam_cooking',
1232
+ 3384: 'basmati_rice_rapid_steam_cooking',
1233
+ 3386: 'jasmine_rice_steam_cooking',
1234
+ 3387: 'jasmine_rice_rapid_steam_cooking',
1235
+ 3389: 'huanghuanian_steam_cooking',
1236
+ 3390: 'huanghuanian_rapid_steam_cooking',
1237
+ 3392: 'simiao_steam_cooking',
1238
+ 3393: 'simiao_rapid_steam_cooking',
1239
+ 3395: 'long_grain_rice_general_steam_cooking',
1240
+ 3396: 'long_grain_rice_general_rapid_steam_cooking',
1241
+ 3398: 'chongming_steam_cooking',
1242
+ 3399: 'chongming_rapid_steam_cooking',
1243
+ 3401: 'wuchang_steam_cooking',
1244
+ 3402: 'wuchang_rapid_steam_cooking',
1245
+ 3404: 'uonumma_koshihikari_steam_cooking',
1246
+ 3405: 'uonumma_koshihikari_rapid_steam_cooking',
1247
+ 3407: 'sheyang_steam_cooking',
1248
+ 3408: 'sheyang_rapid_steam_cooking',
1249
+ 3410: 'round_grain_rice_general_steam_cooking',
1250
+ 3411: 'round_grain_rice_general_rapid_steam_cooking',
1251
+ },
1252
+ // Saugroboter (23)
1253
+ RobotVacuumCleanerProgramId: {
1254
+ '-1': 'no_program',
1255
+ 0: 'no_program',
1256
+ 1: 'auto',
1257
+ 2: 'spot',
1258
+ 3: 'turbo',
1259
+ 4: 'silent',
1260
+ },
1261
+ // Backofen mit Mikrowelle (13)
1262
+ ProgramPhaseMicrowaveOvenCombo: {
1263
+ 0: 'not_running',
1264
+ 3329: 'heating_up_phase',
1265
+ 3330: 'process_running',
1266
+ 3334: 'process_finished',
1267
+ 3339: 'cooling_phase',
1268
+ 3340: 'energy_save',
1269
+ 3863: 'steam_reduction',
1270
+ 7938: 'process_running',
1271
+ 7939: 'waiting_for_start',
1272
+ 7940: 'heating_up_phase',
1273
+ 7942: 'process_finished',
1274
+ 65535: 'not_running',
1275
+ },
1276
+ // Dampfgarer mit Mikrowelle (45)
1277
+ ProgramPhaseSteamOvenMicro: {
1278
+ 0: 'not_running',
1279
+ 3329: 'heating',
1280
+ 3330: 'process_running',
1281
+ 3334: 'process_finished',
1282
+ 3340: 'energy_save',
1283
+ 3863: 'steam_reduction',
1284
+ 7938: 'process_running',
1285
+ 7939: 'waiting_for_start',
1286
+ 7940: 'heating_up_phase',
1287
+ 7942: 'process_running',
1288
+ 65535: 'not_running',
1289
+ },
1290
+ // Saugroboter (23)
1291
+ ProgramPhaseRobotVacuumCleaner: {
1292
+ 0: 'not_running',
1293
+ 5889: 'vacuum_cleaning',
1294
+ 5890: 'returning',
1295
+ 5891: 'vacuum_cleaning_paused',
1296
+ 5892: 'going_to_target_area',
1297
+ 5903: 'docked',
1298
+ 5904: 'docked',
1299
+ 5910: 'remote_controlled',
1300
+ 65535: 'not_running',
1301
+ },
823
1302
  };
824
1303
 
825
1304
  // Gerätetyp (DeviceType aus /Ident) → passende Programm-/Phasen-Tabelle.
1305
+ /*
1306
+ * Nummern und Zuordnung wie in Home Assistant (MieleAppliance, ha-miele-at-lan sensor.py).
1307
+ * Bis 0.3.40 stimmten hier vier Eintraege nicht: 16 stand als Dampfbackofen (ist die Mikrowelle),
1308
+ * 67 als Waermeschublade (ist der Dialoggarer; die Schublade ist 25), der Waschtrockner (24) nahm
1309
+ * die Programme des Trockners, und 13 die Phasen des Backofens. Geprueft war davon nie etwas -
1310
+ * an den eigenen Geraeten (Waschmaschine, Spuelmaschine, Backofen) faellt es nicht auf.
1311
+ */
826
1312
  const BY_TYPE = {
827
1313
  1: { program: 'WashingMachineProgramId', phase: 'ProgramPhaseWashingMachine' }, // Waschmaschine
1314
+ 3: { program: 'WashingMachineProgramId', phase: 'ProgramPhaseWashingMachine' }, // Waschmaschine Semi-Prof
1315
+ 5: { program: 'WashingMachineProgramId', phase: 'ProgramPhaseWashingMachine' }, // Waschmaschine Prof
828
1316
  2: { program: 'TumbleDryerProgramId', phase: 'ProgramPhaseTumbleDryer' }, // Trockner
829
- 24: { program: 'TumbleDryerProgramId', phase: 'ProgramPhaseWasherDryer' }, // Waschtrockner
1317
+ 4: { program: 'TumbleDryerProgramId', phase: 'ProgramPhaseTumbleDryer' }, // Trockner Semi-Prof
1318
+ 6: { program: 'TumbleDryerProgramId', phase: 'ProgramPhaseTumbleDryer' }, // Trockner Prof
1319
+ 24: { program: 'WashingMachineProgramId', phase: 'ProgramPhaseWasherDryer' }, // Waschtrockner
830
1320
  7: { program: 'DishWasherProgramId', phase: 'ProgramPhaseDishwasher' }, // Spülmaschine
1321
+ 8: { program: 'DishWasherProgramId', phase: 'ProgramPhaseDishwasher' }, // Spülmaschine Semi-Prof
1322
+ 9: { program: 'DishWasherProgramId', phase: 'ProgramPhaseDishwasher' }, // Spülmaschine Prof
831
1323
  12: { program: 'OvenProgramId', phase: 'ProgramPhaseOven' }, // Backofen
832
- 13: { program: 'OvenProgramId', phase: 'ProgramPhaseOven' }, // Backofen+Mikrowelle
1324
+ 13: { program: 'OvenProgramId', phase: 'ProgramPhaseMicrowaveOvenCombo' }, // Backofen mit Mikrowelle
833
1325
  15: { program: 'OvenProgramId', phase: 'ProgramPhaseSteamOven' }, // Dampfgarer
834
- 16: { program: 'OvenProgramId', phase: 'ProgramPhaseSteamOvenCombi' }, // Dampfbackofen
1326
+ 16: { program: 'OvenProgramId', phase: 'ProgramPhaseMicrowave' }, // Mikrowelle
1327
+ 31: { program: 'OvenProgramId', phase: 'ProgramPhaseSteamOvenCombi' }, // Dampfbackofen
1328
+ 45: { program: 'SteamOvenMicroProgramId', phase: 'ProgramPhaseSteamOvenMicro' }, // Dampfgarer mit Mikrowelle
1329
+ 67: { program: 'OvenProgramId', phase: 'ProgramPhaseOven' }, // Dialoggarer
1330
+ 73: { program: 'OvenProgramId', phase: 'ProgramPhaseSteamOven' }, // Dampfgarer (MK2)
835
1331
  17: { program: 'CoffeeSystemProgramId', phase: 'ProgramPhaseCoffeeSystem' }, // Kaffeevollautomat
836
- 67: { program: 'DishWarmerProgramId', phase: 'ProgramPhaseWarmingDrawer' }, // Wärmeschublade
1332
+ 23: { program: 'RobotVacuumCleanerProgramId', phase: 'ProgramPhaseRobotVacuumCleaner' }, // Saugroboter
1333
+ 25: { program: 'DishWarmerProgramId', phase: 'ProgramPhaseWarmingDrawer' }, // Wärmeschublade
837
1334
  };
838
1335
 
839
1336
  /**
package/lib/enums_de.js CHANGED
@@ -458,6 +458,16 @@ const PhaseNameDe = {
458
458
  // Wärmeschublade
459
459
  door_open: 'Tür offen',
460
460
  keeping_warm: 'Warmhalten',
461
+ // Backofen mit Mikrowelle, Dampfgarer mit Mikrowelle
462
+ heating: 'Aufheizen',
463
+ cooling_phase: 'Abkühlphase',
464
+ // Saugroboter
465
+ vacuum_cleaning: 'Saugt',
466
+ returning: 'Rückfahrt zur Station',
467
+ vacuum_cleaning_paused: 'Saugen pausiert',
468
+ going_to_target_area: 'Fährt zum Zielbereich',
469
+ docked: 'In der Station',
470
+ remote_controlled: 'Ferngesteuert',
461
471
  };
462
472
 
463
473
  /**
@@ -491,7 +501,7 @@ const BY_TYPE_DE = {
491
501
  24: { phase: ProgramPhaseWashingMachineDe }, // Waschtrockner
492
502
  7: { phase: ProgramPhaseDishwasherDe }, // Spülmaschine
493
503
  12: { phase: ProgramPhaseOvenDe }, // Backofen
494
- 13: { phase: ProgramPhaseOvenDe },
504
+ 67: { phase: ProgramPhaseOvenDe }, // Dialoggarer (gleiche Phasentabelle wie der Backofen)
495
505
  };
496
506
 
497
507
  /**
package/lib/objects.js CHANGED
@@ -80,7 +80,24 @@ function mitErsatz(text, art, v) {
80
80
  function programTextDe(dt, v) {
81
81
  const en = enums.programText(dt, v);
82
82
  const eigen = de.programNameDe(en);
83
- return eigen != null ? eigen : en;
83
+ return eigen != null ? eigen : lesbar(en);
84
+ }
85
+
86
+ /**
87
+ * Englischen Enum-Wert lesbar machen, wenn es keine deutsche Fassung gibt.
88
+ *
89
+ * Die 410 Rezeptprogramme des Dampfgarers mit Mikrowelle (seit 0.3.41) haben keine deutschen
90
+ * Namen; roh stuende dort "artichokes_small". "Artichokes small" ist nicht Deutsch, aber lesbar.
91
+ *
92
+ * @param {string|null} en Enum-Wert
93
+ * @returns {string|null} lesbarer Text
94
+ */
95
+ function lesbar(en) {
96
+ if (!en) {
97
+ return en;
98
+ }
99
+ const t = String(en).replace(/_/g, ' ');
100
+ return t.charAt(0).toUpperCase() + t.slice(1);
84
101
  }
85
102
  // Phase: erst numerische DE-Tabelle (Waschen/Spülen/Backofen), dann englisch-basierte DE-Map
86
103
  // (deckt alle uebrigen Gerätetypen ab), sonst englischer Klartext.
@@ -104,7 +121,7 @@ function phaseTextDe(dt, v) {
104
121
  if (uebersetzt != null) {
105
122
  return uebersetzt;
106
123
  }
107
- return en;
124
+ return lesbar(en);
108
125
  }
109
126
 
110
127
  /**
@@ -526,8 +543,8 @@ function zustandsTexte(sub, deviceType, german) {
526
543
  // die Schleuderdrehzahl auch bei Spülmaschine und Backofen (sinnlos). Key = STATE_FIELDS-Schlüssel,
527
544
  // Wert = erlaubte deviceTypes. Nicht gelistete Felder gelten für ALLE Geräte (Status, Programm, …).
528
545
  const FIELD_DEVICE_TYPES = {
529
- SpinningSpeed: [1, 24], // Schleuderdrehzahl: Waschmaschine, Waschtrockner
530
- DryingStep: [2, 24], // Trockenstufe: Trockner, Waschtrockner
546
+ SpinningSpeed: [1, 3, 5, 24], // Schleuderdrehzahl: Waschmaschinen (auch Semi-Prof/Prof), Waschtrockner
547
+ DryingStep: [2, 4, 6, 24], // Trockenstufe: Trockner (auch Semi-Prof/Prof), Waschtrockner
531
548
  };
532
549
 
533
550
  /**
package/main.js CHANGED
@@ -312,7 +312,11 @@ class MieleLocal extends utils.Adapter {
312
312
  await this.discoverDevices();
313
313
 
314
314
  if (!Object.keys(this.devices).length) {
315
- this.log.warn('No Miele devices found (neither via mDNS nor manually configured).');
315
+ this.log.warn(
316
+ 'No Miele devices found (neither via mDNS nor manually configured). If the appliances are in ' +
317
+ 'another subnet/VLAN, behind a firewall or multicast is blocked (e.g. Docker bridge network), ' +
318
+ "enter their IP addresses on the 'Appliances' tab.",
319
+ );
316
320
  } else {
317
321
  await this.setStateAsync('info.connection', { val: true, ack: true });
318
322
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.miele-local",
3
- "version": "0.3.39",
3
+ "version": "0.3.41",
4
4
  "description": "Connect modern Miele@Home appliances locally without the internet (MieleH256/DOP2).",
5
5
  "author": "Immanuel <github@freitag.online>",
6
6
  "license": "MIT",