iobroker.miele-local 0.2.1 → 0.3.5

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.
@@ -0,0 +1,7 @@
1
+ # Older changes
2
+
3
+ ## 0.1.1 (2026-08-17)
4
+ * (Immanuel) Released via GitHub Actions with npm provenance (trusted publishing). Published under former package name `iobroker.miele-lokal`.
5
+
6
+ ## 0.1.0 (2026-08-17)
7
+ * (Immanuel) Initial release: login/GroupKey retrieval, mDNS discovery, state polling with enum decoding, optional SuperVision push, optional control. Published under former package name `iobroker.miele-lokal`.
package/README.md CHANGED
@@ -5,6 +5,8 @@
5
5
  [![NPM version](https://img.shields.io/npm/v/iobroker.miele-local.svg)](https://www.npmjs.com/package/iobroker.miele-local)
6
6
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
7
 
8
+ *Read this in another language: [Deutsche Dokumentation](README_de.md).*
9
+
8
10
  This adapter connects modern **Miele@Home** appliances **locally, without the internet**.
9
11
  It speaks the local Miele protocol (`MieleH256` / DOP2) directly over the LAN — no cloud
10
12
  account during operation, no detour through the Miele 3rd-party API.
@@ -29,29 +31,28 @@ account during operation, no detour through the Miele 3rd-party API.
29
31
  ## Installation
30
32
 
31
33
  1. Install the adapter and create an instance.
32
- 2. On the **Login** tab, choose your country and click **Open login page** — sign in with
33
- your Miele account in the browser. At the end the browser is redirected to a
34
- `miele://…` address (which fails to open — that is expected); copy that full address.
35
- 3. Paste the `miele://…` address and click **Fetch GroupKey**. GroupID/GroupKey are stored
36
- (GroupKey encrypted).
37
- 4. Save. The adapter discovers the devices via mDNS and creates the states.
38
-
39
- ### Capturing the redirect URL
40
-
41
- The browser cannot open the final `miele://` address itself — that is expected. You obtain
42
- the full address (`miele://oauth2-code/?code=…&state=…`) as follows — **one method is
43
- enough**:
44
-
45
- - **Easy — via the "Open with" dialog:** When the browser asks to open the address "with an
46
- application", it hands the complete `miele://` address to that app. If you open it with a
47
- text editor (Linux: kate/gedit; Windows: Notepad; macOS: TextEdit), the full address
48
- appears in the title/file name or in the text — copy it from there. You can cancel the
49
- actual open action.
50
- - **Reliable — via DevTools:** Open DevTools before logging in (F12) → tab "Network",
51
- enable "Preserve log". After logging in, find the last request whose address begins with
52
- `miele://` or contains `…/de/redirect?…&code=…` → right-click → "Copy link address".
53
-
54
- Both yield the same text with `code=` and `state=`; the adapter accepts both forms.
34
+ 2. On the **Login** tab, choose your country and follow the 3-step login guide below.
35
+ 3. Paste the captured `miele://…` redirect address and click **Fetch GroupKey**. GroupID and
36
+ GroupKey are stored securely (GroupKey encrypted).
37
+ 4. Save. The adapter discovers your devices and creates the states.
38
+
39
+ ### Step-by-step: Capturing the redirect URL
40
+
41
+ Because the final `miele://` address is a custom mobile-app scheme, desktop browsers cannot open
42
+ it automatically and will hang on a spinning wheel. Capture the URL using browser DevTools:
43
+
44
+ 1. **Prepare DevTools:** Click **Open login page** to open the Miele login in a new tab. In that
45
+ new tab, press **F12** to open Developer Tools and switch to the **Network** tab. Enable
46
+ persistent logging:
47
+ - **Chrome / Edge / Brave:** Check **Preserve log**.
48
+ - **Firefox:** Click the gear icon ⚙️ and check **Persist Logs**.
49
+ 2. **Sign In:** Enter the email and password of your Miele app account and submit the login.
50
+ *Note:* The page will remain on a spinning wheel (or report a failed load) — this is completely
51
+ expected and indicates success.
52
+ 3. **Copy & Submit:** In the Network tab (F12), scroll to the very last (usually red) request. It
53
+ starts with `redirect?redirect_uri=miele...` or `miele://oauth2-code/...`. Right-click this
54
+ entry → **Copy URL** (or **Copy link address**). Paste it into the **miele:// redirect URL**
55
+ field in ioBroker and click **Fetch GroupKey**.
55
56
 
56
57
  ## Required ports / firewall
57
58
 
@@ -95,17 +96,20 @@ transmitted to third parties; in normal operation there is no cloud connection.
95
96
 
96
97
  ## States (excerpt)
97
98
 
98
- Per device under `<serial>.info` (static) and `<serial>.state` (live):
99
+ Per device under `<serial>.info` (static/connectivity), `<serial>.state` (live) and `<serial>.eco`:
99
100
 
101
+ - `info.connected` — connectivity status (true when appliance responds)
100
102
  - `state.statusText` / `state.status` — operating state (plain text + raw value)
101
103
  - `state.programText` / `state.programId` — running program
102
104
  - `state.programPhaseText` / `state.programPhase` — program phase
103
105
  - `state.remainingMinutes`, `state.elapsedMinutes`, `state.startInMinutes`
106
+ - `state.remainingSeconds`, `state.elapsedSeconds` (optional second-precise DOP2 values)
104
107
  - `state.estimatedEndTime` / `state.estimatedEndTimeText` — projected finish time
105
108
  - `state.temperature[Zone2/3]`, `state.targetTemperature[Zone2/3]`
106
109
  - `state.signalDoor`, `state.signalInfo`, `state.signalFailure`
107
110
  - `state.mobileStart` — whether remote control is enabled on the device
108
111
  - `state.light`, `state.spinningSpeed` (washing machine), `state.dryingStepText` (dryer)
112
+ - `eco.energy` (kWh), `eco.energyWh` (Wh), `eco.water` (l) (where supported)
109
113
  - `info.techType`, `info.fabNumber`, `info.xkmType`, `info.xkmVersion`, `info.deviceType`
110
114
 
111
115
  With control enabled, additionally `<serial>.control.*` (start, stop, pause, powerOn,
@@ -136,12 +140,92 @@ consequences of use.
136
140
 
137
141
  ## Acknowledgements
138
142
 
143
+ Special thanks to **[meistermopper](https://github.com/meistermopper)**, an experienced
144
+ ioBroker adapter developer, who reviewed this adapter unprompted and contributed substantial
145
+ improvements: periodic background discovery for appliances waking from standby, a per-device
146
+ connectivity state, corrected state roles and units, explicit defaults for all states, and
147
+ German documentation. His work went into release 0.3.0.
148
+
139
149
  The local protocol (`MieleH256`, DOP2, provisioning) is based on the public reverse
140
150
  engineering work of the projects `MieleRESTServer` (akappner),
141
151
  `home-assistant-miele-mobile` and `ha-miele-at-lan`.
142
152
 
143
153
  ## Changelog
144
154
 
155
+ ### 0.3.5
156
+ - **Fix: appliance status no longer flips to "off" during a running program.** A failed status
157
+ request was reported as a state change instead of being retried; every twenty-fifth poll
158
+ produced a spurious "off". Requests now get a second attempt, and an implausible jump from
159
+ "running" to "off" is discarded when the remaining time says the program is still going.
160
+ The retry count is exposed as `info.pollRetries`.
161
+ - **Fix: remaining time was read from the wrong field.** `remainingSeconds` carries only the
162
+ seconds component - at "2:01" it reads 0. The plausibility check now uses
163
+ `remainingMinutes`.
164
+ - **Fix: frozen EcoFeedback values are no longer booked as consumption.** When an appliance
165
+ keeps reporting the previous cycle's figures, the unchanged value is skipped instead of
166
+ being added to the new cycle.
167
+ - Requests are serialised per appliance, and a cycle now survives an adapter restart.
168
+ - **EcoFeedback is only requested while an appliance is actually running.** The DOP2 leaf
169
+ only answers while the appliance is awake - a switched-off machine returns HTTP 500. The
170
+ washing machine's last reading came in mid-programme; afterwards every poll ran into the
171
+ void, one per minute for days, each one occupying the XKM module that answers only one
172
+ request at a time. Polling now happens while a programme runs, during a ten-minute
173
+ follow-up afterwards (the final reading is not settled the moment the status flips), and
174
+ once at startup so that appliances without the leaf can still be identified. The follow-up
175
+ ends early once two consecutive readings are identical.
176
+ - **All object names are complete in eleven languages.** The repository check reported 147
177
+ W1001 warnings for `common.name`; channels, EcoFeedback data points, appliance names and the
178
+ instance objects were still English- or German-only. Appliance categories are translated
179
+ while model and serial number stay untouched - they are proper names.
180
+
181
+ ### 0.3.4
182
+ - **New: cycle history.** Every completed program is recorded with duration, program name,
183
+ energy and water. The appliances do not keep finished cycles themselves, so the history
184
+ starts when the feature is enabled - it cannot be filled retroactively. Recent cycles are
185
+ kept as JSON in `<serial>.history.cyclesJson`, alongside running totals for cycle count,
186
+ runtime, energy and water. Optionally each cycle is also written to the history adapter,
187
+ timestamped at the end of the cycle, so charts can cover any period.
188
+ Configurable on the new **History** tab: ring buffer size (default 50), retention in days
189
+ (default 730) and the history instance.
190
+ - The step-by-step login instructions were stored in English in nine of the eleven language
191
+ files. All eight texts are now translated into es, fr, it, nl, pl, pt, ru, uk and zh-cn.
192
+ - `common.news` no longer lists versions that were never published to npm.
193
+ - Dependabot: raised the PR limit, spread the schedule over a cron slot, added automerge.
194
+
195
+ ### 0.3.3
196
+ - Fix E3005: states declared as `number` no longer receive `null` when the appliance does not
197
+ report a value - the datapoint keeps its default instead. `estimatedEndTime` is cleared with
198
+ 0 rather than null.
199
+ - Fix E1011: `state.light` is read-only and now carries role `sensor.light`; switching happens
200
+ through `control.lightOn`/`lightOff`.
201
+
202
+ ### 0.3.2
203
+ - EcoFeedback conversion moved into `dop2.ecoValues()` and covered by unit tests against the
204
+ cloud-verified reference values (1991 Wh = 1.991 kWh, 953 = 95.3 l).
205
+
206
+ ### 0.3.1
207
+ - Fix: `applyIdent` threw on the new `connected` field, which has no ident path. Because that
208
+ entry comes first, **all** device data stayed empty - model, serial number, firmware.
209
+ - Eco polling now logs why it skips a device instead of failing silently.
210
+
211
+ ### 0.3.0
212
+ - Adopt ioBroker development guidelines and conformity rules.
213
+ - Translate internal log messages to pure English.
214
+ - Add explicit default metadata values (`def`) to all state definitions.
215
+ - Sanitize dynamic object IDs against forbidden characters.
216
+ - Add local verification test script (`npm run test:local`).
217
+ - Add German documentation (`README_de.md`).
218
+ - Fix dev-server packaging issue by removing redundant prepare script.
219
+ - Clarify step-by-step login instructions and i18n translations.
220
+ - Add CHANGELOG_OLD.md for historical pre-rename versions.
221
+ - Add per-device connectivity state (`info.connected`).
222
+ - Add periodic background discovery for waking/standby appliances.
223
+ - Add admin UI configuration for second-precise remaining time polling.
224
+ - Refine EcoFeedback state roles and measurement units.
225
+ - mDNS auto-discovery is no longer marked experimental - confirmed working.
226
+
227
+ Most of the above was contributed by [meistermopper](https://github.com/meistermopper).
228
+
145
229
  ### 0.2.1
146
230
  - Released via GitHub Actions with npm provenance (trusted publishing). No functional
147
231
  changes.
@@ -150,13 +234,7 @@ engineering work of the projects `MieleRESTServer` (akappner),
150
234
  - Renamed from `miele-lokal` to `miele-local`: English adapter name and title.
151
235
  First release under the new package name.
152
236
 
153
- ### 0.1.1
154
- - Released via GitHub Actions with npm provenance (trusted publishing). No functional
155
- changes. Published under the former name `iobroker.miele-lokal`.
156
-
157
- ### 0.1.0
158
- - Initial release: login/GroupKey retrieval, mDNS discovery, state polling with enum
159
- decoding, optional SuperVision push, optional control.
237
+ [Older changelog entries can be found here](CHANGELOG_OLD.md)
160
238
 
161
239
  ## License
162
240
 
package/README_de.md ADDED
@@ -0,0 +1,179 @@
1
+ ![Logo](admin/miele-local.png)
2
+
3
+ # ioBroker.miele-local
4
+
5
+ [![NPM version](https://img.shields.io/npm/v/iobroker.miele-local.svg)](https://www.npmjs.com/package/iobroker.miele-local)
6
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
+
8
+ *Diese Dokumentation in einer anderen Sprache lesen: [English documentation](README.md).*
9
+
10
+ Dieser Adapter verbindet moderne **Miele@Home**-Geräte **lokal ohne Internet**.
11
+ Er spricht das lokale Miele-Protokoll (`MieleH256` / DOP2) direkt über das LAN – kein
12
+ Cloud-Konto im laufenden Betrieb, kein Umweg über die Miele 3rd-Party-Cloud-API.
13
+
14
+ > Der einmalige **Login** mit dem Miele-Konto dient nur dazu, den haushaltsweiten
15
+ > lokalen Schlüssel (GroupID/GroupKey) abzurufen. Danach läuft der Adapter komplett
16
+ > offline, und die Miele-App funktioniert unverändert weiter.
17
+
18
+ ## Funktionen
19
+
20
+ - **Automatischer Abruf der Zugangsdaten** über einen geführten Login (Cloud-OAuth), ohne
21
+ die Geräte neu anlernen zu müssen.
22
+ - **Automatische Geräteerkennung** über mDNS (`_mieleathome._tcp`).
23
+ - **Live-Zustände** aller unterstützten Geräteklassen (Waschmaschine, Trockner,
24
+ Spülmaschine, Backofen, Dampfgarer, Kochfeld, Kaffeevollautomat u. v. m.) mit Klartext-Dekodierung
25
+ von Status, Programm und Phase.
26
+ - **Echtzeit-Aktualisierungen** über den SuperVision-Push-Kanal (optional), mit Polling als
27
+ zuverlässigem Fallback.
28
+ - **Steuerung** (optional): Start/Stop/Pause, Licht, Ein/Aus über beschreibbare Datenpunkte –
29
+ sofern „MobileStart / Fernsteuerung" am Gerät aktiviert ist.
30
+
31
+ ## Installation
32
+
33
+ 1. Adapter installieren und Instanz anlegen.
34
+ 2. Im Tab **Login** das Land wählen und der folgenden 3-Schritte-Anleitung folgen.
35
+ 3. Die abgefangene `miele://…`-Weiterleitungsadresse einfügen und auf **GroupKey abrufen** klicken.
36
+ GroupID und GroupKey werden sicher gespeichert (GroupKey verschlüsselt).
37
+ 4. Speichern. Der Adapter findet die Geräte per mDNS und legt die Datenpunkte an.
38
+
39
+ ### Schritt-für-Schritt: Weiterleitungs-URL abfangen
40
+
41
+ Da die finale `miele://`-Adresse ein mobiles App-Protokoll ist, können Desktop-Browser sie nicht
42
+ automatisch öffnen und bleiben bei einem sich drehenden Laderad stehen. Fange die URL mit den
43
+ Entwicklertools (DevTools) deines Browsers ab:
44
+
45
+ 1. **Entwicklertools vorbereiten:** Klicke auf **Login-Seite öffnen**, um den Login in einem neuen Tab
46
+ zu öffnen. Drücke in dem neuen Tab **F12** (Entwicklertools) und wechsle auf den Reiter **Netzwerk**
47
+ (Network). Aktiviere die dauerhafte Protokollierung:
48
+ - **Chrome / Edge / Brave:** Haken bei **Log beibehalten** (*Preserve log*) setzen.
49
+ - **Firefox:** Auf das Zahnrad-Symbol ⚙️ klicken und **Protokolle dauerhaft anzeigen** (*Persist Logs*) aktivieren.
50
+ 2. **Anmelden:** E-Mail und Passwort deines Miele-App-Kontos eingeben und die Anmeldung abschicken.
51
+ *Hinweis:* Die Seite bleibt bei einem Laderad stehen (oder meldet einen Ladefehler) – das ist völlig
52
+ normal und signalisiert Erfolg.
53
+ 3. **Kopieren & Einbinden:** Im Netzwerk-Tab (F12) ganz nach unten zur letzten (meist rot markierten)
54
+ Zeile scrollen. Sie beginnt mit `redirect?redirect_uri=miele...` oder `miele://oauth2-code/...`.
55
+ Mache einen Rechtsklick auf diese Zeile → **URL kopieren** (bzw. **Link-Adresse kopieren**). Füge sie
56
+ in das Feld **miele://-Redirect-URL** im ioBroker ein und klicke auf **GroupKey abrufen**.
57
+
58
+ ## Benötigte Ports / Firewall
59
+
60
+ | Richtung | Port | Zweck | Erforderlich |
61
+ |---|---|---|---|
62
+ | Eingehend | TCP *Push-Port* (Standard 18082) | Geräte senden Echtzeit-Updates an ioBroker | nur bei aktivem Push |
63
+ | Ein/Aus | UDP 5353 (mDNS) | Geräteerkennung und Push-Registrierung | ja |
64
+ | Ausgehend | TCP 80 → Geräte | Zustände lesen / Steuerbefehle senden | ja |
65
+ | Ausgehend | TCP 443 → miele-iot.com | nur beim Login (GroupKey abrufen) | nur beim Login |
66
+
67
+ Ohne Push ist **kein eingehender Port** erforderlich. ioBroker und die Geräte müssen sich im
68
+ selben Broadcast-Segment befinden (keine VLAN-/Docker-Bridge-Trennung), damit mDNS funktioniert.
69
+
70
+ ### Betrieb in Docker (wichtig)
71
+
72
+ Wenn ioBroker in einem **Docker-Container mit Bridge-Netzwerk** läuft (Standard, z. B. buanet-Image),
73
+ kann die automatische **mDNS-Erkennung die Geräte nicht erreichen** – Multicast wird nicht
74
+ gebrückt. Die direkte Kommunikation (TCP 80) funktioniert, da sie geroutet wird. In diesem Fall:
75
+
76
+ - **Geräte-IPs manuell im Tab „Geräte & Polling" eintragen.** Das Polling funktioniert dann normal.
77
+ - **Push** funktioniert im Bridge-Netzwerk nicht (die Geräte können den Container nicht erreichen). Für
78
+ Push den Container im **Host-Netzwerk** betreiben (`network_mode: host`) – der Push-Port ist
79
+ dann automatisch erreichbar.
80
+
81
+ ### Wie Push technisch funktioniert
82
+
83
+ Bei aktiviertem Push führt der Adapter ein **Enrollment** je Gerät durch: `PUT
84
+ /Devices/<series>/SuperVision/<own-fab>` (registriert den Adapter als Haushalts-Peer) sowie mehrere
85
+ `POST /Subscriptions` mit einer **Callback-URL** `http://<ioBroker-LAN-IP>:<push-port>/…`. Das
86
+ Gerät sendet Zustandsänderungen dann unaufgefordert (sub-sekündlich) an diese URL. Die Subscriptions
87
+ werden periodisch erneuert. Erreicht das Gerät die Callback-URL nicht, greift der Adapter automatisch
88
+ auf Polling zurück.
89
+
90
+ ## Datenschutz
91
+
92
+ Es werden **keine personenbezogenen Daten** im Adapter gespeichert. GroupID, GroupKey und
93
+ Refresh-Token verbleiben ausschließlich in der (verschlüsselten) Instanzkonfiguration bzw. in
94
+ ioBroker-Objekten. Es erfolgt keine Datenübertragung an Dritte; im laufenden Betrieb besteht
95
+ keine Cloud-Verbindung.
96
+
97
+ ## Datenpunkte (Auszug)
98
+
99
+ Je Gerät unter `<serial>.info` (statisch/Verbindung), `<serial>.state` (live) und `<serial>.eco`:
100
+
101
+ - `info.connected` – Erreichbarkeitsstatus (true, wenn Gerät antwortet)
102
+ - `state.statusText` / `state.status` – Betriebszustand (Klartext + Rohwert)
103
+ - `state.programText` / `state.programId` – Laufendes Programm
104
+ - `state.programPhaseText` / `state.programPhase` – Programmphase
105
+ - `state.remainingMinutes`, `state.elapsedMinutes`, `state.startInMinutes`
106
+ - `state.remainingSeconds`, `state.elapsedSeconds` (sekundengenau via DOP2)
107
+ - `state.estimatedEndTime` / `state.estimatedEndTimeText` – Voraussichtliches Programmende
108
+ - `state.temperature[Zone2/3]`, `state.targetTemperature[Zone2/3]`
109
+ - `state.signalDoor`, `state.signalInfo`, `state.signalFailure`
110
+ - `state.mobileStart` – Gibt an, ob MobileStart/Fernsteuerung am Gerät aktiv ist
111
+ - `state.light`, `state.spinningSpeed` (Waschmaschine), `state.dryingStepText` (Trockner)
112
+ - `eco.energy` (kWh), `eco.energyWh` (Wh), `eco.water` (l) (wo unterstützt)
113
+ - `info.techType`, `info.fabNumber`, `info.xkmType`, `info.xkmVersion`, `info.deviceType`
114
+
115
+ Bei aktivierter Steuerung zusätzlich `<serial>.control.*` (start, stop, pause, powerOn,
116
+ powerOff, lightOn, lightOff).
117
+
118
+ ## Kompatibilität / Grenzen
119
+
120
+ - Getestet an Waschmaschine (WCR860/EK037), Spülmaschine (G5840/EK037) und Backofen (H2469BP/EK057).
121
+ - Kühl- und Gefriergeräte sind lokal meist **nur lesbar** (die Firmware lehnt Schreibbefehle ab).
122
+ - Steuerbefehle setzen „MobileStart / Fernsteuerung" am Gerät voraus; manche Firmware-Versionen
123
+ beantworten DOP2-Schreibbefehle mit HTTP 404/500.
124
+ - Der SuperVision-Push ist eine Best-Effort-Ergänzung; Polling ist der zuverlässige Standardpfad.
125
+
126
+ ## Rechtliche Hinweise / Haftungsausschluss
127
+
128
+ Dies ist ein **inoffizielles, privat entwickeltes** Projekt und steht in **keiner Verbindung zu
129
+ Miele & Cie. KG**. „Miele", „Miele@home" und zugehörige Bezeichnungen sind eingetragene
130
+ Marken der Miele & Cie. KG und werden hier nur beschreibend zur Kompatibilitätsangabe verwendet.
131
+
132
+ Der Adapter nutzt ein lokales Protokoll, das durch **Reverse Engineering** dokumentiert wurde.
133
+ Die Nutzung erfolgt **auf eigene Verantwortung**. Die Software wird unter MIT-Lizenz
134
+ **ohne Mängelgewähr** bereitgestellt (siehe LICENSE).
135
+
136
+ ## Danksagung
137
+
138
+ Besonderer Dank gilt **[meistermopper](https://github.com/meistermopper)**, einem erfahrenen
139
+ Entwickler von ioBroker-Adaptern, der diesen Adapter unaufgefordert durchgesehen und
140
+ erhebliche Verbesserungen beigesteuert hat: die periodische Gerätesuche im Hintergrund für
141
+ Geräte, die aus dem Standby aufwachen, einen Erreichbarkeits-Datenpunkt je Gerät, korrigierte
142
+ Rollen und Einheiten, explizite Vorgabewerte für alle Datenpunkte sowie die deutsche
143
+ Dokumentation. Seine Arbeit ist in Version 0.3.0 eingeflossen.
144
+
145
+ Das lokale Protokoll (`MieleH256`, DOP2, Provisioning) basiert auf der Vorarbeit der
146
+ Open-Source-Projekte `MieleRESTServer` (akappner), `home-assistant-miele-mobile` und
147
+ `ha-miele-at-lan`.
148
+
149
+ ## Changelog
150
+
151
+ ### **WORK IN PROGRESS**
152
+
153
+ ### 0.2.1 (2026-08-18)
154
+ - Adopt ioBroker development guidelines and conformity rules.
155
+ - Translate internal log messages to pure English.
156
+ - Add explicit default metadata values (`def`) to all state definitions.
157
+ - Sanitize dynamic object IDs against forbidden characters.
158
+ - Add local verification test script (`npm run test:local`).
159
+ - Add German documentation (`README_de.md`).
160
+ - Fix dev-server packaging issue by removing redundant prepare script.
161
+ - Clarify step-by-step login instructions and i18n translations.
162
+ - Add CHANGELOG_OLD.md for historical pre-rename versions.
163
+ - Add per-device connectivity state (`info.connected`).
164
+ - Add periodic background discovery for waking/standby appliances.
165
+ - Add admin UI configuration for second-precise remaining time polling.
166
+ - Refine EcoFeedback state roles and measurement units.
167
+
168
+ ### 0.2.1
169
+ - Veröffentlichung über GitHub Actions mit npm-Provenance (Trusted Publishing). Keine funktionalen Änderungen.
170
+
171
+ ### 0.2.0
172
+ - Umbenennung von `miele-lokal` in `miele-local`: englischer Adaptername und Titel.
173
+ Erste Version unter dem neuen Paketnamen.
174
+
175
+ [Ältere Einträge sind hier zu finden](CHANGELOG_OLD.md)
176
+
177
+ ## Lizenz
178
+
179
+ MIT License - Copyright (c) 2026 Immanuel
@@ -39,6 +39,26 @@
39
39
  "Datenpunkt-Namen auf Deutsch": "Datenpunkt-Namen auf Deutsch",
40
40
  "EcoFeedback (Energie/Wasser) abrufen": "EcoFeedback (Energie/Wasser) abrufen",
41
41
  "EcoFeedback-Intervall in Sekunden": "EcoFeedback-Intervall in Sekunden",
42
- "Geräte automatisch per mDNS finden (experimentell)": "Geräte automatisch per mDNS finden (experimentell)",
43
- "SuperVision-Push aktivieren (experimentell, Echtzeit)": "SuperVision-Push aktivieren (experimentell, Echtzeit)"
42
+ "SuperVision-Push aktivieren (experimentell, Echtzeit)": "SuperVision-Push aktivieren (experimentell, Echtzeit)",
43
+ "Schritt 1: Entwicklertools im Browser vorbereiten": "Schritt 1: Entwicklertools im Browser vorbereiten",
44
+ "1. Oben auf „Login-Seite öffnen“ klicken (ein neuer Browser-Tab öffnet sich).\n2. Im neuen Tab F12 drücken und auf den Reiter „Netzwerk“ (Network) wechseln.\n3. Protokollierung dauerhaft aktivieren:\n • Chrome / Edge / Brave: Haken bei „Log beibehalten“ (Preserve log) setzen.\n • Firefox: Zahnrad ⚙️ ➔ „Protokolle dauerhaft anzeigen“ (Persist Logs) aktivieren.": "1. Oben auf „Login-Seite öffnen“ klicken (ein neuer Browser-Tab öffnet sich).\n2. Im neuen Tab F12 drücken und auf den Reiter „Netzwerk“ (Network) wechseln.\n3. Protokollierung dauerhaft aktivieren:\n • Chrome / Edge / Brave: Haken bei „Log beibehalten“ (Preserve log) setzen.\n • Firefox: Zahnrad ⚙️ ➔ „Protokolle dauerhaft anzeigen“ (Persist Logs) aktivieren.",
45
+ "Schritt 2: Bei Miele anmelden": "Schritt 2: Bei Miele anmelden",
46
+ "1. E-Mail und Passwort deines Miele-App-Kontos eingeben und auf „Anmeldung“ klicken.\n2. Wichtig: Nach dem Login bleibt die Seite bei einem sich drehenden Laderad stehen (oder meldet einen Fehler). Das ist völlig normal und bedeutet, dass die Anmeldung erfolgreich war!": "1. E-Mail und Passwort deines Miele-App-Kontos eingeben und auf „Anmeldung“ klicken.\n2. Wichtig: Nach dem Login bleibt die Seite bei einem sich drehenden Laderad stehen (oder meldet einen Fehler). Das ist völlig normal und bedeutet, dass die Anmeldung erfolgreich war!",
47
+ "Schritt 3: Adresse kopieren & GroupKey ermitteln": "Schritt 3: Adresse kopieren & GroupKey ermitteln",
48
+ "1. Im Netzwerk-Tab (F12) ganz nach unten zur letzten (meist rot markierten) Zeile scrollen. Sie beginnt mit „redirect?redirect_uri=miele...“ oder „miele://oauth2-code/...“.\n2. Rechtsklick auf diese Zeile ➔ „URL kopieren“ (bzw. „Adresse des Links kopieren“).\n3. Die kopierte Adresse unten in das Feld einfügen und auf „GroupKey ermitteln“ klicken.": "1. Im Netzwerk-Tab (F12) ganz nach unten zur letzten (meist rot markierten) Zeile scrollen. Sie beginnt mit „redirect?redirect_uri=miele...“ oder „miele://oauth2-code/...“.\n2. Rechtsklick auf diese Zeile ➔ „URL kopieren“ (bzw. „Adresse des Links kopieren“).\n3. Die kopierte Adresse unten in das Feld einfügen und auf „GroupKey ermitteln“ klicken.",
49
+ "Der Adapter ermittelt die lokalen Zugangsdaten (GroupID/GroupKey) einmalig über eine Anmeldung mit Ihrem Miele-Konto. Die Miele-App funktioniert danach unverändert weiter. Es werden keine Zugangsdaten an Dritte übertragen.": "Der Adapter ermittelt die lokalen Zugangsdaten (GroupID/GroupKey) einmalig über eine Anmeldung mit Ihrem Miele-Konto. Die Miele-App funktioniert danach unverändert weiter. Es werden keine Zugangsdaten an Dritte übertragen.",
50
+ "Nach erfolgreicher Ermittlung stehen GroupID und (verschlüsselt gespeicherter) GroupKey unten im Tab „Erweitert\". Speichern nicht vergessen.": "Nach erfolgreicher Ermittlung stehen GroupID und (verschlüsselt gespeicherter) GroupKey unten im Tab „Erweitert\". Speichern nicht vergessen.",
51
+ "Hintergrund-Suche Intervall in Minuten": "Hintergrund-Suche Intervall in Minuten",
52
+ "Sekundengenaue Rest-/Laufzeit abrufen (DOP2)": "Sekundengenaue Rest-/Laufzeit abrufen (DOP2)",
53
+ "Sekunden-Abfrageintervall in Sekunden": "Sekunden-Abfrageintervall in Sekunden",
54
+ "Verlauf": "Verlauf",
55
+ "Programme mitschreiben": "Programme mitschreiben",
56
+ "Einträge im Ringpuffer": "Einträge im Ringpuffer",
57
+ "Wie viele der letzten Programme in cyclesJson stehen. Für die Schnellanzeige gedacht; Langzeitdaten kommen aus dem History-Adapter.": "Wie viele der letzten Programme in cyclesJson stehen. Für die Schnellanzeige gedacht; Langzeitdaten kommen aus dem History-Adapter.",
58
+ "Aufbewahrung in Tagen": "Aufbewahrung in Tagen",
59
+ "Ältere Einträge fallen aus dem Ringpuffer. 730 Tage sind zwei Jahre.": "Ältere Einträge fallen aus dem Ringpuffer. 730 Tage sind zwei Jahre.",
60
+ "Zusätzlich in den History-Adapter schreiben": "Zusätzlich in den History-Adapter schreiben",
61
+ "Energie, Wasser und Dauer je Programm mit dem Zeitpunkt des Programmendes – damit lassen sich Diagramme über beliebige Zeiträume bauen.": "Energie, Wasser und Dauer je Programm mit dem Zeitpunkt des Programmendes – damit lassen sich Diagramme über beliebige Zeiträume bauen.",
62
+ "History-Instanz": "History-Instanz",
63
+ "Der Adapter schreibt jedes abgeschlossene Programm mit: Dauer, Programm, Energie und Wasser. Die Geräte selbst heben abgeschlossene Programme nicht auf, der Verlauf beginnt also mit dem Einschalten dieser Funktion – rückwirkend lässt er sich nicht füllen. Die letzten Programme stehen als JSON unter <Seriennummer>.history.cyclesJson, die Summen daneben.": "Der Adapter schreibt jedes abgeschlossene Programm mit: Dauer, Programm, Energie und Wasser. Die Geräte selbst heben abgeschlossene Programme nicht auf, der Verlauf beginnt also mit dem Einschalten dieser Funktion – rückwirkend lässt er sich nicht füllen. Die letzten Programme stehen als JSON unter <Seriennummer>.history.cyclesJson, die Summen daneben."
44
64
  }
@@ -9,7 +9,7 @@
9
9
  "Login-Seite öffnen": "Open login page",
10
10
  "miele://-Redirect-URL": "miele:// redirect URL",
11
11
  "GroupKey ermitteln": "Fetch GroupKey",
12
- "Geräte automatisch per mDNS finden": "Discover devices automatically via mDNS",
12
+ "Geräte automatisch per mDNS finden": "Find devices automatically via mDNS",
13
13
  "Jetzt suchen": "Search now",
14
14
  "Manuelle Geräte-IPs (optional, zusätzlich)": "Manual device IPs (optional, additional)",
15
15
  "IP-Adresse": "IP address",
@@ -39,6 +39,26 @@
39
39
  "Datenpunkt-Namen auf Deutsch": "State names in German",
40
40
  "EcoFeedback (Energie/Wasser) abrufen": "Fetch EcoFeedback (energy/water)",
41
41
  "EcoFeedback-Intervall in Sekunden": "EcoFeedback interval in seconds",
42
- "Geräte automatisch per mDNS finden (experimentell)": "Find devices automatically via mDNS (experimental)",
43
- "SuperVision-Push aktivieren (experimentell, Echtzeit)": "Enable SuperVision push (experimental, real-time)"
42
+ "SuperVision-Push aktivieren (experimentell, Echtzeit)": "Enable SuperVision push (experimental, real-time)",
43
+ "Schritt 1: Entwicklertools im Browser vorbereiten": "Step 1: Prepare browser developer tools",
44
+ "1. Oben auf „Login-Seite öffnen“ klicken (ein neuer Browser-Tab öffnet sich).\n2. Im neuen Tab F12 drücken und auf den Reiter „Netzwerk“ (Network) wechseln.\n3. Protokollierung dauerhaft aktivieren:\n • Chrome / Edge / Brave: Haken bei „Log beibehalten“ (Preserve log) setzen.\n • Firefox: Zahnrad ⚙️ ➔ „Protokolle dauerhaft anzeigen“ (Persist Logs) aktivieren.": "1. Click 'Open login page' above (a new browser tab opens).\n2. In the new tab, press F12 and switch to the 'Network' tab.\n3. Enable persistent logging:\n • Chrome / Edge / Brave: Check 'Preserve log'.\n • Firefox: Click gear ⚙️ ➔ check 'Persist Logs'.",
45
+ "Schritt 2: Bei Miele anmelden": "Step 2: Sign in with Miele",
46
+ "1. E-Mail und Passwort deines Miele-App-Kontos eingeben und auf „Anmeldung“ klicken.\n2. Wichtig: Nach dem Login bleibt die Seite bei einem sich drehenden Laderad stehen (oder meldet einen Fehler). Das ist völlig normal und bedeutet, dass die Anmeldung erfolgreich war!": "1. Enter your Miele app account email and password and click 'Sign in'.\n2. Note: After login, the page will hang on a spinning loading wheel (or show an error). This is completely normal and indicates success!",
47
+ "Schritt 3: Adresse kopieren & GroupKey ermitteln": "Step 3: Copy redirect address & fetch GroupKey",
48
+ "1. Im Netzwerk-Tab (F12) ganz nach unten zur letzten (meist rot markierten) Zeile scrollen. Sie beginnt mit „redirect?redirect_uri=miele...“ oder „miele://oauth2-code/...“.\n2. Rechtsklick auf diese Zeile ➔ „URL kopieren“ (bzw. „Adresse des Links kopieren“).\n3. Die kopierte Adresse unten in das Feld einfügen und auf „GroupKey ermitteln“ klicken.": "1. In the Network tab (F12), scroll to the very last (often red) request starting with 'redirect?redirect_uri=miele...' or 'miele://oauth2-code/...'.\n2. Right-click that entry ➔ 'Copy URL' / 'Copy link address'.\n3. Paste the URL into the field below and click 'Fetch GroupKey'.",
49
+ "Der Adapter ermittelt die lokalen Zugangsdaten (GroupID/GroupKey) einmalig über eine Anmeldung mit Ihrem Miele-Konto. Die Miele-App funktioniert danach unverändert weiter. Es werden keine Zugangsdaten an Dritte übertragen.": "The adapter retrieves local credentials (GroupID/GroupKey) once by signing in with your Miele account. The Miele app continues to work as before. No credentials are transmitted to third parties.",
50
+ "Nach erfolgreicher Ermittlung stehen GroupID und (verschlüsselt gespeicherter) GroupKey unten im Tab „Erweitert\". Speichern nicht vergessen.": "Once retrieved, GroupID and encrypted GroupKey appear on the 'Advanced' tab. Don't forget to save.",
51
+ "Hintergrund-Suche Intervall in Minuten": "Background discovery interval in minutes",
52
+ "Sekundengenaue Rest-/Laufzeit abrufen (DOP2)": "Fetch second-precise remaining/elapsed time (DOP2)",
53
+ "Sekunden-Abfrageintervall in Sekunden": "Second polling interval in seconds",
54
+ "Verlauf": "History",
55
+ "Programme mitschreiben": "Record cycles",
56
+ "Einträge im Ringpuffer": "Entries in the ring buffer",
57
+ "Wie viele der letzten Programme in cyclesJson stehen. Für die Schnellanzeige gedacht; Langzeitdaten kommen aus dem History-Adapter.": "How many recent cycles are kept in cyclesJson. Meant for quick display; long-term data comes from the history adapter.",
58
+ "Aufbewahrung in Tagen": "Retention in days",
59
+ "Ältere Einträge fallen aus dem Ringpuffer. 730 Tage sind zwei Jahre.": "Older entries drop out of the ring buffer. 730 days is two years.",
60
+ "Zusätzlich in den History-Adapter schreiben": "Also write to the history adapter",
61
+ "Energie, Wasser und Dauer je Programm mit dem Zeitpunkt des Programmendes – damit lassen sich Diagramme über beliebige Zeiträume bauen.": "Energy, water and duration per cycle, timestamped at the end of the cycle – so charts can cover any period.",
62
+ "History-Instanz": "History instance",
63
+ "Der Adapter schreibt jedes abgeschlossene Programm mit: Dauer, Programm, Energie und Wasser. Die Geräte selbst heben abgeschlossene Programme nicht auf, der Verlauf beginnt also mit dem Einschalten dieser Funktion – rückwirkend lässt er sich nicht füllen. Die letzten Programme stehen als JSON unter <Seriennummer>.history.cyclesJson, die Summen daneben.": "The adapter records every completed cycle: duration, program, energy and water. The appliances do not keep finished cycles themselves, so the history starts when you enable this – it cannot be filled retroactively. Recent cycles are available as JSON under <serial>.history.cyclesJson, the totals next to it."
44
64
  }
@@ -39,6 +39,26 @@
39
39
  "Datenpunkt-Namen auf Deutsch": "Nombres de estados en alemán",
40
40
  "EcoFeedback (Energie/Wasser) abrufen": "Obtener EcoFeedback (energía/agua)",
41
41
  "EcoFeedback-Intervall in Sekunden": "Intervalo de EcoFeedback en segundos",
42
- "Geräte automatisch per mDNS finden (experimentell)": "Detectar dispositivos automáticamente por mDNS (experimental)",
43
- "SuperVision-Push aktivieren (experimentell, Echtzeit)": "Activar push SuperVision (experimental, tiempo real)"
42
+ "SuperVision-Push aktivieren (experimentell, Echtzeit)": "Activar push SuperVision (experimental, tiempo real)",
43
+ "Schritt 1: Entwicklertools im Browser vorbereiten": "Paso 1: preparar las herramientas de desarrollo del navegador",
44
+ "1. Oben auf „Login-Seite öffnen“ klicken (ein neuer Browser-Tab öffnet sich).\n2. Im neuen Tab F12 drücken und auf den Reiter „Netzwerk“ (Network) wechseln.\n3. Protokollierung dauerhaft aktivieren:\n • Chrome / Edge / Brave: Haken bei „Log beibehalten“ (Preserve log) setzen.\n • Firefox: Zahnrad ⚙️ ➔ „Protokolle dauerhaft anzeigen“ (Persist Logs) aktivieren.": "1. Haga clic arriba en «Abrir página de inicio de sesión» (se abre una pestaña nueva).\n2. En la pestaña nueva pulse F12 y cambie a la pestaña «Red» (Network).\n3. Active el registro persistente:\n • Chrome / Edge / Brave: marque «Conservar registro» (Preserve log).\n • Firefox: engranaje ⚙️ ➔ active «Conservar registros» (Persist Logs).",
45
+ "Schritt 2: Bei Miele anmelden": "Paso 2: iniciar sesión en Miele",
46
+ "1. E-Mail und Passwort deines Miele-App-Kontos eingeben und auf „Anmeldung“ klicken.\n2. Wichtig: Nach dem Login bleibt die Seite bei einem sich drehenden Laderad stehen (oder meldet einen Fehler). Das ist völlig normal und bedeutet, dass die Anmeldung erfolgreich war!": "1. Introduzca el correo y la contraseña de su cuenta de la app Miele y haga clic en «Iniciar sesión».\n2. Importante: después del inicio de sesión la página se queda con una rueda girando (o muestra un error). Es completamente normal y significa que el acceso ha funcionado.",
47
+ "Schritt 3: Adresse kopieren & GroupKey ermitteln": "Paso 3: copiar la dirección y obtener la GroupKey",
48
+ "1. Im Netzwerk-Tab (F12) ganz nach unten zur letzten (meist rot markierten) Zeile scrollen. Sie beginnt mit „redirect?redirect_uri=miele...“ oder „miele://oauth2-code/...“.\n2. Rechtsklick auf diese Zeile ➔ „URL kopieren“ (bzw. „Adresse des Links kopieren“).\n3. Die kopierte Adresse unten in das Feld einfügen und auf „GroupKey ermitteln“ klicken.": "1. En la pestaña Red (F12) desplácese hasta la última petición (suele estar en rojo) que empieza por «redirect?redirect_uri=miele...» o «miele://oauth2-code/...».\n2. Haga clic derecho en esa línea ➔ «Copiar URL» (o «Copiar dirección del enlace»).\n3. Pegue la dirección copiada en el campo de abajo y haga clic en «Obtener GroupKey».",
49
+ "Der Adapter ermittelt die lokalen Zugangsdaten (GroupID/GroupKey) einmalig über eine Anmeldung mit Ihrem Miele-Konto. Die Miele-App funktioniert danach unverändert weiter. Es werden keine Zugangsdaten an Dritte übertragen.": "El adaptador obtiene una sola vez las credenciales locales (GroupID/GroupKey) mediante un inicio de sesión con su cuenta Miele. La app de Miele sigue funcionando igual. No se transmiten credenciales a terceros.",
50
+ "Nach erfolgreicher Ermittlung stehen GroupID und (verschlüsselt gespeicherter) GroupKey unten im Tab „Erweitert\". Speichern nicht vergessen.": "Tras obtenerlos, la GroupID y la GroupKey (guardada cifrada) aparecen en la pestaña «Avanzado». No olvide guardar.",
51
+ "Hintergrund-Suche Intervall in Minuten": "Intervalo de descubrimiento en segundo plano en minutos",
52
+ "Sekundengenaue Rest-/Laufzeit abrufen (DOP2)": "Obtener tiempo restante/transcurrido exacto en segundos (DOP2)",
53
+ "Sekunden-Abfrageintervall in Sekunden": "Intervalo de consulta en segundos",
54
+ "Verlauf": "Historial",
55
+ "Programme mitschreiben": "Registrar los programas",
56
+ "Einträge im Ringpuffer": "Entradas en el búfer circular",
57
+ "Wie viele der letzten Programme in cyclesJson stehen. Für die Schnellanzeige gedacht; Langzeitdaten kommen aus dem History-Adapter.": "Cuántos programas recientes se guardan en cyclesJson. Pensado para la vista rápida; los datos a largo plazo vienen del adaptador history.",
58
+ "Aufbewahrung in Tagen": "Conservación en días",
59
+ "Ältere Einträge fallen aus dem Ringpuffer. 730 Tage sind zwei Jahre.": "Las entradas más antiguas salen del búfer circular. 730 días son dos años.",
60
+ "Zusätzlich in den History-Adapter schreiben": "Escribir también en el adaptador history",
61
+ "Energie, Wasser und Dauer je Programm mit dem Zeitpunkt des Programmendes – damit lassen sich Diagramme über beliebige Zeiträume bauen.": "Energía, agua y duración por programa, con la marca de tiempo del final del programa, para poder crear gráficos de cualquier periodo.",
62
+ "History-Instanz": "Instancia de history",
63
+ "Der Adapter schreibt jedes abgeschlossene Programm mit: Dauer, Programm, Energie und Wasser. Die Geräte selbst heben abgeschlossene Programme nicht auf, der Verlauf beginnt also mit dem Einschalten dieser Funktion – rückwirkend lässt er sich nicht füllen. Die letzten Programme stehen als JSON unter <Seriennummer>.history.cyclesJson, die Summen daneben.": "El adaptador registra cada programa terminado: duración, programa, energía y agua. Los aparatos no conservan los programas finalizados, así que el historial empieza al activar esta opción; no puede rellenarse con datos pasados. Los últimos programas están como JSON en <número de serie>.history.cyclesJson, junto a los totales."
44
64
  }
@@ -39,6 +39,26 @@
39
39
  "Datenpunkt-Namen auf Deutsch": "Noms des états en allemand",
40
40
  "EcoFeedback (Energie/Wasser) abrufen": "Récupérer EcoFeedback (énergie/eau)",
41
41
  "EcoFeedback-Intervall in Sekunden": "Intervalle EcoFeedback en secondes",
42
- "Geräte automatisch per mDNS finden (experimentell)": "Détecter les appareils automatiquement via mDNS (expérimental)",
43
- "SuperVision-Push aktivieren (experimentell, Echtzeit)": "Activer le push SuperVision (expérimental, temps réel)"
42
+ "SuperVision-Push aktivieren (experimentell, Echtzeit)": "Activer le push SuperVision (expérimental, temps réel)",
43
+ "Schritt 1: Entwicklertools im Browser vorbereiten": "Étape 1 : préparer les outils de développement du navigateur",
44
+ "1. Oben auf „Login-Seite öffnen“ klicken (ein neuer Browser-Tab öffnet sich).\n2. Im neuen Tab F12 drücken und auf den Reiter „Netzwerk“ (Network) wechseln.\n3. Protokollierung dauerhaft aktivieren:\n • Chrome / Edge / Brave: Haken bei „Log beibehalten“ (Preserve log) setzen.\n • Firefox: Zahnrad ⚙️ ➔ „Protokolle dauerhaft anzeigen“ (Persist Logs) aktivieren.": "1. Cliquez ci-dessus sur « Ouvrir la page de connexion » (un nouvel onglet s'ouvre).\n2. Dans le nouvel onglet, appuyez sur F12 et passez à l'onglet « Réseau » (Network).\n3. Activez la journalisation persistante :\n • Chrome / Edge / Brave : cochez « Conserver le journal » (Preserve log).\n • Firefox : roue dentée ⚙️ ➔ activez « Conserver les journaux » (Persist Logs).",
45
+ "Schritt 2: Bei Miele anmelden": "Étape 2 : se connecter à Miele",
46
+ "1. E-Mail und Passwort deines Miele-App-Kontos eingeben und auf „Anmeldung“ klicken.\n2. Wichtig: Nach dem Login bleibt die Seite bei einem sich drehenden Laderad stehen (oder meldet einen Fehler). Das ist völlig normal und bedeutet, dass die Anmeldung erfolgreich war!": "1. Saisissez l'adresse e-mail et le mot de passe de votre compte de l'application Miele, puis cliquez sur « Connexion ».\n2. Important : après la connexion, la page reste bloquée sur une roue qui tourne (ou affiche une erreur). C'est tout à fait normal et signifie que la connexion a réussi.",
47
+ "Schritt 3: Adresse kopieren & GroupKey ermitteln": "Étape 3 : copier l'adresse de redirection et récupérer la GroupKey",
48
+ "1. Im Netzwerk-Tab (F12) ganz nach unten zur letzten (meist rot markierten) Zeile scrollen. Sie beginnt mit „redirect?redirect_uri=miele...“ oder „miele://oauth2-code/...“.\n2. Rechtsklick auf diese Zeile ➔ „URL kopieren“ (bzw. „Adresse des Links kopieren“).\n3. Die kopierte Adresse unten in das Feld einfügen und auf „GroupKey ermitteln“ klicken.": "1. Dans l'onglet Réseau (F12), faites défiler jusqu'à la dernière requête (souvent en rouge) commençant par « redirect?redirect_uri=miele... » ou « miele://oauth2-code/... ».\n2. Clic droit sur cette ligne ➔ « Copier l'URL » (ou « Copier l'adresse du lien »).\n3. Collez l'adresse copiée dans le champ ci-dessous et cliquez sur « Récupérer la GroupKey ».",
49
+ "Der Adapter ermittelt die lokalen Zugangsdaten (GroupID/GroupKey) einmalig über eine Anmeldung mit Ihrem Miele-Konto. Die Miele-App funktioniert danach unverändert weiter. Es werden keine Zugangsdaten an Dritte übertragen.": "L'adaptateur récupère une seule fois les identifiants locaux (GroupID/GroupKey) via une connexion à votre compte Miele. L'application Miele continue de fonctionner comme avant. Aucun identifiant n'est transmis à des tiers.",
50
+ "Nach erfolgreicher Ermittlung stehen GroupID und (verschlüsselt gespeicherter) GroupKey unten im Tab „Erweitert\". Speichern nicht vergessen.": "Une fois récupérées, la GroupID et la GroupKey (stockée chiffrée) apparaissent dans l'onglet « Avancé ». N'oubliez pas d'enregistrer.",
51
+ "Hintergrund-Suche Intervall in Minuten": "Intervalle de découverte en arrière-plan en minutes",
52
+ "Sekundengenaue Rest-/Laufzeit abrufen (DOP2)": "Récupérer le temps restant/écoulé précis à la seconde (DOP2)",
53
+ "Sekunden-Abfrageintervall in Sekunden": "Intervalle d'interrogation en secondes",
54
+ "Verlauf": "Historique",
55
+ "Programme mitschreiben": "Enregistrer les cycles",
56
+ "Einträge im Ringpuffer": "Entrées dans le tampon circulaire",
57
+ "Wie viele der letzten Programme in cyclesJson stehen. Für die Schnellanzeige gedacht; Langzeitdaten kommen aus dem History-Adapter.": "Nombre de cycles récents conservés dans cyclesJson. Prévu pour l’affichage rapide ; les données à long terme proviennent de l’adaptateur history.",
58
+ "Aufbewahrung in Tagen": "Conservation en jours",
59
+ "Ältere Einträge fallen aus dem Ringpuffer. 730 Tage sind zwei Jahre.": "Les entrées plus anciennes sortent du tampon circulaire. 730 jours correspondent à deux ans.",
60
+ "Zusätzlich in den History-Adapter schreiben": "Écrire aussi dans l’adaptateur history",
61
+ "Energie, Wasser und Dauer je Programm mit dem Zeitpunkt des Programmendes – damit lassen sich Diagramme über beliebige Zeiträume bauen.": "Énergie, eau et durée par cycle, horodatés à la fin du cycle – pour des graphiques sur n’importe quelle période.",
62
+ "History-Instanz": "Instance history",
63
+ "Der Adapter schreibt jedes abgeschlossene Programm mit: Dauer, Programm, Energie und Wasser. Die Geräte selbst heben abgeschlossene Programme nicht auf, der Verlauf beginnt also mit dem Einschalten dieser Funktion – rückwirkend lässt er sich nicht füllen. Die letzten Programme stehen als JSON unter <Seriennummer>.history.cyclesJson, die Summen daneben.": "L’adaptateur enregistre chaque cycle terminé : durée, programme, énergie et eau. Les appareils ne conservent pas les cycles achevés, l’historique commence donc à l’activation – il ne peut pas être rempli rétroactivement. Les derniers cycles sont disponibles en JSON sous <numéro de série>.history.cyclesJson, avec les totaux."
44
64
  }
@@ -39,6 +39,26 @@
39
39
  "Datenpunkt-Namen auf Deutsch": "Nomi degli stati in tedesco",
40
40
  "EcoFeedback (Energie/Wasser) abrufen": "Recupera EcoFeedback (energia/acqua)",
41
41
  "EcoFeedback-Intervall in Sekunden": "Intervallo EcoFeedback in secondi",
42
- "Geräte automatisch per mDNS finden (experimentell)": "Rileva dispositivi automaticamente via mDNS (sperimentale)",
43
- "SuperVision-Push aktivieren (experimentell, Echtzeit)": "Abilita push SuperVision (sperimentale, tempo reale)"
42
+ "SuperVision-Push aktivieren (experimentell, Echtzeit)": "Abilita push SuperVision (sperimentale, tempo reale)",
43
+ "Schritt 1: Entwicklertools im Browser vorbereiten": "Passo 1: preparare gli strumenti di sviluppo del browser",
44
+ "1. Oben auf „Login-Seite öffnen“ klicken (ein neuer Browser-Tab öffnet sich).\n2. Im neuen Tab F12 drücken und auf den Reiter „Netzwerk“ (Network) wechseln.\n3. Protokollierung dauerhaft aktivieren:\n • Chrome / Edge / Brave: Haken bei „Log beibehalten“ (Preserve log) setzen.\n • Firefox: Zahnrad ⚙️ ➔ „Protokolle dauerhaft anzeigen“ (Persist Logs) aktivieren.": "1. Fare clic sopra su «Apri pagina di accesso» (si apre una nuova scheda).\n2. Nella nuova scheda premere F12 e passare alla scheda «Rete» (Network).\n3. Attivare la registrazione persistente:\n • Chrome / Edge / Brave: spuntare «Conserva registro» (Preserve log).\n • Firefox: ingranaggio ⚙️ ➔ attivare «Mantieni i log» (Persist Logs).",
45
+ "Schritt 2: Bei Miele anmelden": "Passo 2: accedere con Miele",
46
+ "1. E-Mail und Passwort deines Miele-App-Kontos eingeben und auf „Anmeldung“ klicken.\n2. Wichtig: Nach dem Login bleibt die Seite bei einem sich drehenden Laderad stehen (oder meldet einen Fehler). Das ist völlig normal und bedeutet, dass die Anmeldung erfolgreich war!": "1. Inserire e-mail e password dell'account dell'app Miele e fare clic su «Accedi».\n2. Importante: dopo l'accesso la pagina resta ferma su una rotellina che gira (o mostra un errore). È del tutto normale e significa che l'accesso è riuscito.",
47
+ "Schritt 3: Adresse kopieren & GroupKey ermitteln": "Passo 3: copiare l'indirizzo e ottenere la GroupKey",
48
+ "1. Im Netzwerk-Tab (F12) ganz nach unten zur letzten (meist rot markierten) Zeile scrollen. Sie beginnt mit „redirect?redirect_uri=miele...“ oder „miele://oauth2-code/...“.\n2. Rechtsklick auf diese Zeile ➔ „URL kopieren“ (bzw. „Adresse des Links kopieren“).\n3. Die kopierte Adresse unten in das Feld einfügen und auf „GroupKey ermitteln“ klicken.": "1. Nella scheda Rete (F12) scorrere fino all'ultima richiesta (spesso in rosso) che inizia con «redirect?redirect_uri=miele...» o «miele://oauth2-code/...».\n2. Fare clic con il tasto destro su quella riga ➔ «Copia URL» (o «Copia indirizzo del link»).\n3. Incollare l'indirizzo copiato nel campo sottostante e fare clic su «Ottieni GroupKey».",
49
+ "Der Adapter ermittelt die lokalen Zugangsdaten (GroupID/GroupKey) einmalig über eine Anmeldung mit Ihrem Miele-Konto. Die Miele-App funktioniert danach unverändert weiter. Es werden keine Zugangsdaten an Dritte übertragen.": "L'adapter ottiene una sola volta le credenziali locali (GroupID/GroupKey) tramite un accesso al proprio account Miele. L'app Miele continua a funzionare come prima. Nessuna credenziale viene trasmessa a terzi.",
50
+ "Nach erfolgreicher Ermittlung stehen GroupID und (verschlüsselt gespeicherter) GroupKey unten im Tab „Erweitert\". Speichern nicht vergessen.": "Una volta ottenute, GroupID e GroupKey (memorizzata cifrata) compaiono nella scheda «Avanzate». Non dimenticare di salvare.",
51
+ "Hintergrund-Suche Intervall in Minuten": "Intervallo di rilevamento in background in minuti",
52
+ "Sekundengenaue Rest-/Laufzeit abrufen (DOP2)": "Recupera tempo rimanente/trascorso preciso al secondo (DOP2)",
53
+ "Sekunden-Abfrageintervall in Sekunden": "Intervallo di polling in secondi",
54
+ "Verlauf": "Cronologia",
55
+ "Programme mitschreiben": "Registrare i programmi",
56
+ "Einträge im Ringpuffer": "Voci nel buffer circolare",
57
+ "Wie viele der letzten Programme in cyclesJson stehen. Für die Schnellanzeige gedacht; Langzeitdaten kommen aus dem History-Adapter.": "Quanti programmi recenti restano in cyclesJson. Pensato per la visualizzazione rapida; i dati a lungo termine arrivano dall’adapter history.",
58
+ "Aufbewahrung in Tagen": "Conservazione in giorni",
59
+ "Ältere Einträge fallen aus dem Ringpuffer. 730 Tage sind zwei Jahre.": "Le voci più vecchie escono dal buffer circolare. 730 giorni corrispondono a due anni.",
60
+ "Zusätzlich in den History-Adapter schreiben": "Scrivere anche nell’adapter history",
61
+ "Energie, Wasser und Dauer je Programm mit dem Zeitpunkt des Programmendes – damit lassen sich Diagramme über beliebige Zeiträume bauen.": "Energia, acqua e durata per programma, con l’orario di fine – così i grafici possono coprire qualsiasi periodo.",
62
+ "History-Instanz": "Istanza history",
63
+ "Der Adapter schreibt jedes abgeschlossene Programm mit: Dauer, Programm, Energie und Wasser. Die Geräte selbst heben abgeschlossene Programme nicht auf, der Verlauf beginnt also mit dem Einschalten dieser Funktion – rückwirkend lässt er sich nicht füllen. Die letzten Programme stehen als JSON unter <Seriennummer>.history.cyclesJson, die Summen daneben.": "L’adapter registra ogni programma concluso: durata, programma, energia e acqua. Gli apparecchi non conservano i programmi terminati, quindi la cronologia inizia con l’attivazione e non può essere riempita a posteriori. Gli ultimi programmi sono in JSON sotto <numero di serie>.history.cyclesJson, accanto ai totali."
44
64
  }
@@ -39,6 +39,26 @@
39
39
  "Datenpunkt-Namen auf Deutsch": "Statusnamen in het Duits",
40
40
  "EcoFeedback (Energie/Wasser) abrufen": "EcoFeedback (energie/water) ophalen",
41
41
  "EcoFeedback-Intervall in Sekunden": "EcoFeedback-interval in seconden",
42
- "Geräte automatisch per mDNS finden (experimentell)": "Apparaten automatisch via mDNS vinden (experimenteel)",
43
- "SuperVision-Push aktivieren (experimentell, Echtzeit)": "SuperVision-push inschakelen (experimenteel, realtime)"
42
+ "SuperVision-Push aktivieren (experimentell, Echtzeit)": "SuperVision-push inschakelen (experimenteel, realtime)",
43
+ "Schritt 1: Entwicklertools im Browser vorbereiten": "Stap 1: ontwikkelaarstools van de browser voorbereiden",
44
+ "1. Oben auf „Login-Seite öffnen“ klicken (ein neuer Browser-Tab öffnet sich).\n2. Im neuen Tab F12 drücken und auf den Reiter „Netzwerk“ (Network) wechseln.\n3. Protokollierung dauerhaft aktivieren:\n • Chrome / Edge / Brave: Haken bei „Log beibehalten“ (Preserve log) setzen.\n • Firefox: Zahnrad ⚙️ ➔ „Protokolle dauerhaft anzeigen“ (Persist Logs) aktivieren.": "1. Klik hierboven op 'Inlogpagina openen' (er opent een nieuw tabblad).\n2. Druk in het nieuwe tabblad op F12 en ga naar het tabblad 'Netwerk' (Network).\n3. Zet blijvende logging aan:\n • Chrome / Edge / Brave: vink 'Log behouden' (Preserve log) aan.\n • Firefox: tandwiel ⚙️ ➔ zet 'Logs behouden' (Persist Logs) aan.",
45
+ "Schritt 2: Bei Miele anmelden": "Stap 2: aanmelden bij Miele",
46
+ "1. E-Mail und Passwort deines Miele-App-Kontos eingeben und auf „Anmeldung“ klicken.\n2. Wichtig: Nach dem Login bleibt die Seite bei einem sich drehenden Laderad stehen (oder meldet einen Fehler). Das ist völlig normal und bedeutet, dass die Anmeldung erfolgreich war!": "1. Voer het e-mailadres en wachtwoord van uw Miele-app-account in en klik op 'Aanmelden'.\n2. Belangrijk: na het aanmelden blijft de pagina hangen op een draaiend laadwiel (of toont een fout). Dat is volkomen normaal en betekent dat het aanmelden is gelukt.",
47
+ "Schritt 3: Adresse kopieren & GroupKey ermitteln": "Stap 3: adres kopiëren en GroupKey ophalen",
48
+ "1. Im Netzwerk-Tab (F12) ganz nach unten zur letzten (meist rot markierten) Zeile scrollen. Sie beginnt mit „redirect?redirect_uri=miele...“ oder „miele://oauth2-code/...“.\n2. Rechtsklick auf diese Zeile ➔ „URL kopieren“ (bzw. „Adresse des Links kopieren“).\n3. Die kopierte Adresse unten in das Feld einfügen und auf „GroupKey ermitteln“ klicken.": "1. Scroll in het tabblad Netwerk (F12) naar de allerlaatste (vaak rode) aanvraag die begint met 'redirect?redirect_uri=miele...' of 'miele://oauth2-code/...'.\n2. Klik met rechts op die regel ➔ 'URL kopiëren' (of 'Linkadres kopiëren').\n3. Plak het gekopieerde adres in het veld hieronder en klik op 'GroupKey ophalen'.",
49
+ "Der Adapter ermittelt die lokalen Zugangsdaten (GroupID/GroupKey) einmalig über eine Anmeldung mit Ihrem Miele-Konto. Die Miele-App funktioniert danach unverändert weiter. Es werden keine Zugangsdaten an Dritte übertragen.": "De adapter haalt de lokale inloggegevens (GroupID/GroupKey) eenmalig op via een aanmelding met uw Miele-account. De Miele-app blijft ongewijzigd werken. Er worden geen gegevens aan derden doorgegeven.",
50
+ "Nach erfolgreicher Ermittlung stehen GroupID und (verschlüsselt gespeicherter) GroupKey unten im Tab „Erweitert\". Speichern nicht vergessen.": "Na het ophalen staan GroupID en de (versleuteld opgeslagen) GroupKey op het tabblad 'Geavanceerd'. Vergeet niet op te slaan.",
51
+ "Hintergrund-Suche Intervall in Minuten": "Achtergrond detectie interval in minuten",
52
+ "Sekundengenaue Rest-/Laufzeit abrufen (DOP2)": "Exacte resterende/verstreken tijd in seconden ophalen (DOP2)",
53
+ "Sekunden-Abfrageintervall in Sekunden": "Seconden poll-interval in seconden",
54
+ "Verlauf": "Historie",
55
+ "Programme mitschreiben": "Programma’s vastleggen",
56
+ "Einträge im Ringpuffer": "Items in de ringbuffer",
57
+ "Wie viele der letzten Programme in cyclesJson stehen. Für die Schnellanzeige gedacht; Langzeitdaten kommen aus dem History-Adapter.": "Hoeveel recente programma’s in cyclesJson blijven staan. Bedoeld voor snelle weergave; langetermijndata komt uit de history-adapter.",
58
+ "Aufbewahrung in Tagen": "Bewaartermijn in dagen",
59
+ "Ältere Einträge fallen aus dem Ringpuffer. 730 Tage sind zwei Jahre.": "Oudere items vallen uit de ringbuffer. 730 dagen is twee jaar.",
60
+ "Zusätzlich in den History-Adapter schreiben": "Ook naar de history-adapter schrijven",
61
+ "Energie, Wasser und Dauer je Programm mit dem Zeitpunkt des Programmendes – damit lassen sich Diagramme über beliebige Zeiträume bauen.": "Energie, water en duur per programma, met het tijdstip van het programma-einde – zo kunnen grafieken elke periode beslaan.",
62
+ "History-Instanz": "History-instantie",
63
+ "Der Adapter schreibt jedes abgeschlossene Programm mit: Dauer, Programm, Energie und Wasser. Die Geräte selbst heben abgeschlossene Programme nicht auf, der Verlauf beginnt also mit dem Einschalten dieser Funktion – rückwirkend lässt er sich nicht füllen. Die letzten Programme stehen als JSON unter <Seriennummer>.history.cyclesJson, die Summen daneben.": "De adapter legt elk afgerond programma vast: duur, programma, energie en water. De apparaten bewaren afgeronde programma’s niet zelf, de historie begint dus bij het inschakelen – met terugwerkende kracht vullen kan niet. De laatste programma’s staan als JSON onder <serienummer>.history.cyclesJson, met de totalen ernaast."
44
64
  }