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

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 (55) hide show
  1. package/BUILD-INFO.json +23 -0
  2. package/CHANGELOG.md +53 -0
  3. package/LICENSE +21 -0
  4. package/NOTICE +19 -0
  5. package/README.de.md +344 -0
  6. package/README.md +343 -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/GITHUB-UPDATE.md +76 -0
  14. package/docs/LOCAL-LAN.de.md +150 -0
  15. package/docs/LOCAL-LAN.md +150 -0
  16. package/docs/MESSAGE-API.md +111 -0
  17. package/docs/RELEASE.md +91 -0
  18. package/docs/TROUBLESHOOTING.de.md +230 -0
  19. package/docs/TROUBLESHOOTING.md +230 -0
  20. package/docs/images/README.md +10 -0
  21. package/docs/images/dashboard-details-en.png +0 -0
  22. package/docs/images/dashboard-overview-en.png +0 -0
  23. package/docs/official-api-contract.json +418 -0
  24. package/examples/01-first-steps-device-list.json +148 -0
  25. package/examples/02-events.json +165 -0
  26. package/examples/03-safe-read-write.json +155 -0
  27. package/examples/04-local-read-only.json +214 -0
  28. package/examples/README.de.md +62 -0
  29. package/examples/README.md +62 -0
  30. package/examples/dashboard-dishwasher-washer-oven.json +628 -0
  31. package/examples/dashboard-screenshot-simulated.json +405 -0
  32. package/examples/demo-home-connect-flowfuse-1.34.1-scriptless.json +390 -0
  33. package/lib/client.js +600 -0
  34. package/lib/constants.js +66 -0
  35. package/lib/dashboard-i18n.js +255 -0
  36. package/lib/device-label.js +39 -0
  37. package/lib/errors.js +51 -0
  38. package/lib/health.js +525 -0
  39. package/lib/local-client.js +1014 -0
  40. package/lib/local-crypto.js +122 -0
  41. package/lib/local-diagnostics.js +115 -0
  42. package/lib/local-profile.js +706 -0
  43. package/lib/local-trace.js +103 -0
  44. package/lib/oauth.js +23 -0
  45. package/lib/rate-limiter.js +186 -0
  46. package/lib/simulator.js +290 -0
  47. package/lib/sse.js +58 -0
  48. package/lib/validation.js +194 -0
  49. package/lib/websocket-transport.js +374 -0
  50. package/nodes/home-connect.html +795 -0
  51. package/nodes/home-connect.js +699 -0
  52. package/nodes/locales/de/home-connect.html +19 -0
  53. package/nodes/locales/de/home-connect.json +10 -0
  54. package/nodes/locales/en-US/home-connect.json +10 -0
  55. package/package.json +76 -4
@@ -0,0 +1,148 @@
1
+ [
2
+ {
3
+ "id": "hc-list-flow",
4
+ "type": "tab",
5
+ "label": "Home Connect 01 – Geräteliste",
6
+ "disabled": false,
7
+ "info": "Einfachster Start: lokale Testgeräte automatisch erkennen. Keine Zugangsdaten erforderlich."
8
+ },
9
+ {
10
+ "id": "hc-list-note",
11
+ "type": "comment",
12
+ "z": "hc-list-flow",
13
+ "name": "1. Deployen 2. Knopf links klicken 3. Debug-Fenster öffnen",
14
+ "info": "Der integrierte Simulator führt keine externen Zugriffe aus. Für Production später eine eigene deployte und autorisierte Verbindung auswählen. Outputs include health/warnings (home-connect-health/v1). No firmware data or undocumented endpoint is used.",
15
+ "x": 310,
16
+ "y": 40,
17
+ "wires": []
18
+ },
19
+ {
20
+ "id": "hc-list-config",
21
+ "type": "home-connect-config",
22
+ "name": "Home Connect – integrierter Simulator",
23
+ "environment": "builtin-simulator",
24
+ "redirectUri": "http://localhost:1880/home-connect/oauth/callback",
25
+ "scope": "IdentifyAppliance",
26
+ "language": "de-DE",
27
+ "allowWrite": false,
28
+ "requestTimeout": 15000,
29
+ "maxRequestsPerDay": 900,
30
+ "minimumRequestInterval": 250
31
+ },
32
+ {
33
+ "id": "hc-list-inject",
34
+ "type": "inject",
35
+ "z": "hc-list-flow",
36
+ "name": "Geräteliste laden",
37
+ "props": [
38
+ {
39
+ "p": "payload"
40
+ }
41
+ ],
42
+ "repeat": "",
43
+ "crontab": "",
44
+ "once": true,
45
+ "onceDelay": 1,
46
+ "topic": "",
47
+ "payload": "",
48
+ "payloadType": "date",
49
+ "x": 140,
50
+ "y": 100,
51
+ "wires": [
52
+ [
53
+ "hc-list-discover"
54
+ ]
55
+ ]
56
+ },
57
+ {
58
+ "id": "hc-list-discover",
59
+ "type": "home-connect-discover",
60
+ "z": "hc-list-flow",
61
+ "name": "Alle Geräte erkennen",
62
+ "connection": "hc-list-config",
63
+ "mode": "all",
64
+ "haId": "",
65
+ "x": 370,
66
+ "y": 100,
67
+ "wires": [
68
+ [
69
+ "hc-list-summary",
70
+ "hc-list-debug-raw"
71
+ ],
72
+ [
73
+ "hc-list-debug-error"
74
+ ]
75
+ ]
76
+ },
77
+ {
78
+ "id": "hc-list-summary",
79
+ "type": "function",
80
+ "z": "hc-list-flow",
81
+ "name": "Einfache Geräteliste",
82
+ "func": "msg.payload=(msg.payload||[]).map(entry=>({name:entry.appliance?.name,brand:entry.appliance?.brand,type:entry.appliance?.type,vib:entry.appliance?.vib,connected:entry.appliance?.connected,health:entry.health,warnings:entry.warnings,haId:entry.appliance?.haId}));\nreturn msg;",
83
+ "outputs": 1,
84
+ "timeout": 0,
85
+ "noerr": 0,
86
+ "initialize": "",
87
+ "finalize": "",
88
+ "libs": [],
89
+ "x": 610,
90
+ "y": 80,
91
+ "wires": [
92
+ [
93
+ "hc-list-debug-simple"
94
+ ]
95
+ ]
96
+ },
97
+ {
98
+ "id": "hc-list-debug-simple",
99
+ "type": "debug",
100
+ "z": "hc-list-flow",
101
+ "name": "Geräteliste (einfach)",
102
+ "active": true,
103
+ "tosidebar": true,
104
+ "console": false,
105
+ "tostatus": false,
106
+ "complete": "payload",
107
+ "targetType": "msg",
108
+ "statusVal": "",
109
+ "statusType": "auto",
110
+ "x": 870,
111
+ "y": 80,
112
+ "wires": []
113
+ },
114
+ {
115
+ "id": "hc-list-debug-raw",
116
+ "type": "debug",
117
+ "z": "hc-list-flow",
118
+ "name": "Vollständige Capabilities",
119
+ "active": false,
120
+ "tosidebar": true,
121
+ "console": false,
122
+ "tostatus": false,
123
+ "complete": "payload",
124
+ "targetType": "msg",
125
+ "statusVal": "",
126
+ "statusType": "auto",
127
+ "x": 630,
128
+ "y": 130,
129
+ "wires": []
130
+ },
131
+ {
132
+ "id": "hc-list-debug-error",
133
+ "type": "debug",
134
+ "z": "hc-list-flow",
135
+ "name": "Fehler",
136
+ "active": true,
137
+ "tosidebar": true,
138
+ "console": false,
139
+ "tostatus": false,
140
+ "complete": "payload",
141
+ "targetType": "msg",
142
+ "statusVal": "",
143
+ "statusType": "auto",
144
+ "x": 610,
145
+ "y": 180,
146
+ "wires": []
147
+ }
148
+ ]
@@ -0,0 +1,165 @@
1
+ [
2
+ {
3
+ "id": "hc-events-flow",
4
+ "type": "tab",
5
+ "label": "Home Connect 02 – Events",
6
+ "disabled": false,
7
+ "info": "Ein gemeinsamer Event-Stream für alle Geräte. Output 2 zeigt die eigentliche Ursache eines Reconnects."
8
+ },
9
+ {
10
+ "id": "hc-events-note",
11
+ "type": "comment",
12
+ "z": "hc-events-flow",
13
+ "name": "Ein Stream für alle Geräte • Fehlerausgang immer mit Debug verbinden",
14
+ "info": "Production: zuerst Test/Geräteliste reparieren. Fehlen Auth oder Monitor-Scopes, zeigt der Node reconnecting. Outputs include health/warnings (home-connect-health/v1). No firmware data or undocumented endpoint is used.",
15
+ "x": 330,
16
+ "y": 40,
17
+ "wires": []
18
+ },
19
+ {
20
+ "id": "hc-events-config",
21
+ "type": "home-connect-config",
22
+ "name": "Home Connect – integrierter Simulator",
23
+ "environment": "builtin-simulator",
24
+ "redirectUri": "http://localhost:1880/home-connect/oauth/callback",
25
+ "scope": "IdentifyAppliance",
26
+ "language": "de-DE",
27
+ "allowWrite": false,
28
+ "requestTimeout": 15000,
29
+ "maxRequestsPerDay": 900,
30
+ "minimumRequestInterval": 250
31
+ },
32
+ {
33
+ "id": "hc-events-node",
34
+ "type": "home-connect-events",
35
+ "z": "hc-events-flow",
36
+ "name": "Events aller Geräte",
37
+ "connection": "hc-events-config",
38
+ "haId": "*",
39
+ "x": 170,
40
+ "y": 110,
41
+ "wires": [
42
+ [
43
+ "hc-events-type",
44
+ "hc-events-debug-all"
45
+ ],
46
+ [
47
+ "hc-events-debug-error"
48
+ ]
49
+ ]
50
+ },
51
+ {
52
+ "id": "hc-events-type",
53
+ "type": "switch",
54
+ "z": "hc-events-flow",
55
+ "name": "Eventtyp",
56
+ "property": "topic",
57
+ "propertyType": "msg",
58
+ "rules": [
59
+ {
60
+ "t": "eq",
61
+ "v": "STATUS",
62
+ "vt": "str"
63
+ },
64
+ {
65
+ "t": "eq",
66
+ "v": "EVENT",
67
+ "vt": "str"
68
+ },
69
+ {
70
+ "t": "else"
71
+ }
72
+ ],
73
+ "checkall": "true",
74
+ "repair": false,
75
+ "outputs": 3,
76
+ "x": 390,
77
+ "y": 100,
78
+ "wires": [
79
+ [
80
+ "hc-events-debug-status"
81
+ ],
82
+ [
83
+ "hc-events-debug-event"
84
+ ],
85
+ [
86
+ "hc-events-debug-other"
87
+ ]
88
+ ]
89
+ },
90
+ {
91
+ "id": "hc-events-debug-status",
92
+ "type": "debug",
93
+ "z": "hc-events-flow",
94
+ "name": "STATUS",
95
+ "active": true,
96
+ "tosidebar": true,
97
+ "console": false,
98
+ "tostatus": false,
99
+ "complete": "payload",
100
+ "targetType": "msg",
101
+ "x": 620,
102
+ "y": 70,
103
+ "wires": []
104
+ },
105
+ {
106
+ "id": "hc-events-debug-event",
107
+ "type": "debug",
108
+ "z": "hc-events-flow",
109
+ "name": "EVENT",
110
+ "active": true,
111
+ "tosidebar": true,
112
+ "console": false,
113
+ "tostatus": false,
114
+ "complete": "payload",
115
+ "targetType": "msg",
116
+ "x": 620,
117
+ "y": 110,
118
+ "wires": []
119
+ },
120
+ {
121
+ "id": "hc-events-debug-other",
122
+ "type": "debug",
123
+ "z": "hc-events-flow",
124
+ "name": "Weitere Events",
125
+ "active": true,
126
+ "tosidebar": true,
127
+ "console": false,
128
+ "tostatus": false,
129
+ "complete": "payload",
130
+ "targetType": "msg",
131
+ "x": 640,
132
+ "y": 150,
133
+ "wires": []
134
+ },
135
+ {
136
+ "id": "hc-events-debug-all",
137
+ "type": "debug",
138
+ "z": "hc-events-flow",
139
+ "name": "Alle Events (optional)",
140
+ "active": false,
141
+ "tosidebar": true,
142
+ "console": false,
143
+ "tostatus": false,
144
+ "complete": "true",
145
+ "targetType": "full",
146
+ "x": 410,
147
+ "y": 180,
148
+ "wires": []
149
+ },
150
+ {
151
+ "id": "hc-events-debug-error",
152
+ "type": "debug",
153
+ "z": "hc-events-flow",
154
+ "name": "Reconnect-Ursache / Fehler",
155
+ "active": true,
156
+ "tosidebar": true,
157
+ "console": false,
158
+ "tostatus": false,
159
+ "complete": "payload",
160
+ "targetType": "msg",
161
+ "x": 430,
162
+ "y": 230,
163
+ "wires": []
164
+ }
165
+ ]
@@ -0,0 +1,155 @@
1
+ [
2
+ {
3
+ "id": "hc-safe-flow",
4
+ "type": "tab",
5
+ "label": "Home Connect 03 – Sicher lesen/schreiben",
6
+ "disabled": false,
7
+ "info": "Snapshot lesen und einen Start ausschließlich als Dry-Run validieren."
8
+ },
9
+ {
10
+ "id": "hc-safe-note",
11
+ "type": "comment",
12
+ "z": "hc-safe-flow",
13
+ "name": "Dry-Run sendet nichts • Simulator-ID ist kein echtes Gerät",
14
+ "info": "Für Production zuerst eigene Geräte entdecken und die erkannte haId auswählen. Dry-Run erst nach Prüfung bewusst deaktivieren. Outputs include health/warnings (home-connect-health/v1). No firmware data or undocumented endpoint is used.",
15
+ "x": 320,
16
+ "y": 40,
17
+ "wires": []
18
+ },
19
+ {
20
+ "id": "hc-safe-config",
21
+ "type": "home-connect-config",
22
+ "name": "Home Connect – integrierter Simulator",
23
+ "environment": "builtin-simulator",
24
+ "redirectUri": "http://localhost:1880/home-connect/oauth/callback",
25
+ "scope": "IdentifyAppliance",
26
+ "language": "de-DE",
27
+ "allowWrite": true,
28
+ "requestTimeout": 15000,
29
+ "maxRequestsPerDay": 900,
30
+ "minimumRequestInterval": 250
31
+ },
32
+ {
33
+ "id": "hc-safe-read-inject",
34
+ "type": "inject",
35
+ "z": "hc-safe-flow",
36
+ "name": "Backofen-Snapshot lesen",
37
+ "props": [
38
+ {
39
+ "p": "payload"
40
+ }
41
+ ],
42
+ "repeat": "",
43
+ "crontab": "",
44
+ "once": false,
45
+ "onceDelay": 0.1,
46
+ "topic": "",
47
+ "payload": "",
48
+ "payloadType": "date",
49
+ "x": 160,
50
+ "y": 100,
51
+ "wires": [
52
+ [
53
+ "hc-safe-read"
54
+ ]
55
+ ]
56
+ },
57
+ {
58
+ "id": "hc-safe-read",
59
+ "type": "home-connect-read",
60
+ "z": "hc-safe-flow",
61
+ "name": "Snapshot",
62
+ "connection": "hc-safe-config",
63
+ "operation": "snapshot",
64
+ "haId": "oven-001",
65
+ "key": "",
66
+ "subKey": "",
67
+ "x": 390,
68
+ "y": 100,
69
+ "wires": [
70
+ [
71
+ "hc-safe-debug-data"
72
+ ],
73
+ [
74
+ "hc-safe-debug-error"
75
+ ]
76
+ ]
77
+ },
78
+ {
79
+ "id": "hc-safe-write-inject",
80
+ "type": "inject",
81
+ "z": "hc-safe-flow",
82
+ "name": "Start nur validieren",
83
+ "props": [
84
+ {
85
+ "p": "payload",
86
+ "v": "{\"action\":\"start-program\",\"program\":\"Cooking.Oven.Program.HeatingMode.HotAir\",\"options\":[{\"key\":\"Cooking.Oven.Option.SetpointTemperature\",\"value\":180}],\"confirm\":\"CONFIRM\"}",
87
+ "vt": "json"
88
+ }
89
+ ],
90
+ "repeat": "",
91
+ "crontab": "",
92
+ "once": false,
93
+ "onceDelay": 0.1,
94
+ "topic": "",
95
+ "x": 150,
96
+ "y": 170,
97
+ "wires": [
98
+ [
99
+ "hc-safe-write"
100
+ ]
101
+ ]
102
+ },
103
+ {
104
+ "id": "hc-safe-write",
105
+ "type": "home-connect-write",
106
+ "z": "hc-safe-flow",
107
+ "name": "Sicherer Dry-Run",
108
+ "connection": "hc-safe-config",
109
+ "action": "from-message",
110
+ "haId": "oven-001",
111
+ "dryRun": true,
112
+ "confirmationMode": "token",
113
+ "allowedApplianceTypes": "Oven",
114
+ "x": 390,
115
+ "y": 170,
116
+ "wires": [
117
+ [
118
+ "hc-safe-debug-data"
119
+ ],
120
+ [
121
+ "hc-safe-debug-error"
122
+ ]
123
+ ]
124
+ },
125
+ {
126
+ "id": "hc-safe-debug-data",
127
+ "type": "debug",
128
+ "z": "hc-safe-flow",
129
+ "name": "Ergebnis",
130
+ "active": true,
131
+ "tosidebar": true,
132
+ "console": false,
133
+ "tostatus": false,
134
+ "complete": "true",
135
+ "targetType": "full",
136
+ "x": 620,
137
+ "y": 110,
138
+ "wires": []
139
+ },
140
+ {
141
+ "id": "hc-safe-debug-error",
142
+ "type": "debug",
143
+ "z": "hc-safe-flow",
144
+ "name": "Fehler",
145
+ "active": true,
146
+ "tosidebar": true,
147
+ "console": false,
148
+ "tostatus": false,
149
+ "complete": "payload",
150
+ "targetType": "msg",
151
+ "x": 620,
152
+ "y": 180,
153
+ "wires": []
154
+ }
155
+ ]
@@ -0,0 +1,214 @@
1
+ [
2
+ {
3
+ "id": "hc-local-tab",
4
+ "type": "tab",
5
+ "label": "04 Local LAN read-only",
6
+ "disabled": false,
7
+ "info": "Anonymized example. BEFORE DEPLOYING: open the Local Home Connect configuration, mount/select the protected Profile Downloader folder, click Scan profiles / Detect devices, enter one private Host/IP per card, leave Auto selected, and click Test connection on every card. The test immediately uses the visible Host/IP and transport; Done serializes them again for Deploy. Read selects the descriptive device label but stores the full technical ID; Events selects one or all configured devices. No local write node is included."
8
+ },
9
+ {
10
+ "id": "hc-local-config",
11
+ "type": "home-connect-config",
12
+ "name": "Home Connect Local – read-only",
13
+ "environment": "local",
14
+ "redirectUri": "http://localhost:1880/home-connect/oauth/callback",
15
+ "scope": "IdentifyAppliance",
16
+ "language": "de-DE",
17
+ "requestTimeout": 15000,
18
+ "maxRequestsPerDay": 900,
19
+ "minimumRequestInterval": 250,
20
+ "localProfilePath": "/data/homeconnect-profiles",
21
+ "allowWrite": false,
22
+ "localDeviceMappings": "[]"
23
+ },
24
+ {
25
+ "id": "hc-local-note",
26
+ "type": "comment",
27
+ "z": "hc-local-tab",
28
+ "name": "ZUERST ÖFFNEN: Ordner → Suchen → IP → Test → Deploy",
29
+ "info": "DE (einfacher Ablauf): 1. Profilordner in den Node-RED-Container nur lesend mounten. 2. Diese Config öffnen und Local LAN (read-only) wählen. 3. Ordnerpfad eintragen. 4. Profile suchen / Geräte erkennen anklicken. 5. In jeder Gerätekarte eine private IP/Host eintragen. 6. Auto (empfohlen) lassen. 7. Je Karte Verbindung testen; der Test verwendet sofort die sichtbaren Werte. 8. Fertig und Deployen; dabei wird die Zuordnung nochmals gespeichert. Danach im Read-Node die verständliche Gerätebezeichnung/Ressource und im Events-Node ein Gerät oder alle wählen. Intern bleibt die vollständige ID erhalten. Profile enthalten PSK/IV und dürfen nicht veröffentlicht werden.\n\nEN: 1. Mount the profile folder read-only inside the Node-RED container. 2. Open this config and select Local LAN (read-only). 3. Enter the folder. 4. Click Scan profiles / Detect devices. 5. Enter a private Host/IP in every card. 6. Leave Auto (recommended). 7. Test every card; the visible values are used immediately. 8. Done and Deploy serializes the mappings again. Read selects the descriptive device label/resource; Events selects one/all while the full ID stays internal. Never publish profile keys.",
30
+ "x": 300,
31
+ "y": 80,
32
+ "wires": []
33
+ },
34
+ {
35
+ "id": "hc-local-inject",
36
+ "type": "inject",
37
+ "z": "hc-local-tab",
38
+ "name": "Lokale Geräte lesen / Read local appliances",
39
+ "props": [
40
+ {
41
+ "p": "payload"
42
+ },
43
+ {
44
+ "p": "topic",
45
+ "vt": "str"
46
+ }
47
+ ],
48
+ "repeat": "",
49
+ "crontab": "",
50
+ "once": false,
51
+ "onceDelay": 0.1,
52
+ "topic": "home-connect/local/discover",
53
+ "payload": "",
54
+ "payloadType": "date",
55
+ "x": 250,
56
+ "y": 150,
57
+ "wires": [
58
+ [
59
+ "hc-local-discover"
60
+ ]
61
+ ]
62
+ },
63
+ {
64
+ "id": "hc-local-discover",
65
+ "type": "home-connect-discover",
66
+ "z": "hc-local-tab",
67
+ "name": "Local discover (read-only)",
68
+ "connection": "hc-local-config",
69
+ "mode": "all",
70
+ "haId": "",
71
+ "x": 540,
72
+ "y": 150,
73
+ "wires": [
74
+ [
75
+ "hc-local-debug"
76
+ ],
77
+ [
78
+ "hc-local-error"
79
+ ]
80
+ ]
81
+ },
82
+ {
83
+ "id": "hc-local-events",
84
+ "type": "home-connect-events",
85
+ "z": "hc-local-tab",
86
+ "name": "Local events (all profiles)",
87
+ "connection": "hc-local-config",
88
+ "haId": "*",
89
+ "x": 250,
90
+ "y": 230,
91
+ "wires": [
92
+ [
93
+ "hc-local-event-debug"
94
+ ],
95
+ [
96
+ "hc-local-error"
97
+ ]
98
+ ]
99
+ },
100
+ {
101
+ "id": "hc-local-debug",
102
+ "type": "debug",
103
+ "z": "hc-local-tab",
104
+ "name": "Local appliance snapshots",
105
+ "active": true,
106
+ "tosidebar": true,
107
+ "console": false,
108
+ "tostatus": false,
109
+ "complete": "true",
110
+ "targetType": "full",
111
+ "statusVal": "",
112
+ "statusType": "auto",
113
+ "x": 800,
114
+ "y": 150,
115
+ "wires": []
116
+ },
117
+ {
118
+ "id": "hc-local-event-debug",
119
+ "type": "debug",
120
+ "z": "hc-local-tab",
121
+ "name": "Local status events",
122
+ "active": true,
123
+ "tosidebar": true,
124
+ "console": false,
125
+ "tostatus": false,
126
+ "complete": "true",
127
+ "targetType": "full",
128
+ "statusVal": "",
129
+ "statusType": "auto",
130
+ "x": 550,
131
+ "y": 230,
132
+ "wires": []
133
+ },
134
+ {
135
+ "id": "hc-local-error",
136
+ "type": "debug",
137
+ "z": "hc-local-tab",
138
+ "name": "Structured local error",
139
+ "active": true,
140
+ "tosidebar": true,
141
+ "console": false,
142
+ "tostatus": false,
143
+ "complete": "true",
144
+ "targetType": "full",
145
+ "statusVal": "",
146
+ "statusType": "auto",
147
+ "x": 810,
148
+ "y": 250,
149
+ "wires": []
150
+ },
151
+ {
152
+ "id": "hc-local-read-inject",
153
+ "type": "inject",
154
+ "z": "hc-local-tab",
155
+ "name": "Read selected local snapshot",
156
+ "props": [
157
+ {
158
+ "p": "payload"
159
+ }
160
+ ],
161
+ "repeat": "",
162
+ "crontab": "",
163
+ "once": false,
164
+ "onceDelay": 0.1,
165
+ "topic": "",
166
+ "payload": "",
167
+ "payloadType": "date",
168
+ "x": 230,
169
+ "y": 310,
170
+ "wires": [
171
+ [
172
+ "hc-local-read"
173
+ ]
174
+ ]
175
+ },
176
+ {
177
+ "id": "hc-local-read",
178
+ "type": "home-connect-read",
179
+ "z": "hc-local-tab",
180
+ "name": "Select detected device + Snapshot",
181
+ "connection": "hc-local-config",
182
+ "operation": "snapshot",
183
+ "haId": "",
184
+ "key": "",
185
+ "subKey": "",
186
+ "x": 530,
187
+ "y": 310,
188
+ "wires": [
189
+ [
190
+ "hc-local-read-debug"
191
+ ],
192
+ [
193
+ "hc-local-error"
194
+ ]
195
+ ]
196
+ },
197
+ {
198
+ "id": "hc-local-read-debug",
199
+ "type": "debug",
200
+ "z": "hc-local-tab",
201
+ "name": "Selected local read",
202
+ "active": true,
203
+ "tosidebar": true,
204
+ "console": false,
205
+ "tostatus": false,
206
+ "complete": "true",
207
+ "targetType": "full",
208
+ "statusVal": "",
209
+ "statusType": "auto",
210
+ "x": 810,
211
+ "y": 310,
212
+ "wires": []
213
+ }
214
+ ]