EDIT 24-2-2025:
@FireSon is bezig met een volledig in HA geïntegreerde versie zodat onderstaande werkwijze niet meer nodig is!Vervallen niet meer nodig!
Aanleiding:
In het Zendure Hyper 2000 topic staan al aardig wat voorbeelden hoe je de Hyper 2000 in Home Assistant[HA] kunt integreren. Echter is dat geen compleet verhaal en niet overzichtelijk.Met dit topic wil ik alle informatie die ik heb verzameld over externe koppelingen en hoe ik deze in Home Assistant heb toegepast, samenbrengen. Zo kan het originele Zendure Hyper 2000-topic zich volledig richten op de Zendure-hardware en de koppeling met de Zendure-app.
De oplossing die ik hier beschrijf, is niet heel eenvoudig; er zijn namelijk behoorlijk wat lagen betrokken. Maar zodra je de koppeling hebt gelegd, kun je de Hyper 2000 volledig aansturen. Ik pretendeer niet dat dit de beste oplossing is, het is voor mijn doel voldoende, maar ik hoop dat anderen mooie aanvullingen of verbeteringen hebben of wie weet betere integraties gevonden hebben.
Bestaande Zendure-koppelingen:
Ik heb twee koppelingen met de Zendure-hardware gevonden, beide oorspronkelijk ontwikkeld voor oudere Zendure-apparaten. Aangezien ze allemaal gebruikmaken van dezelfde Zendure API, zijn ze ook goed toepasbaar voor de Hyper 2000. Het enige wat je moet doen, is de juiste product-id van de Hyper achterhalen. Voor recente Hyper 2000-modellen is dat: gDa3tb de oude key is: ja72U0haHet verschil tussen deze twee koppelingen zit in de keuze om de Zendure-app wel of niet te blijven gebruiken, en of je volledige lokale controle wilt hebben.
De methode die ik hier beschrijf, maakt gebruik van de app. Dit heeft een aantal voordelen:
1. Je behoudt je garantie (wat volgens Zendure een vereiste lijkt te zijn).
2. De app werkt gewoon prettig met alle relevante informatie en aanstuurmogelijkheden.
Het nadeel is wel dat je afhankelijk blijft van de Zendure-cloud. Gelukkig zijn de responstijden van de server tot nu toe prima.
Bij de andere koppeling ga je met behulp van een tijdelijke installatie op bijvoorbeeld een raspberry de verwijzing naar de Zendure MQTT server op de Hyper omleiden naar je eigen lokale MQTT server.
Koppeling in het kort:
Bij deze koppeling maken we gebruik van een integratie die speciaal is geschreven voor ioBroker. Deze integratie logt in op de Zendure Cloud en schrijft alle data weg naar een lokale MQTT-server binnen ioBroker.Vervolgens leggen we vanuit Node-RED, dat gekoppeld is aan je eigen Home Assistant MQTT-server, een bridge naar de MQTT-server van ioBroker. Als laatste maken we gebruik van Node-RED-flows om de aansturing van de Hyper te realiseren.
Daarnaast kunnen we met Home Assistant MQTT-sensoren alle relevante gegevens uit de Zendure API in Home Assistant inlezen. Waaronder alle batterij statussen, energie calculaties en statussen van gekoppelde PV.
Handleiding:
1. ioBroker installeren:
Aangezien we een iobroker omgeving nodig hebben om de Zendure integratie te gebruiken moeten we eerst een versie van iobroker installeren, je hebt daarbij o.a. de keuze uit:- een lxc container in Proxmox aanmaken
- een Docker container aanmaken
- installeren via de cli op Ubuntu
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| version: '2' services: iobroker: image: buanet/iobroker:latest container_name: iobroker hostname: iobroker restart: always ports: - "8081:8081" # Toegang tot de ioBroker UI - "1883:1883" # Toegang tot de ioBroker MQTT-server volumes: - /iobroker:/opt/iobroker environment: - TZ=Europe/Amsterdam |
2. MQTT broker/client adapter installeren in ioBroker:
- ga naar adapters binnen ioBroker en geef in het zoekveld MQTT broker op
- kies voor MQTT broker/client
- klik op de 3 puntjes rechtsboven en klik vervolgens op de + voor installatie
- zorg dat de instellingen overeenkomen met de afbeeldingen hieronder
/f/image/aHd2wfbsIgMV0O9HbNUGzcoS.png?f=fotoalbum_large)
/f/image/X4Uydyz9n6olYYKmlpe6Wspp.png?f=fotoalbum_large)
/f/image/Ea919ajmGI4FAo6g6USNJy5R.png?f=fotoalbum_large)
Onder Instances kun je de geinstalleerde adapters terugvinden en configureren.
3. Zendure adapter installeren in ioBroker:
Om te voorkomen dat je uit de app wordt uitgelogd zodra je deze adapter gebruikt, kun je het beste een nieuw Zendure-account aanmaken in de app met een ander e-mailadres. Vervolgens kun je je Hypers delen(onder Profile, Device Sharing in de app) met dit nieuwe account.Zodra dit is gedaan, kun je met het nieuwe account inloggen bij de Zendure-ioBroker-adapter, terwijl je in de app ingelogd blijft met je oorspronkelijke account.
- ga naar adapters binnen ioBroker en geef in het zoekveld zendure op
- kies voor Zendure Solarflow
- klik op de 3 puntjes rechtsboven en klik vervolgens op de + voor installatie
- kies voor de EU server en geef je Zendure login op
- vink de 3 keuzen aan
/f/image/rV9zCYvxvtjiM2ORmmdki17K.png?f=fotoalbum_large)
4. Bridge maken in node-red tussen de MQTT server van ioBroker en je eigen MQTT server:
Ik heb onder node-red een bridge van de iobroker mqtt server naar mijn eigen HA mqtt server gemaakt, dat is alles wat je nodig hebt vanaf dat moment kun je onder node-red flows maken of vanuit HA automations.Als je nog geen node-red in HA gebruikt kun je die het beste via de add-ons van HA installeren.
Zorg er ook voor dat je de node-red HA websocket installeert, dan kun je o.a. de flows via een switch in HA uit en aanzetten.
/f/image/4Lsw1qgUPGVQG6GjmCMnTwXA.png?f=fotoalbum_large)
/f/image/lZsJrx8YqS7Qj831ngjkP9Uf.png?f=fotoalbum_large)
/f/image/rTditYyy00NyseA7TetZqdIz.png?f=fotoalbum_large)
Als dit allemaal goed gegaan is kun je nu in je mqtt server de Zendure states terugvinden:
/f/image/cQeUl7VKrYQkczbyLolOpKbl.png?f=fotoalbum_large)
Vanaf nu is de koppeling eigenlijk compleet en kun je vanuit de mqtt explorer, HA automations of node-red je Hyper gaan aansturen.
LET OP:
Zorg ervoor dat je binnen de app bij Energieplan geen enkele optie hebt aanstaan anders werkt het aansturen niet. Ook op diepere niveau's binnen Energieplan.
Hieronder een paar voorbeeld commando's via MQTT:
Als je wilt importeren of exporteren moet je eerst zorgen dat de ACmode goed staat. Mqtt topic:
code:
geef je voor laden een 1 en voor exporteren een 2.1
| zendure-solarflow/0/gDa3tb/<device-id>/control/acMode/set |
Vervolgens stuur je de waarde voor export naar:
code:
1
| zendure-solarflow/0/gDa3tb/<device-id>/control/setOutputLimit/set |
of voor laden naar:
code:
1
| zendure-solarflow/0/gDa3tb/<device-id>/control/setInputLimit/set |
Vergeet niet om bij <device-id> je eigen device-id te plaatsen, die kun je vinden als je eenmaal een connectie met de io.Broker mqtt server hebt gemaakt.
5. De Zendure MQTT sensoren in HA aanmaken:
Hieronder de mqtt sensoren die je kunt aanmaken en straks ook nodig hebt voor de node-red flows, vergeet niet de juiste notatie van mqtt, sensor bovenaan toe te voegen als je nog niet eerder mqtt sensoren in HA hebt aangemaakt, en het <device-id>, <serienr_hyper> en <serienr-battX> aan te passen.opbouw HA configuratie:
configuration.yaml
YAML:
1
| mqtt: !include mqtt.yaml |
mqtt.yaml
YAML:
1
2
3
4
5
6
7
| sensor: - name: "batt import vandaag" unique_id: "W2BE3DESbattwwwzwuhwhhwilpttvs" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/calculations/gridInputEnergyTodaykWh" unit_of_measurement: "kWh" device_class: "energy" etc.... |
Volledige lijst van mqtt-sensoren die je kunt toevoegen:
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
| - name: "batt import vandaag" unique_id: "YtegehSbattwwwzwuhwhhwilpttvs" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/calculations/gridInputEnergyTodaykWh" unit_of_measurement: "kWh" device_class: "energy" value_template: > {% if states('sensor.zendure_batt_import_vandaag') not in ['unknown'] %} {{ value_json }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "zp totaal vandaag" unique_id: "YtegehSbattwwwzpttvs" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/calculations/solarInputEnergyTodayWh" unit_of_measurement: "kWh" device_class: "energy" value_template: > {% if states('sensor.zendure_zp_totaal_vandaag') not in ['unknown'] %} {{ (float(value_json) / 1000) }} {% else %} {{ int(0) }} {% endif %} device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt export vandaag" unique_id: "YtegehSbattexpvd" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/calculations/outputHomeEnergyTodaykWh" unit_of_measurement: "kWh" device_class: "energy" value_template: > {% if states('sensor.zendure_batt_export_vandaag') not in ['unknown'] %} {{ value_json }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "acmode" unique_id: "YtegehSacmodeaa" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/control/acMode" device_class: "power" value_template: > {% if states('sensor.zendure_acmode') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "pack input act" unique_id: "YtegehSpckinpact1" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/packInputPower" unit_of_measurement: "W" device_class: "power" value_template: > {% if states('sensor.zendure_pack_input_act') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "output home act" unique_id: "YtegehSophmpwr" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/outputHomePower" unit_of_measurement: "W" device_class: "power" value_template: > {% if states('sensor.zendure_output_home_act') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "ontlaadtijd tot leeg" unique_id: "YtegehSldtdtotleeg" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/remainOutTime" unit_of_measurement: "H" device_class: "duration" value_template: > {% if states('sensor.zendure_ontlaadtijd_tot_leeg') not in ['unknown'] %} {{ int(value_json, 0) / 60 }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt input act" unique_id: "YtegehSbattinpactv" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/outputPackPower" unit_of_measurement: "W" device_class: "power" value_template: > {% if states('sensor.zendure_batt_input_act') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "laadtijd tot vol" unique_id: "YtegehSldtdtotvol" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/remainInputTime" unit_of_measurement: "H" device_class: "duration" value_template: > {% if states('sensor.zendure_laadtijd_tot_vol') not in ['unknown'] %} {{ int(value_json, 0) / 60 }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt 1 soc" unique_id: "YtegehSbatt1soclvl" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/packData/<serienr_batt1>/socLevel" unit_of_measurement: "%" device_class: "battery" value_template: > {% if states('sensor.zendure_batt_1_soc') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt 2 soc" unique_id: "YtegehSbatt2soclvl" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/packData/<serienr_batt1>/socLevel" unit_of_measurement: "%" device_class: "battery" value_template: > {% if states('sensor.zendure_batt_2_soc') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt 1 max temp" unique_id: "YtegehSbatt1maxtemp" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/packData/<serienr_batt1>/maxTemp" unit_of_measurement: "°C" device_class: "temperature" value_template: > {% if states('sensor.zendure_batt_1_max_temp') not in ['unknown'] %} {{ value_json }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt 2 max temp" unique_id: "YtegehSbatt2maxtemp" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/packData/<serienr_batt2>/maxTemp" unit_of_measurement: "°C" device_class: "temperature" value_template: > {% if states('sensor.zendure_batt_2_max_temp') not in ['unknown'] %} {{ value_json }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt 1 max voltage" unique_id: "YtegehSbatt1maxvolt" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/packData/<serienr_batt1>/maxVol" unit_of_measurement: "V" device_class: "voltage" value_template: > {% if states('sensor.zendure_batt_1_max_voltage') not in ['unknown'] %} {{ value_json }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt 1 min voltage" unique_id: "YtegehSbatt1minvolt" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/packData/<serienr_batt1>/minVol" unit_of_measurement: "V" device_class: "voltage" value_template: > {% if states('sensor.zendure_batt_1_min_voltage') not in ['unknown'] %} {{ value_json }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt 2 max voltage" unique_id: "YtegehSbatt2maxvolt" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/packData/<serienr_batt2>/maxVol" unit_of_measurement: "V" device_class: "voltage" value_template: > {% if states('sensor.zendure_batt_2_max_voltage') not in ['unknown'] %} {{ value_json }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt 2 min voltage" unique_id: "YtegehSbatt2minvolt" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/packData/<serienr_batt2>/minVol" unit_of_measurement: "V" device_class: "voltage" value_template: > {% if states('sensor.zendure_batt_2_min_voltage') not in ['unknown'] %} {{ value_json }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: " hyper temp" unique_id: "Ytegehhypertemp" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/hyperTmp" value_template: "{{ value_json }}" unit_of_measurement: "°C" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "output limit" unique_id: "Ytegehoutputlimit" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/outputLimit" value_template: "{{ value_json | int }}" unit_of_measurement: "W" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "input limit" unique_id: "Ytegehinputlimit" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/inputLimit" value_template: "{{ value_json | int }}" unit_of_measurement: "W" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "hub status" unique_id: "YtegehShubState" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/hubState" value_template: "{{ value_json | int }}" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "zp act" unique_id: "YtegehSsolarInputwwPower" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/solarInputPower" unit_of_measurement: "W" device_class: "power" value_template: > {% if states('sensor.zendure_zp_act') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "solar power 1 act" unique_id: "YtegehSsolarpower1" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/pvPower1" unit_of_measurement: "W" device_class: "power" value_template: > {% if states('sensor.zendure_solar_power_1_act') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "solar power 2 act" unique_id: "YtegehSsolarpower2" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/pvPower2" unit_of_measurement: "W" device_class: "power" value_template: > {% if states('sensor.zendure_solar_power_2_act') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "pack input power" unique_id: "YtegehSpackInputPower" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>" unit_of_measurement: "W" device_class: "power" value_template: > {% if states('sensor.zendure_pack_input_power') not in ['unknown'] %} {{ int(value_json.packInputPower, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "grid input act" unique_id: "YtegehSgridInputPower" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/gridInputPower" unit_of_measurement: "W" device_class: "power" value_template: > {% if states('sensor.zendure_grid_input_act') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} state_class: "measurement" device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "ac output act" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/acOutputPower" unique_id: "acoutputact" value_template: > {% if states('sensor.zendure_ac_output_act') not in ['unknown'] %} {{ int(value_json, 0) }} {% else %} {{ int(0) }} {% endif %} unit_of_measurement: "W" state_class: "measurement" icon: mdi:battery-clock device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "batt soc" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/electricLevel" unique_id: "zenbattsoc" value_template: "{{ value_json }}" unit_of_measurement: "%" icon: mdi:battery-sync-outline device: name: "Zendure" identifiers: "<serienr_hyper>" manufacturer: "Zendure" model: "Hyper 2000" - name: "laadtijd tot vol" unique_id: "W2BE3DESldtdtotvol" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/calculations/remainInputTime" value_template: "{{ value }}" device: name: "Zendure" identifiers: "<serie_nr> manufacturer: "Zendure" model: "Hyper 2000" - name: "ontlaadtijd tot leeg" unique_id: "W2BE3DssESldtdleeG" state_topic: "zendure-solarflow/0/gDa3tb/<device-id>/calculations/remainOutTime" value_template: "{{ value }}" device: name: "Zendure" identifiers: "<serie_nr>" manufacturer: "Zendure" model: "Hyper 2000" |
Als je de mqtt sensoren binnen HA opnieuw geladen hebt of HA herstart hebt kun je nu een nieuw apparaat terugvinden met de naam Zendure met daarbij alle bovenstaande sensoren.
6. node-red flow "handmatig laden":
Voorbeeld van hoedat je in HA via een input_numer die je met de helper functie kunt aanmaken een slider maakt om handmatig de waarde voor laden in te stellen. In mijn voorbeeld zie je het veld input_number.hyper_import in de eerste node(als je die aanklikt), dat is de HA helper die ik heb aangemaakt om de waarde vanuit HA door te geven naar deze flow. Dus die moet jezelf ook aanmaken:/f/image/HKsYietejEEsGVYmO1nduM9q.png?f=fotoalbum_large)
Vergeet ook niet na het importeren van deze flow in node-red, om de topics hieronder aan te passen met je eigen deviceid!
De flow lijkt ingewikkeld maar bovenin controleer ik eerst of export al aanstaat en die zet ik dan ook eventueel uit zodat de 2 processen import/export elkaar niet in de weg zitten. Verder controleer ik eerst of acmode wel op import staat en zo niet zet ik acmode op de juiste waarde.
/f/image/hi5rawgZ5mOMYUWldxDzbIHE.png?f=fotoalbum_large)
De node-red flow die je kunt importeren:
JSON:
1
| [{"id":"deb6472c24d7dd68","type":"server-state-changed","z":"4357f0b9551a8e4d","name":"LADEN (import)","server":"1190584e6afd2564","version":6,"outputs":1,"exposeAsEntityConfig":"","entities":{"entity":["input_number.hyper_import"],"substring":[],"regex":[]},"outputInitially":false,"stateType":"num","ifState":"","ifStateType":"num","ifStateOperator":"gt","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":100,"y":1200,"wires":[["cf8276fc4378460f"]]},{"id":"d0c4e8ecd10de3ad","type":"mqtt out","z":"4357f0b9551a8e4d","name":"Set Input(laden)","topic":"zendure-solarflow/0/gDa3tb/device-id/control/setInputLimit/set","qos":"","retain":"true","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"a4502226a97fecb5","x":780,"y":1180,"wires":[]},{"id":"cf8276fc4378460f","type":"api-current-state","z":"4357f0b9551a8e4d","name":"acMode controle","server":"1190584e6afd2564","version":3,"outputs":2,"halt_if":"1","halt_if_type":"num","halt_if_compare":"is","entity_id":"sensor.zendure_acmode","state_type":"num","blockInputOverrides":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":330,"y":1200,"wires":[["928559588423b165","289f142b4450d997"],["5b48afae79962d07","3aee97ee8794d651","289f142b4450d997"]]},{"id":"6716e95cdebea2b7","type":"mqtt out","z":"4357f0b9551a8e4d","name":"Import aanzetten","topic":"zendure-solarflow/0/gDa3tb/device-id/control/acMode/set","qos":"","retain":"true","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"a4502226a97fecb5","x":790,"y":1260,"wires":[]},{"id":"5b48afae79962d07","type":"function","z":"4357f0b9551a8e4d","name":"payload","func":"msg.payload = 1;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":540,"y":1260,"wires":[["6716e95cdebea2b7"]]},{"id":"0f302315a381424a","type":"mqtt out","z":"4357f0b9551a8e4d","name":"Set Imput(laden)","topic":"zendure-solarflow/0/gDa3tb/device-id/control/setInputLimit/set","qos":"","retain":"true","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"a4502226a97fecb5","x":1020,"y":1340,"wires":[]},{"id":"3aee97ee8794d651","type":"delay","z":"4357f0b9551a8e4d","name":"","pauseType":"delay","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":540,"y":1340,"wires":[["db51498a54f686fb"]]},{"id":"928559588423b165","type":"api-current-state","z":"4357f0b9551a8e4d","name":"import ophalen","server":"1190584e6afd2564","version":3,"outputs":1,"halt_if":"","halt_if_type":"num","halt_if_compare":"is","entity_id":"input_number.hyper_import","state_type":"num","blockInputOverrides":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":560,"y":1180,"wires":[["d0c4e8ecd10de3ad"]]},{"id":"db51498a54f686fb","type":"api-current-state","z":"4357f0b9551a8e4d","name":"import ophalen","server":"1190584e6afd2564","version":3,"outputs":1,"halt_if":"","halt_if_type":"num","halt_if_compare":"is","entity_id":"input_number.hyper_import","state_type":"num","blockInputOverrides":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":780,"y":1340,"wires":[["0f302315a381424a"]]},{"id":"d0f7b33d25d372a5","type":"mqtt out","z":"4357f0b9551a8e4d","name":"Set Output op 0","topic":"zendure-solarflow/0/gDa3tb/device-id/control/setOutputLimit/set","qos":"","retain":"true","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"a4502226a97fecb5","x":960,"y":1100,"wires":[]},{"id":"289f142b4450d997","type":"api-current-state","z":"4357f0b9551a8e4d","name":"export ophalen","server":"1190584e6afd2564","version":3,"outputs":2,"halt_if":"0","halt_if_type":"num","halt_if_compare":"gt","entity_id":"input_number.hyper_export","state_type":"num","blockInputOverrides":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":560,"y":1100,"wires":[["c40d21499faec940"],[]]},{"id":"c40d21499faec940","type":"function","z":"4357f0b9551a8e4d","name":"payload","func":"msg.payload = 0;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":760,"y":1100,"wires":[["d0f7b33d25d372a5"]]},{"id":"1190584e6afd2564","type":"server","name":"Home Assistant","version":5,"addon":false,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"a4502226a97fecb5","type":"mqtt-broker","name":"ioBroker","broker":"http://192.168.2.114/","port":1883,"clientid":"","autoConnect":true,"usetls":false,"protocolVersion":4,"keepalive":60,"cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}] |
De overige flows ga ik hieronder plaatsen in vervolg reacties want het starttopic zit aan de max.
[ Voor 25% gewijzigd door Mediacj op 15-03-2025 17:27 ]