@impact0815/node-red-contrib-home-connect 0.0.0-stage → 0.2.0

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.
Files changed (52) hide show
  1. package/BUILD-INFO.json +23 -0
  2. package/CHANGELOG.md +52 -0
  3. package/LICENSE +21 -0
  4. package/NOTICE +19 -0
  5. package/README.de.md +326 -0
  6. package/README.md +325 -2
  7. package/SECURITY.md +47 -0
  8. package/docs/API-COVERAGE.md +59 -0
  9. package/docs/ARCHITECTURE.md +95 -0
  10. package/docs/DASHBOARD.de.md +121 -0
  11. package/docs/DASHBOARD.md +121 -0
  12. package/docs/FIRST-PUSH.md +42 -0
  13. package/docs/LOCAL-LAN.de.md +150 -0
  14. package/docs/LOCAL-LAN.md +150 -0
  15. package/docs/MESSAGE-API.md +111 -0
  16. package/docs/RELEASE.md +78 -0
  17. package/docs/TROUBLESHOOTING.de.md +230 -0
  18. package/docs/TROUBLESHOOTING.md +230 -0
  19. package/docs/images/README.md +10 -0
  20. package/docs/images/dashboard-details-en.png +0 -0
  21. package/docs/images/dashboard-overview-en.png +0 -0
  22. package/docs/official-api-contract.json +418 -0
  23. package/examples/01-first-steps-device-list.json +148 -0
  24. package/examples/02-events.json +165 -0
  25. package/examples/03-safe-read-write.json +155 -0
  26. package/examples/04-local-read-only.json +214 -0
  27. package/examples/dashboard-dishwasher-washer-oven.json +628 -0
  28. package/examples/dashboard-screenshot-simulated.json +405 -0
  29. package/examples/demo-home-connect-flowfuse-1.34.1-scriptless.json +390 -0
  30. package/lib/client.js +600 -0
  31. package/lib/constants.js +66 -0
  32. package/lib/dashboard-i18n.js +255 -0
  33. package/lib/device-label.js +39 -0
  34. package/lib/errors.js +51 -0
  35. package/lib/health.js +525 -0
  36. package/lib/local-client.js +1014 -0
  37. package/lib/local-crypto.js +122 -0
  38. package/lib/local-diagnostics.js +115 -0
  39. package/lib/local-profile.js +706 -0
  40. package/lib/local-trace.js +103 -0
  41. package/lib/oauth.js +23 -0
  42. package/lib/rate-limiter.js +186 -0
  43. package/lib/simulator.js +290 -0
  44. package/lib/sse.js +58 -0
  45. package/lib/validation.js +194 -0
  46. package/lib/websocket-transport.js +374 -0
  47. package/nodes/home-connect.html +795 -0
  48. package/nodes/home-connect.js +699 -0
  49. package/nodes/locales/de/home-connect.html +19 -0
  50. package/nodes/locales/de/home-connect.json +10 -0
  51. package/nodes/locales/en-US/home-connect.json +10 -0
  52. package/package.json +71 -4
@@ -0,0 +1,23 @@
1
+ {
2
+ "packageName": "node-red-contrib-home-connect",
3
+ "packageVersion": "0.2.0",
4
+ "buildId": "hc-0.2.0-final",
5
+ "oauthFlow": "authorization_code_client_secret",
6
+ "pkce": false,
7
+ "localTransport": "read-only",
8
+ "dashboardLocales": [
9
+ "de",
10
+ "en"
11
+ ],
12
+ "dashboardLanguageStorageKey": "home-connect-dashboard-language",
13
+ "dashboardCompatibility": "@flowfuse/node-red-dashboard@1.34.1",
14
+ "dashboardLabelBinding": "computed-hcLabels",
15
+ "screenshotExample": "examples/dashboard-screenshot-simulated.json",
16
+ "releaseStatus": "final",
17
+ "featureFreeze": "2026-11-01",
18
+ "isolatedDemo": "examples/demo-home-connect-flowfuse-1.34.1-scriptless.json",
19
+ "documentationScreenshots": [
20
+ "docs/images/dashboard-overview-en.png",
21
+ "docs/images/dashboard-details-en.png"
22
+ ]
23
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,52 @@
1
+ # Changelog
2
+
3
+ ## 0.2.0 - 2026-11-01
4
+
5
+ Version 0.2.0 is feature-frozen for publication as build `hc-0.2.0-final`.
6
+
7
+ ### Added
8
+
9
+ - Experimental direct LAN reads and events using Home Connect Profile Downloader data, with AES-256-CBC/HMAC on port 80 and TLS 1.2 PSK on port 443.
10
+ - Recursive profile-set discovery, one central profile-to-host mapping, private/link-local target validation, staged connection diagnostics, sanitized protocol tracing, and an unconditional `LOCAL_READ_ONLY` write barrier.
11
+ - Profile-driven resolution of hexadecimal `uid`/`refUID`/`enid`/`refENID` identifiers, nested `enumerationType` references, and `subsetOf` inheritance across `DeviceDescription.xml` and `FeatureMapping.xml`.
12
+ - Local snapshot classification for status, settings, values, programs, options, remaining time, and safe `profileResolution` diagnostics. Unknown enum members preserve `rawValue`, remain unresolved, and do not create semantic health warnings.
13
+ - Dashboard 2.0 overview and appliance-detail examples for Dishwasher, Washer, and Oven, including initial snapshots, partial-event merging, last-known state, offline/reconnect handling, guarded cloud controls, and local read-only presentation.
14
+ - German/English dashboard localization for UI labels, appliance types, health/warnings, known enums, programs, and options. Technical keys and raw values remain unchanged.
15
+ - A deterministic credential-free screenshot flow and the isolated user-supplied `demo-home-connect-flowfuse-1.34.1-scriptless.json` Demo flow.
16
+ - Bilingual Local LAN, Dashboard, troubleshooting, architecture, security, and message/API documentation.
17
+
18
+ ### Changed
19
+
20
+ - Local transport selection now honors an explicit profile AES/TLS/PSK declaration before using IV presence as a fallback.
21
+ - Local handshakes and resource reads are driven by negotiated service versions, tolerate unsupported optional resources, process unsolicited values, respond to housekeeping requests, and rebuild complete sessions with bounded jittered backoff.
22
+ - Appliance selectors show type, friendly name, brand/model, and only a shortened display suffix while retaining the full internal ID unchanged.
23
+ - Dashboard local read-only cards show semantic status/program/option information without rendering write controls. Cloud writes remain guarded by global enablement, appliance allowlists, confirmation tokens, dry-run, and live capability checks.
24
+ - Dashboard localization now binds a collision-resistant computed `hcLabels` object for compatibility with `@flowfuse/node-red-dashboard` 1.34.1.
25
+
26
+ ### Fixed
27
+
28
+ - Made the protected JSONL trace regression test platform-aware: POSIX continues to require the enforced `0600` mode, while Windows verifies file creation and secret redaction without asserting permission bits that Windows cannot represent reliably. The trace implementation still creates/appends with mode `0600` and explicitly applies `0600` on POSIX-capable filesystems.
29
+ - Corrected real-profile enum handling for digit-only hexadecimal IDs, comment-named `enumerationType` tables, inherited enum subsets, profile booleans, program UIDs, and unknown members.
30
+ - Corrected local WebSocket upgrade headers and `/homeconnect` path handling, AES/TLS profile validation, legacy authentication fallback, `/ci/services` versioning, `deviceReady`, keepalive handling, and success-code interpretation.
31
+ - Prevented optional local-read failures from discarding appliance-pushed or previously successful values.
32
+ - Prevented unresolved enum values and neutral local `RemoteControlStartAllowed=false` status from generating false warnings.
33
+ - Prevented FlowFuse Dashboard scope values named `tr` from breaking localized template rendering.
34
+
35
+ ### Security and privacy
36
+
37
+ - Local writes are rejected before network I/O.
38
+ - Profile PSK/IV values remain in protected profile data or Node-RED credentials and are never included in exported examples, messages, traces, or diagnostics.
39
+ - Protocol traces redact keys, authentication/OAuth material, nonces, appliance/network identifiers, serial/MAC/SSID data, and IP fields.
40
+ - Examples and regression fixtures are simulated or anonymized; release checks reject exported credentials, credential-like values, numeric private IP addresses, and missing documentation screenshots.
41
+
42
+ ### Compatibility
43
+
44
+ - Node.js 18 or newer.
45
+ - Node-RED 3 or newer.
46
+ - Dashboard examples tested for `@flowfuse/node-red-dashboard` 1.34.1.
47
+ - OAuth remains Authorization Code Grant with client secret and without PKCE.
48
+ - Runtime dependencies remain zero.
49
+
50
+ ## 0.1.0
51
+
52
+ - Initial release with official-cloud OAuth, discovery, finite read coverage, SSE, rate-limit protection, normalized health/warnings, guarded writes, simulator flows, bilingual documentation, CI, and package validation.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Community contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/NOTICE ADDED
@@ -0,0 +1,19 @@
1
+ node-red-contrib-home-connect
2
+
3
+ Independent, unofficial community software for the public Home Connect API and an experimental, undocumented local appliance protocol.
4
+ Inspired at a conceptual level by the discovery-first and safeguarded-write approach of:
5
+ https://github.com/impact0815/node-red-contrib-viessmann
6
+ No source code from that project is included.
7
+
8
+ Home Connect and appliance brand names are trademarks of their respective owners. Their use identifies API compatibility only and does not imply affiliation, endorsement or support.
9
+
10
+ Local protocol behavior was independently implemented using public community observations and documentation from:
11
+ https://github.com/chris-mc1/homeconnect_local_hass
12
+ https://github.com/chris-mc1/homeconnect_websocket
13
+ https://github.com/hcpy2-0/hcpy
14
+ https://github.com/zibous/homeconnect-hcpy
15
+ https://github.com/Asmir1975/homeconnect_local_hass-UI
16
+ https://github.com/SukramJ/go-homeconnect2mqtt
17
+ https://github.com/bruestel/homeconnect-profile-downloader
18
+
19
+ No source code, appliance profiles, credentials, serial numbers, PSKs or IVs from those projects are included. Those projects remain subject to their own licenses; users must review them when installing or using the separate tools.
package/README.de.md ADDED
@@ -0,0 +1,326 @@
1
+ # node-red-contrib-home-connect
2
+
3
+ **[English](README.md) · Deutsch**
4
+
5
+ [![CI](https://github.com/impact0815/node-red-contrib-home-connect/actions/workflows/ci.yml/badge.svg)](https://github.com/impact0815/node-red-contrib-home-connect/actions/workflows/ci.yml)
6
+ [![Version](https://img.shields.io/badge/version-0.2.0-blue.svg)](CHANGELOG.md)
7
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
8
+
9
+ Node-RED-Nodes für Home Connect: direkte, nur lesende LAN-Anbindung über Geräteprofile sowie die bestehende offizielle Cloud-API mit OAuth, Discovery, SSE, Rate-Limit-Schutz, Health/Warnungen und abgesicherten Schreibzugriffen. Das Projekt folgt konzeptionell dem Discovery-first- und Safe-write-Ansatz von [`impact0815/node-red-contrib-viessmann`](https://github.com/impact0815/node-red-contrib-viessmann), ist aber eine eigenständige Implementierung für Home Connect.
10
+
11
+ > **Inoffizielles Community-Projekt.** Dieses Paket ist weder mit Home Connect GmbH oder BSH Hausgeräte GmbH noch mit Bosch, Siemens, Neff, Gaggenau oder anderen Marken verbunden, von ihnen freigegeben oder unterstützt. Nutzung auf eigenes Risiko. Gerätesteuerung kann Hitze, Bewegung, Wasserverbrauch und weitere Gefahren verursachen. Erst im Simulator und mit Dry-Run testen.
12
+
13
+ ## Das Wichtigste vorab
14
+
15
+ - **Client ID und Client Secret kommen aus einer eigenen Application im Home Connect Developer Portal**, nicht aus der Home-Connect-App.
16
+ - Diese Version verwendet den **OAuth 2.0 Authorization Code Grant mit Client Secret und ohne PKCE**.
17
+ - Das **Client Secret ist geheim**. Nie in Screenshots, Foren, Issues, Flows oder Git-Repositories zeigen. Wurde es sichtbar, im Developer Portal regenerieren und neu autorisieren.
18
+ - Die Redirect URI muss im Developer Portal und in Node-RED **Zeichen für Zeichen identisch** sein.
19
+ - Eine Verbindung immer zuerst **speichern und deployen**, danach erneut öffnen und autorisieren.
20
+ - Das experimentelle lokale Protokoll ist undokumentiert und kann sich mit Firmware ändern. Lokaler Zugriff ist technisch **fest schreibgeschützt**; Profil-PSK/IV sind Geheimnisse.
21
+
22
+ ## Funktionen
23
+
24
+ - vertraulicher OAuth-2.0-Authorization-Code-Flow, CSRF-State und Refresh-Token-Rotation
25
+ - Client Secret und Refresh Token im Node-RED-Credential-Store, nicht in exportierten Flows
26
+ - Production, China, offizieller Home-Connect-Simulator und integrierter Offline-Simulator
27
+ - rekursive Erkennung und Gruppierung zusammengehöriger Profile-Downloader-JSON/XML-Dateien mit genau einer zentralen Profil-zu-Host/IP-Zuordnung in der Config-Node
28
+ - direkte lokale WebSocket-Reads/-Events mit AES-CBC/HMAC oder TLS-PSK; die Verbindungsart steht standardmäßig auf **Auto** und kann zentral überschrieben werden
29
+ - serviceversionsgesteuerter Handshake und Leseablauf mit Verarbeitung unaufgeforderter Gerätewerte, Keepalive-Antworten und vollständigem Session-Neuaufbau
30
+ - optionaler bereinigter Protokoll-Mitschnitt im Speicher oder als geschützte JSONL-Datei, ohne PSK, IV, Schlüssel, Nonces oder Geräte-/Netzwerkkennungen
31
+ - Geräteauswahlen zeigen `Typ — verständlicher Name — Marke/Modell — …ID-Ende`; intern bleibt die vollständige technische ID unverändert
32
+ - strikte Prüfung auf private/link-lokale Ziele, Profil-JSON im Credential-Store und feste `LOCAL_READ_ONLY`-Schreibsperre
33
+ - profilbasierte Auflösung hexadezimaler XML-`uid`/`refUID`-Werte und referenzierter Enums in semantische Home-Connect-Schlüssel mit anschließender Einordnung in Status, Einstellungen, Werte und Programme
34
+ - Server-Sent Events (SSE) mit automatischem Reconnect
35
+ - normiertes Health-Modell `ok`, `running`, `info`, `warning`, `action_required`, `offline`, `error`
36
+ - deduplizierte Warnungen mit deutschen und englischen Texten aus Gerätestatus, Event-`level`/`handling`, Verbindung, API und OAuth; das Dashboard zeigt nur die gewählte Sprache
37
+ - klar getrennte Daten- und Fehlerausgänge
38
+ - persistentes, konfigurierbares 24-Stunden-Aufrufbudget mit gemeinsamem Zähler für gleiche Client IDs und 429-Circuit-Breaker
39
+ - abgesicherte Schreibzugriffe mit globaler Freigabe, Gerätetyp-Allowlist, Bestätigungstoken, Dry-Run und Live-Capability-Prüfung
40
+ - keine automatische Wiederholung von Schreibzugriffen
41
+ - deutsche und englische README, Hilfe, Troubleshooting und Beispiele
42
+ - Dashboard-2.0-Beispiel mit gespeicherter DE/EN-Sprachauswahl, lokalisierten UI-/Geräte-/Enum-/Programm-/Optionsnamen, initialem Snapshot, Teil-Event-Zusammenführung, Offline/Reconnect sowie Cloud- und Local-read-only-Pfad
43
+ - separater, vollständig simulierter und zugangsdatenfreier Screenshot-Flow für reproduzierbare GitHub-/npm-Dokumentationsbilder
44
+ - keine Runtime-Abhängigkeiten; Node.js ab 18 und Node-RED ab 3
45
+
46
+ ## Installation
47
+
48
+ ### Lokale TGZ-Datei
49
+
50
+ ```bash
51
+ cd ~/.node-red
52
+ npm install /absoluter/pfad/node-red-contrib-home-connect-0.2.0.tgz
53
+ ```
54
+
55
+ Danach Node-RED vollständig neu starten und den Browser mit **Strg+F5** neu laden.
56
+
57
+ ### Docker-Beispiel
58
+
59
+ ```bash
60
+ docker cp node-red-contrib-home-connect-0.2.0.tgz node-red:/tmp/
61
+ docker exec node-red npm install --prefix /data /tmp/node-red-contrib-home-connect-0.2.0.tgz
62
+ docker restart node-red
63
+ ```
64
+
65
+ ### Upgrade von 0.1.0
66
+
67
+ Das alte Paket sauber austauschen, damit Node-RED keine veraltete Kopie lädt:
68
+
69
+ ```bash
70
+ cd ~/.node-red
71
+ npm uninstall node-red-contrib-home-connect
72
+ rm -rf node_modules/node-red-contrib-home-connect
73
+ npm install --force /absoluter/pfad/node-red-contrib-home-connect-0.2.0.tgz
74
+ node -p "require('./node_modules/node-red-contrib-home-connect/BUILD-INFO.json')"
75
+ ```
76
+
77
+ Erwartet werden `hc-0.2.0-final` und `pkce: false`. Bei Docker anschließend den Container neu starten. Bestehende Cloud-Konfiguration bleibt kompatibel; unvollständige oder alte Autorisierungs-Links/Codes nicht weiterverwenden.
78
+
79
+ ## Schritt für Schritt: Einrichtung für Einsteiger
80
+
81
+ ### A. Erst ohne Konto ausprobieren
82
+
83
+ 1. In Node-RED **Menü → Import → Beispiele → node-red-contrib-home-connect → 01-first-steps-device-list** wählen.
84
+ 2. Deployen.
85
+ 3. Links am Inject-Node auf den Knopf klicken.
86
+ 4. Im Debug-Fenster erscheinen die drei ausschließlich lokalen Testgeräte.
87
+ 5. Der integrierte Simulator baut keine Verbindung zu Home Connect auf und benötigt keine Zugangsdaten.
88
+
89
+ ### B. Reale Geräte lokal anbinden (nur lesend)
90
+
91
+ 1. Mit dem Community-[Home Connect Profile Downloader](https://github.com/bruestel/homeconnect-profile-downloader) die JSON/XML-Dateien der Geräte exportieren.
92
+ 2. Den entpackten Ordner mit restriktiven Dateirechten auf dem Node-RED-Host speichern; bei Docker beispielsweise unter `/data/homeconnect-profiles` nur lesend einbinden. Einzutragen ist der Pfad **im Node-RED-Container**, nicht der Pfad auf dem Notebook.
93
+ 3. Neue Home-Connect-Konfiguration erstellen und **Local LAN (read-only)** wählen.
94
+ 4. Den serverseitigen Profilordner eintragen und **Profile suchen / Geräte erkennen** anklicken. Der rekursive Scanner gruppiert je Gerät das Geräte-JSON mit `DeviceDescription.xml` und `FeatureMapping.xml`. Das Ergebnis lautet zum Beispiel **3 Geräteprofile gefunden**. Unvollständige Sätze und doppelte Profil-IDs werden separat genannt und müssen im Ordner korrigiert werden.
95
+ 5. Für jedes vollständige Geräteprofil erscheint eine eigene Karte. Dort genau einen Host bzw. eine IP eintragen. Fehlende, formal falsche, öffentliche und nicht lokale Ziele werden markiert. **Verbindungsart: Auto (empfohlen)** beibehalten; Auto respektiert zuerst die deklarierte AES-/TLS-/PSK-Art des Profils und verwendet das IV nur als Fallback.
96
+ 6. In jeder Gerätekarte **Verbindung testen** anklicken. Der Test verwendet auch vor **Fertig/Deployen** immer die gerade sichtbare Host/IP und Verbindungsart. Er zeigt einzeln IP-Erreichbarkeit, Profil, Transport, WebSocket, Session, Services und Read-only-Daten. Abgelehnte Protokollressourcen nennen Aktion, Version und Gerätecode; Netzwerkfehler bleiben davon getrennt. Es wird nie ein Schreibzugriff gesendet.
97
+ 7. **Fertig → Deployen**. Die Oberfläche serialisiert `localDeviceMappings` bei jeder Kartenänderung und nochmals beim Speichern. Dadurch bleiben genau diese Zuordnungen nach dem Deploy erhalten; kein Mapping-JSON selbst schreiben.
98
+ 8. Im Read-Node nur das konfigurierte Gerät und die Lese-Ressource auswählen. Im Events-Node ein Gerät oder **Alle konfigurierten Geräte** auswählen. Beide Nodes besitzen kein eigenes Host-/IP-Feld.
99
+ 9. Kein Write-Node für lokale Zugriffe verwenden: `LOCAL_READ_ONLY` weist jeden Schreibversuch vor lokalem Netzwerkzugriff ab.
100
+
101
+ Unter **Erweitert** ist **Profil-JSON manuell einfügen (optional)** nur ein Ausweichweg. Entweder Ordner oder manuelles JSON verwenden. Bei gesetztem Ordner ist der manuelle Editor standardmäßig eingeklappt/deaktiviert und wird ignoriert. Eine Schaltfläche erzeugt das optionale Credential-JSON aus erkannten Profilen und fertigen Zuordnungen; niemand muss Platzhalter, Beispielschlüssel oder Mapping-JSON von Hand schreiben. Dort kann außerdem zeitweise der sichere Protokoll-Mitschnitt aktiviert werden: ohne Pfad nur als begrenzte Testanzeige, mit absolutem Pfad unter POSIX als JSONL `0600`; sensible Felder werden entfernt. Unter Windows den Pfad per NTFS-ACL auf das Dienstkonto beschränken, weil POSIX-Rechte dort nicht zuverlässig sind.
102
+
103
+ Die Runtime verbindet nur private/link-lokale Ziele über `ws://host:80/homeconnect` (AES/HMAC) oder `wss://host:443/homeconnect` (TLS-PSK). PSK/IV werden nie ausgegeben. Vollständige Einrichtung, Docker, Protokollgrenze und Fehlerbehebung: **[Lokale-LAN-Anleitung](docs/LOCAL-LAN.de.md)**.
104
+
105
+ Geräteauswahlen verwenden kompakte Bezeichnungen wie `Dishwasher — Geschirrspüler — Siemens SX678X36TE — …4576`. Das gekürzte Ende dient nur der Anzeige; Flow und Runtime verwenden weiterhin die vollständige, unveränderte technische ID.
106
+
107
+ ### C. Eigene Application im Developer Portal anlegen
108
+
109
+ 1. Beim [Home Connect Developer Portal](https://developer.home-connect.com/) anmelden.
110
+ 2. Eine **eigene Application** erstellen.
111
+ 3. **Authorization Code Grant Flow** auswählen.
112
+ 4. Ein Client Secret erzeugen.
113
+ 5. **PKCE deaktiviert lassen**, weil diese Paketvariante keine PKCE-Parameter sendet.
114
+ 6. Die später in Node-RED verwendete Redirect URI registrieren.
115
+ 7. Client ID und Client Secret sicher aufbewahren.
116
+
117
+ Client ID und Client Secret stammen **nicht** aus der Home-Connect-App auf dem Smartphone.
118
+
119
+ ### D. Die richtige Redirect URI festlegen
120
+
121
+ Schema:
122
+
123
+ ```text
124
+ https://<vom-browser-erreichbarer-node-red-host>:<port>/home-connect/oauth/callback
125
+ ```
126
+
127
+ Beispiel mit rein fiktivem Hostnamen:
128
+
129
+ ```text
130
+ https://nodered.example.net/home-connect/oauth/callback
131
+ ```
132
+
133
+ Die Zeichenfolge muss auf beiden Seiten identisch sein:
134
+
135
+ - gleiches `http` oder `https`
136
+ - gleicher Hostname
137
+ - gleicher Port
138
+ - Pfad endet exakt auf `/home-connect/oauth/callback`
139
+ - **kein** Slash am Ende
140
+
141
+ **Wichtig zu localhost:** `localhost` bezeichnet immer den Rechner, auf dem der Browser läuft. Es funktioniert daher nur, wenn Browser und Node-RED auf demselben Rechner laufen. Bei Node-RED auf NAS, Raspberry Pi, Server oder Container einen vom Browser erreichbaren Hostnamen bzw. eine erreichbare IP-Adresse verwenden.
142
+
143
+ ### E. Cloud-Verbindung in Node-RED anlegen
144
+
145
+ 1. Einen Home-Connect-Node auf die Arbeitsfläche ziehen.
146
+ 2. Bei **Verbindung** eine neue `home-connect-config` anlegen.
147
+ 3. Eindeutigen Namen verwenden, zum Beispiel `Home Connect Production – Zuhause`. Eine Production-Verbindung nicht `Simulator` nennen.
148
+ 4. Umgebung auswählen.
149
+ 5. Client ID, Client Secret und die exakte Redirect URI eintragen.
150
+ 6. Mit möglichst kleinen Scopes starten.
151
+ 7. Das lokale Budget zunächst bei **900 API-Aufrufen pro 24 Stunden** und den Mindestabstand bei **250 ms** belassen.
152
+ 8. Zunächst **Schreibzugriff erlauben** ausgeschaltet lassen.
153
+ 9. **Fertig** klicken.
154
+ 10. **Deployen**.
155
+ 11. Die Verbindung erneut öffnen. Erst jetzt ist **Autorisieren** aktiv.
156
+ 12. **Autorisieren** anklicken, bei Home Connect anmelden und den Zugriff bestätigen.
157
+ 13. Erfolgreich ist der Vorgang, wenn im Browser **Home Connect authorized** erscheint.
158
+ 14. Fenster schließen, in Node-RED **Test** anklicken. Danach werden Geräte in den Geräteauswahlen automatisch angeboten.
159
+
160
+ ## Scopes verständlich erklärt
161
+
162
+ `IdentifyAppliance` wird für die Geräteliste benötigt. Weitere Rechte möglichst gerätespezifisch vergeben.
163
+
164
+ | Zweck | Beispiel |
165
+ |---|---|
166
+ | Nur Geräte erkennen | `IdentifyAppliance` |
167
+ | Geschirrspüler, Waschmaschine und Backofen beobachten | `IdentifyAppliance Dishwasher-Monitor Washer-Monitor Oven-Monitor` |
168
+ | Dashboard lesen und steuern | `IdentifyAppliance Dishwasher-Monitor Dishwasher-Control Dishwasher-Settings Washer-Monitor Washer-Control Washer-Settings Oven-Monitor Oven-Control Oven-Settings` |
169
+
170
+ Der allgemeine Scope `Monitor` reicht je nach Application/Konto nicht immer aus. Nach jeder Scope-Änderung muss neu autorisiert werden, damit ein neuer Refresh Token mit den neuen Rechten gespeichert wird.
171
+
172
+ ## Normiertes Health-/Warning-Modell
173
+
174
+ Alle Discover-, Read-, Event-, Write- und Fehlerausgaben enthalten `msg.health`, `msg.warnings` und dieselben Angaben unter `msg.homeConnect`. Snapshots und Discovery-Einträge tragen zusätzlich `payload.health`, `payload.warnings`, `payload.healthSchema` und `payload.healthAt`. Dashboard-Flows müssen deshalb Home-Connect-Enums nicht selbst bewerten.
175
+
176
+ ```js
177
+ msg.health = 'action_required';
178
+ msg.warnings = [{
179
+ source: 'status',
180
+ code: 'HC_OPERATION_ACTION_REQUIRED',
181
+ severity: 'critical',
182
+ text: {
183
+ de: 'Das Gerät benötigt eine Aktion vor Ort.',
184
+ en: 'The appliance requires an action on site.'
185
+ },
186
+ transient: false
187
+ }];
188
+ ```
189
+
190
+ Das Modell berücksichtigt insbesondere `OperationState`, `DoorState`, `RemoteControlActive`, `RemoteControlStartAllowed`, `LocalControlActive`, Geräte-/SSE-Verbindung, Event-`level` und `handling`, OAuth-Zustände, API-Fehler und Rate Limits. Kurzlebige Meldungen wie `Finished`, normale Geräte-Events und `CONNECTED` werden dedupliziert und laufen automatisch ab. `DISCONNECTED`/offline bleibt bestehen, bis ein Verbindungs- oder Snapshot-Signal die Erholung bestätigt. Rohwerte bleiben erhalten, damit neue Enums nicht verloren gehen.
191
+
192
+ ## Enthaltene Nodes
193
+
194
+ | Node | Aufgabe |
195
+ |---|---|
196
+ | **Home Connect API** | gemeinsame lokale Read-only- oder Cloud-OAuth-Konfiguration, Scopes und Cloud-Schreibfreigabe |
197
+ | **Home Connect discover** | eigene Geräte und Capabilities dynamisch laden |
198
+ | **Home Connect read** | Status, Einstellungen, Programme, Optionen, Bilder und unterstützte Map-Ressourcen lesen |
199
+ | **Home Connect events** | lokale WebSocket- oder Cloud-SSE-Events für alle oder ein Gerät empfangen |
200
+ | **Home Connect write** | Cloud-Programme, -Einstellungen und -Befehle abgesichert senden; lokal immer gesperrt |
201
+
202
+ Jeder Funktions-Node hat zwei Ausgänge: **Daten/Ergebnis/Event** und **strukturierter Fehler**.
203
+
204
+ ## Beispiel-Flows
205
+
206
+ Unter **Import → Beispiele → node-red-contrib-home-connect**:
207
+
208
+ | Datei | Inhalt |
209
+ |---|---|
210
+ | `01-first-steps-device-list.json` | einfachster Einstieg: integrierter Simulator und Geräteliste |
211
+ | `02-events.json` | gemeinsamer Event-Stream, Filterung und Debug-Ausgabe |
212
+ | `03-safe-read-write.json` | Snapshot lesen und einen Schreibvorgang nur als Dry-Run prüfen |
213
+ | `04-local-read-only.json` | anonymisierter lokaler Discover-/Read-/Events-Flow ohne Write-Node |
214
+ | `dashboard-dishwasher-washer-oven.json` | Dashboard 2.0: automatische/gespeicherte DE/EN-Anzeige, initialer Snapshot, lokale/Cloud-Event-Zusammenführung, letzter bekannter Zustand, Offline/Reconnect, Übersicht und Detailkarten |
215
+ | `dashboard-screenshot-simulated.json` | zugangsdatenfreie, deterministische Screenshot-Demo mit drei klar als simuliert markierten Geräten; nur Node-RED Dashboard 2 wird benötigt |
216
+ | `demo-home-connect-flowfuse-1.34.1-scriptless.json` | isolierter Demo-Flow mit skriptfreien Templates für FlowFuse Dashboard 1.34.1; deterministisch sowie ohne Zugangsdaten und Netzwerkzugriff |
217
+
218
+ Für das Dashboard wird zusätzlich `@flowfuse/node-red-dashboard` benötigt:
219
+
220
+ ```bash
221
+ cd ~/.node-red
222
+ npm install @flowfuse/node-red-dashboard
223
+ ```
224
+
225
+ Die Beispiele laufen zuerst mit dem integrierten Simulator. Für reale Geräte entweder eine lokale Read-only-Verbindung oder eine autorisierte Production-Cloud-Verbindung verwenden, Geräteliste laden und die Verbindung in den Home-Connect-Nodes austauschen. Der gemeinsame Reducer verarbeitet vollständige Snapshots und partielle `STATUS`-/`NOTIFY`-Events, ohne nicht enthaltene Felder zu löschen. Bei Offline bleibt der letzte bekannte Zustand sichtbar; nach Reconnect laufen Aktualisierungen automatisch weiter. Bei `readOnly` sind Bedienelemente deaktiviert; Cloud-Write-Nodes zunächst im Dry-Run lassen. Technische Schlüssel bleiben intern unverändert; nur die Benutzeranzeige wird lokalisiert. Hinweise zur Sprachwahl und zum Screenshot-Flow stehen in der [Dashboard-Anleitung](docs/DASHBOARD.de.md).
226
+
227
+ ## Dokumentations-Screenshots
228
+
229
+ Die Release-Dokumentation verwendet ausschließlich die isolierte simulierte Demo und enthält zwei geprüfte Aufnahmen:
230
+
231
+ ![Englische Home-Connect-Demoübersicht](docs/images/dashboard-overview-en.png)
232
+
233
+ ![Englische Home-Connect-Demodetails](docs/images/dashboard-details-en.png)
234
+
235
+ Beide geprüften Bilder verwenden die englische Oberfläche und zeigen ausschließlich `SIMULATED`-Demo-Daten. `npm run release:check` verhindert die Veröffentlichung, wenn eine Datei fehlt, strukturell ungültig ist oder vom geprüften, durch den Benutzer bereitgestellten PNG abweicht. Die abgeschlossene Sichtprüfung fand keine Browserprofile, Hostnamen, Adressen, Kontonamen, echten Gerätekennungen, Tokens, QR-Codes, Profile oder fremden Tabs/Fenster.
236
+
237
+ ## Geräteinformationen und Firmware – wichtige Grenze
238
+
239
+ Die öffentlich dokumentierte Home-Connect-API liefert Geräteinformationen wie Name, Marke, Gerätetyp, `vib`/E-Nummer und Verbindungsstatus, soweit das jeweilige Gerät bzw. Konto sie bereitstellt. Diese Werte werden in Discovery und im Dashboard sinnvoll angezeigt.
240
+
241
+ **Firmwareversion, Firmwarehistorie und Firmwareupdate gehören nicht zur öffentlich dokumentierten API.** Dieses Paket zeigt keine erfundene Firmwarefunktion, verwendet keine undokumentierten Firmware-Endpunkte und versucht nicht, Updates auszulösen. Firmware und Updates ausschließlich über die offiziellen Hersteller-/Home-Connect-Wege prüfen.
242
+
243
+ ## Troubleshooting / FAQ
244
+
245
+ ### `CONFIG_NOT_FOUND` beim Start der Autorisierung
246
+
247
+ Die Schaltfläche bzw. ein alter Flow verweist auf eine Config-Node, die nicht in der laufenden Runtime existiert. Häufig wurde ein Beispiel-/Simulator-Flow kopiert oder noch nicht deployt.
248
+
249
+ **Lösung:** richtige Verbindung auswählen → **Fertig** → **Deployen** → Verbindung erneut öffnen → neue Autorisierung starten. Keine alte Browser-Registerkarte weiterverwenden.
250
+
251
+ ### Name und Umgebung passen nicht zusammen
252
+
253
+ Ein Name wie `Simulator` bei ausgewählter Production-Umgebung ist technisch möglich, führt aber leicht zur falschen Verbindung. Die Oberfläche warnt jetzt davor. Eindeutig umbenennen und erneut deployen.
254
+
255
+ ### Nach dem Login erscheint `ERR_EMPTY_RESPONSE` oder „Verbindung fehlgeschlagen“ auf localhost
256
+
257
+ Der Browser wurde zu `localhost` zurückgeschickt, Node-RED läuft aber auf einem anderen Rechner. Die Redirect URI im Developer Portal und in Node-RED auf einen vom Browser erreichbaren Node-RED-Host ändern, exakt abgleichen, deployen und OAuth neu beginnen.
258
+
259
+ ### `unauthorized_client` / `client or redirection URI not authorized`
260
+
261
+ Meist stimmt die Redirect URI nicht exakt überein. Protokoll, Host, Port, Pfad und abschließenden Slash prüfen. Außerdem sicherstellen, dass in der Developer-Portal-Application PKCE deaktiviert ist. Diese Build-Variante sendet keine PKCE-Parameter.
262
+
263
+ ### Nach dem Paketupdate läuft weiterhin alter Code
264
+
265
+ Node-RED lädt Runtime-Code nur beim Start. Alte Installation entfernen, neues TGZ mit `--force` installieren, Node-RED bzw. Container vollständig neu starten und Browser hart neu laden. Build-Info prüfen. Danach OAuth komplett neu starten; alte Auth-URLs und einmalige Codes sind ungültig.
266
+
267
+ ### `No refresh token is stored. Complete OAuth authorization first.`
268
+
269
+ OAuth wurde nicht erfolgreich abgeschlossen. Autorisierung neu starten und warten, bis **Home Connect authorized** angezeigt wird. Erst danach `Test`, Discover, Read oder Events verwenden.
270
+
271
+ ### `insufficient_scope`
272
+
273
+ Der gespeicherte Token besitzt nicht die benötigten Rechte. `IdentifyAppliance` plus passende gerätespezifische Scopes eintragen, speichern, deployen und neu autorisieren. Nur den Text im Scope-Feld zu ändern aktualisiert einen vorhandenen Token nicht.
274
+
275
+ ### Events-Node bleibt auf `reconnecting`
276
+
277
+ Meist fehlen Autorisierung oder Event-/Monitor-Scopes. Zuerst mit **Test** bzw. dem Gerätelisten-Beispiel prüfen, ob Geräte geladen werden. Fehlerausgang des Events-Nodes ansehen, Scopes korrigieren und neu autorisieren. Wegen API-Grenzen möglichst nur einen Stream für alle Geräte verwenden.
278
+
279
+ ### `health`, `warnings` und Rate Limit
280
+
281
+ `health` ist die verdichtete Bewertung; `warnings` enthält stabile Codes und deutsche/englische Texte. Der Konfigurations-Node begrenzt standardmäßig auf **900 API-Aufrufversuche in jedem rollierenden 24-Stunden-Fenster** und lässt damit 100 Aufrufe Reserve zum Anbieterlimit von 1000. Zulässig sind 1 bis 1000; für gemeinsam verwendete Client IDs gilt innerhalb dieses Node-RED-Prozesses die strengste aktive Konfiguration. REST-Aufrufe, Wiederholungen und SSE-Verbindungsversuche zählen jeweils einzeln. Der Zähler wird unter dem Node-RED-`userDir` in `.home-connect` persistiert und über Deploys/Neustarts hinweg weitergeführt.
282
+
283
+ Ist das lokale Budget erschöpft, wird **vor dem Netzwerkzugriff** ein strukturierter Fehler `LOCAL_RATE_LIMITED` mit `retryAfter` und `resetAt` ausgegeben. Meldet Home Connect HTTP 429, wird auch eine im Fehlertext enthaltene Restdauer wie `75502 seconds` erkannt, persistent gespeichert und als Circuit Breaker verwendet; währenddessen sendet dieses Paket keine weiteren Home-Connect-API-Aufrufe. Eine 429-Antwort wird nicht automatisch wiederholt. Andere Hosts oder Programme mit derselben Home-Connect-Application können nicht koordiniert werden; deshalb die Reserve nicht ohne Grund auf 1000 erhöhen und nur einen Config-Node pro Client ID verwenden.
284
+
285
+ Bei `HC_API_RATE_LIMITED` Polling reduzieren und `retryAfter` beachten. Bei `HC_OAUTH_INSUFFICIENT_SCOPE` oder `HC_OAUTH_AUTHORIZATION_EXPIRED` Scopes bzw. Autorisierung korrigieren und anschließend neu autorisieren. Das Dashboard deaktiviert Startaktionen bei offline, Fehler, notwendiger Aktion oder blockierter Fernsteuerung.
286
+
287
+ ### Woran erkenne ich Erfolg?
288
+
289
+ Der Callback zeigt **Home Connect authorized**. Danach meldet **Test** die Anzahl der Geräte, und **Geräte laden** befüllt die Auswahl automatisch.
290
+
291
+ Die ausführliche Entscheidungshilfe steht in [Troubleshooting (DE)](docs/TROUBLESHOOTING.de.md).
292
+
293
+ ## Sicherheit
294
+
295
+ - In `settings.js` ein starkes `credentialSecret` setzen, bevor Credentials gespeichert werden.
296
+ - Editor, Dashboard und Callback per HTTPS und Authentifizierung schützen.
297
+ - Client Secret, Tokens, echte Hostnamen, Geräte-IDs und OAuth-Codes nie in Issues oder Screenshots veröffentlichen.
298
+ - Bei offengelegtem Secret dieses sofort im Developer Portal regenerieren und neu autorisieren.
299
+ - Nur minimale Scopes anfordern.
300
+ - `allowWrite` standardmäßig auslassen; neue Schreibaktionen erst mit Dry-Run prüfen.
301
+ - Für Schreib-Nodes eigenes Bestätigungstoken und Gerätetyp-Allowlist verwenden.
302
+ - Herstellerhinweise und Home-Connect-Bedingungen beachten.
303
+
304
+ Mehr: [SECURITY.md](SECURITY.md).
305
+
306
+ ## Entwicklung und Prüfung
307
+
308
+ ```bash
309
+ npm run validate
310
+ ```
311
+
312
+ Die Prüfung umfasst Syntax, JSON/Flow-Dateien, Unit- und Simulator-Integrationstests sowie `npm pack --dry-run`. GitHub Actions testet mit Node.js 18, 20 und 22.
313
+
314
+ ## Weitere Dokumentation
315
+
316
+ - [Troubleshooting (DE)](docs/TROUBLESHOOTING.de.md)
317
+ - [Architektur](docs/ARCHITECTURE.md)
318
+ - [Message API](docs/MESSAGE-API.md)
319
+ - [API-Abdeckung](docs/API-COVERAGE.md)
320
+ - [Dashboard (DE)](docs/DASHBOARD.de.md)
321
+ - [Beitragen](CONTRIBUTING.md)
322
+ - [Changelog](CHANGELOG.md)
323
+
324
+ ## Lizenz
325
+
326
+ MIT, siehe [LICENSE](LICENSE) und [NOTICE](NOTICE).