Acties:
  • 0 Henk 'm!

  • WargamingPlayer
  • Registratie: Mei 2025
  • Laatst online: 21:01
corsat schreef op donderdag 21 augustus 2025 @ 22:35:
ik heb het losse netwerk aangemaakt omdat ik de lilygo's niet geconnect kreeg maar je hebt mij op het goede spoor gebracht. Heb het aparte netwerk eruit gegooid en lilygo2 op mijn standaard 2.4ghz netwerk gezet en voila, een standaard ip adres en geconnect met HA inmiddels. Heeft wat moeite gekost maar het is dan eindelijk gelukt. Morgen de andere Marstek/lilygo verbinden en dan kan ik gaan optimaliseren i.s.m. mijn alfen laadpaal.
Waarschijnlijk met een eigen Acces Point gedaan en deze niet in AP modus gezet maar in routes mode waardoor je een compleet geïsoleerd netwerk had.

8 x 430wp, Huawei SUN2000-3KTL-L1, 2 x Marstek Venus-E (154.215), Home Assistant


Acties:
  • 0 Henk 'm!

  • Jim423
  • Registratie: September 2007
  • Laatst online: 28-09 17:21
Moet je wel als kanttekening erbij zetten dat je 4 of 6 mm² naar je OVK moet hebben, afhankelijk van de lengte.
(En officieel gezien daarnaast je uitschakeltijden en circuitimpedantie meten gezien je aardlekschakelaar ontbreekt) ;)

AMD Ryzen 5800X - 32GB DDR4 Corsair RGB - XFX 6900XT - Panasonic HIT 990Wp - AE200L WPB met cv-ondersteuning


Acties:
  • 0 Henk 'm!

  • WargamingPlayer
  • Registratie: Mei 2025
  • Laatst online: 21:01
Jim423 schreef op dinsdag 26 augustus 2025 @ 09:32:
Moet je wel als kanttekening erbij zetten dat je 4 of 6 mm² naar je OVK moet hebben, afhankelijk van de lengte.
(En officieel gezien daarnaast je uitschakeltijden en circuitimpedantie meten gezien je aardlekschakelaar ontbreekt) ;)
Bij mij zitten de aardleks in OVK. Dat is voldoende. Reden is eenvoudig, de normale groepen hebben een 30mA aardlek en de PV een 300mA aardlek. Dan zou ik in de hoofdkast een 300mA moeten hebben van 40A of daar een 25A ALAMAT van 300mA.

8 x 430wp, Huawei SUN2000-3KTL-L1, 2 x Marstek Venus-E (154.215), Home Assistant


Acties:
  • +5 Henk 'm!

  • tdolder
  • Registratie: September 2007
  • Laatst online: 28-09 17:06
Vandaag mijn 3e Marstek ontvangen en ze aangesloten op een eigen groep en verdeeld over de 3 fasen.
Gelijk maar even overgestapt van de YAML versie naar de mooie HACS integratie van @[RNMC] Viper bedankt voor deze mooie integratie. Dat maak het een stuk makkelijker :)
Afbeeldingslocatie: https://tweakers.net/i/Ly2pRwYlKU-ELmvi5FTLXVwR3rI=/232x232/filters:strip_icc():strip_exif()/f/image/WZBjKt7vih9yUDbAQjlKFGx2.jpg?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/6DuomWXN4bvi14IY1JNohCt3YkM=/232x232/filters:strip_exif()/f/image/lWBeXJSYVW9HyOf6FWTo6IZ2.png?f=fotoalbum_tile

EX30 - SMER - Ultra sinds 16-03-2024 / Wallbox Pulsar Max / HomeAssistant / Unifi / 3 x Marstek Venus E v2


Acties:
  • 0 Henk 'm!

  • mathiasc
  • Registratie: Maart 2012
  • Laatst online: 22:01
ik heb vandaag een 4 kanaals tcp naar RS485 converter ontvangen voor mijn 3 venus V2 batterijen:

https://www.waveshare.com/4-ch-rs485-to-eth-b.htm

Elk kanaal is een apart IP, elk hetzelfde geconfigureerd. ik heb echter een zeer raar fenomeen:

voor de duidelijkheid, als er 1 batterij is aangesloten (eender welke) en bij de andere de stekker fysiek is uitgetrokken werkt alles perfect, bij alle 3 de batterijen.

Zodra ik bij een 2de batterij de modbusstekker insteek gaat de eerste in "warn" en kan ik niks meer van gegevens uitlezen, niet van de eerste en niet van de 2de.

ik heb al geprobeerd met een aparte voedingsadapter omdat ik dacht dat de 5V te weinig krachtig is.De 3 GND's en +5V's zijn samen getorst, dus 1 5V voeding voor de 3 batterijen, maar ook geen soelaas.

Het is zelf zo dat als ik de A en B (data draden) uittrek langs de kant van de waveshare van batterij 2 en 3 (dus op dat ogenblik zijn enkel de voedingen nog samengetorst) en ik de connector insteek, ik hetzelfde fenomeen hebben. Ik kan in principe elke batterij apart voeden met een aparte 5V voeding maar dat lijkt me toch niet logisch?!

Dit zijn mijn settings, hoewel dat geen verschil mag maken gezien het probleem zich voordoet ook al de data lijnen van bat 2 en 3 niet aangesloten zijn:

enable Multihost aan of uit maakt geen verschil

Afbeeldingslocatie: https://tweakers.net/i/cjQi3OfwzDSrV8HaNJz7UjPXPBQ=/800x/filters:strip_icc():strip_exif()/f/image/RzfhscB4oOmVusLuIkrtYy81.jpg?f=fotoalbum_large

[ Voor 20% gewijzigd door mathiasc op 26-08-2025 21:16 ]


Acties:
  • 0 Henk 'm!
mathiasc schreef op dinsdag 26 augustus 2025 @ 21:12:
ik heb vandaag een 4 kanaals tcp naar RS485 converter ontvangen voor mijn 3 venus V2 batterijen:

https://www.waveshare.com/4-ch-rs485-to-eth-b.htm

Elk kanaal is een apart IP, elk hetzelfde geconfigureerd. ik heb echter een zeer raar fenomeen:

voor de duidelijkheid, als er 1 batterij is aangesloten (eender welke) en bij de andere de stekker fysiek is uitgetrokken werkt alles perfect, bij alle 3 de batterijen.

Zodra ik bij een 2de batterij de modbusstekker insteek gaat de eerste in "warn" en kan ik niks meer van gegevens uitlezen, niet van de eerste en niet van de 2de.

ik heb al geprobeerd met een aparte voedingsadapter omdat ik dacht dat de 5V te weinig krachtig is.De 3 GND's en +5V's zijn samen getorst, dus 1 5V voeding voor de 3 batterijen, maar ook geen soelaas.

Het is zelf zo dat als ik de A en B (data draden) uittrek langs de kant van de waveshare van batterij 2 en 3 (dus op dat ogenblik zijn enkel de voedingen nog samengetorst) en ik de connector insteek, ik hetzelfde fenomeen hebben. Ik kan in principe elke batterij apart voeden met een aparte 5V voeding maar dat lijkt me toch niet logisch?!

Dit zijn mijn settings, hoewel dat geen verschil mag maken gezien het probleem zich voordoet ook al de data lijnen van bat 2 en 3 niet aangesloten zijn:

enable Multihost aan of uit maakt geen verschil

[Afbeelding]
Wacht wat? Je bundelt de voeding uit de batterijen samen tot 1 voeding? Waarom zou je dat doen? Dat is vragen om problemen. De batterijen hoef je ook niet te voeden? Ik snap oprecht niet wat je aan het doen bent en waarom.

De Waveshare heeft blijkbaar minimaal 6V nodig, dus je geeft dat ding een voeding, bijvoorbeeld 12 V, en verder verbind je alleen de A en B van alle Modbus kabels, meer niet.

Acties:
  • 0 Henk 'm!

  • superduper1969
  • Registratie: December 2005
  • Laatst online: 23:27
mathiasc schreef op dinsdag 26 augustus 2025 @ 21:12:
ik heb vandaag een 4 kanaals tcp naar RS485 converter ontvangen voor mijn 3 venus V2 batterijen:

https://www.waveshare.com/4-ch-rs485-to-eth-b.htm

Elk kanaal is een apart IP, elk hetzelfde geconfigureerd. ik heb echter een zeer raar fenomeen:

voor de duidelijkheid, als er 1 batterij is aangesloten (eender welke) en bij de andere de stekker fysiek is uitgetrokken werkt alles perfect, bij alle 3 de batterijen.

Zodra ik bij een 2de batterij de modbusstekker insteek gaat de eerste in "warn" en kan ik niks meer van gegevens uitlezen, niet van de eerste en niet van de 2de.

ik heb al geprobeerd met een aparte voedingsadapter omdat ik dacht dat de 5V te weinig krachtig is.De 3 GND's en +5V's zijn samen getorst, dus 1 5V voeding voor de 3 batterijen, maar ook geen soelaas.

Het is zelf zo dat als ik de A en B (data draden) uittrek langs de kant van de waveshare van batterij 2 en 3 (dus op dat ogenblik zijn enkel de voedingen nog samengetorst) en ik de connector insteek, ik hetzelfde fenomeen hebben. Ik kan in principe elke batterij apart voeden met een aparte 5V voeding maar dat lijkt me toch niet logisch?!

Dit zijn mijn settings, hoewel dat geen verschil mag maken gezien het probleem zich voordoet ook al de data lijnen van bat 2 en 3 niet aangesloten zijn:

enable Multihost aan of uit maakt geen verschil

[Afbeelding]
De 3x5v aan elkaar knopen is geen goed idee.

MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt


Acties:
  • 0 Henk 'm!

  • mathiasc
  • Registratie: Maart 2012
  • Laatst online: 22:01
superduper1969 schreef op dinsdag 26 augustus 2025 @ 21:23:
[...]

De 3x5v aan elkaar knopen is geen goed idee.
als ik het goed begrijp is die +5V van de marstek +5V IN en niet OUT toch?

de waveshare converter is gevoed via POE en heeft dus geen voeding meer nodig...

Acties:
  • 0 Henk 'm!
mathiasc schreef op dinsdag 26 augustus 2025 @ 21:33:
[...]


als ik het goed begrijp is die +5V van de marstek +5V IN en niet OUT toch?

de waveshare converter is gevoed via POE en heeft dus geen voeding meer nodig...
Ja dat is zeker wel 5V OUT. In dat geval snap ik ook meteen waar de verwarring vandaan komt. De batterij heeft geen voeding nodig.

Ik hoop dat er goede beveiliging op dat PCB zit :X

Acties:
  • +2 Henk 'm!

  • mathiasc
  • Registratie: Maart 2012
  • Laatst online: 22:01
pascallj schreef op dinsdag 26 augustus 2025 @ 21:36:
[...]


Ja dat is zeker wel 5V OUT. In dat geval snap ik ook meteen waar de verwarring vandaan komt. De batterij heeft geen voeding nodig.

Ik hoop dat er goede beveiliging op dat PCB zit :X
*loopt vlug naar de batterijen*

even testen ... hang on ...

stupid me ...

Misschien dat wel even verduidelijken in de 1ste post dat het +5V OUT is en niet IN (maar dan nog ... Stupid me)

en ja de PCB's zijn goed beveiligd:

M2
--
Power: 0W
Soc: 100%
Capacity: 5.1kWh
Controllable: true

M1
--
Power: 0W
Soc: 100%
Capacity: 5.1kWh
Controllable: true

M3
--
Power: 758W
Soc: 14%
Capacity: 5.1kWh
Controllable: true

#happy me!

[ Voor 37% gewijzigd door mathiasc op 26-08-2025 21:40 ]


Acties:
  • 0 Henk 'm!

  • superduper1969
  • Registratie: December 2005
  • Laatst online: 23:27
mathiasc schreef op dinsdag 26 augustus 2025 @ 21:36:

Misschien dat wel even verduidelijken in de 1ste post dat het +5V OUT is en niet IN (maar dan nog ... Stupid me)
Uit TS: De Elfin RS485 naar TCP wordt gevoed vanuit de RS485 er is geen extra power nodig.

Maar ik ben blij dat alles nu werkt! d:)b

MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt


Acties:
  • +2 Henk 'm!

  • AUijtdehaag
  • Registratie: Oktober 2006
  • Niet online
tdolder schreef op dinsdag 26 augustus 2025 @ 16:36:
Vandaag mijn 3e Marstek ontvangen en ze aangesloten op een eigen groep en verdeeld over de 3 fasen.
Gelijk maar even overgestapt van de YAML versie naar de mooie HACS integratie van @[RNMC] Viper bedankt voor deze mooie integratie. Dat maak het een stuk makkelijker :)
[Afbeelding][Afbeelding]
Is dat wel werkbaar met 30s polling?

PVOutput Github - Div ESP TK: MHI - Clack - Marstek


Acties:
  • 0 Henk 'm!

  • rb1213
  • Registratie: Maart 2007
  • Laatst online: 17-09 20:23
Hallo,
kan iemand me uitleggen hoe je de API activeert op de batterijen? ik heb vorige week Marstek gecontacteerd , ze hebben het geactiveerd op de batterijen ... maar in de app zie ik nergens een optie op die aan te zetten of een poort in te stellen.

[ Voor 12% gewijzigd door rb1213 op 27-08-2025 11:39 ]


Acties:
  • 0 Henk 'm!
rb1213 schreef op woensdag 27 augustus 2025 @ 08:48:
Hallo,
kan iemand me uitleggen hoe je de API activeert op de batterijen? ik heb vorige week Marstek gecontacteerd , ze hebben het geactiveerd op de batterijen ... maar in de app zie ik nergens een optie op die aan te zetten of een poort in te stellen.

+is er een mogelijkheid om de Marstek P1 ct003 aan HA te koppelen ?
Ik denk dat je hiermee wel uit de voeten kunt: DinX in "Hame / Marstek / Duravolt 5,12kWh plug en play thuisaccu"

Acties:
  • +1 Henk 'm!

  • rb1213
  • Registratie: Maart 2007
  • Laatst online: 17-09 20:23
oh, bedankt voor de info !
die post had ik gemist ..
maar ik zit nog op v153 en zie die optie niet , kga ze nog eens moeten contacteren vrees ik.

Acties:
  • 0 Henk 'm!

  • mathiasc
  • Registratie: Maart 2012
  • Laatst online: 22:01
ik heb nog een probleempje met de homeassistant integratie van @superduper1969 .

ik heb gisteren de 3 batterijen toegevoegd in EVCC, wat gewoon direct werkte zonder enig probleem.

Als ik echter ze in HA toevoeg werkt er maar 1, terwijl alles op dezelfde manier is geconfigureerd, ook van de werkende batterij werken de knoppen (control mode bvb) niet.

Afbeeldingslocatie: https://tweakers.net/i/HDeZ6eoVc83IE3PH2XjydfUOVXA=/800x/filters:strip_icc():strip_exif()/f/image/OKUhBKioDSzxg5rajJpAu5iZ.jpg?f=fotoalbum_large

config werkende batterij:

Afbeeldingslocatie: https://tweakers.net/i/U6OI7TXMWVL80S01bK621RkY7To=/fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():strip_exif()/f/image/HVNDTBroi5mYFrYg7gt1ZZNW.jpg?f=user_large

config niet werkende batterij:

Afbeeldingslocatie: https://tweakers.net/i/jzoSlEZQPjr2rIRv1V8_GKQ1-yg=/fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():strip_exif()/f/image/AGbshZLNG9TEAIEbOFSkckx0.jpg?f=user_large

achterliggend staan beide config's van de modbusomvormer uiteraard hetzelfde, in evcc heb ik geen problemen om alle 3 de batterijen uit te lezen. wat mis ik?

Acties:
  • 0 Henk 'm!
mathiasc schreef op woensdag 27 augustus 2025 @ 12:16:
ik heb nog een probleempje met de homeassistant integratie van @superduper1969 .

ik heb gisteren de 3 batterijen toegevoegd in EVCC, wat gewoon direct werkte zonder enig probleem.

Als ik echter ze in HA toevoeg werkt er maar 1, terwijl alles op dezelfde manier is geconfigureerd, ook van de werkende batterij werken de knoppen (control mode bvb) niet.

[Afbeelding]

config werkende batterij:

[Afbeelding]

config niet werkende batterij:

[Afbeelding]

achterliggend staan beide config's van de modbusomvormer uiteraard hetzelfde, in evcc heb ik geen problemen om alle 3 de batterijen uit te lezen. wat mis ik?
Als je problemen hebt met HA, zou ik altijd als eerste even in de logs kijken. Ik vermoed dat je daar een foutmelding gaat terugvinden dat de Modbus naam uniek moet zijn.

Acties:
  • 0 Henk 'm!

  • mathiasc
  • Registratie: Maart 2012
  • Laatst online: 22:01
pascallj schreef op woensdag 27 augustus 2025 @ 12:19:
[...]


Als je problemen hebt met HA, zou ik altijd als eerste even in de logs kijken. Ik vermoed dat je daar een foutmelding gaat terugvinden dat de Modbus naam uniek moet zijn.
ik heb deze error's:

code:
1
2
2025-08-27 07:29:19.825 WARNING (MainThread) [homeassistant.components.modbus.validators] Modbus MarstekVenus host/port 192.168.0.153_502 is duplicate, not loaded!
2025-08-27 07:29:19.825 WARNING (MainThread) [homeassistant.components.modbus.validators] Modbus MarstekVenus host/port 192.168.90.233_502 is duplicate, not loaded!


terwijl er zeker geen 2 duplicate yaml's of ip's staan in de yaml's

anderzijds heb ik dit, vermoedelijk omdat de data niet juist binnenkomt:

code:
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
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
025-08-27 07:29:27.736 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise) render
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise' but no
2025-08-27 07:29:27.749 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {{ mode == 219
2025-08-27 07:29:27.750 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise) renders
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise' but
2025-08-27 07:29:27.756 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {{ mode == 
2025-08-27 07:29:27.760 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% if states('sensor.my_battery3_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2446, in forgiving_float_filter
    return float(value)
ValueError: could not convert string to float: 'unknown'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2449, in forgiving_float_filter
    raise_no_default("float", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified
2025-08-27 07:29:27.766 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified') while processing template 'Template<template=({% if states('sensor.my_battery3_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery3_charging_in_w'
2025-08-27 07:29:27.767 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% if states('sensor.my_battery3_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) }}
{% else %}
  0
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2446, in forgiving_float_filter
    return float(value)
ValueError: could not convert string to float: 'unknown'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2449, in forgiving_float_filter
    raise_no_default("float", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified
2025-08-27 07:29:27.773 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified') while processing template 'Template<template=({% if states('sensor.my_battery3_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) }}
{% else %}
  0
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery3_discharging_in_w'
2025-08-27 07:29:27.775 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery3_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified
2025-08-27 07:29:27.780 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_force_charge_discharge_mode') | int %} {% if
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified') while processing template 'Template<template=({% set mode = states('sensor.my_battery3_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery3_force_charge_discharge_mode_status'
2025-08-27 07:29:27.782 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified
2025-08-27 07:29:27.788 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {% if mode == 
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified') while processing template 'Template<template=({% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery3_rs485_control_mode_status'
2025-08-27 07:29:27.789 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% if states('sensor.my_battery_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2446, in forgiving_float_filter
    return float(value)
ValueError: could not convert string to float: 'unavailable'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2449, in forgiving_float_filter
    raise_no_default("float", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified
2025-08-27 07:29:27.795 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified') while processing template 'Template<template=({% if states('sensor.my_battery_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery_charging_in_w'
2025-08-27 07:29:27.796 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% if states('sensor.my_battery_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) }}
{% else %}
  0
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2446, in forgiving_float_filter
    return float(value)
ValueError: could not convert string to float: 'unavailable'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2449, in forgiving_float_filter
    raise_no_default("float", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified
2025-08-27 07:29:27.802 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified') while processing template 'Template<template=({% if states('sensor.my_battery_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) }}
{% else %}
  0
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery_discharging_in_w'
2025-08-27 07:29:27.803 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified
2025-08-27 07:29:27.809 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_force_charge_discharge_mode') | int %} {%
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified') while processing template 'Template<template=({% set mode = states('sensor.my_battery_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery_force_charge_discharge_mode_status'
2025-08-27 07:29:27.810 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified
2025-08-27 07:29:27.816 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {% if mode 
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified') while processing template 'Template<template=({% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery_rs485_control_mode_status'

Acties:
  • 0 Henk 'm!
mathiasc schreef op woensdag 27 augustus 2025 @ 12:37:
[...]


ik heb deze error's:

code:
1
2
2025-08-27 07:29:19.825 WARNING (MainThread) [homeassistant.components.modbus.validators] Modbus MarstekVenus host/port 192.168.0.153_502 is duplicate, not loaded!
2025-08-27 07:29:19.825 WARNING (MainThread) [homeassistant.components.modbus.validators] Modbus MarstekVenus host/port 192.168.90.233_502 is duplicate, not loaded!


terwijl er zeker geen 2 duplicate yaml's of ip's staan in de yaml's

anderzijds heb ik dit:

code:
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
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
025-08-27 07:29:27.736 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise) render
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise' but no
2025-08-27 07:29:27.749 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {{ mode == 219
2025-08-27 07:29:27.750 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise) renders
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {{ mode == 21930 }}  # True (ON) when Enabled (21930), False (OFF) otherwise' but
2025-08-27 07:29:27.756 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {{ mode == 
2025-08-27 07:29:27.760 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% if states('sensor.my_battery3_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2446, in forgiving_float_filter
    return float(value)
ValueError: could not convert string to float: 'unknown'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2449, in forgiving_float_filter
    raise_no_default("float", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified
2025-08-27 07:29:27.766 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified') while processing template 'Template<template=({% if states('sensor.my_battery3_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery3_charging_in_w'
2025-08-27 07:29:27.767 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% if states('sensor.my_battery3_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) }}
{% else %}
  0
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2446, in forgiving_float_filter
    return float(value)
ValueError: could not convert string to float: 'unknown'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2449, in forgiving_float_filter
    raise_no_default("float", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified
2025-08-27 07:29:27.773 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: float got invalid input 'unknown' when rendering template '{% if states('sensor.my_battery3_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified') while processing template 'Template<template=({% if states('sensor.my_battery3_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery3_ac_power') | float) }}
{% else %}
  0
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery3_discharging_in_w'
2025-08-27 07:29:27.775 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery3_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified
2025-08-27 07:29:27.780 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_force_charge_discharge_mode') | int %} {% if
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified') while processing template 'Template<template=({% set mode = states('sensor.my_battery3_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery3_force_charge_discharge_mode_status'
2025-08-27 07:29:27.782 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified
2025-08-27 07:29:27.788 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unknown' when rendering template '{% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {% if mode == 
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified') while processing template 'Template<template=({% set mode = states('sensor.my_battery3_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery3_rs485_control_mode_status'
2025-08-27 07:29:27.789 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% if states('sensor.my_battery_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2446, in forgiving_float_filter
    return float(value)
ValueError: could not convert string to float: 'unavailable'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2449, in forgiving_float_filter
    raise_no_default("float", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified
2025-08-27 07:29:27.795 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}' but no default was specified') while processing template 'Template<template=({% if states('sensor.my_battery_ac_power') | float < 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) *-1 }}
{% else %}
  0
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery_charging_in_w'
2025-08-27 07:29:27.796 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% if states('sensor.my_battery_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) }}
{% else %}
  0
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2446, in forgiving_float_filter
    return float(value)
ValueError: could not convert string to float: 'unavailable'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2449, in forgiving_float_filter
    raise_no_default("float", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified
2025-08-27 07:29:27.802 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: float got invalid input 'unavailable' when rendering template '{% if states('sensor.my_battery_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) }}
{% else %}
  0
{% endif %}' but no default was specified') while processing template 'Template<template=({% if states('sensor.my_battery_ac_power') | float > 0 %}
  {{ (states('sensor.my_battery_ac_power') | float) }}
{% else %}
  0
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery_discharging_in_w'
2025-08-27 07:29:27.803 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified
2025-08-27 07:29:27.809 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_force_charge_discharge_mode') | int %} {%
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}' but no default was specified') while processing template 'Template<template=({% set mode = states('sensor.my_battery_force_charge_discharge_mode') | int %} {% if mode == 0 %}
  Stop
{% elif mode == 1 %}
  Charge
{% elif mode == 2 %}
  Discharge
{% else %}
  Unknown
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery_force_charge_discharge_mode_status'
2025-08-27 07:29:27.810 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 641, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2977, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2465, in forgiving_int_filter
    raise_no_default("int", value)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1975, in raise_no_default
    raise ValueError(
    ...<2 lines>...
    )
ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 758, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 643, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified
2025-08-27 07:29:27.816 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('ValueError: Template error: int got invalid input 'unavailable' when rendering template '{% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {% if mode 
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}' but no default was specified') while processing template 'Template<template=({% set mode = states('sensor.my_battery_rs485_control_mode') | int %} {% if mode == 21930 %}
  Enabled
{% elif mode == 21947 %}
  Disabled
{% else %}
  Unknown
{% endif %}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.my_battery_rs485_control_mode_status'
Precies wat ik verwachtte: de naam van de Modbus hub moet uniek zijn. Je hebt nu 3 keer 'MarstekVenus' als naam voor de hub. In de twee warnings zie je dat ook letterlijk staan: 'MarstekVenus is duplicate'. Daarom worden die andere twee configuraties niet geladen en zijn de entities dus niet beschikbaar.

Dus ja, de configuratie is misschien niet helemaal juist, maar deze wordt ook al lang niet meer onderhouden door ~superduper1969, dus dat is ergens wel logisch.

Acties:
  • 0 Henk 'm!

  • Ies Korpershoek
  • Registratie: Februari 2001
  • Laatst online: 21:40
Info nodig
Draai hier een Marstek Venus V2 met een Liligo V1.1 en het werkt. Prima niet aankomen zou je zeggen.
Maar ik zie toch wel verschillende yaml files voor hetzelfde doel van verschillende ontwikkelaars.
Wat is op dit moment de meest actuele en beste ( weet niet of dat samen gaat ) files om te gebruiken met de LiLyGO V1.1

Acties:
  • 0 Henk 'm!

  • superduper1969
  • Registratie: December 2005
  • Laatst online: 23:27
@mathiasc
Als aanpassen de oplossing is dan pas ik het aan op Github.
Ik kan niet actief testen.

Ik pas dan alleen de 2&3 aan omdat de meeste maar 1 batterij hebben:
code:
1
2
3
4
5
6
7
8
9
10
11
12
marstek_venus_battery_control.yaml
  modbus:
    - name: MarstekVenus  (dus ongewijzigd)

marstek_venus_battery2_control.yaml

  modbus:
    - name: MarstekVenus2

marstek_venus_battery3_control.yaml
  modbus:
    - name: MarstekVenus3

[ Voor 6% gewijzigd door superduper1969 op 27-08-2025 13:13 ]

MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt


Acties:
  • +1 Henk 'm!

  • superduper1969
  • Registratie: December 2005
  • Laatst online: 23:27
Ies Korpershoek schreef op woensdag 27 augustus 2025 @ 12:48:
Info nodig
Draai hier een Marstek Venus V2 met een Liligo V1.1 en het werkt. Prima niet aankomen zou je zeggen.
Maar ik zie toch wel verschillende yaml files voor hetzelfde doel van verschillende ontwikkelaars.
Wat is op dit moment de meest actuele en beste ( weet niet of dat samen gaat ) files om te gebruiken met de LiLyGO V1.1
Dat ligt eraan wat je wilt,
Die van mij heeft als recente updates meer sensoren en een gewijzigde Led library zodat je geen meldingen krijgt als je de code comlipeert.

Zie de meldingen in de TS.

MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt


Acties:
  • +1 Henk 'm!

  • mathiasc
  • Registratie: Maart 2012
  • Laatst online: 22:01
superduper1969 schreef op woensdag 27 augustus 2025 @ 13:13:
@mathiasc
Als aanpassen de oplossing is dan pas ik het aan op Github.
Ik kan niet actief testen.

Ik pas dan alleen de 2&3 aan omdat de meeste maar 1 batterij hebben:
code:
1
2
3
4
5
6
7
8
9
10
11
12
marstek_venus_battery_control.yaml
  modbus:
    - name: MarstekVenus  (dus ongewijzigd)

marstek_venus_battery2_control.yaml

  modbus:
    - name: MarstekVenus2

marstek_venus_battery3_control.yaml
  modbus:
    - name: MarstekVenus3
klopt, dit was de oplossing!

Acties:
  • 0 Henk 'm!

  • tisniwoar
  • Registratie: November 2010
  • Laatst online: 12-09 00:57
AUijtdehaag schreef op woensdag 27 augustus 2025 @ 04:54:
[...]


Is dat wel werkbaar met 30s polling?
Polling is niet vastgelegd op 30s (en kan aangepast worden in const.py bestand):
code:
1
2
3
4
5
6
7
8
SCAN_INTERVAL = {
    "power": 10,         # high‑frequency power readings
    "electrical": 30,    # voltage, current, frequency
    "energy": 60,        # cumulative kWh counters
    "soc": 30,           # state‑of‑charge
    "state": 5,         # fast‑changing state / alarm bits
    "info": 60          # device info like name, serial number, software version
}

Acties:
  • +1 Henk 'm!

  • [RNMC] Viper
  • Registratie: Juli 2001
  • Laatst online: 23:19

[RNMC] Viper

📱13mini ⌚️8 💻14" M1

tisniwoar schreef op woensdag 27 augustus 2025 @ 16:18:
[...]

Polling is niet vastgelegd op 30s (en kan aangepast worden in const.py bestand):
code:
1
2
3
4
5
6
7
8
SCAN_INTERVAL = {
    "power": 10,         # high‑frequency power readings
    "electrical": 30,    # voltage, current, frequency
    "energy": 60,        # cumulative kWh counters
    "soc": 30,           # state‑of‑charge
    "state": 5,         # fast‑changing state / alarm bits
    "info": 60          # device info like name, serial number, software version
}
Dit onderdeel werkt nog niet goed, maar idee is wel om onderscheid te maken in polling. Sommige attributen hoef je niet elke 10sec te vernieuwen.

He who controls the past, commands the future. He who commands the future, conquers the past.


Acties:
  • 0 Henk 'm!

  • r03n_d
  • Registratie: December 2009
  • Laatst online: 27-09 12:56
Arjen S schreef op zondag 16 februari 2025 @ 10:56:
Met mijn scripts schakelt hij wel en past het oplaadvermogen ook netjes aan maar het loopt niet soepel dus dat vraagt nog wel wat tweaking, ook de overgang van laden naar ontladen gaat niet zoals je graag zou zien, daar riep Richard al wat over geloof ik. Gebruik mijn info hierboven daarom als een soort opstart om wat inzicht te krijgen in hoe die automatiseringen er ongeveer uit kunnen komen te zien. Als ik een 100% goed werkend script heb zal ik dat wel posten of wie weet heeft iemand anders al het nodige paraat, dat zou ook fantastisch zijn natuurlijk!
Met z'n allen maken we er wat moois van :)
Ik up even een hele oude comment, maar vraag me af of dit nog gelukt is?

De B2500 emulator snap ik oprecht niks van..

MT Venus 5.12KWh V153 - HW P1 - PV 2660Wp


  • Ies Korpershoek
  • Registratie: Februari 2001
  • Laatst online: 21:40
superduper1969 schreef op woensdag 27 augustus 2025 @ 13:19:
[...]

Dat ligt eraan wat je wilt,
Die van mij heeft als recente updates meer sensoren en een gewijzigde Led library zodat je geen meldingen krijgt als je de code comlipeert.

Zie de meldingen in de TS.
Jouw yaml geladen en werkt, ook in HA zie ik alles. Nog niet helemaal duidelijk wat ik nu in de config map moet zetten en waarom, want is zie een berg sensoren in HA. Wat ik uiteindelijk wil is de Marstek vanuit Node Red aansturen voor laden en ontladen.

Heb wel een klein probleem dat de 5v uit de Marstek als voeding voor de LilyGo kennelijk niet voldoende is. Soms valt alles weg. Met een losse USB voeding is alles OK

  • german_noob
  • Registratie: Juni 2025
  • Laatst online: 25-09 08:18
Hallo,

ik heb zojuist op pagina 1 een directe integratie in HA gevonden met het meetapparaat CT002/CT003.

Daarmee zou ik mijn Lilygo en de Shelly kunnen verwijderen, neem ik aan?

Als ik de CT002 koop, installeer en de HA-integratie toevoeg, kan ik dan afzien van de Marstek Cloud en de internetverbinding van de Venus verwijderen? Ik wil onafhankelijk worden van de Martek-app + cloud.

9,36 kWp / South+North / Marstek Venus E / SMA STP8.0 / SMA SHM2


Acties:
  • +2 Henk 'm!
german_noob schreef op donderdag 28 augustus 2025 @ 08:34:
Hallo,

ik heb zojuist op pagina 1 een directe integratie in HA gevonden met het meetapparaat CT002/CT003.

Daarmee zou ik mijn Lilygo en de Shelly kunnen verwijderen, neem ik aan?

Als ik de CT002 koop, installeer en de HA-integratie toevoeg, kan ik dan afzien van de Marstek Cloud en de internetverbinding van de Venus verwijderen? Ik wil onafhankelijk worden van de Martek-app + cloud.
Het uitlezen van de batterij en de manier van sturing staan los van elkaar. Met de LilyGo kan je de batterij uitlezen, SoC, vermogen etc. zien.

Met de CT002/Shelly stuur je de batterij zodat deze NOM kan houden. Het zou kunnen dat met die integratie ook een aantal dingen is uit te lezen, zoals gevraagd vermogen, maar bij lange na niet alle waardes uit de batterij.

Dus de Shelly kan je vervangen voor de CT002 (maar waarom zou je dat doen als je blijkbaar al een Shelly hebt die goed werkt?) maar het vervangt niet de LilyGo die de Modbus uitleest. Tenzij je al die informatie niet nodig vindt.

De cloud heb je nu sowieso ook al niet nodig met uitlezing via Modbus. Je zal alleen de verbinding dan op router niveau moeten blokkeren, want WiFi is wel nodig om te communiceren met een energiemeter.

Acties:
  • +1 Henk 'm!

  • superduper1969
  • Registratie: December 2005
  • Laatst online: 23:27
Ies Korpershoek schreef op donderdag 28 augustus 2025 @ 06:43:
[...]

Jouw yaml geladen en werkt, ook in HA zie ik alles. Nog niet helemaal duidelijk wat ik nu in de config map moet zetten en waarom, want is zie een berg sensoren in HA. Wat ik uiteindelijk wil is de Marstek vanuit Node Red aansturen voor laden en ontladen.

Heb wel een klein probleem dat de 5v uit de Marstek als voeding voor de LilyGo kennelijk niet voldoende is. Soms valt alles weg. Met een losse USB voeding is alles OK
Dat is meer een vraag voor dit topic: https://gathering.tweakers.net/forum/list_messages/2301062

MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt


  • mathiasc
  • Registratie: Maart 2012
  • Laatst online: 22:01
nog even een vraagje hier.

de integratie met HA werkt reeds goed voor het uitelzen en te kiezen voor de modussen van de batterijen. Ik kan ze nu dus in cascade laten leeglopen via de feed in.

echter wat ik nog zou willen doen is bvb zeggen dat ze in cascade moeten opladen met 800w. Nu kan ik dit bvb via de app wel instellen, maar het zou handig zijn dat dit via HA kan gebeuren.

ik heb al eens zitten spelen en laden/ontladen met de schuifbalk kan ik wel kiezen, maar het doet niks op de batterij zelf.

knopje "RS485 control mode switch" lijkt ook niks te doen in geen enkele modus.

echter begrijp ik volgende knoppen niet, vermoedelijk kan ik bovenstaande hiermee mogelijk maken?

Afbeeldingslocatie: https://tweakers.net/i/H5NgS4TTmq6bEnrQKhq3UwReiAc=/800x/filters:strip_icc():strip_exif()/f/image/xJYDFcHYmE2rOxY5wOArqFhB.jpg?f=fotoalbum_large
mathiasc schreef op donderdag 28 augustus 2025 @ 12:01:
nog even een vraagje hier.

de integratie met HA werkt reeds goed voor het uitelzen en te kiezen voor de modussen van de batterijen. Ik kan ze nu dus in cascade laten leeglopen via de feed in.

echter wat ik nog zou willen doen is bvb zeggen dat ze in cascade moeten opladen met 800w. Nu kan ik dit bvb via de app wel instellen, maar het zou handig zijn dat dit via HA kan gebeuren.

ik heb al eens zitten spelen en laden/ontladen met de schuifbalk kan ik wel kiezen, maar het doet niks op de batterij zelf.

knopje "RS485 control mode switch" lijkt ook niks te doen in geen enkele modus.

echter begrijp ik volgende knoppen niet, vermoedelijk kan ik bovenstaande hiermee mogelijk maken?

[Afbeelding]
Kijk even in de TS voor de uitleg van de switch en de registers die daarbij horen.

  • mathiasc
  • Registratie: Maart 2012
  • Laatst online: 22:01
pascallj schreef op donderdag 28 augustus 2025 @ 12:03:
[...]


Kijk even in de TS voor de uitleg van de switch en de registers die daarbij horen.
wel ik had deze gelezen, echter blijkt nu plots dat de schakelaars en knoppen wel werken ... begrijp wie begrijpen kan ...

Ik zie echter dat ik nu 2 handelingen moet doen om hem forcibly te laten laden/ontladen.

ik moet de 485 control mode aanleggen EN op de knop forcibly charge klikken. Kan dit niet met enkel het knopje om de 485 control mode aan te leggen? in HA automation kan je uiteraard wel beiden doen in 1 stap maar het zou iets praktischer zijn.

Ook zie ik dat je als je de waarde van charge bvb verhoogt, telkens opnieuw op de knop forcibly charge klikken, kan dit niet dynamisch gemaakt worden?
mathiasc schreef op donderdag 28 augustus 2025 @ 12:20:
[...]

wel ik had deze gelezen, echter blijkt nu plots dat de schakelaars en knoppen wel werken ... begrijp wie begrijpen kan ...

Ik zie echter dat ik nu 2 handelingen moet doen om hem forcibly te laten laden/ontladen.

ik moet de 485 control mode aanleggen EN op de knop forcibly charge klikken. Kan dit niet met enkel het knopje om de 485 control mode aan te leggen? in HA automation kan je uiteraard wel beiden doen in 1 stap maar het zou iets praktischer zijn.

Ook zie ik dat je als je de waarde van charge bvb verhoogt, telkens opnieuw op de knop forcibly charge klikken, kan dit niet dynamisch gemaakt worden?
Met de RS485 control mode zet je hem gewoon in een vierde modus 'RS485 control'. De tijdschema's en NOM regelingen staan dan uit. Vervolgens kies je het vermogen wat je wilt met 'Forcible (Dis)charge'. Hierna zet je de Forcible RS485 stand op de richting die je wil: laden/ontladen/niets. Et voila. Zolang je met RS485 control blijft sturen, kan dit gewoon aanblijven. Je hoeft het alleen uit te schakelen als je gebruik wilt maken van NOM/tijdschema's.

Je kan het vermogen ook gewoon dynamisch veranderen; daar is geen extra handeling voor nodig.

Maar even terug naar je oorspronkelijke vraag, dat cascade op-/ontladen, wil je dat met NOM doen? Want dan heb je het hele RS485 control gebeuren niet nodig.

[ Voor 3% gewijzigd door pascallj op 28-08-2025 12:27 ]


  • mathiasc
  • Registratie: Maart 2012
  • Laatst online: 22:01
pascallj schreef op donderdag 28 augustus 2025 @ 12:25:
[...]

Maar even terug naar je oorspronkelijke vraag, dat cascade op-/ontladen, wil je dat met NOM doen? Want dan heb je het hele RS485 control gebeuren niet nodig.
ja klopt, dat werkt nu al met een automatisatie die kijkt naar de SOC en die dan de modus verandert.

ik heb het voor de omgekeerde richting nodig, zijnde het laden wanneer er bvb geen zon is en om onder het capaciteitstareif van 2,5 te blijven in belgie als hier plots een WP of airco int gang schiet. waar ik de charge current dan snel moet kunnen wijzigen.

concreet, ik lees de P1's totale vermogen uit, en als er geen zon meer is en geen meer verwacht wordt zou ik de batterijen (in cascade) laten laden met een stroom tot 2,5kw captar, als er plots een grote verbruiker in gang schiet, en dus de stroom > 2,5kw wordt, zal het laden moeten verminderen met het wattage van het meerverbruik.

ik hoop dat dit wat duidelijk is :)

dit zal vooral de "wintersetup" worden (lees: peak shaving mode), in de zomer is dat allemaal minder van belang en kunnen ze overdag gewoon op de anti-feed mode blijven staan overdag want dan is er zon genoeg.

[ Voor 9% gewijzigd door mathiasc op 28-08-2025 12:46 ]

mathiasc schreef op donderdag 28 augustus 2025 @ 12:44:
[...]


ja klopt, dat werkt nu al met een automatisatie die kijkt naar de SOC en die dan de modus verandert.

ik heb het voor de omgekeerde richting nodig, zijnde het laden wanneer er bvb geen zon is en om onder het capaciteitstareif van 2,5 te blijven in belgie als hier plots een WP of airco int gang schiet. waar ik de charge current dan snel moet kunnen wijzigen.

concreet, ik lees de P1's totale vermogen uit, en als er geen zon meer in en geen meer verwacht wordt zou ik de batterijen (in cascade) laten laden met een stroom tot 2,5kw captar, als er plots een grote verbruiker in gang schiet, en dus de stroom > 2,5kw wordt, zal het laden moeten verminderen met het wattage van het meerverbruik.

ik hoop dat dit wat duidelijk is :)
Als je wilt laden wanneer er geen zon is, heb je volgens mij niet zo veel meer te maken met een NOM situatie. Je kan dan wel een P1 meter emuleren die een offset heeft van het maximale vermogen van 1 batterij. Dus bijvoorbeeld 2500W-op-meter. Of je schrijft zelf een grove NOM implementatie die het in wat grovere stappen aanpast.

Maar voor het bedenken van een leuke strategie, hebben we wel weer een ander speciaal topic als je dat verder zou willen uitdiepen.

  • mathiasc
  • Registratie: Maart 2012
  • Laatst online: 22:01
pascallj schreef op donderdag 28 augustus 2025 @ 12:56:
[...]


Als je wilt laden wanneer er geen zon is, heb je volgens mij niet zo veel meer te maken met een NOM situatie. Je kan dan wel een P1 meter emuleren die een offset heeft van het maximale vermogen van 1 batterij. Dus bijvoorbeeld 2500W-op-meter. Of je schrijft zelf een grove NOM implementatie die het in wat grovere stappen aanpast.
ergens een linkje van? Dat zou voor mij de ideale situatie zijn (te kunnen werken met een offset) ipv met complexe automatisaties aan de gang te slaan. weet wel dat ik 3 batterijen heb en dus in principe de CT003 zou moeten kunnen emuleren van marstek voor een goede samenwerking tussen de batterijen in NOM modus.
Maar voor het bedenken van een leuke strategie, hebben we wel weer een ander speciaal topic als je dat verder zou willen uitdiepen.
welk mag dat dan zijn?

[ Voor 11% gewijzigd door mathiasc op 28-08-2025 13:00 ]

mathiasc schreef op donderdag 28 augustus 2025 @ 12:58:
[...]


ergens een linkje van want dat zou voor mij de ideale situatie zijn ipv met complexe automatisaties aan de gang te slaan.


[...]


welk mag dat dan zijn?
Met dit project kan je bijvoorbeeld een Shelly/CT emuleren: https://github.com/tomquist/b2500-meter. Als je dan als bron de informatie van je P1 neemt en daar een offset aan toevoegt, heb je het volgens mij ongeveer. Moet je wel even rekening houden met de randvoorwaarden: wat gebeurt als de batterij vol is etc. Ook is de emulator natuurlijk niet geschikt voor samenwerking met meerdere batterijen etc. dus zal je zelf moeten gaan schakelen tussen de batterijen. Even goed over nadenken wat er allemaal kan gebeuren. De batterijen zullen dus ook altijd ramvol worden geladen dan ongeacht of er zon is etc.

Marstek PIB Domotica integratie en je Energierekening

  • german_noob
  • Registratie: Juni 2025
  • Laatst online: 25-09 08:18
pascallj schreef op donderdag 28 augustus 2025 @ 08:40:
[...]


Het uitlezen van de batterij en de manier van sturing staan los van elkaar. Met de LilyGo kan je de batterij uitlezen, SoC, vermogen etc. zien.

Met de CT002/Shelly stuur je de batterij zodat deze NOM kan houden. Het zou kunnen dat met die integratie ook een aantal dingen is uit te lezen, zoals gevraagd vermogen, maar bij lange na niet alle waardes uit de batterij.

Dus de Shelly kan je vervangen voor de CT002 (maar waarom zou je dat doen als je blijkbaar al een Shelly hebt die goed werkt?) maar het vervangt niet de LilyGo die de Modbus uitleest. Tenzij je al die informatie niet nodig vindt.

De cloud heb je nu sowieso ook al niet nodig met uitlezing via Modbus. Je zal alleen de verbinding dan op router niveau moeten blokkeren, want WiFi is wel nodig om te communiceren met een energiemeter.
Bedankt voor je antwoord.

Momenteel heb ik de Lilygo alleen geïnstalleerd om het geheugen in HA te kunnen integreren. Ik zou dan de Shelly uit de elektriciteitskast kunnen verwijderen en CT002 kunnen installeren. Dan zou ik nog maar 1 apparaat hebben in plaats van 2. Dat was mijn idee.

9,36 kWp / South+North / Marstek Venus E / SMA STP8.0 / SMA SHM2


  • bruneelm
  • Registratie: Januari 2007
  • Laatst online: 21:53
pascallj schreef op donderdag 28 augustus 2025 @ 13:03:
[...]


Met dit project kan je bijvoorbeeld een Shelly/CT emuleren: https://github.com/tomquist/b2500-meter. Als je dan als bron de informatie van je P1 neemt en daar een offset aan toevoegt, heb je het volgens mij ongeveer. Moet je wel even rekening houden met de randvoorwaarden: wat gebeurt als de batterij vol is etc. Ook is de emulator natuurlijk niet geschikt voor samenwerking met meerdere batterijen etc. dus zal je zelf moeten gaan schakelen tussen de batterijen. Even goed over nadenken wat er allemaal kan gebeuren. De batterijen zullen dus ook altijd ramvol worden geladen dan ongeacht of er zon is etc.

Marstek PIB Domotica integratie en je Energierekening
Even inbreken in de discussie zonder al de tijd gehad te hebben om die laatste draad te lezen

Eenvoudig zou je een offset voor de CAPTAR kunnen definiëren, doe ik al voor aanstuurbare mijn wallbox en werkt perfect

Echter tijdens de winter zal de stroom uit het net komen bij gebrek aan PV. Moet je rekening houden dat de bruikbare stroomprijs verhoogt wegens de verliezen. Is het dus de bedoeling om zo weinig mogelijk tussen te komen voor een instelbare CAPTAR bv 2500W

En dan zie ik de regeling anders. Basis of min CAPTAR is gedefinieerd op 2500W en moet je interpreteren als 625Wh voor elk kwartier. Indien je nu een verbruiker hebt die 5000W verbruikt dan zou je met de offset bijsturen wat niet nodig is indien de dit vermogen minder dan 7,5min in gebruik is
De sturing moet kijken, met de capaciteit van de accu, en de resterende tijd of en voor hoeveel er bijgestuurd moet worden om niet boven de ingestelde CAPTAR te komen in het lopende kwartier.

  • tdolder
  • Registratie: September 2007
  • Laatst online: 28-09 17:06
AUijtdehaag schreef op woensdag 27 augustus 2025 @ 04:54:
[...]


Is dat wel werkbaar met 30s polling?
Nu is het nog 30s maar er wordt gewerkt aan een nieuwe versie met Support for Dynamic Polling Intervals

https://github.com/ViperRNMC/marstek_venus_modbus/issues/18

EX30 - SMER - Ultra sinds 16-03-2024 / Wallbox Pulsar Max / HomeAssistant / Unifi / 3 x Marstek Venus E v2


Acties:
  • +1 Henk 'm!

  • [RNMC] Viper
  • Registratie: Juli 2001
  • Laatst online: 23:19

[RNMC] Viper

📱13mini ⌚️8 💻14" M1

tdolder schreef op donderdag 28 augustus 2025 @ 18:10:
[...]

Nu is het nog 30s maar er wordt gewerkt aan een nieuwe versie met Support for Dynamic Polling Intervals

https://github.com/ViperRNMC/marstek_venus_modbus/issues/18
Vraag is ook een beetje wat je er mee wilt, bij actief sturen waarbij je actuele data nodig hebt is 30 sec wellicht te lang. De aansturing is wel direct. Dynamic staat op de planning, maar nog niet klaar.

He who controls the past, commands the future. He who commands the future, conquers the past.


Acties:
  • 0 Henk 'm!

  • AUijtdehaag
  • Registratie: Oktober 2006
  • Niet online
Er staan nu 3 versies van de Atom s3 lite op mijn github ivm modbus rtu naar tcp/ip bridge
De 1e is de normale esphome versie (modbus rtu)
De 2e is de gecombineerde versie van 1 en 3 (modbus rtu + tcp/ip bridge)
De 3e is modbus tcp/ip (bridge)

Afbeeldingslocatie: https://tweakers.net/i/LBr6Kuum7_V_Km5mW4YAmLqgjlw=/800x/filters:strip_icc():strip_exif()/f/image/WnPwXGzmCIf73sqpLXurHxje.jpg?f=fotoalbum_large

De 2e kan modbus collissions veroorzaken waardoor er sensoren naar 0 gaan (bijv. battery soc % in evcc)
Vanwege 2 kapiteinen op 1 schip.
Ter info

[ Voor 195% gewijzigd door AUijtdehaag op 01-09-2025 09:30 ]

PVOutput Github - Div ESP TK: MHI - Clack - Marstek


Acties:
  • 0 Henk 'm!

  • Klaas_Brant
  • Registratie: November 2022
  • Laatst online: 13-09 17:33
Afbeeldingslocatie: https://tweakers.net/i/N-JCmZKxtBalBllf3K0IOlvhXPs=/800x/filters:strip_exif()/f/image/fJQXm5TUmyGB1fmTDMkBokTz.png?f=fotoalbum_large

Ik zie dit regelmatig in de nacht gebeuren met nul-op-meter (anti-feedin) geselecteerd. Een beetje bizar. Ik begrijp uberhaupt niet waarom de batterij stroom zou willen kopen om 2 uur in de 's nachts?! Ik begrijp dat het aan gaan van een stroomverbruiker een kleine verstoring kan veroorzaken. Maar zo lang? En met uitschieters tot 1Kw? Ik begrijp dat mijn versie 4 slimme meter "slechts" om de 10 seconden data kan geven, maar dan verwacht ik weer een stabiel beeld na 1 minuut en geen inkoop van de batterij. Ervaringen van andere gebruikers?

MT Venus E Versie 2 - Software V153 + Homewizzard P1


Acties:
  • 0 Henk 'm!
Klaas_Brant schreef op zondag 31 augustus 2025 @ 12:01:
[Afbeelding]

Ik zie dit regelmatig in de nacht gebeuren met nul-op-meter (anti-feedin) geselecteerd. Een beetje bizar. Ik begrijp uberhaupt niet waarom de batterij stroom zou willen kopen om 2 uur in de 's nachts?! Ik begrijp dat het aan gaan van een stroomverbruiker een kleine verstoring kan veroorzaken. Maar zo lang? En met uitschieters tot 1Kw? Ik begrijp dat mijn versie 4 slimme meter "slechts" om de 10 seconden data kan geven, maar dan verwacht ik weer een stabiel beeld na 1 minuut en geen inkoop van de batterij. Ervaringen van andere gebruikers?
Dit is meer een vraag voor het Reguliere topic. Dit topic richt zich eigenlijk alleen op het gebruik van Modbus.

Maar om toch een poging te wagen: Het is natuurlijk niet zo dat de batterij besluit om op 2 uur 's nachts stroom te gaan inkopen. Hij doet dit omdat hij denkt dat er zonneoverschot is. De Marstek heeft niet het besef dat er om 2 uur geen zonnestroom kan zijn. Waarschijnlijk is er vanwege een verbruiker inderdaad in een oscillatie gekomen waarbij hij naar zichzelf kijkt zonder dat hij dat doorheeft.

We zien hier de laatste tijd wat meer berichten over. Je kunt proberen of een andere meter selecteren betere resultaten geeft, blijkbaar kan dat verschil maken. Ook hebben we laatst begrepen dat Marstek de uitleessnelheid een beetje kan aanpassen. Mogelijk ook iets om aan te vragen.

Acties:
  • 0 Henk 'm!

  • Klaas_Brant
  • Registratie: November 2022
  • Laatst online: 13-09 17:33
Sorry, ik wist niet dat er ook een regulier topic forum is. Omdat ik ook met de modbus aan het "spelen" ben, heb ik hier al veel posts gelezen en vandaar de vraag. Ik heb een dongle uit china (zoals de EW11 maar dit is de USR-DR164 https://nl.aliexpress.com/item/1005008268896592.html voor minder dan 15 euro) zoals die in gebruik is in deze node red implementatie https://github.com/gf78/m...d-homeassistant/tree/main die ook er voor zorgt dat het venus in Home Assistent gebruikt kan worden en MQTT en REST API krijgt. Knap gedaan en werkt erg goed. Maar ik wil zelf meer sturing geven door via de modbus zelf de instructies tot laden/ ontladen te geven. Input van open meteo voor de zonnepanelen. Eventueel day ahead prijzen en feedback van de zonnepanelen zelf. Een beetje "poor man's Victron Dynamic ESS" voor Marstek. Hier is de dongle aan de marstek:

Afbeeldingslocatie: https://tweakers.net/i/ZHeT0g_Fkug7XXahIcKccU1cR8E=/x800/filters:strip_icc():strip_exif()/f/image/hMdxDQEh2cduBvjiIJZIJxA3.jpg?f=fotoalbum_large

Ik denk dat met de juiste aansturing besparing van 1000Kwh+ per jaar voor 1 MT Venus goed mogelijk moet zijn. Ervaringen op dit gebied?

MT Venus E Versie 2 - Software V153 + Homewizzard P1


Acties:
  • 0 Henk 'm!

  • VerSus
  • Registratie: Augustus 2025
  • Laatst online: 05-09 09:59
Hallo, heeft iemand al eens geprobeerd de externe wifi-aansluiting van de LilyGO te gebruiken? Zo ja, hoe activeer ik die? Ik heb gelezen dat er waarschijnlijk iets omgesoldeerd moet worden, maar ik kan helaas niet precies achterhalen wat.

Acties:
  • 0 Henk 'm!

  • superduper1969
  • Registratie: December 2005
  • Laatst online: 23:27
VerSus schreef op maandag 1 september 2025 @ 08:52:
Hallo, heeft iemand al eens geprobeerd de externe wifi-aansluiting van de LilyGO te gebruiken? Zo ja, hoe activeer ik die? Ik heb gelezen dat er waarschijnlijk iets omgesoldeerd moet worden, maar ik kan helaas niet precies achterhalen wat.
https://www.elektroda.com/news/news4124039.html

MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt


Acties:
  • 0 Henk 'm!

  • Marco_64
  • Registratie: Februari 2025
  • Laatst online: 00:08
Net boven de ipex-connector is er een doorverbinding die 'verlegd' moet worden zodat het signaal van de externe antenne gebruikt wordt.

3x Marstek Venus E (1xV1 en 2xV2 op v153 bms 215), Shelly Pro 3EM, 3x LilyGo T-CAN RS485, Home Assistant


Acties:
  • +2 Henk 'm!

  • rb1213
  • Registratie: Maart 2007
  • Laatst online: 17-09 20:23
removed

[ Voor 100% gewijzigd door rb1213 op 02-09-2025 19:29 ]


Acties:
  • 0 Henk 'm!

  • VerSus
  • Registratie: Augustus 2025
  • Laatst online: 05-09 09:59
Heel mooi! 🎉
Super dat het gelukt is en dat je nu met die 4 dBi-antenne veel beter bereik hebt vanuit de kelder. Bedankt voor je terugkoppeling – dat klinkt echt als een geslaagde upgrade.

Acties:
  • 0 Henk 'm!

  • HiHaHors
  • Registratie: December 2023
  • Laatst online: 28-09 13:15
Misschien heb ik het gemist, maar hoe is de pinout van de RJ45 RS485 modbus aansluiting van de nieuwe V3 versie?

Acties:
  • 0 Henk 'm!
HiHaHors schreef op maandag 1 september 2025 @ 14:25:
Misschien heb ik het gemist, maar hoe is de pinout van de RJ45 RS485 modbus aansluiting van de nieuwe V3 versie?
We hebben nog geen gebruikers van de V3 die zich gemeld hebben, dus geen idee! Heb jij een V3?

Acties:
  • 0 Henk 'm!

  • HiHaHors
  • Registratie: December 2023
  • Laatst online: 28-09 13:15
pascallj schreef op maandag 1 september 2025 @ 14:26:
[...]


We hebben nog geen gebruikers van de V3 die zich gemeld hebben, dus geen idee! Heb jij een V3?
Bijna...

Acties:
  • 0 Henk 'm!
Wees een pionier en hou ons op de hoogte, we horen het graag!

Acties:
  • 0 Henk 'm!

  • rb1213
  • Registratie: Maart 2007
  • Laatst online: 17-09 20:23
moved to other forum

[ Voor 105% gewijzigd door rb1213 op 02-09-2025 08:55 ]


Acties:
  • +2 Henk 'm!
rb1213 schreef op maandag 1 september 2025 @ 22:23:
een Home Assistant battery switcher template Sensor
deze keer zonder P1 data en voor 3 batterijen

die probeert altijd zo weinig mogelijk batterijen actief te hebben, het dichts bij max limiet gebaseerd op hun activiteit ( om een beter rendement te hebben)
geeft een json list van de batterijen die minimaal actief moeten zijn , enkel die dan op Self-Feed zetten via een automation
de sensor namen aanpassen uiteraard voor ac_power en soc.

- name: "Battery Manager Final Batteries"
unique_id: battery_manager_final_batteries
state: >
{% set powers = {
'marstek': states('sensor.marstek_ac_power') | float(0),
'marstek2': states('sensor.marstek2_ac_power') | float(0),
'marstek3': states('sensor.marstek3_ac_power') | float(0)
} %}

{% set socs = {
'marstek': states('sensor.marstek_battery_soc') | float(0),
'marstek2': states('sensor.marstek2_battery_soc') | float(0),
'marstek3': states('sensor.marstek3_battery_soc') | float(0)
} %}

{% set total_power = powers['marstek'] + powers['marstek2'] + powers['marstek3'] %}
{% set abs_total = total_power | abs %}
{% set mode = 'discharge' if total_power > 0 else 'charge' %}

{% set capacities = namespace(map={}) %}
{% for name in powers %}
{% set soc = socs[name] %}
{% if mode == 'charge' %}
{% if soc < 99 %}
{% set capacities.map = capacities.map | combine({ name: 2080 }) %}
{% elif soc == 99 %}
{% set capacities.map = capacities.map | combine({ name: 1000 }) %}
{% endif %}
{% elif mode == 'discharge' and soc > 11 %}
{% set capacities.map = capacities.map | combine({ name: 2080 }) %}
{% endif %}
{% endfor %}

{% set sorted = namespace(list=[]) %}
{% for name in capacities.map %}
{% set inserted = false %}
{% for i in range(sorted.list | length) %}
{% set current = sorted.list[i] %}
{% if powers[name] | abs > powers[current] | abs %}
{% set sorted.list = sorted.list[:i] + [name] + sorted.list[i:] %}
{% set inserted = true %}
{% break %}
{% endif %}
{% endfor %}
{% if not inserted %}
{% set sorted.list = sorted.list + [name] %}
{% endif %}
{% endfor %}

{% set selected = namespace(list=[], total=0) %}
{% for name in sorted.list %}
{% if selected.total < abs_total %}
{% set selected.list = selected.list + [name] %}
{% set selected.total = selected.total + capacities.map[name] %}
{% endif %}
{% endfor %}

{{ selected.list | tojson }}
Voor automatiseringen voor de Marstek, hebben we een apart topic: Marstek PIB Domotica integratie en je Energierekening. Zo kunnen we dit topic een beetje op de Modbus implementatie gericht houden.

Als je overigens daar je code post, zet de code dan aub tussen [code][/code] tags zodat de code makkelijker leesbaar is.

Acties:
  • 0 Henk 'm!

  • FritsLa
  • Registratie: Juli 2021
  • Laatst online: 25-09 12:29
Ik probeer de viper integratie voor de Elfin te installeren op mijn home assistant green waarop HACS al is geïnstalleerd. Ik krijg dan echter een foutmelding dat de repository niet wordt gevonden. Hoe nu verder? Afbeeldingslocatie: https://tweakers.net/i/QmQoZulB4itWlwG0NuEHAUW1wnA=/x800/filters:strip_icc():strip_exif()/f/image/dvK8MtcuHfgQRI8g5JnFMZxw.jpg?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/1QeYlBkb0eFYL7xBDlSaHLhUfbs=/x800/filters:strip_icc():strip_exif()/f/image/0MXKxSdNbukYRqCSpYArjHgh.jpg?f=fotoalbum_large

Acties:
  • 0 Henk 'm!

  • The Outsider
  • Registratie: September 2025
  • Laatst online: 09-09 08:10
Hey specialisten,

Ik zit vast ... na meerdere pogingen kom ik toch even ten rade bij jullie ..
vermoedelijk iets kleins dat ik over het hoofd heb gezien ...

Geen data beschikbaar in HA!

Lilygo v1.1 aangeschaft
naar mijn goed vermogen de volledige manual van superduper1969 gevolgd
(Marstek Venus / Duravolt PnP Thuisaccu Modbus koppeling)

alsnog krijg ik geen data binnen in HA

wat klopt wel..
Lilygo geflasht in ESP Home en werkt volgens mij: sz volledige install werd doorlopen zonder fouten & aangesloten op de marstek geeft deze direct een rode LED (tijdens opstart) maar na enige tijd een groene LED = dus modbus en WIFI ok (Heb er ook MET fouten gehad maar was dan voornamelijk IP-gerelateerd maar werd ook opgelost)
ik zie op mijn netwerk de esp-homeweb met IP adres XXX.173
(Dit IP adres werd ook toegevoegd in yaml for use-adress)
Toch kan ik dit IP niet bereiken?
Ok de "werkwijze" van Denie van Kleef (youtube-kanaal) werd meermaals herdaan ...
API-OTA key elke keer vernieuwd ...

ben een beetje het noorden kwijt

Acties:
  • 0 Henk 'm!

  • dannyro
  • Registratie: April 2025
  • Laatst online: 20:32
FritsLa schreef op dinsdag 2 september 2025 @ 10:55:
Ik probeer de viper integratie voor de Elfin te installeren op mijn home assistant green waarop HACS al is geïnstalleerd. Ik krijg dan echter een foutmelding dat de repository niet wordt gevonden. Hoe nu verder? [Afbeelding]

[Afbeelding]
Hier vind ik deze ook niet in Hacs.

MTVenus V2 V154 BMS 215 APP V1.6.45 HW-P1 M5stack Atom lite Modbus HA integration ZP 3,28kWp Goodwe 3kW


Acties:
  • 0 Henk 'm!

  • Jobbr
  • Registratie: September 2025
  • Laatst online: 27-09 10:08
Dag allen,

Fantastisch project dat jullie hebben gecreëerd.
Ik ben sinds kort ook de trotse eigenaar van een Marstek Venus v2.0, alleen krijg ik geen data uit de RS485.

Model: Marstek Venus-E v2.0 - MST-BIE5-2500
Ik heb een LilyGo aangesloten. De aansluiting is volgens mij correct, maar ik heb voor de zekerheid toch even een foto toegevoegd.
Afbeeldingslocatie: https://tweakers.net/i/wynnQ9WZRXyniQ43SYhcEUMhfcw=/x800/filters:strip_icc():strip_exif()/f/image/mNcowjz9A6iTrBN4VSCH9LLu.jpg?f=fotoalbum_large

De esp webpage werkt wel en de wifi data komt mooi uit de LilyGo. De ldata van de modbus blijft echter steeds unknown. De code van mijn esp heb ik ook even bijgevoegd ter volledigheid.
Afbeeldingslocatie: https://tweakers.net/i/GpsiwQ1fJutOuwZ8J21Kzpk6Lcw=/800x/filters:strip_exif()/f/image/MctCoHXRMwXQkXayYrANMo3G.png?f=fotoalbum_large

Iemand die enig idee heeft wat er mis gaat? Ik heb zelf al enige tijd zitten zoeken, maar ik word er maar niet wijzer uit :)

code:
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
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
esphome:
  name: marstek-venus-v20
  friendly_name: Marstek Venus v2.0

esp32:
  board: esp32dev
  framework:
    type: esp-idf

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "!secret_key"

ota:
  - platform: esphome
    password: "!secret_password"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "!secret_SSID"
    password: "!secret_password"

captive_portal:

web_server:
  port: 80
  version: 3
  include_internal: False
#  ota: False
  local: True
  sorting_groups:
    - id: Info
      name: "Info"
      sorting_weight: -40
    - id: Control
      name: "Control"
      sorting_weight: -30
    - id: Status
      name: "Status"
      sorting_weight: -20
    - id: Diagnostic
      name: "Diagnostic"
      sorting_weight: -10

# Configure UART
uart:
  - id: mod_bus
    rx_pin: GPIO32
    tx_pin: GPIO33
    baud_rate: 115200
    data_bits: 8
    stop_bits: 1
    parity: NONE

modbus:
  - uart_id: mod_bus
    id: modbus1
    send_wait_time: 50ms

modbus_controller:
  - id: mt
    address: 0x1
    modbus_id: modbus1
    command_throttle: 50ms
    update_interval: 5s

# Tekstsensoren
text_sensor:
  - platform: modbus_controller
    name: "Device Name"
    icon: mdi:rename-outline
    id: device_name
    modbus_controller_id: mt
    register_type: holding
    address: 31000
    register_count: 10
    response_size: 20
    skip_updates: 60 # 5 minutes
    entity_category: diagnostic
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 7

  - platform: template
    name: "Software Version"
    id: software_version_text
    icon: mdi:factory
    update_interval: never  # updates only when sensor triggers
    entity_category: diagnostic
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 8

  - platform: template
    name: "Firmware Version"
    id: firmware_version_text
    icon: mdi:factory
    update_interval: never  # updates only when sensor triggers
    entity_category: diagnostic
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 9

  - platform: template
    name: "BMS Version"
    id: bms_version_text
    icon: mdi:factory
    update_interval: never  # updates only when sensor triggers
    entity_category: diagnostic
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 10

  # - name: "Marstek SN Code"
  #   platform: modbus_controller
  #   modbus_controller_id: mt
  #   register_type: holding
  #   address: 31200
  #   register_count: 10
  #   response_size: 20
  #   skip_updates: 60 # 5 minutes

  - platform: template
    name: "Marstek Inverter State"
    lambda: |-
      switch (int(id(inverter_state).state)) {
        case 0: return std::string("Sleep");
        case 1: return std::string("Standby");
        case 2: return std::string("Charge");
        case 3: return std::string("Discharge");
        case 4: return std::string("Fault");
        case 5: return std::string("Idle");
        case 6: return std::string("AC bypass");
        default: return std::string("Unknown");
      };
    update_interval: 5s
    web_server:
      sorting_group_id: Info
      sorting_weight: 4

  - platform: wifi_info
    ip_address:
      name: ESP IP
      icon: mdi:ip
      web_server:
        sorting_group_id: Diagnostic
        sorting_weight: 4
    ssid:
      name: ESP SSID
      icon: mdi:wifi
      web_server:
        sorting_group_id: Diagnostic
        sorting_weight: 3

  - platform: version
    name: ESP Version
    hide_timestamp: true
    disabled_by_default: false
    icon: mdi:new-box
    entity_category: diagnostic
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 2

  - platform: modbus_controller
    id: wifi_status
    name: "Wifi status"
    modbus_controller_id: mt
    register_type: holding
    address: 30300
    raw_encode: NONE
    icon: mdi:wifi-alert
    entity_category: diagnostic
    skip_updates: 20
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "Disconnected"; break;
        case 1:  mode_str = "Connected"; break;                                                              
      }
      return mode_str;
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 20

  - platform: modbus_controller
    id: bt_status
    name: "BT status"
    modbus_controller_id: mt
    register_type: holding
    address: 30301
    raw_encode: NONE
    icon: mdi:home-heart
    entity_category: diagnostic
    skip_updates: 20
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "Off"; break;
        case 1:  mode_str = "Active after boot"; break;    
        case 2:  mode_str = "Connected"; break; 
        case 3:  mode_str = "Active"; break;                                                           
      }
      return mode_str;
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 21

  - platform: modbus_controller
    id: cloud_status
    name: "Cloud status"
    modbus_controller_id: mt
    register_type: holding
    address: 30302
    raw_encode: NONE
    icon: mdi:home-heart
    entity_category: diagnostic
    skip_updates: 20
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "Disconnected"; break;
        case 1:  mode_str = "Connected"; break;                                                              
      }
      return mode_str;
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 22

  - platform: modbus_controller
    id: power_restriction_discharge
    name: "Power restriction"
    modbus_controller_id: mt
    register_type: holding
    address: 41010
    raw_encode: NONE
    icon: mdi:home-heart
    entity_category: diagnostic
    skip_updates: 20
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "Off"; break;
        case 1:  mode_str = "800W limited"; break;                                                              
      }
      return mode_str;
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 23

# Binaire sensoren
binary_sensor:
  - platform: modbus_controller
    name: "Marstek PLL Abnormal Restart"
    id: "lilygo_rs485_marstek_pll_abnormal_restart"
    icon: mdi:flash-triangle
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x01

  - platform: modbus_controller
    name: "Marstek Overtemperature Limit"
    icon: mdi:thermometer-alert
    id: "lilygo_rs485_marstek_overtemperature_limit"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x02

  - platform: modbus_controller
    name: "Marstek Low Temperature Limit"
    icon: mdi:thermometer-alert
    id: "lilygo_rs485_marstek_low_temperature_limit"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x04

  - platform: modbus_controller
    name: "Marstek Fan Abnormal Warning"
    icon: mdi:fan-alert
    id: "lilygo_rs485_marstek_fan_abnormal_warning"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x08

  - platform: modbus_controller
    name: "Marstek Low Battery SOC Warning"
    icon: mdi:battery-off-outline
    id: "lilygo_rs485_marstek_low_battery_soc_warning"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x16

  - platform: modbus_controller
    name: "Marstek Output Overcurrent Warning"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_output_overcurrent_warning"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x32

  - platform: modbus_controller
    name: "Marstek Abnormal Line Sequence Detection"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_abnormal_line_sequence_detection"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x64

  - platform: modbus_controller
    name: "Marstek Wifi Abnormal"
    icon: mdi:wifi-alert
    id: "lilygo_rs485_marstek_wifi_abnormal"
    modbus_controller_id: mt
    register_type: holding
    address: 36001
    bitmask: 0x01

  - platform: modbus_controller
    name: "Marstek BLE abnormal"
    icon: mdi:bluetooth-off
    id: "lilygo_rs485_marstek_ble_abnormal"
    modbus_controller_id: mt
    register_type: holding
    address: 36001
    bitmask: 0x02

  - platform: modbus_controller
    name: "Marstek Network abnormal"
    icon: mdi:network-off
    id: "lilygo_rs485_marstek_network_abnormal"
    modbus_controller_id: mt
    register_type: holding
    address: 36001
    bitmask: 0x04

  - platform: modbus_controller
    name: "Marstek CT connection abnormal"
    icon: mdi:robot-vacuum-alert
    id: "lilygo_rs485_marstek_ct_connection_abnormal"
    modbus_controller_id: mt
    register_type: holding
    address: 36001
    bitmask: 0x08

  - platform: modbus_controller
    name: "Marstek Grid overvoltage"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_grid_overvoltage"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x01

  - platform: modbus_controller
    name: "Marstek Grid undervoltage"
    icon: mdi:flash-triangle-outline
    id: "lilygo_rs485_marstek_grid_undervoltage"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x02

  - platform: modbus_controller
    name: "Marstek Grid overfrequency"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_grid_overfrequency"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x04

  - platform: modbus_controller
    name: "Marstek Grid underfrequency"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_grid_underfrequency"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x08

  - platform: modbus_controller
    name: "Marstek Grid peak voltage abnormal"
    icon: mdi:alert-plus
    id: "lilygo_rs485_marstek_grid_peak_voltage_abnormal"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x10

  - platform: modbus_controller
    name: "Marstek Current Dcover"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_current_dcover"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x20

  - platform: modbus_controller
    name: "Marstek Voltage Dcover"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_voltage_dcover"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x40

  - platform: modbus_controller
    name: "Marstek BAT overvoltage"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_bat_overvoltage"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x01

  - platform: modbus_controller
    name: "Marstek BAT undervoltage"
    icon: mdi:flash-triangle-outline
    id: "lilygo_rs485_marstek_bat_undervoltage"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x02

  - platform: modbus_controller
    name: "Marstek BAT overcurrent"
    icon: mdi:wave-undercurrent
    id: "lilygo_rs485_marstek_bat_overcurrent"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x04

  - platform: modbus_controller
    name: "Marstek BAT low SOC"
    icon: mdi:battery-off-outline
    id: "lilygo_rs485_marstek_bat_low_soc"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x08

  - platform: modbus_controller
    name: "Marstek BAT communication failure"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_bat_communication_failure"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x10

  - platform: modbus_controller
    name: "Marstek BMS protect"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_bms_protect"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x20

  - platform: status
    name: "WiFi Status"
    id: "lilygo_rs485_wifi_status"

# Sensoren
sensor:
  - name: "Marstek Battery Wifi Signal Strength"
    id: lilygo_rs485_marstek_battery_wifi_signal_strenght
    icon: mdi:wifi
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 30303
    value_type: U_WORD
    unit_of_measurement: "dBm"
    filters:
      - multiply: -1
    accuracy_decimals: 0   
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 7

  - platform: copy # Reports the Battery signal strength in %
    source_id: lilygo_rs485_marstek_battery_wifi_signal_strenght
    name: "Marstek Battery Wifi Signal"
    id: battery_wifi_signal_proc
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: " %"
    entity_category: diagnostic
    device_class: ""
    icon: mdi:wifi
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 6

  - platform: modbus_controller
    id: inverter_state  # No name, since it's internal
    icon: mdi:state-machine
    modbus_controller_id: mt
    register_type: holding
    address: 35100
    value_type: U_WORD
    internal: true # Hides from Home Assistant
    web_server:
      sorting_group_id: Info
      sorting_weight: 30

  - platform: modbus_controller
    id: software_version # No name, since it's internal
    icon: mdi:factory
    modbus_controller_id: mt
    register_type: holding
    address: 31100
    value_type: U_WORD
    accuracy_decimals: 0
    skip_updates: 60 # 5 minutes
    internal: true # Hides from Home Assistant
    on_value:
      then:
        - lambda: |-
            int version = (int)x;
            char buf[5];
            sprintf(buf, "V%d", version);
            id(software_version_text).publish_state(buf);

  - platform: modbus_controller
    id: firmware_version # No name, since it's internal
    icon: mdi:factory
    modbus_controller_id: mt
    register_type: holding
    address: 31101
    value_type: U_WORD
    accuracy_decimals: 0
    skip_updates: 60 # 5 minutes
    internal: true # Hides from Home Assistant
    on_value:
      then:
        - lambda: |-
            int version = (int)x;
            char buf[5];
            sprintf(buf, "V%d", version);
            id(firmware_version_text).publish_state(buf);

  - platform: modbus_controller
    id: bms_version
    icon: mdi:factory
    modbus_controller_id: mt
    register_type: holding
    address: 31102
    value_type: U_WORD
    accuracy_decimals: 0
    skip_updates: 60 # 5 minutes
    internal: true
    on_value:
      then:
        - lambda: |-
            int version = (int)x;
            char buf[5];
            sprintf(buf, "V%d", version);
            id(bms_version_text).publish_state(buf);
  
  - name: "Marstek Battery Voltage (Average)"
    id: "lilygo_rs485_marstek_battery_voltage_average"
    icon: mdi:sine-wave
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32100
    value_type: U_WORD
    unit_of_measurement: "V"
    device_class: voltage
    accuracy_decimals: 2
    state_class: measurement
    filters:
      - multiply: 0.01
    web_server:
      sorting_group_id: Info
      sorting_weight: 16
    
  - name: "Marstek Battery Current (Average)"
    id: "lilygo_rs485_marstek_battery_current_average"
    icon: mdi:current-dc
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32101
    value_type: S_WORD
    unit_of_measurement: "A"
    device_class: current
    accuracy_decimals: 2
    state_class: measurement
    filters:
      - multiply: 0.01
    web_server:
      sorting_group_id: Info
      sorting_weight: 15

  - name: "Marstek Battery Power"
    id: "lilygo_rs485_marstek_battery_power"
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32102
    value_type: S_DWORD
    unit_of_measurement: "W"
    device_class: power
    state_class: measurement
    accuracy_decimals: 0
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Info
      sorting_weight: 14

  - name: "Marstek Battery State Of Charge"
    id: "lilygo_rs485_marstek_battery_state_of_charge" # Was marstek_soc
    platform: modbus_controller
    device_class: battery
    state_class: measurement
    modbus_controller_id: mt
    register_type: holding
    address: 32104
    value_type: U_WORD
    unit_of_measurement: "%"
    accuracy_decimals: 0
    web_server:
      sorting_group_id: Info
      sorting_weight: 5

# Slow Sensor
  - name: "Marstek Battery Total Energy"
    id: "lilygo_rs485_marstek_battery_total_energy" # Was marstek_total_energy
    icon: mdi:battery-charging-100
    platform: modbus_controller
    device_class: energy_storage
    state_class: measurement
    modbus_controller_id: mt
    register_type: holding
    address: 32105 
    value_type: U_WORD
    unit_of_measurement: "kWh"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001 # Firmware 148: 0.001 / Firmware 147: 0.01
    skip_updates: 60 # 5 minutes
    web_server:
      sorting_group_id: Info
      sorting_weight: 7

  - platform: template
    name: "Marstek Battery Remaining Capacity"
    id: "lilygo_rs485_marstek_battery_remaining_capacity"
    icon: mdi:battery-arrow-down-outline
    unit_of_measurement: "kWh"
    accuracy_decimals: 2
    update_interval: 300s
    lambda: |-
      if (id(lilygo_rs485_marstek_battery_total_energy).has_state() && id(lilygo_rs485_marstek_battery_state_of_charge).has_state()) {
        float total_energy = id(lilygo_rs485_marstek_battery_total_energy).state;
        float soc = id(lilygo_rs485_marstek_battery_state_of_charge).state / 100.0;
        return roundf(total_energy * soc * 100) / 100; // Ensures two decimal places
      }
      return NAN;
    web_server:
      sorting_group_id: Info
      sorting_weight: 6

  - name: "Marstek AC Voltage"
    id: "lilygo_rs485_marstek_ac_voltage"
    icon: mdi:current-ac
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32200
    value_type: U_WORD
    unit_of_measurement: "V"
    device_class: voltage
    state_class: measurement
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
    web_server:
      sorting_group_id: Info
      sorting_weight: 3

  - name: "Marstek AC Current"
    id: "lilygo_rs485_marstek_ac_current"
    icon: mdi:current-ac
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32201
    value_type: U_WORD
    unit_of_measurement: "A"
    device_class: current
    state_class: measurement
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    web_server:
      sorting_group_id: Info
      sorting_weight: 2

# Slow Sensor
  - name: "Marstek AC Power"
    id: "lilygo_rs485_marstek_ac_power"
    icon: mdi:flash
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32202
    value_type: S_DWORD
    unit_of_measurement: "W"
    device_class: power
    state_class: measurement
    accuracy_decimals: 0
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Info
      sorting_weight: 1

#  - name: "Marstek AC Offgrid Voltage"
#    id: "lilygo_rs485_marstek_ac_offgrid_voltage"
#    icon: mdi:sine-wave
#    platform: modbus_controller
#    modbus_controller_id: mt
#    state_class: measurement
#    register_type: holding
#    address: 32300
#    value_type: U_WORD
#    unit_of_measurement: "V"
#    device_class: voltage
#    accuracy_decimals: 2
#    filters:
#      - multiply: 0.1
#    web_server:
#      sorting_group_id: Info
#      sorting_weight: 26

#  - name: "Marstek AC Offgrid Current"
#    id: "lilygo_rs485_marstek_ac_offgrid_current"
#    icon: mdi:current-ac
#    platform: modbus_controller
#    state_class: measurement
#    modbus_controller_id: mt
#    register_type: holding
#    address: 32301
#    value_type: U_WORD
#    unit_of_measurement: "A"
#    device_class: current
#    accuracy_decimals: 2
#    filters:
#      - multiply: 0.01
#    web_server:
#      sorting_group_id: Info
#      sorting_weight: 27

#  - name: "Marstek AC Offgrid Power"
#    id: "lilygo_rs485_marstek_ac_offgrid_power"
#    icon: mdi:flash
#    platform: modbus_controller
#    state_class: measurement
#    modbus_controller_id: mt
#    register_type: holding
#    address: 32302
#    value_type: S_DWORD
#    unit_of_measurement: "W"
#    device_class: power
#    state_class: measurement
#    accuracy_decimals: 0
#    web_server:
#      sorting_group_id: Info
#      sorting_weight: 28

  - name: "Marstek Total Charging Energy"
    id: "lilygo_rs485_marstek_total_charging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33000
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    web_server:
      sorting_group_id: Info
      sorting_weight: 12

  - name: "Marstek Total Discharging Energy"
    id: "lilygo_rs485_marstek_total_discharging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33002
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    web_server:
      sorting_group_id: Info
      sorting_weight: 13

  - name: "Marstek Daily Charging Energy"
    id: "lilygo_rs485_marstek_daily_charging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33004
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    web_server:
      sorting_group_id: Info
      sorting_weight: 8

  - name: "Marstek Daily Discharging Energy"
    id: "lilygo_rs485_marstek_daily_discharging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33006
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    web_server:
      sorting_group_id: Info
      sorting_weight: 9

# Slow Sensor
  - name: "Marstek Monthly Charging Energy"
    id: "lilygo_rs485_marstek_monthly_charging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33008
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    skip_updates: 60 # 5 minutes
    web_server:
      sorting_group_id: Info
      sorting_weight: 10

# Slow Sensor
  - name: "Marstek Monthly Discharging Energy"
    id: "lilygo_rs485_marstek_monthly_discharging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33010
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    skip_updates: 60 # 5 minutes
    web_server:
      sorting_group_id: Info
      sorting_weight: 11

  - name: "Marstek Internal Temperature"
    id: "lilygo_rs485_marstek_internal_temperature"
    icon: mdi:thermometer
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35000
    value_type: S_WORD
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
    skip_updates: 60 # 5 minutes
    web_server:
      sorting_group_id: Info
      sorting_weight: 19

  - name: "Marstek Internal MOS1 Temperature"
    id: "lilygo_rs485_marstek_internal_mos1_temperature"
    icon: mdi:thermometer
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35001
    value_type: S_WORD
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
    skip_updates: 60 # 5 minutes
    web_server:
      sorting_group_id: Info
      sorting_weight: 20

# Slow Sensor    
  - name: "Marstek Internal MOS2 Temperature"
    id: "lilygo_rs485_marstek_internal_mos2_temperature"
    icon: mdi:thermometer
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35002
    value_type: S_WORD
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    skip_updates: 60 # 5 minutes
    filters:
      - multiply: 0.1
    web_server:
      sorting_group_id: Info
      sorting_weight: 21

  - name: "Marstek Max. Cell Temperature"
    id: "lilygo_rs485_marstek_max_cell_temperature"
    icon: mdi:thermometer
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35010
    value_type: S_WORD
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    skip_updates: 60 # 5 minutes
    filters:
      - multiply: 1
    web_server:
      sorting_group_id: Info
      sorting_weight: 22
    
  - name: "Marstek Min. Cell Temperature"
    id: "lilygo_rs485_marstek_min_cell_temperature"
    icon: mdi:thermometer
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35011
    value_type: S_WORD
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    filters:
      - multiply: 1
    web_server:
      sorting_group_id: Info
      sorting_weight: 23
    
  - name: "Marstek Battery Charge Voltage Limit"
    id: "lilygo_rs485_marstek_battery_charge_voltage_limit"
    icon: mdi:sine-wave
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35110
    value_type: U_WORD
    unit_of_measurement: "V"
    device_class: voltage
    accuracy_decimals: 1
    state_class: measurement
    filters:
      - multiply: 0.1
    web_server:
      sorting_group_id: Info
      sorting_weight: 16

  - name: "Marstek Battery Charge Current Limit"
    id: "lilygo_rs485_marstek_battery_charge_current_limit"
    icon: mdi:current-dc
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35111
    value_type: S_WORD
    unit_of_measurement: "A"
    device_class: current
    accuracy_decimals: 0
    state_class: measurement
    skip_updates: 60 # 5 minutes
    filters:
      - multiply: 0.01
    web_server:
      sorting_group_id: Info
      sorting_weight: 17

  - name: "Marstek Battery Discharge Current Limit"
    id: "lilygo_rs485_marstek_battery_discharge_current_limit"
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35112
    value_type: S_WORD
    unit_of_measurement: "A"
    device_class: current
    accuracy_decimals: 0
    skip_updates: 60 # 5 minutes
    state_class: measurement
    filters:
      - multiply: 0.01
    web_server:
      sorting_group_id: Info
      sorting_weight: 18

  - name: "Marstek Battery Maximum Cell Voltage"
    platform: modbus_controller
    icon: mdi:sine-wave
    modbus_controller_id: mt
    register_type: holding
    address: 37007
    value_type: U_WORD
    unit_of_measurement: "V"
    device_class: voltage
    accuracy_decimals: 2
    state_class: measurement
    filters:
      - multiply: 0.001
    id: marstek_max_cell_voltage
    skip_updates: 10
    web_server:
      sorting_group_id: Info
      sorting_weight: 24

  - name: "Marstek Battery Minimum Cell Voltage"
    platform: modbus_controller
    icon: mdi:sine-wave
    modbus_controller_id: mt
    register_type: holding
    address: 37008
    value_type: U_WORD
    unit_of_measurement: "V"
    device_class: voltage
    accuracy_decimals: 2
    state_class: measurement
    filters:
      - multiply: 0.001
    id: marstek_min_cell_voltage
    skip_updates: 10
    web_server:
      sorting_group_id: Info
      sorting_weight: 25

  - platform: template
    name: "Marstek Battery Cell Voltage Delta"
    icon: mdi:sine-wave
    unit_of_measurement: "V"
    device_class: voltage
    accuracy_decimals: 3
    state_class: measurement
    lambda: |-
      if (isnan(id(marstek_max_cell_voltage).state) || isnan(id(marstek_min_cell_voltage).state)) {
        return NAN;
      }
      return id(marstek_max_cell_voltage).state - id(marstek_min_cell_voltage).state;
    web_server:
      sorting_group_id: Info
      sorting_weight: 26
  
  - platform: wifi_signal
    name: "WiFi Signal Strength"
    icon: mdi:wifi
    id: "wifi_strength" # Was wifi_strength
    update_interval: 30s
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 6

  # An internal sensor to check Modbus communication status.
  - platform: modbus_controller
    modbus_controller_id: mt
    name: "Modbus Status"
    icon: mdi:transit-connection
    id: "modbus_status" # Was modbus_status
    register_type: holding
    address: 32104  # Using the Battery SOC register as a reference
    value_type: U_WORD
    internal: true
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 15

# Instellingen en modi (Select en Number)
select:
  - name: "Marstek RS485 Control Mode"
    id: "lilygo_rs485_marstek_rs485_control_mode"
    icon: mdi:connection
    platform: modbus_controller
    modbus_controller_id: mt
    address: 42000
    value_type: U_WORD
    optionsmap:
      "enable": 21930
      "disable": 21947
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 1

  - name: "Marstek Forcible Charge/Discharge" 
    id: "lilygo_rs485_marstek_forcible_chargedischarge"
    platform: modbus_controller
    modbus_controller_id: mt
    address: 42010
    value_type: U_WORD
    optionsmap:
      "stop": 0
      "charge": 1
      "discharge": 2
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 4

  - name: "Marstek Backup Function"
    id: "lilygo_rs485_marstek_backup_function"
    platform: modbus_controller
    modbus_controller_id: mt
    address: 41200
    value_type: U_WORD
    optionsmap:
      "enable": 0
      "disable": 1
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 3 

  - name: "Marstek User Work Mode"
    id: "lilygo_rs485_marstek_user_work_mode"
    icon: mdi:auto-mode
    platform: modbus_controller
    modbus_controller_id: mt
    address: 43000
    value_type: U_WORD
    optionsmap:
      "manual": 0
      "anti-feed": 1
      "ai": 2
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 2

number:
  - name: "Marstek Forcible Charge Power"
    id: "lilygo_rs485_marstek_forcible_charge_power"
    icon: mdi:tune-variant
    mode: box
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 42020
    value_type: U_WORD
    unit_of_measurement: "W"
    min_value: 0
    max_value: 2500
    step: 1
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 5

  - name: "Marstek Charge To SOC"
    id: "lilygo_rs485_marstek_charge_to_soc"
    icon: mdi:battery-charging-medium 
    mode: box
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 42011
    value_type: U_WORD
    unit_of_measurement: "%"
    min_value: 12
    max_value: 100
    step: 1
    web_server:
      sorting_group_id: Control
      sorting_weight: 9

  - name: "Marstek Forcible Discharge Power"
    id: "lilygo_rs485_marstek_forcible_discharge_power"
    icon: mdi:tune-variant
    mode: box
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 42021
    value_type: U_WORD
    unit_of_measurement: "W"
    min_value: 0
    max_value: 2500
    step: 1
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 6

  - name: "Marstek Charging Cutoff Capacity"
    id: "lilygo_rs485_marstek_charging_cutoff_capacity"
    icon: mdi:battery-90
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 44000
    value_type: U_WORD
    unit_of_measurement: "%"
    min_value: 80
    max_value: 100
    multiply: 10

  - name: "Marstek Discharging Cutoff Capacity"
    id: "lilygo_rs485_marstek_discharging_cutoff_capacity"
    icon: mdi:battery-10
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 44001
    value_type: U_WORD
    unit_of_measurement: "%"
    min_value: 12
    max_value: 30
    multiply: 10

  - name: "Marstek Max. Charge Power"
    id: "lilygo_rs485_marstek_max_charge_power"
    icon: mdi:tune-variant
    mode: box
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 44002
    value_type: U_WORD
    unit_of_measurement: "W"
    min_value: 0
    max_value: 2500
    step: 1

# Slow Sensor
  - name: "Marstek Max. Discharge Power"
    id: "lilygo_rs485_marstek_max_discharge_power"
    icon: mdi:tune-variant
    mode: box
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 44003
    value_type: U_WORD
    unit_of_measurement: "W"
    min_value: 0
    max_value: 2500
    step: 1
    skip_updates: 2 # 10 seconds



Logs:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
3:48:09][D][text_sensor:069]: 'Marstek Inverter State': Sending state 'Unknown'
[13:48:12][D][modbus_controller:039]: Modbus command to device=1 register=0x7D64 no response received - removed from send queue
[13:48:12][D][modbus_controller:039]: Modbus command to device=1 register=0x7DC8 no response received - removed from send queue
[13:48:13][D][modbus_controller:039]: Modbus command to device=1 register=0x891C no response received - removed from send queue
[13:48:13][D][modbus_controller:039]: Modbus command to device=1 register=0x8CA0 no response received - removed from send queue
[13:48:13][D][modbus_controller:039]: Modbus command to device=1 register=0x8D04 no response received - removed from send queue
[13:48:14][D][modbus_controller:039]: Modbus command to device=1 register=0x908F no response received - removed from send queue
[13:48:14][D][text_sensor:069]: 'Marstek Inverter State': Sending state 'Unknown'
[13:48:14][D][modbus_controller:039]: Modbus command to device=1 register=0xA0F0 no response received - removed from send queue
[13:48:14][D][modbus_controller:039]: Modbus command to device=1 register=0xA410 no response received - removed from send queue
[13:48:15][D][modbus_controller:039]: Modbus command to device=1 register=0xA41A no response received - removed from send queue
[13:48:15][D][modbus_controller:039]: Modbus command to device=1 register=0xA424 no response received - removed from send queue
[13:48:15][D][modbus_controller:039]: Modbus command to device=1 register=0xA7F8 no response received - removed from send queue
[13:48:15][D][modbus_controller:039]: Modbus command to device=1 register=0xABE0 no response received - removed from send queue
[13:48:17][D][modbus_controller:039]: Modbus command to device=1 register=0x891C no response received - removed from send queue
[13:48:17][D][modbus_controller:039]: Modbus command to device=1 register=0x8CA0 no response received - removed from send queue
[13:48:18][D][modbus_controller:039]: Modbus command to device=1 register=0x8D04 no response received - removed from send queue
[13:48:19][D][text_sensor:069]: 'Marstek Inverter State': Sending state 'Unknown'
[13:48:22][D][modbus_controller:039]: Modbus command to device=1 register=0x891C no response received - removed from send queue

Acties:
  • 0 Henk 'm!
Jobbr schreef op dinsdag 2 september 2025 @ 13:52:
Dag allen,

Fantastisch project dat jullie hebben gecreëerd.
Ik ben sinds kort ook de trotse eigenaar van een Marstek Venus v2.0, alleen krijg ik geen data uit de RS485.

Model: Marstek Venus-E v2.0 - MST-BIE5-2500
Ik heb een LilyGo aangesloten. De aansluiting is volgens mij correct, maar ik heb voor de zekerheid toch even een foto toegevoegd.

De esp webpage werkt wel en de data komt mooi uit de LilyGo. De logs voor de modbus zijn echter steeds unknown. De code van mijn esp heb ik ook even bijgevoegd ter volledigheid.

Iemand die enig idee heeft wat er mis gaat? Ik heb zelf al enige tijd zitten zoeken, maar ik word er maar niet wijzer uit :)

code:
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
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
esphome:
  name: marstek-venus-v20
  friendly_name: Marstek Venus v2.0

esp32:
  board: esp32dev
  framework:
    type: esp-idf

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "!secret_key"

ota:
  - platform: esphome
    password: "!secret_password"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "!secret_SSID"
    password: "!secret_password"

captive_portal:

web_server:
  port: 80
  version: 3
  include_internal: False
#  ota: False
  local: True
  sorting_groups:
    - id: Info
      name: "Info"
      sorting_weight: -40
    - id: Control
      name: "Control"
      sorting_weight: -30
    - id: Status
      name: "Status"
      sorting_weight: -20
    - id: Diagnostic
      name: "Diagnostic"
      sorting_weight: -10

# Configure UART
uart:
  - id: mod_bus
    rx_pin: GPIO32
    tx_pin: GPIO33
    baud_rate: 115200
    data_bits: 8
    stop_bits: 1
    parity: NONE

modbus:
  - uart_id: mod_bus
    id: modbus1
    send_wait_time: 50ms

modbus_controller:
  - id: mt
    address: 0x1
    modbus_id: modbus1
    command_throttle: 50ms
    update_interval: 5s

# Tekstsensoren
text_sensor:
  - platform: modbus_controller
    name: "Device Name"
    icon: mdi:rename-outline
    id: device_name
    modbus_controller_id: mt
    register_type: holding
    address: 31000
    register_count: 10
    response_size: 20
    skip_updates: 60 # 5 minutes
    entity_category: diagnostic
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 7

  - platform: template
    name: "Software Version"
    id: software_version_text
    icon: mdi:factory
    update_interval: never  # updates only when sensor triggers
    entity_category: diagnostic
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 8

  - platform: template
    name: "Firmware Version"
    id: firmware_version_text
    icon: mdi:factory
    update_interval: never  # updates only when sensor triggers
    entity_category: diagnostic
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 9

  - platform: template
    name: "BMS Version"
    id: bms_version_text
    icon: mdi:factory
    update_interval: never  # updates only when sensor triggers
    entity_category: diagnostic
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 10

  # - name: "Marstek SN Code"
  #   platform: modbus_controller
  #   modbus_controller_id: mt
  #   register_type: holding
  #   address: 31200
  #   register_count: 10
  #   response_size: 20
  #   skip_updates: 60 # 5 minutes

  - platform: template
    name: "Marstek Inverter State"
    lambda: |-
      switch (int(id(inverter_state).state)) {
        case 0: return std::string("Sleep");
        case 1: return std::string("Standby");
        case 2: return std::string("Charge");
        case 3: return std::string("Discharge");
        case 4: return std::string("Fault");
        case 5: return std::string("Idle");
        case 6: return std::string("AC bypass");
        default: return std::string("Unknown");
      };
    update_interval: 5s
    web_server:
      sorting_group_id: Info
      sorting_weight: 4

  - platform: wifi_info
    ip_address:
      name: ESP IP
      icon: mdi:ip
      web_server:
        sorting_group_id: Diagnostic
        sorting_weight: 4
    ssid:
      name: ESP SSID
      icon: mdi:wifi
      web_server:
        sorting_group_id: Diagnostic
        sorting_weight: 3

  - platform: version
    name: ESP Version
    hide_timestamp: true
    disabled_by_default: false
    icon: mdi:new-box
    entity_category: diagnostic
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 2

  - platform: modbus_controller
    id: wifi_status
    name: "Wifi status"
    modbus_controller_id: mt
    register_type: holding
    address: 30300
    raw_encode: NONE
    icon: mdi:wifi-alert
    entity_category: diagnostic
    skip_updates: 20
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "Disconnected"; break;
        case 1:  mode_str = "Connected"; break;                                                              
      }
      return mode_str;
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 20

  - platform: modbus_controller
    id: bt_status
    name: "BT status"
    modbus_controller_id: mt
    register_type: holding
    address: 30301
    raw_encode: NONE
    icon: mdi:home-heart
    entity_category: diagnostic
    skip_updates: 20
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "Off"; break;
        case 1:  mode_str = "Active after boot"; break;    
        case 2:  mode_str = "Connected"; break; 
        case 3:  mode_str = "Active"; break;                                                           
      }
      return mode_str;
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 21

  - platform: modbus_controller
    id: cloud_status
    name: "Cloud status"
    modbus_controller_id: mt
    register_type: holding
    address: 30302
    raw_encode: NONE
    icon: mdi:home-heart
    entity_category: diagnostic
    skip_updates: 20
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "Disconnected"; break;
        case 1:  mode_str = "Connected"; break;                                                              
      }
      return mode_str;
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 22

  - platform: modbus_controller
    id: power_restriction_discharge
    name: "Power restriction"
    modbus_controller_id: mt
    register_type: holding
    address: 41010
    raw_encode: NONE
    icon: mdi:home-heart
    entity_category: diagnostic
    skip_updates: 20
    lambda: |-
      uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
      ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
      std::string mode_str;
      switch (int_mode) {
        case 0:  mode_str = "Off"; break;
        case 1:  mode_str = "800W limited"; break;                                                              
      }
      return mode_str;
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 23

# Binaire sensoren
binary_sensor:
  - platform: modbus_controller
    name: "Marstek PLL Abnormal Restart"
    id: "lilygo_rs485_marstek_pll_abnormal_restart"
    icon: mdi:flash-triangle
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x01

  - platform: modbus_controller
    name: "Marstek Overtemperature Limit"
    icon: mdi:thermometer-alert
    id: "lilygo_rs485_marstek_overtemperature_limit"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x02

  - platform: modbus_controller
    name: "Marstek Low Temperature Limit"
    icon: mdi:thermometer-alert
    id: "lilygo_rs485_marstek_low_temperature_limit"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x04

  - platform: modbus_controller
    name: "Marstek Fan Abnormal Warning"
    icon: mdi:fan-alert
    id: "lilygo_rs485_marstek_fan_abnormal_warning"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x08

  - platform: modbus_controller
    name: "Marstek Low Battery SOC Warning"
    icon: mdi:battery-off-outline
    id: "lilygo_rs485_marstek_low_battery_soc_warning"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x16

  - platform: modbus_controller
    name: "Marstek Output Overcurrent Warning"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_output_overcurrent_warning"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x32

  - platform: modbus_controller
    name: "Marstek Abnormal Line Sequence Detection"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_abnormal_line_sequence_detection"
    modbus_controller_id: mt
    register_type: holding
    address: 36000
    bitmask: 0x64

  - platform: modbus_controller
    name: "Marstek Wifi Abnormal"
    icon: mdi:wifi-alert
    id: "lilygo_rs485_marstek_wifi_abnormal"
    modbus_controller_id: mt
    register_type: holding
    address: 36001
    bitmask: 0x01

  - platform: modbus_controller
    name: "Marstek BLE abnormal"
    icon: mdi:bluetooth-off
    id: "lilygo_rs485_marstek_ble_abnormal"
    modbus_controller_id: mt
    register_type: holding
    address: 36001
    bitmask: 0x02

  - platform: modbus_controller
    name: "Marstek Network abnormal"
    icon: mdi:network-off
    id: "lilygo_rs485_marstek_network_abnormal"
    modbus_controller_id: mt
    register_type: holding
    address: 36001
    bitmask: 0x04

  - platform: modbus_controller
    name: "Marstek CT connection abnormal"
    icon: mdi:robot-vacuum-alert
    id: "lilygo_rs485_marstek_ct_connection_abnormal"
    modbus_controller_id: mt
    register_type: holding
    address: 36001
    bitmask: 0x08

  - platform: modbus_controller
    name: "Marstek Grid overvoltage"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_grid_overvoltage"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x01

  - platform: modbus_controller
    name: "Marstek Grid undervoltage"
    icon: mdi:flash-triangle-outline
    id: "lilygo_rs485_marstek_grid_undervoltage"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x02

  - platform: modbus_controller
    name: "Marstek Grid overfrequency"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_grid_overfrequency"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x04

  - platform: modbus_controller
    name: "Marstek Grid underfrequency"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_grid_underfrequency"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x08

  - platform: modbus_controller
    name: "Marstek Grid peak voltage abnormal"
    icon: mdi:alert-plus
    id: "lilygo_rs485_marstek_grid_peak_voltage_abnormal"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x10

  - platform: modbus_controller
    name: "Marstek Current Dcover"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_current_dcover"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x20

  - platform: modbus_controller
    name: "Marstek Voltage Dcover"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_voltage_dcover"
    modbus_controller_id: mt
    register_type: holding
    address: 36100
    bitmask: 0x40

  - platform: modbus_controller
    name: "Marstek BAT overvoltage"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_bat_overvoltage"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x01

  - platform: modbus_controller
    name: "Marstek BAT undervoltage"
    icon: mdi:flash-triangle-outline
    id: "lilygo_rs485_marstek_bat_undervoltage"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x02

  - platform: modbus_controller
    name: "Marstek BAT overcurrent"
    icon: mdi:wave-undercurrent
    id: "lilygo_rs485_marstek_bat_overcurrent"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x04

  - platform: modbus_controller
    name: "Marstek BAT low SOC"
    icon: mdi:battery-off-outline
    id: "lilygo_rs485_marstek_bat_low_soc"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x08

  - platform: modbus_controller
    name: "Marstek BAT communication failure"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_bat_communication_failure"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x10

  - platform: modbus_controller
    name: "Marstek BMS protect"
    icon: mdi:flash-triangle
    id: "lilygo_rs485_marstek_bms_protect"
    modbus_controller_id: mt
    register_type: holding
    address: 36101
    bitmask: 0x20

  - platform: status
    name: "WiFi Status"
    id: "lilygo_rs485_wifi_status"

# Sensoren
sensor:
  - name: "Marstek Battery Wifi Signal Strength"
    id: lilygo_rs485_marstek_battery_wifi_signal_strenght
    icon: mdi:wifi
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 30303
    value_type: U_WORD
    unit_of_measurement: "dBm"
    filters:
      - multiply: -1
    accuracy_decimals: 0   
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 7

  - platform: copy # Reports the Battery signal strength in %
    source_id: lilygo_rs485_marstek_battery_wifi_signal_strenght
    name: "Marstek Battery Wifi Signal"
    id: battery_wifi_signal_proc
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: " %"
    entity_category: diagnostic
    device_class: ""
    icon: mdi:wifi
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 6

  - platform: modbus_controller
    id: inverter_state  # No name, since it's internal
    icon: mdi:state-machine
    modbus_controller_id: mt
    register_type: holding
    address: 35100
    value_type: U_WORD
    internal: true # Hides from Home Assistant
    web_server:
      sorting_group_id: Info
      sorting_weight: 30

  - platform: modbus_controller
    id: software_version # No name, since it's internal
    icon: mdi:factory
    modbus_controller_id: mt
    register_type: holding
    address: 31100
    value_type: U_WORD
    accuracy_decimals: 0
    skip_updates: 60 # 5 minutes
    internal: true # Hides from Home Assistant
    on_value:
      then:
        - lambda: |-
            int version = (int)x;
            char buf[5];
            sprintf(buf, "V%d", version);
            id(software_version_text).publish_state(buf);

  - platform: modbus_controller
    id: firmware_version # No name, since it's internal
    icon: mdi:factory
    modbus_controller_id: mt
    register_type: holding
    address: 31101
    value_type: U_WORD
    accuracy_decimals: 0
    skip_updates: 60 # 5 minutes
    internal: true # Hides from Home Assistant
    on_value:
      then:
        - lambda: |-
            int version = (int)x;
            char buf[5];
            sprintf(buf, "V%d", version);
            id(firmware_version_text).publish_state(buf);

  - platform: modbus_controller
    id: bms_version
    icon: mdi:factory
    modbus_controller_id: mt
    register_type: holding
    address: 31102
    value_type: U_WORD
    accuracy_decimals: 0
    skip_updates: 60 # 5 minutes
    internal: true
    on_value:
      then:
        - lambda: |-
            int version = (int)x;
            char buf[5];
            sprintf(buf, "V%d", version);
            id(bms_version_text).publish_state(buf);
  
  - name: "Marstek Battery Voltage (Average)"
    id: "lilygo_rs485_marstek_battery_voltage_average"
    icon: mdi:sine-wave
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32100
    value_type: U_WORD
    unit_of_measurement: "V"
    device_class: voltage
    accuracy_decimals: 2
    state_class: measurement
    filters:
      - multiply: 0.01
    web_server:
      sorting_group_id: Info
      sorting_weight: 16
    
  - name: "Marstek Battery Current (Average)"
    id: "lilygo_rs485_marstek_battery_current_average"
    icon: mdi:current-dc
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32101
    value_type: S_WORD
    unit_of_measurement: "A"
    device_class: current
    accuracy_decimals: 2
    state_class: measurement
    filters:
      - multiply: 0.01
    web_server:
      sorting_group_id: Info
      sorting_weight: 15

  - name: "Marstek Battery Power"
    id: "lilygo_rs485_marstek_battery_power"
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32102
    value_type: S_DWORD
    unit_of_measurement: "W"
    device_class: power
    state_class: measurement
    accuracy_decimals: 0
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Info
      sorting_weight: 14

  - name: "Marstek Battery State Of Charge"
    id: "lilygo_rs485_marstek_battery_state_of_charge" # Was marstek_soc
    platform: modbus_controller
    device_class: battery
    state_class: measurement
    modbus_controller_id: mt
    register_type: holding
    address: 32104
    value_type: U_WORD
    unit_of_measurement: "%"
    accuracy_decimals: 0
    web_server:
      sorting_group_id: Info
      sorting_weight: 5

# Slow Sensor
  - name: "Marstek Battery Total Energy"
    id: "lilygo_rs485_marstek_battery_total_energy" # Was marstek_total_energy
    icon: mdi:battery-charging-100
    platform: modbus_controller
    device_class: energy_storage
    state_class: measurement
    modbus_controller_id: mt
    register_type: holding
    address: 32105 
    value_type: U_WORD
    unit_of_measurement: "kWh"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001 # Firmware 148: 0.001 / Firmware 147: 0.01
    skip_updates: 60 # 5 minutes
    web_server:
      sorting_group_id: Info
      sorting_weight: 7

  - platform: template
    name: "Marstek Battery Remaining Capacity"
    id: "lilygo_rs485_marstek_battery_remaining_capacity"
    icon: mdi:battery-arrow-down-outline
    unit_of_measurement: "kWh"
    accuracy_decimals: 2
    update_interval: 300s
    lambda: |-
      if (id(lilygo_rs485_marstek_battery_total_energy).has_state() && id(lilygo_rs485_marstek_battery_state_of_charge).has_state()) {
        float total_energy = id(lilygo_rs485_marstek_battery_total_energy).state;
        float soc = id(lilygo_rs485_marstek_battery_state_of_charge).state / 100.0;
        return roundf(total_energy * soc * 100) / 100; // Ensures two decimal places
      }
      return NAN;
    web_server:
      sorting_group_id: Info
      sorting_weight: 6

  - name: "Marstek AC Voltage"
    id: "lilygo_rs485_marstek_ac_voltage"
    icon: mdi:current-ac
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32200
    value_type: U_WORD
    unit_of_measurement: "V"
    device_class: voltage
    state_class: measurement
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
    web_server:
      sorting_group_id: Info
      sorting_weight: 3

  - name: "Marstek AC Current"
    id: "lilygo_rs485_marstek_ac_current"
    icon: mdi:current-ac
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32201
    value_type: U_WORD
    unit_of_measurement: "A"
    device_class: current
    state_class: measurement
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    web_server:
      sorting_group_id: Info
      sorting_weight: 2

# Slow Sensor
  - name: "Marstek AC Power"
    id: "lilygo_rs485_marstek_ac_power"
    icon: mdi:flash
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 32202
    value_type: S_DWORD
    unit_of_measurement: "W"
    device_class: power
    state_class: measurement
    accuracy_decimals: 0
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Info
      sorting_weight: 1

#  - name: "Marstek AC Offgrid Voltage"
#    id: "lilygo_rs485_marstek_ac_offgrid_voltage"
#    icon: mdi:sine-wave
#    platform: modbus_controller
#    modbus_controller_id: mt
#    state_class: measurement
#    register_type: holding
#    address: 32300
#    value_type: U_WORD
#    unit_of_measurement: "V"
#    device_class: voltage
#    accuracy_decimals: 2
#    filters:
#      - multiply: 0.1
#    web_server:
#      sorting_group_id: Info
#      sorting_weight: 26

#  - name: "Marstek AC Offgrid Current"
#    id: "lilygo_rs485_marstek_ac_offgrid_current"
#    icon: mdi:current-ac
#    platform: modbus_controller
#    state_class: measurement
#    modbus_controller_id: mt
#    register_type: holding
#    address: 32301
#    value_type: U_WORD
#    unit_of_measurement: "A"
#    device_class: current
#    accuracy_decimals: 2
#    filters:
#      - multiply: 0.01
#    web_server:
#      sorting_group_id: Info
#      sorting_weight: 27

#  - name: "Marstek AC Offgrid Power"
#    id: "lilygo_rs485_marstek_ac_offgrid_power"
#    icon: mdi:flash
#    platform: modbus_controller
#    state_class: measurement
#    modbus_controller_id: mt
#    register_type: holding
#    address: 32302
#    value_type: S_DWORD
#    unit_of_measurement: "W"
#    device_class: power
#    state_class: measurement
#    accuracy_decimals: 0
#    web_server:
#      sorting_group_id: Info
#      sorting_weight: 28

  - name: "Marstek Total Charging Energy"
    id: "lilygo_rs485_marstek_total_charging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33000
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    web_server:
      sorting_group_id: Info
      sorting_weight: 12

  - name: "Marstek Total Discharging Energy"
    id: "lilygo_rs485_marstek_total_discharging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33002
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    web_server:
      sorting_group_id: Info
      sorting_weight: 13

  - name: "Marstek Daily Charging Energy"
    id: "lilygo_rs485_marstek_daily_charging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33004
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    web_server:
      sorting_group_id: Info
      sorting_weight: 8

  - name: "Marstek Daily Discharging Energy"
    id: "lilygo_rs485_marstek_daily_discharging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33006
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    web_server:
      sorting_group_id: Info
      sorting_weight: 9

# Slow Sensor
  - name: "Marstek Monthly Charging Energy"
    id: "lilygo_rs485_marstek_monthly_charging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33008
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    skip_updates: 60 # 5 minutes
    web_server:
      sorting_group_id: Info
      sorting_weight: 10

# Slow Sensor
  - name: "Marstek Monthly Discharging Energy"
    id: "lilygo_rs485_marstek_monthly_discharging_energy"
    icon: mdi:chart-bar
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 33010
    value_type: U_DWORD
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
    register_count: 2
    skip_updates: 60 # 5 minutes
    web_server:
      sorting_group_id: Info
      sorting_weight: 11

  - name: "Marstek Internal Temperature"
    id: "lilygo_rs485_marstek_internal_temperature"
    icon: mdi:thermometer
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35000
    value_type: S_WORD
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
    skip_updates: 60 # 5 minutes
    web_server:
      sorting_group_id: Info
      sorting_weight: 19

  - name: "Marstek Internal MOS1 Temperature"
    id: "lilygo_rs485_marstek_internal_mos1_temperature"
    icon: mdi:thermometer
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35001
    value_type: S_WORD
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
    skip_updates: 60 # 5 minutes
    web_server:
      sorting_group_id: Info
      sorting_weight: 20

# Slow Sensor    
  - name: "Marstek Internal MOS2 Temperature"
    id: "lilygo_rs485_marstek_internal_mos2_temperature"
    icon: mdi:thermometer
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35002
    value_type: S_WORD
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    skip_updates: 60 # 5 minutes
    filters:
      - multiply: 0.1
    web_server:
      sorting_group_id: Info
      sorting_weight: 21

  - name: "Marstek Max. Cell Temperature"
    id: "lilygo_rs485_marstek_max_cell_temperature"
    icon: mdi:thermometer
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35010
    value_type: S_WORD
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    skip_updates: 60 # 5 minutes
    filters:
      - multiply: 1
    web_server:
      sorting_group_id: Info
      sorting_weight: 22
    
  - name: "Marstek Min. Cell Temperature"
    id: "lilygo_rs485_marstek_min_cell_temperature"
    icon: mdi:thermometer
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35011
    value_type: S_WORD
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    filters:
      - multiply: 1
    web_server:
      sorting_group_id: Info
      sorting_weight: 23
    
  - name: "Marstek Battery Charge Voltage Limit"
    id: "lilygo_rs485_marstek_battery_charge_voltage_limit"
    icon: mdi:sine-wave
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35110
    value_type: U_WORD
    unit_of_measurement: "V"
    device_class: voltage
    accuracy_decimals: 1
    state_class: measurement
    filters:
      - multiply: 0.1
    web_server:
      sorting_group_id: Info
      sorting_weight: 16

  - name: "Marstek Battery Charge Current Limit"
    id: "lilygo_rs485_marstek_battery_charge_current_limit"
    icon: mdi:current-dc
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35111
    value_type: S_WORD
    unit_of_measurement: "A"
    device_class: current
    accuracy_decimals: 0
    state_class: measurement
    skip_updates: 60 # 5 minutes
    filters:
      - multiply: 0.01
    web_server:
      sorting_group_id: Info
      sorting_weight: 17

  - name: "Marstek Battery Discharge Current Limit"
    id: "lilygo_rs485_marstek_battery_discharge_current_limit"
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 35112
    value_type: S_WORD
    unit_of_measurement: "A"
    device_class: current
    accuracy_decimals: 0
    skip_updates: 60 # 5 minutes
    state_class: measurement
    filters:
      - multiply: 0.01
    web_server:
      sorting_group_id: Info
      sorting_weight: 18

  - name: "Marstek Battery Maximum Cell Voltage"
    platform: modbus_controller
    icon: mdi:sine-wave
    modbus_controller_id: mt
    register_type: holding
    address: 37007
    value_type: U_WORD
    unit_of_measurement: "V"
    device_class: voltage
    accuracy_decimals: 2
    state_class: measurement
    filters:
      - multiply: 0.001
    id: marstek_max_cell_voltage
    skip_updates: 10
    web_server:
      sorting_group_id: Info
      sorting_weight: 24

  - name: "Marstek Battery Minimum Cell Voltage"
    platform: modbus_controller
    icon: mdi:sine-wave
    modbus_controller_id: mt
    register_type: holding
    address: 37008
    value_type: U_WORD
    unit_of_measurement: "V"
    device_class: voltage
    accuracy_decimals: 2
    state_class: measurement
    filters:
      - multiply: 0.001
    id: marstek_min_cell_voltage
    skip_updates: 10
    web_server:
      sorting_group_id: Info
      sorting_weight: 25

  - platform: template
    name: "Marstek Battery Cell Voltage Delta"
    icon: mdi:sine-wave
    unit_of_measurement: "V"
    device_class: voltage
    accuracy_decimals: 3
    state_class: measurement
    lambda: |-
      if (isnan(id(marstek_max_cell_voltage).state) || isnan(id(marstek_min_cell_voltage).state)) {
        return NAN;
      }
      return id(marstek_max_cell_voltage).state - id(marstek_min_cell_voltage).state;
    web_server:
      sorting_group_id: Info
      sorting_weight: 26
  
  - platform: wifi_signal
    name: "WiFi Signal Strength"
    icon: mdi:wifi
    id: "wifi_strength" # Was wifi_strength
    update_interval: 30s
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 6

  # An internal sensor to check Modbus communication status.
  - platform: modbus_controller
    modbus_controller_id: mt
    name: "Modbus Status"
    icon: mdi:transit-connection
    id: "modbus_status" # Was modbus_status
    register_type: holding
    address: 32104  # Using the Battery SOC register as a reference
    value_type: U_WORD
    internal: true
    web_server:
      sorting_group_id: Diagnostic
      sorting_weight: 15

# Instellingen en modi (Select en Number)
select:
  - name: "Marstek RS485 Control Mode"
    id: "lilygo_rs485_marstek_rs485_control_mode"
    icon: mdi:connection
    platform: modbus_controller
    modbus_controller_id: mt
    address: 42000
    value_type: U_WORD
    optionsmap:
      "enable": 21930
      "disable": 21947
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 1

  - name: "Marstek Forcible Charge/Discharge" 
    id: "lilygo_rs485_marstek_forcible_chargedischarge"
    platform: modbus_controller
    modbus_controller_id: mt
    address: 42010
    value_type: U_WORD
    optionsmap:
      "stop": 0
      "charge": 1
      "discharge": 2
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 4

  - name: "Marstek Backup Function"
    id: "lilygo_rs485_marstek_backup_function"
    platform: modbus_controller
    modbus_controller_id: mt
    address: 41200
    value_type: U_WORD
    optionsmap:
      "enable": 0
      "disable": 1
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 3 

  - name: "Marstek User Work Mode"
    id: "lilygo_rs485_marstek_user_work_mode"
    icon: mdi:auto-mode
    platform: modbus_controller
    modbus_controller_id: mt
    address: 43000
    value_type: U_WORD
    optionsmap:
      "manual": 0
      "anti-feed": 1
      "ai": 2
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 2

number:
  - name: "Marstek Forcible Charge Power"
    id: "lilygo_rs485_marstek_forcible_charge_power"
    icon: mdi:tune-variant
    mode: box
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 42020
    value_type: U_WORD
    unit_of_measurement: "W"
    min_value: 0
    max_value: 2500
    step: 1
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 5

  - name: "Marstek Charge To SOC"
    id: "lilygo_rs485_marstek_charge_to_soc"
    icon: mdi:battery-charging-medium 
    mode: box
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 42011
    value_type: U_WORD
    unit_of_measurement: "%"
    min_value: 12
    max_value: 100
    step: 1
    web_server:
      sorting_group_id: Control
      sorting_weight: 9

  - name: "Marstek Forcible Discharge Power"
    id: "lilygo_rs485_marstek_forcible_discharge_power"
    icon: mdi:tune-variant
    mode: box
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 42021
    value_type: U_WORD
    unit_of_measurement: "W"
    min_value: 0
    max_value: 2500
    step: 1
    skip_updates: 2 # 10 seconds
    web_server:
      sorting_group_id: Control
      sorting_weight: 6

  - name: "Marstek Charging Cutoff Capacity"
    id: "lilygo_rs485_marstek_charging_cutoff_capacity"
    icon: mdi:battery-90
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 44000
    value_type: U_WORD
    unit_of_measurement: "%"
    min_value: 80
    max_value: 100
    multiply: 10

  - name: "Marstek Discharging Cutoff Capacity"
    id: "lilygo_rs485_marstek_discharging_cutoff_capacity"
    icon: mdi:battery-10
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 44001
    value_type: U_WORD
    unit_of_measurement: "%"
    min_value: 12
    max_value: 30
    multiply: 10

  - name: "Marstek Max. Charge Power"
    id: "lilygo_rs485_marstek_max_charge_power"
    icon: mdi:tune-variant
    mode: box
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 44002
    value_type: U_WORD
    unit_of_measurement: "W"
    min_value: 0
    max_value: 2500
    step: 1

# Slow Sensor
  - name: "Marstek Max. Discharge Power"
    id: "lilygo_rs485_marstek_max_discharge_power"
    icon: mdi:tune-variant
    mode: box
    platform: modbus_controller
    modbus_controller_id: mt
    register_type: holding
    address: 44003
    value_type: U_WORD
    unit_of_measurement: "W"
    min_value: 0
    max_value: 2500
    step: 1
    skip_updates: 2 # 10 seconds



Logs:
3:48:09][D][text_sensor:069]: 'Marstek Inverter State': Sending state 'Unknown'
[13:48:12][D][modbus_controller:039]: Modbus command to device=1 register=0x7D64 no response received - removed from send queue
[13:48:12][D][modbus_controller:039]: Modbus command to device=1 register=0x7DC8 no response received - removed from send queue
[13:48:13][D][modbus_controller:039]: Modbus command to device=1 register=0x891C no response received - removed from send queue
[13:48:13][D][modbus_controller:039]: Modbus command to device=1 register=0x8CA0 no response received - removed from send queue
[13:48:13][D][modbus_controller:039]: Modbus command to device=1 register=0x8D04 no response received - removed from send queue
[13:48:14][D][modbus_controller:039]: Modbus command to device=1 register=0x908F no response received - removed from send queue
[13:48:14][D][text_sensor:069]: 'Marstek Inverter State': Sending state 'Unknown'
[13:48:14][D][modbus_controller:039]: Modbus command to device=1 register=0xA0F0 no response received - removed from send queue
[13:48:14][D][modbus_controller:039]: Modbus command to device=1 register=0xA410 no response received - removed from send queue
[13:48:15][D][modbus_controller:039]: Modbus command to device=1 register=0xA41A no response received - removed from send queue
[13:48:15][D][modbus_controller:039]: Modbus command to device=1 register=0xA424 no response received - removed from send queue
[13:48:15][D][modbus_controller:039]: Modbus command to device=1 register=0xA7F8 no response received - removed from send queue
[13:48:15][D][modbus_controller:039]: Modbus command to device=1 register=0xABE0 no response received - removed from send queue
[13:48:17][D][modbus_controller:039]: Modbus command to device=1 register=0x891C no response received - removed from send queue
[13:48:17][D][modbus_controller:039]: Modbus command to device=1 register=0x8CA0 no response received - removed from send queue
[13:48:18][D][modbus_controller:039]: Modbus command to device=1 register=0x8D04 no response received - removed from send queue
[13:48:19][D][text_sensor:069]: 'Marstek Inverter State': Sending state 'Unknown'
[13:48:22][D][modbus_controller:039]: Modbus command to device=1 register=0x891C no response received - remo

[Afbeelding]
Je gebruikt (een aangepaste versie van) de configuratie voor de POE variant maar gebruikt volgens mij de normale. Je hebt het 'lilygo-rs485.yaml' bestand nodig.

Acties:
  • 0 Henk 'm!

  • amvolleb
  • Registratie: Juli 2016
  • Laatst online: 21:51
FritsLa schreef op dinsdag 2 september 2025 @ 10:55:
Ik probeer de viper integratie voor de Elfin te installeren op mijn home assistant green waarop HACS al is geïnstalleerd. Ik krijg dan echter een foutmelding dat de repository niet wordt gevonden. Hoe nu verder? [Afbeelding]

[Afbeelding]
Je weet dat het om een custom repository gaat? Zie https://www.hacs.xyz/docs/faq/custom_repositories/

2x MTVenus V153 5.12, CT003 V117 + 40ZP SolarEdge (NO+ZW) 13300Wp + Panasonic 16kW T-CAP + Easee EV charger


Acties:
  • 0 Henk 'm!
The Outsider schreef op dinsdag 2 september 2025 @ 13:33:
Hey specialisten,

Ik zit vast ... na meerdere pogingen kom ik toch even ten rade bij jullie ..
vermoedelijk iets kleins dat ik over het hoofd heb gezien ...

Geen data beschikbaar in HA!

Lilygo v1.1 aangeschaft
naar mijn goed vermogen de volledige manual van superduper1969 gevolgd
(Marstek Venus / Duravolt PnP Thuisaccu Modbus koppeling)

alsnog krijg ik geen data binnen in HA

wat klopt wel..
Lilygo geflasht in ESP Home en werkt volgens mij: sz volledige install werd doorlopen zonder fouten & aangesloten op de marstek geeft deze direct een rode LED (tijdens opstart) maar na enige tijd een groene LED = dus modbus en WIFI ok (Heb er ook MET fouten gehad maar was dan voornamelijk IP-gerelateerd maar werd ook opgelost)
ik zie op mijn netwerk de esp-homeweb met IP adres XXX.173
(Dit IP adres werd ook toegevoegd in yaml for use-adress)
Toch kan ik dit IP niet bereiken?
Ok de "werkwijze" van Denie van Kleef (youtube-kanaal) werd meermaals herdaan ...
API-OTA key elke keer vernieuwd ...

ben een beetje het noorden kwijt
Kan je je configuratie delen?

Acties:
  • 0 Henk 'm!

  • The Outsider
  • Registratie: September 2025
  • Laatst online: 09-09 08:10
pascallj schreef op dinsdag 2 september 2025 @ 13:57:
[...]


Kan je je configuratie delen?
Sorry .. dit is voor mij echt "back to school" :)

esphome:
name: lilygo-rs485
friendly_name: LILYGO RS485
min_version: 2024.11.0
name_add_mac_suffix: false

esp32:
board: esp32dev
framework:
type: arduino

# Enable logging
logger:
# level: VERY_VERBOSE

# Enable Home Assistant API
api:
encryption:
key: "GauAJ1zingbdKF4i0NfHXg01aerf4X3z+UgVmgFtKJk="

ota:
- platform: esphome
password: "96bae7bf41b6063438984ae7c4ecdff4"

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
use_address: 192.168.53.173

# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Lilygo-Rs485 Fallback Hotspot"
password: "GBDjgqkttbFLa93eFCaj"

web_server:
port: 80
version: 3
include_internal: False
# ota: False
local: True
sorting_groups:
- id: Info
name: "Info"
sorting_weight: -40
- id: Control
name: "Control"
sorting_weight: -30
- id: Status
name: "Status"
sorting_weight: -20
- id: Diagnostic
name: "Diagnostic"
sorting_weight: -10

# Set pins required for LilyGo T-CAN485 board
output:
- platform: gpio
id: ENABLE_PIN # Enable the chip
pin:
number: GPIO19
inverted: true

- platform: gpio
id: SE_PIN # Enable autodirection
pin:
number: GPIO17
inverted: true

- platform: gpio
id: ENABLE_5V_PIN # Enable 5V pin for RS485 chip
pin:
number: GPIO16
inverted: true

# Configure UART
uart:
- id: mod_bus
rx_pin: GPIO21
tx_pin: GPIO22
baud_rate: 115200
data_bits: 8
stop_bits: 1
parity: NONE

modbus:
- uart_id: mod_bus
id: modbus1
send_wait_time: 30ms

modbus_controller:
- id: mt
address: 0x1
modbus_id: modbus1
command_throttle: 30ms
update_interval: 5s

# Tekstsensoren
text_sensor:
- platform: modbus_controller
name: "Device Name"
icon: mdi:rename-outline
id: device_name
modbus_controller_id: mt
register_type: holding
address: 31000
register_count: 10
response_size: 20
skip_updates: 60 # 5 minutes
entity_category: diagnostic
web_server:
sorting_group_id: Diagnostic
sorting_weight: 7

- platform: template
name: "Software Version"
id: software_version_text
icon: mdi:factory
update_interval: never # updates only when sensor triggers
entity_category: diagnostic
web_server:
sorting_group_id: Diagnostic
sorting_weight: 8

- platform: template
name: "Firmware Version"
id: firmware_version_text
icon: mdi:factory
update_interval: never # updates only when sensor triggers
entity_category: diagnostic
web_server:
sorting_group_id: Diagnostic
sorting_weight: 9

- platform: template
name: "BMS Version"
id: bms_version_text
icon: mdi:factory
update_interval: never # updates only when sensor triggers
entity_category: diagnostic
web_server:
sorting_group_id: Diagnostic
sorting_weight: 10

# - name: "Marstek SN Code"
# platform: modbus_controller
# modbus_controller_id: mt
# register_type: holding
# address: 31200
# register_count: 10
# response_size: 20
# skip_updates: 60 # 5 minutes

- platform: template
name: "Marstek Inverter State"
lambda: |-
switch (int(id(inverter_state).state)) {
case 0: return std::string("Sleep");
case 1: return std::string("Standby");
case 2: return std::string("Charge");
case 3: return std::string("Discharge");
case 4: return std::string("Fault");
case 5: return std::string("Idle");
case 6: return std::string("AC bypass");
default: return std::string("Unknown");
};
update_interval: 5s
web_server:
sorting_group_id: Info
sorting_weight: 4

- platform: wifi_info
ip_address:
name: ESP IP
icon: mdi:ip
web_server:
sorting_group_id: Diagnostic
sorting_weight: 4
ssid:
name: ESP SSID
icon: mdi:wifi
web_server:
sorting_group_id: Diagnostic
sorting_weight: 3

- platform: version
name: ESP Version
hide_timestamp: true
disabled_by_default: false
icon: mdi:new-box
entity_category: diagnostic
web_server:
sorting_group_id: Diagnostic
sorting_weight: 2

- platform: modbus_controller
id: wifi_status
name: "Wifi status"
modbus_controller_id: mt
register_type: holding
address: 30300
raw_encode: NONE
icon: mdi:wifi-alert
entity_category: diagnostic
skip_updates: 20
lambda: |-
uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
std::string mode_str;
switch (int_mode) {
case 0: mode_str = "Disconnected"; break;
case 1: mode_str = "Connected"; break;
}
return mode_str;
web_server:
sorting_group_id: Diagnostic
sorting_weight: 20

- platform: modbus_controller
id: bt_status
name: "BT status"
modbus_controller_id: mt
register_type: holding
address: 30301
raw_encode: NONE
icon: mdi:home-heart
entity_category: diagnostic
skip_updates: 20
lambda: |-
uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
std::string mode_str;
switch (int_mode) {
case 0: mode_str = "Off"; break;
case 1: mode_str = "Active after boot"; break;
case 2: mode_str = "Connected"; break;
case 3: mode_str = "Active"; break;
}
return mode_str;
web_server:
sorting_group_id: Diagnostic
sorting_weight: 21

- platform: modbus_controller
id: cloud_status
name: "Cloud status"
modbus_controller_id: mt
register_type: holding
address: 30302
raw_encode: NONE
icon: mdi:home-heart
entity_category: diagnostic
skip_updates: 20
lambda: |-
uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
std::string mode_str;
switch (int_mode) {
case 0: mode_str = "Disconnected"; break;
case 1: mode_str = "Connected"; break;
}
return mode_str;
web_server:
sorting_group_id: Diagnostic
sorting_weight: 22

- platform: modbus_controller
id: power_restriction_discharge
name: "Power restriction"
modbus_controller_id: mt
register_type: holding
address: 41010
raw_encode: NONE
icon: mdi:home-heart
entity_category: diagnostic
skip_updates: 20
lambda: |-
uint16_t int_mode = (data[item->offset] << 8) + data[item->offset+1];
ESP_LOGD("main","Parsed operation mode int : %d", int_mode);
std::string mode_str;
switch (int_mode) {
case 0: mode_str = "Off"; break;
case 1: mode_str = "800W limited"; break;
}
return mode_str;
web_server:
sorting_group_id: Diagnostic
sorting_weight: 23

# Binaire sensoren
binary_sensor:
- platform: modbus_controller
name: "Marstek PLL Abnormal Restart"
id: "lilygo_rs485_marstek_pll_abnormal_restart"
icon: mdi:flash-triangle
modbus_controller_id: mt
register_type: holding
address: 36000
bitmask: 0x01

- platform: modbus_controller
name: "Marstek Overtemperature Limit"
icon: mdi:thermometer-alert
id: "lilygo_rs485_marstek_overtemperature_limit"
modbus_controller_id: mt
register_type: holding
address: 36000
bitmask: 0x02

- platform: modbus_controller
name: "Marstek Low Temperature Limit"
icon: mdi:thermometer-alert
id: "lilygo_rs485_marstek_low_temperature_limit"
modbus_controller_id: mt
register_type: holding
address: 36000
bitmask: 0x04

- platform: modbus_controller
name: "Marstek Fan Abnormal Warning"
icon: mdi:fan-alert
id: "lilygo_rs485_marstek_fan_abnormal_warning"
modbus_controller_id: mt
register_type: holding
address: 36000
bitmask: 0x08

- platform: modbus_controller
name: "Marstek Low Battery SOC Warning"
icon: mdi:battery-off-outline
id: "lilygo_rs485_marstek_low_battery_soc_warning"
modbus_controller_id: mt
register_type: holding
address: 36000
bitmask: 0x16

- platform: modbus_controller
name: "Marstek Output Overcurrent Warning"
icon: mdi:flash-triangle
id: "lilygo_rs485_marstek_output_overcurrent_warning"
modbus_controller_id: mt
register_type: holding
address: 36000
bitmask: 0x32

- platform: modbus_controller
name: "Marstek Abnormal Line Sequence Detection"
icon: mdi:flash-triangle
id: "lilygo_rs485_marstek_abnormal_line_sequence_detection"
modbus_controller_id: mt
register_type: holding
address: 36000
bitmask: 0x64

- platform: modbus_controller
name: "Marstek Wifi Abnormal"
icon: mdi:wifi-alert
id: "lilygo_rs485_marstek_wifi_abnormal"
modbus_controller_id: mt
register_type: holding
address: 36001
bitmask: 0x01

- platform: modbus_controller
name: "Marstek BLE abnormal"
icon: mdi:bluetooth-off
id: "lilygo_rs485_marstek_ble_abnormal"
modbus_controller_id: mt
register_type: holding
address: 36001
bitmask: 0x02

- platform: modbus_controller
name: "Marstek Network abnormal"
icon: mdi:network-off
id: "lilygo_rs485_marstek_network_abnormal"
modbus_controller_id: mt
register_type: holding
address: 36001
bitmask: 0x04

- platform: modbus_controller
name: "Marstek CT connection abnormal"
icon: mdi:robot-vacuum-alert
id: "lilygo_rs485_marstek_ct_connection_abnormal"
modbus_controller_id: mt
register_type: holding
address: 36001
bitmask: 0x08

- platform: modbus_controller
name: "Marstek Grid overvoltage"
icon: mdi:flash-triangle
id: "lilygo_rs485_marstek_grid_overvoltage"
modbus_controller_id: mt
register_type: holding
address: 36100
bitmask: 0x01

- platform: modbus_controller
name: "Marstek Grid undervoltage"
icon: mdi:flash-triangle-outline
id: "lilygo_rs485_marstek_grid_undervoltage"
modbus_controller_id: mt
register_type: holding
address: 36100
bitmask: 0x02

- platform: modbus_controller
name: "Marstek Grid overfrequency"
icon: mdi:flash-triangle
id: "lilygo_rs485_marstek_grid_overfrequency"
modbus_controller_id: mt
register_type: holding
address: 36100
bitmask: 0x04

- platform: modbus_controller
name: "Marstek Grid underfrequency"
icon: mdi:flash-triangle
id: "lilygo_rs485_marstek_grid_underfrequency"
modbus_controller_id: mt
register_type: holding
address: 36100
bitmask: 0x08

- platform: modbus_controller
name: "Marstek Grid peak voltage abnormal"
icon: mdi:alert-plus
id: "lilygo_rs485_marstek_grid_peak_voltage_abnormal"
modbus_controller_id: mt
register_type: holding
address: 36100
bitmask: 0x10

- platform: modbus_controller
name: "Marstek Current Dcover"
icon: mdi:flash-triangle
id: "lilygo_rs485_marstek_current_dcover"
modbus_controller_id: mt
register_type: holding
address: 36100
bitmask: 0x20

- platform: modbus_controller
name: "Marstek Voltage Dcover"
icon: mdi:flash-triangle
id: "lilygo_rs485_marstek_voltage_dcover"
modbus_controller_id: mt
register_type: holding
address: 36100
bitmask: 0x40

- platform: modbus_controller
name: "Marstek BAT overvoltage"
icon: mdi:flash-triangle
id: "lilygo_rs485_marstek_bat_overvoltage"
modbus_controller_id: mt
register_type: holding
address: 36101
bitmask: 0x01

- platform: modbus_controller
name: "Marstek BAT undervoltage"
icon: mdi:flash-triangle-outline
id: "lilygo_rs485_marstek_bat_undervoltage"
modbus_controller_id: mt
register_type: holding
address: 36101
bitmask: 0x02

- platform: modbus_controller
name: "Marstek BAT overcurrent"
icon: mdi:wave-undercurrent
id: "lilygo_rs485_marstek_bat_overcurrent"
modbus_controller_id: mt
register_type: holding
address: 36101
bitmask: 0x04

- platform: modbus_controller
name: "Marstek BAT low SOC"
icon: mdi:battery-off-outline
id: "lilygo_rs485_marstek_bat_low_soc"
modbus_controller_id: mt
register_type: holding
address: 36101
bitmask: 0x08

- platform: modbus_controller
name: "Marstek BAT communication failure"
icon: mdi:flash-triangle
id: "lilygo_rs485_marstek_bat_communication_failure"
modbus_controller_id: mt
register_type: holding
address: 36101
bitmask: 0x10

- platform: modbus_controller
name: "Marstek BMS protect"
icon: mdi:flash-triangle
id: "lilygo_rs485_marstek_bms_protect"
modbus_controller_id: mt
register_type: holding
address: 36101
bitmask: 0x20

- platform: status
name: "WiFi Status"
id: "lilygo_rs485_wifi_status"

# Sensoren
sensor:
- name: "Marstek Battery Wifi Signal Strength"
id: lilygo_rs485_marstek_battery_wifi_signal_strenght
icon: mdi:wifi
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 30303
value_type: U_WORD
unit_of_measurement: "dBm"
filters:
- multiply: -1
accuracy_decimals: 0
web_server:
sorting_group_id: Diagnostic
sorting_weight: 7

- platform: copy # Reports the Battery signal strength in %
source_id: lilygo_rs485_marstek_battery_wifi_signal_strenght
name: "Marstek Battery Wifi Signal"
id: battery_wifi_signal_proc
filters:
- lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
unit_of_measurement: " %"
entity_category: diagnostic
device_class: ""
icon: mdi:wifi
web_server:
sorting_group_id: Diagnostic
sorting_weight: 6

- platform: modbus_controller
id: inverter_state # No name, since it's internal
icon: mdi:state-machine
modbus_controller_id: mt
register_type: holding
address: 35100
value_type: U_WORD
internal: true # Hides from Home Assistant
web_server:
sorting_group_id: Info
sorting_weight: 30

- platform: modbus_controller
id: software_version # No name, since it's internal
icon: mdi:factory
modbus_controller_id: mt
register_type: holding
address: 31100
value_type: U_WORD
accuracy_decimals: 0
skip_updates: 60 # 5 minutes
internal: true # Hides from Home Assistant
on_value:
then:
- lambda: |-
int version = (int)x;
char buf[5];
sprintf(buf, "V%d", version);
id(software_version_text).publish_state(buf);

- platform: modbus_controller
id: firmware_version # No name, since it's internal
icon: mdi:factory
modbus_controller_id: mt
register_type: holding
address: 31101
value_type: U_WORD
accuracy_decimals: 0
skip_updates: 60 # 5 minutes
internal: true # Hides from Home Assistant
on_value:
then:
- lambda: |-
int version = (int)x;
char buf[5];
sprintf(buf, "V%d", version);
id(firmware_version_text).publish_state(buf);

- platform: modbus_controller
id: bms_version
icon: mdi:factory
modbus_controller_id: mt
register_type: holding
address: 31102
value_type: U_WORD
accuracy_decimals: 0
skip_updates: 60 # 5 minutes
internal: true
on_value:
then:
- lambda: |-
int version = (int)x;
char buf[5];
sprintf(buf, "V%d", version);
id(bms_version_text).publish_state(buf);

- name: "Marstek Battery Voltage (Average)"
id: "lilygo_rs485_marstek_battery_voltage_average"
icon: mdi:sine-wave
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 32100
value_type: U_WORD
unit_of_measurement: "V"
device_class: voltage
accuracy_decimals: 2
state_class: measurement
filters:
- multiply: 0.01
web_server:
sorting_group_id: Info
sorting_weight: 16

- name: "Marstek Battery Current (Average)"
id: "lilygo_rs485_marstek_battery_current_average"
icon: mdi:current-dc
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 32101
value_type: S_WORD
unit_of_measurement: "A"
device_class: current
accuracy_decimals: 2
state_class: measurement
filters:
- multiply: 0.01
web_server:
sorting_group_id: Info
sorting_weight: 15

- name: "Marstek Battery Power"
id: "lilygo_rs485_marstek_battery_power"
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 32102
value_type: S_DWORD
unit_of_measurement: "W"
device_class: power
state_class: measurement
accuracy_decimals: 0
skip_updates: 2 # 10 seconds
web_server:
sorting_group_id: Info
sorting_weight: 14

- name: "Marstek Battery State Of Charge"
id: "lilygo_rs485_marstek_battery_state_of_charge" # Was marstek_soc
platform: modbus_controller
device_class: battery
state_class: measurement
modbus_controller_id: mt
register_type: holding
address: 32104
value_type: U_WORD
unit_of_measurement: "%"
accuracy_decimals: 0
web_server:
sorting_group_id: Info
sorting_weight: 5

# Slow Sensor
- name: "Marstek Battery Total Energy"
id: "lilygo_rs485_marstek_battery_total_energy" # Was marstek_total_energy
icon: mdi:battery-charging-100
platform: modbus_controller
device_class: energy_storage
state_class: measurement
modbus_controller_id: mt
register_type: holding
address: 32105
value_type: U_WORD
unit_of_measurement: "kWh"
accuracy_decimals: 3
filters:
- multiply: 0.001 # Firmware 148: 0.001 / Firmware 147: 0.01
skip_updates: 60 # 5 minutes
web_server:
sorting_group_id: Info
sorting_weight: 7

- platform: template
name: "Marstek Battery Remaining Capacity"
id: "lilygo_rs485_marstek_battery_remaining_capacity"
icon: mdi:battery-arrow-down-outline
unit_of_measurement: "kWh"
accuracy_decimals: 2
update_interval: 300s
lambda: |-
if (id(lilygo_rs485_marstek_battery_total_energy).has_state() && id(lilygo_rs485_marstek_battery_state_of_charge).has_state()) {
float total_energy = id(lilygo_rs485_marstek_battery_total_energy).state;
float soc = id(lilygo_rs485_marstek_battery_state_of_charge).state / 100.0;
return roundf(total_energy * soc * 100) / 100; // Ensures two decimal places
}
return NAN;
web_server:
sorting_group_id: Info
sorting_weight: 6

- name: "Marstek AC Voltage"
id: "lilygo_rs485_marstek_ac_voltage"
icon: mdi:current-ac
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 32200
value_type: U_WORD
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
web_server:
sorting_group_id: Info
sorting_weight: 3

- name: "Marstek AC Current"
id: "lilygo_rs485_marstek_ac_current"
icon: mdi:current-ac
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 32201
value_type: U_WORD
unit_of_measurement: "A"
device_class: current
state_class: measurement
accuracy_decimals: 2
filters:
- multiply: 0.01
web_server:
sorting_group_id: Info
sorting_weight: 2

# Slow Sensor
- name: "Marstek AC Power"
id: "lilygo_rs485_marstek_ac_power"
icon: mdi:flash
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 32202
value_type: S_DWORD
unit_of_measurement: "W"
device_class: power
state_class: measurement
accuracy_decimals: 0
skip_updates: 2 # 10 seconds
web_server:
sorting_group_id: Info
sorting_weight: 1

# - name: "Marstek AC Offgrid Voltage"
# id: "lilygo_rs485_marstek_ac_offgrid_voltage"
# icon: mdi:sine-wave
# platform: modbus_controller
# modbus_controller_id: mt
# state_class: measurement
# register_type: holding
# address: 32300
# value_type: U_WORD
# unit_of_measurement: "V"
# device_class: voltage
# accuracy_decimals: 2
# filters:
# - multiply: 0.1
# web_server:
# sorting_group_id: Info
# sorting_weight: 26

# - name: "Marstek AC Offgrid Current"
# id: "lilygo_rs485_marstek_ac_offgrid_current"
# icon: mdi:current-ac
# platform: modbus_controller
# state_class: measurement
# modbus_controller_id: mt
# register_type: holding
# address: 32301
# value_type: U_WORD
# unit_of_measurement: "A"
# device_class: current
# accuracy_decimals: 2
# filters:
# - multiply: 0.01
# web_server:
# sorting_group_id: Info
# sorting_weight: 27

# - name: "Marstek AC Offgrid Power"
# id: "lilygo_rs485_marstek_ac_offgrid_power"
# icon: mdi:flash
# platform: modbus_controller
# state_class: measurement
# modbus_controller_id: mt
# register_type: holding
# address: 32302
# value_type: S_DWORD
# unit_of_measurement: "W"
# device_class: power
# state_class: measurement
# accuracy_decimals: 0
# web_server:
# sorting_group_id: Info
# sorting_weight: 28

- name: "Marstek Total Charging Energy"
id: "lilygo_rs485_marstek_total_charging_energy"
icon: mdi:chart-bar
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 33000
value_type: U_DWORD
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 2
filters:
- multiply: 0.01
register_count: 2
web_server:
sorting_group_id: Info
sorting_weight: 12

- name: "Marstek Total Discharging Energy"
id: "lilygo_rs485_marstek_total_discharging_energy"
icon: mdi:chart-bar
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 33002
value_type: U_DWORD
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 2
filters:
- multiply: 0.01
register_count: 2
web_server:
sorting_group_id: Info
sorting_weight: 13

- name: "Marstek Daily Charging Energy"
id: "lilygo_rs485_marstek_daily_charging_energy"
icon: mdi:chart-bar
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 33004
value_type: U_DWORD
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 2
filters:
- multiply: 0.01
register_count: 2
web_server:
sorting_group_id: Info
sorting_weight: 8

- name: "Marstek Daily Discharging Energy"
id: "lilygo_rs485_marstek_daily_discharging_energy"
icon: mdi:chart-bar
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 33006
value_type: U_DWORD
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 2
filters:
- multiply: 0.01
register_count: 2
web_server:
sorting_group_id: Info
sorting_weight: 9

# Slow Sensor
- name: "Marstek Monthly Charging Energy"
id: "lilygo_rs485_marstek_monthly_charging_energy"
icon: mdi:chart-bar
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 33008
value_type: U_DWORD
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 2
filters:
- multiply: 0.01
register_count: 2
skip_updates: 60 # 5 minutes
web_server:
sorting_group_id: Info
sorting_weight: 10

# Slow Sensor
- name: "Marstek Monthly Discharging Energy"
id: "lilygo_rs485_marstek_monthly_discharging_energy"
icon: mdi:chart-bar
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 33010
value_type: U_DWORD
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 2
filters:
- multiply: 0.01
register_count: 2
skip_updates: 60 # 5 minutes
web_server:
sorting_group_id: Info
sorting_weight: 11

- name: "Marstek Internal Temperature"
id: "lilygo_rs485_marstek_internal_temperature"
icon: mdi:thermometer
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 35000
value_type: S_WORD
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
skip_updates: 60 # 5 minutes
web_server:
sorting_group_id: Info
sorting_weight: 19

- name: "Marstek Internal MOS1 Temperature"
id: "lilygo_rs485_marstek_internal_mos1_temperature"
icon: mdi:thermometer
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 35001
value_type: S_WORD
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
skip_updates: 60 # 5 minutes
web_server:
sorting_group_id: Info
sorting_weight: 20

# Slow Sensor
- name: "Marstek Internal MOS2 Temperature"
id: "lilygo_rs485_marstek_internal_mos2_temperature"
icon: mdi:thermometer
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 35002
value_type: S_WORD
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
accuracy_decimals: 1
skip_updates: 60 # 5 minutes
filters:
- multiply: 0.1
web_server:
sorting_group_id: Info
sorting_weight: 21

- name: "Marstek Max. Cell Temperature"
id: "lilygo_rs485_marstek_max_cell_temperature"
icon: mdi:thermometer
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 35010
value_type: S_WORD
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
accuracy_decimals: 1
skip_updates: 60 # 5 minutes
filters:
- multiply: 1
web_server:
sorting_group_id: Info
sorting_weight: 22

- name: "Marstek Min. Cell Temperature"
id: "lilygo_rs485_marstek_min_cell_temperature"
icon: mdi:thermometer
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 35011
value_type: S_WORD
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 1
web_server:
sorting_group_id: Info
sorting_weight: 23

- name: "Marstek Battery Charge Voltage Limit"
id: "lilygo_rs485_marstek_battery_charge_voltage_limit"
icon: mdi:sine-wave
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 35110
value_type: U_WORD
unit_of_measurement: "V"
device_class: voltage
accuracy_decimals: 1
state_class: measurement
filters:
- multiply: 0.1
web_server:
sorting_group_id: Info
sorting_weight: 16

- name: "Marstek Battery Charge Current Limit"
id: "lilygo_rs485_marstek_battery_charge_current_limit"
icon: mdi:current-dc
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 35111
value_type: S_WORD
unit_of_measurement: "A"
device_class: current
accuracy_decimals: 0
state_class: measurement
skip_updates: 60 # 5 minutes
filters:
- multiply: 0.01
web_server:
sorting_group_id: Info
sorting_weight: 17

- name: "Marstek Battery Discharge Current Limit"
id: "lilygo_rs485_marstek_battery_discharge_current_limit"
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 35112
value_type: S_WORD
unit_of_measurement: "A"
device_class: current
accuracy_decimals: 0
skip_updates: 60 # 5 minutes
state_class: measurement
filters:
- multiply: 0.01
web_server:
sorting_group_id: Info
sorting_weight: 18

- name: "Marstek Battery Maximum Cell Voltage"
platform: modbus_controller
icon: mdi:sine-wave
modbus_controller_id: mt
register_type: holding
address: 37007
value_type: U_WORD
unit_of_measurement: "V"
device_class: voltage
accuracy_decimals: 2
state_class: measurement
filters:
- multiply: 0.001
id: marstek_max_cell_voltage
skip_updates: 10
web_server:
sorting_group_id: Info
sorting_weight: 24

- name: "Marstek Battery Minimum Cell Voltage"
platform: modbus_controller
icon: mdi:sine-wave
modbus_controller_id: mt
register_type: holding
address: 37008
value_type: U_WORD
unit_of_measurement: "V"
device_class: voltage
accuracy_decimals: 2
state_class: measurement
filters:
- multiply: 0.001
id: marstek_min_cell_voltage
skip_updates: 10
web_server:
sorting_group_id: Info
sorting_weight: 25

- platform: template
name: "Marstek Battery Cell Voltage Delta"
icon: mdi:sine-wave
unit_of_measurement: "V"
device_class: voltage
accuracy_decimals: 3
state_class: measurement
lambda: |-
if (isnan(id(marstek_max_cell_voltage).state) || isnan(id(marstek_min_cell_voltage).state)) {
return NAN;
}
return id(marstek_max_cell_voltage).state - id(marstek_min_cell_voltage).state;
web_server:
sorting_group_id: Info
sorting_weight: 26

- platform: wifi_signal
name: "WiFi Signal Strength"
icon: mdi:wifi
id: "wifi_strength" # Was wifi_strength
update_interval: 30s
web_server:
sorting_group_id: Diagnostic
sorting_weight: 6

# An internal sensor to check Modbus communication status.
- platform: modbus_controller
modbus_controller_id: mt
name: "Modbus Status"
icon: mdi:transit-connection
id: "modbus_status" # Was modbus_status
register_type: holding
address: 32104 # Using the Battery SOC register as a reference
value_type: U_WORD
internal: true
web_server:
sorting_group_id: Diagnostic
sorting_weight: 15

# Instellingen en modi (Select en Number)
select:
- name: "Marstek RS485 Control Mode"
id: "lilygo_rs485_marstek_rs485_control_mode"
icon: mdi:connection
platform: modbus_controller
modbus_controller_id: mt
address: 42000
value_type: U_WORD
optionsmap:
"enable": 21930
"disable": 21947
skip_updates: 2 # 10 seconds
web_server:
sorting_group_id: Control
sorting_weight: 1

- name: "Marstek Forcible Charge/Discharge"
id: "lilygo_rs485_marstek_forcible_chargedischarge"
platform: modbus_controller
modbus_controller_id: mt
address: 42010
value_type: U_WORD
optionsmap:
"stop": 0
"charge": 1
"discharge": 2
skip_updates: 2 # 10 seconds
web_server:
sorting_group_id: Control
sorting_weight: 4

- name: "Marstek Backup Function"
id: "lilygo_rs485_marstek_backup_function"
platform: modbus_controller
modbus_controller_id: mt
address: 41200
value_type: U_WORD
optionsmap:
"enable": 0
"disable": 1
skip_updates: 2 # 10 seconds
web_server:
sorting_group_id: Control
sorting_weight: 3

- name: "Marstek User Work Mode"
id: "lilygo_rs485_marstek_user_work_mode"
icon: mdi:auto-mode
platform: modbus_controller
modbus_controller_id: mt
address: 43000
value_type: U_WORD
optionsmap:
"manual": 0
"anti-feed": 1
"ai": 2
skip_updates: 2 # 10 seconds
web_server:
sorting_group_id: Control
sorting_weight: 2

number:
- name: "Marstek Forcible Charge Power"
id: "lilygo_rs485_marstek_forcible_charge_power"
icon: mdi:tune-variant
mode: box
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 42020
value_type: U_WORD
unit_of_measurement: "W"
min_value: 0
max_value: 2500
step: 1
skip_updates: 2 # 10 seconds
web_server:
sorting_group_id: Control
sorting_weight: 5

- name: "Marstek Charge To SOC"
id: "lilygo_rs485_marstek_charge_to_soc"
icon: mdi:battery-charging-medium
mode: box
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 42011
value_type: U_WORD
unit_of_measurement: "%"
min_value: 12
max_value: 100
step: 1
web_server:
sorting_group_id: Control
sorting_weight: 9

- name: "Marstek Forcible Discharge Power"
id: "lilygo_rs485_marstek_forcible_discharge_power"
icon: mdi:tune-variant
mode: box
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 42021
value_type: U_WORD
unit_of_measurement: "W"
min_value: 0
max_value: 2500
step: 1
skip_updates: 2 # 10 seconds
web_server:
sorting_group_id: Control
sorting_weight: 6

- name: "Marstek Charging Cutoff Capacity"
id: "lilygo_rs485_marstek_charging_cutoff_capacity"
icon: mdi:battery-90
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 44000
value_type: U_WORD
unit_of_measurement: "%"
min_value: 80
max_value: 100
multiply: 10

- name: "Marstek Discharging Cutoff Capacity"
id: "lilygo_rs485_marstek_discharging_cutoff_capacity"
icon: mdi:battery-10
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 44001
value_type: U_WORD
unit_of_measurement: "%"
min_value: 12
max_value: 30
multiply: 10

- name: "Marstek Max. Charge Power"
id: "lilygo_rs485_marstek_max_charge_power"
icon: mdi:tune-variant
mode: box
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 44002
value_type: U_WORD
unit_of_measurement: "W"
min_value: 0
max_value: 2500
step: 1

# Slow Sensor
- name: "Marstek Max. Discharge Power"
id: "lilygo_rs485_marstek_max_discharge_power"
icon: mdi:tune-variant
mode: box
platform: modbus_controller
modbus_controller_id: mt
register_type: holding
address: 44003
value_type: U_WORD
unit_of_measurement: "W"
min_value: 0
max_value: 2500
step: 1
skip_updates: 2 # 10 seconds

###############################################################################
# LED
###############################################################################
light:
- platform: esp32_rmt_led_strip
rgb_order: GRB
chipset: WS2812
pin: GPIO4
num_leds: 1
name: "Status LED"
id: status_led

interval:
- interval: 5s
then:
- lambda: |-
ESP_LOGD("status", "Modbus: %.0f, WiFi: %.0f", id(modbus_status).state, id(wifi_strength).state);
- if:
condition:
lambda: |-
return !isnan(id(modbus_status).state) && id(wifi_strength).state > -80;
then:
- light.turn_on:
id: status_led
red: 0%
green: 100% # 🟢 Green = Modbus OK & WiFi strong
blue: 0%
else:
- if:
condition:
lambda: |-
return isnan(id(modbus_status).state) && id(wifi_strength).state < -80;
then:
- light.turn_on:
id: status_led
red: 100% # 🟣 Purple = Both Modbus & WiFi failed
green: 0%
blue: 100%
else:
- if:
condition:
lambda: |-
return id(wifi_strength).state < -80;
then:
- light.turn_on:
id: status_led
red: 0%
green: 0%
blue: 100% # 🔵 Blue = Weak WiFi signal (< -80 dBm)
else:
- light.turn_on:
id: status_led
red: 100% # 🔴 Red = Modbus error, WiFi OK
green: 0%
blue: 0%

Acties:
  • +1 Henk 'm!

  • Jobbr
  • Registratie: September 2025
  • Laatst online: 27-09 10:08
pascallj schreef op dinsdag 2 september 2025 @ 13:55:
[...]


Je gebruikt (een aangepaste versie van) de configuratie voor de POE variant maar gebruikt volgens mij de normale. Je hebt het 'lilygo-rs485.yaml' bestand nodig.
Je hebt volledig gelijk. Ik heb de code aangepast en ik krijg meteen alle data binnen.
Enorm bedankt! Dat ik hier al die tijd over heen heb gekeken :D

Acties:
  • 0 Henk 'm!

  • The Outsider
  • Registratie: September 2025
  • Laatst online: 09-09 08:10
pascallj schreef op dinsdag 2 september 2025 @ 13:57:
[...]


Kan je je configuratie delen?
toch een fout in de log

WARNING Can't connect to ESPHome API for lilygo-rs485 @ 192.168.53.173: Error connecting to [AddrInfo(family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, proto=6, sockaddr=IPv4Sockaddr(address='192.168.53.173', port=6053))]: [Errno 113] Connect call failed ('192.168.53.173', 6053) (SocketAPIError)

??

Acties:
  • 0 Henk 'm!
The Outsider schreef op dinsdag 2 september 2025 @ 14:31:
[...]

toch een fout in de log

WARNING Can't connect to ESPHome API for lilygo-rs485 @ 192.168.53.173: Error connecting to [AddrInfo(family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, proto=6, sockaddr=IPv4Sockaddr(address='192.168.53.173', port=6053))]: [Errno 113] Connect call failed ('192.168.53.173', 6053) (SocketAPIError)

??
De configuratie is bij jou wel goed zo te zien. Volgende keer het liefste alles tussen [code]CODE HIER[/code] tags inzetten zodat het ook een beetje fatsoenlijk leesbaar is.

Zit je Home Assistant instance soms in een ander netwerk/subnet dan de LilyGo? Gast/IOT-netwerk? Zo te zien kunnen ze elkaar niet bereiken.

Acties:
  • +1 Henk 'm!

  • WargamingPlayer
  • Registratie: Mei 2025
  • Laatst online: 21:01
pascallj schreef op woensdag 27 augustus 2025 @ 12:39:
[...]


Precies wat ik verwachtte: de naam van de Modbus hub moet uniek zijn. Je hebt nu 3 keer 'MarstekVenus' als naam voor de hub. In de twee warnings zie je dat ook letterlijk staan: 'MarstekVenus is duplicate'. Daarom worden die andere twee configuraties niet geladen en zijn de entities dus niet beschikbaar.

Dus ja, de configuratie is misschien niet helemaal juist, maar deze wordt ook al lang niet meer onderhouden door ~superduper1969, dus dat is ergens wel logisch.
Je kan voor de Modbus via een Elwin (of vergelijkbare) beter de integratie van @[RNMC] Viper gebruiken of wanneer je wat hogere polling wil hebben die van mij. Die van @superduper1969 wordt niet onderhouden, die van mij wel. Wanneer de laatste stapjes van de @[RNMC] Viper HACS integratie voltooid zijn zoals instelbare polling dan adviseer ik die integratie boven die van mij. Zie ook mijn git pagina.

https://github.com/WargamingPlayer/HA-Marstek-Venus-E-Modbus

8 x 430wp, Huawei SUN2000-3KTL-L1, 2 x Marstek Venus-E (154.215), Home Assistant


Acties:
  • 0 Henk 'm!

  • FritsLa
  • Registratie: Juli 2021
  • Laatst online: 25-09 12:29
Ja dat wist ik maar het lukte niet om hem toe te voegen, nu is het ineens wel gelukt. Bedankt iig! W

Acties:
  • 0 Henk 'm!

  • rb1213
  • Registratie: Maart 2007
  • Laatst online: 17-09 20:23
heeft er iemand een andere modbus oplossing dan de batterijen op manual plaatsen om die te doen stoppen met laden of ontladen.
ik merk dat als je veel / snel aanstuurt , dat ze plots niet meer reageren 😔
ik doe dat nu via HA om bij lage belasting slechts 1 batterij actief te hebben ( 1x 300w is een beter rendement dan 3x100w)

Acties:
  • 0 Henk 'm!

  • nheinemans
  • Registratie: Juli 2002
  • Laatst online: 26-09 09:07
rb1213 schreef op dinsdag 2 september 2025 @ 22:34:
heeft er iemand een andere modbus oplossing dan de batterijen op manual plaatsen om die te doen stoppen met laden of ontladen.
ik merk dat als je veel / snel aanstuurt , dat ze plots niet meer reageren 😔
ik doe dat nu via HA om bij lage belasting slechts 1 batterij actief te hebben ( 1x 300w is een beter rendement dan 3x100w)
Staan je batterijen allemaal in anti-feed modus? Je zou de max (dis)charge power op 0 kunnen zetten van 2 batterijen.
En wellicht een grotere hysteresis gebruiken, dus pas uitschakelen als de belasting onder de 500W komt, en inschakelen als de belasting boven de 2000W komt? Dat doe je elke dag met een andere batterij, en je zorgt ervoor de ze allemaal een keer aan de beurt komen.

[ Voor 19% gewijzigd door nheinemans op 03-09-2025 09:48 ]


Acties:
  • 0 Henk 'm!

  • ajouwens
  • Registratie: Augustus 2010
  • Laatst online: 27-09 15:40
rb1213 schreef op dinsdag 2 september 2025 @ 22:34:
heeft er iemand een andere modbus oplossing dan de batterijen op manual plaatsen om die te doen stoppen met laden of ontladen.
ik merk dat als je veel / snel aanstuurt , dat ze plots niet meer reageren 😔
ik doe dat nu via HA om bij lage belasting slechts 1 batterij actief te hebben ( 1x 300w is een beter rendement dan 3x100w)
Misschien dat de HA Threshold integratie hier iets kan doen?

Marstek Venus E (v2) V152, 1 fase 40A, Solar 2kW (max), Home Assistant, Unifi, Volvo EX30 SMER


Acties:
  • 0 Henk 'm!

  • FirefoxNL
  • Registratie: Februari 2018
  • Laatst online: 22-09 23:54
pascallj schreef op maandag 1 september 2025 @ 14:26:
[...]
We hebben nog geen gebruikers van de V3 die zich gemeld hebben, dus geen idee! Heb jij een V3?
Ik heb gisteravond mijn V3 in ontvangst mogen nemen. Heb je tips om de pin-out van die RJ45 poort te achterhalen? De handleiding zegt daar helaas niet zoveel over, anders dan dat de poort bestaat.

Marstek Venus-E V2 v153 - Marstek Venus-E V3 v112


Acties:
  • +1 Henk 'm!

  • WargamingPlayer
  • Registratie: Mei 2025
  • Laatst online: 21:01
FirefoxNL schreef op woensdag 3 september 2025 @ 11:30:
[...]


Ik heb gisteravond mijn V3 in ontvangst mogen nemen. Heb je tips om de pin-out van die RJ45 poort te achterhalen? De handleiding zegt daar helaas niet zoveel over, anders dan dat de poort bestaat.
Meten is weten, maar dan is de vraag wat meet je, hoe meet je. Je zou een RJ45 kunnen knijpen met wat draden er aan en gewoon gaan meten. Helaas is alles tussen de -24 en +24V in en ook niet allemaal gelijkstroom. Dus om alles echt zeker te weten zal niet eenvoudig worden zonder scope om te zien of er signaal gemoduleerd wordt en wat de signalen zijn.

En om het nog complexer te maken. Modbus over RJ45 is ook nog eens lekker niet gestandaardiseerd :-(

[ Voor 6% gewijzigd door WargamingPlayer op 03-09-2025 11:44 ]

8 x 430wp, Huawei SUN2000-3KTL-L1, 2 x Marstek Venus-E (154.215), Home Assistant


Acties:
  • +1 Henk 'm!
FirefoxNL schreef op woensdag 3 september 2025 @ 11:30:
[...]


Ik heb gisteravond mijn V3 in ontvangst mogen nemen. Heb je tips om de pin-out van die RJ45 poort te achterhalen? De handleiding zegt daar helaas niet zoveel over, anders dan dat de poort bestaat.
Top! Alvast bedankt voor de handleiding, voor het eerst dat we die hier zien verschijnen.

Om te testen zal je een ethernet kabel met aan 1 kant een plug (die correct is aangesloten) en aan de andere kant de losse draden moeten hebben. De kleuren van de draden strip je allemaal zodat ze los komen te liggen en organiseer van je links naar rechts exact op dezelfde manier zoals ze ook in de plug zitten. Waarschijnlijk is dit volgens T-568B (zie Google) maar controleer dat even door door de plug heen te kijken (of je zet er zelf een plug aan volgens T-568B.

Vervolgens zorg je dat geen van de uiteindes elkaar raken en plug je de kabel in. Dan ga je met een multimeter op +/- 20 VDC stand (ik verwacht niets hoger) meten tussen alle mogelijke paren en houd je de polariteit van de meter continu hetzelfde. Dus bijvoorbeeld altijd de positief meest links.

En dan is het alle 28 combinaties afgaan en de resultaten noteren... Dus 1-2, 1-3, 1-4, ..., 2-3, 2-4, ..., 6-7, 7-8. Dan kunnen we wel een aardige indruk hebben van hoe de pin-out is.

Acties:
  • 0 Henk 'm!

  • FirefoxNL
  • Registratie: Februari 2018
  • Laatst online: 22-09 23:54
WargamingPlayer schreef op woensdag 3 september 2025 @ 11:37:
[...]
Dus om alles echt zeker te weten zal niet eenvoudig worden zonder scope om te zien of er signaal gemoduleerd wordt en wat de signalen zijn.
Een scope heb ik helaas niet. Dat gaat mijn expertise net wat te buiten. Ik zal eens kijken wat ik vanavond kan uitvogelen met een oude ethernetkabel.

Ze claimen dat er met die V3 ook een Open API koppeling mogelijk is met Home Assistant. Bron. Daar zal ook nog niet zoveel van bekend zijn neem ik aan. De documenten die daar bij de downloads staan zijn grotendeels nog van de V2.

Marstek Venus-E V2 v153 - Marstek Venus-E V3 v112


Acties:
  • +1 Henk 'm!
WargamingPlayer schreef op woensdag 3 september 2025 @ 11:37:
[...]

Meten is weten, maar dan is de vraag wat meet je, hoe meet je. Je zou een RJ45 kunnen knijpen met wat draden er aan en gewoon gaan meten. Helaas is alles tussen de -24 en +24V in en ook niet allemaal gelijkstroom. Dus om alles echt zeker te weten zal niet eenvoudig worden zonder scope om te zien of er signaal gemoduleerd wordt en wat de signalen zijn.

En om het nog complexer te maken. Modbus over RJ45 is ook nog eens lekker niet gestandaardiseerd :-(
Zolang er geen commando verstuurd wordt, mag je wel gelijkstroom op de RS485 bus verwachten. Inderdaad jammer dat het niet gestandaardiseerd is.

Acties:
  • +1 Henk 'm!
FirefoxNL schreef op woensdag 3 september 2025 @ 11:48:
[...]


Een scope heb ik helaas niet. Dat gaat mijn expertise net wat te buiten. Ik zal eens kijken wat ik vanavond kan uitvogelen met een oude ethernetkabel.

Ze claimen dat er met die V3 ook een Open API koppeling mogelijk is met Home Assistant. Bron. Daar zal ook nog niet zoveel van bekend zijn neem ik aan. De documenten die daar bij de downloads staan zijn grotendeels nog van de V2.
De Open API komt er waarschijnlijk wel (sterker nog die is er al, maar niet standaard geactiveerd), maar ik verwacht eigenlijk geen standaard integraties vanuit Marstek voor de Smarthome systemen. Maar dat is geen probleem gezien de actieve community... 8)

Maar dan alsnog verschaft de Modbus (in elk geval op V2 en eerder) meer data dan de API tot nu toe. Maar aangezien de V3 andere firmware draait dan de voorgaande versies blijft het sowieso ook nog de vraag of de Modbus registers hetzelfde zijn.

Acties:
  • 0 Henk 'm!

  • FirefoxNL
  • Registratie: Februari 2018
  • Laatst online: 22-09 23:54
pascallj schreef op woensdag 3 september 2025 @ 11:47:
[...]
En dan is het alle 28 combinaties afgaan en de resultaten noteren... Dus 1-2, 1-3, 1-4, ..., 2-3, 2-4, ..., 6-7, 7-8. Dan kunnen we wel een aardige indruk hebben van hoe de pin-out is.
Kijk, dat moet wel lukken denk ik. Ik ga vanavond eens kijken en hou je op de hoogte. Thanks!
pascallj schreef op woensdag 3 september 2025 @ 11:53:
[...]
maar ik verwacht eigenlijk geen standaard integraties vanuit Marstek voor de Smarthome systemen.
Bijzonder dat ze dan wel specifiek Home Assistant noemen in hun marketing op de pagina die ik linkte. Maar ik heb inderdaad geen twijfel aan deze community :D
pascallj schreef op woensdag 3 september 2025 @ 11:53:
[...]
Maar aangezien de V3 andere firmware draait dan de voorgaande versies blijft het sowieso ook nog de vraag of de Modbus registers hetzelfde zijn.
We gaan het zien. Ik hou je op de hoogte!

Marstek Venus-E V2 v153 - Marstek Venus-E V3 v112


Acties:
  • +1 Henk 'm!

  • Jerre78
  • Registratie: September 2025
  • Laatst online: 18-09 17:43
FirefoxNL schreef op woensdag 3 september 2025 @ 11:30:
[...]


Ik heb gisteravond mijn V3 in ontvangst mogen nemen. Heb je tips om de pin-out van die RJ45 poort te achterhalen? De handleiding zegt daar helaas niet zoveel over, anders dan dat de poort bestaat.
Proficiat met je aankoop :)
Als ik niet mis ben, dacht ik dat de V3 naast Modbus RTU via de LAN poort ook Modbus TCP aankan, net zoals je een Alfen laadpaal kunt aansturen via Modbus.
Enkel LAN-poort aansluiten, en poort 502 gebruiken.

Ben benieuwd.

Acties:
  • +1 Henk 'm!

  • superduper1969
  • Registratie: December 2005
  • Laatst online: 23:27
De handleiding wil bij mij niet laden.
Is de RJ 45 niet gewoon een Ethernet aansluiting? Aansluiten op je netwerk en kijken in je router dat er een IP wordt uitgedeeld? En modbus kan ook modbus over IP zijn waar ik al maanden geleden om gevraagd heb.

MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt


Acties:
  • +1 Henk 'm!
superduper1969 schreef op woensdag 3 september 2025 @ 12:54:
De handleiding wil bij mij niet laden.
Is de RJ 45 niet gewoon een Ethernet aansluiting? Aansluiten op je netwerk en kijken in je router dat er een IP wordt uitgedeeld? En modbus kan ook modbus over IP zijn waar ik al maanden geleden om gevraagd heb.
De handleiding laadt hier prima.

Ze hebben het specifiek over een RS485 poort. Dus dat is geen Modbus over TCP. Daarvoor zou ook geen extra RJ45 poort nodig zijn, dat protocol kan je prima implementeren over de andere ethernet aansluiting.

Ik zou hem zeker niet aansluiten op je router. Ik denk dat er ook weer spanning geleverd wordt op deze RS485 aansluiting en heb geen idee wat er gebeurt als je gewoon zo een spanning zet op de draden van je netwerk.

Acties:
  • 0 Henk 'm!

  • FirefoxNL
  • Registratie: Februari 2018
  • Laatst online: 22-09 23:54
superduper1969 schreef op woensdag 3 september 2025 @ 12:54:
De handleiding wil bij mij niet laden.
Is de RJ 45 niet gewoon een Ethernet aansluiting? Aansluiten op je netwerk en kijken in je router dat er een IP wordt uitgedeeld? En modbus kan ook modbus over IP zijn waar ik al maanden geleden om gevraagd heb.
Hieronder even een foto uit de handleiding. :)
Er zitten twee RJ45 poorten op. De A en de C poort zijn beide RJ45.
De ene is inderdaad een LAN aansluiting maar de andere wordt als RS485 bestempeld. Ik zal vanavond ook even kijken of die poort een IP krijgt.

Afbeeldingslocatie: https://tweakers.net/i/vD38BnPmSeVC0VAzyM-bP_v_PsM=/800x/filters:strip_exif()/f/image/wVBit1NBdjfcZ4o2WtKKur7j.png?f=fotoalbum_large
Jerre78 schreef op woensdag 3 september 2025 @ 12:31:
[...]
Proficiat met je aankoop :)
Als ik niet mis ben, dacht ik dat de V3 naast Modbus RTU via de LAN poort ook Modbus TCP aankan, net zoals je een Alfen laadpaal kunt aansturen via Modbus.
Enkel LAN-poort aansluiten, en poort 502 gebruiken.

Ben benieuwd.
Bedankt! Ik ga dit vanavond ook even testen. Nog tips voor een tooltje om Modbus berichten te versturen?

[ Voor 22% gewijzigd door FirefoxNL op 03-09-2025 13:01 ]

Marstek Venus-E V2 v153 - Marstek Venus-E V3 v112


Acties:
  • +1 Henk 'm!

  • superduper1969
  • Registratie: December 2005
  • Laatst online: 23:27
Bedankt voor het screenshot, ik ben buiten Europa op dit moment en het hotel zal misschien wat blocken.

MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt


Acties:
  • 0 Henk 'm!

  • WargamingPlayer
  • Registratie: Mei 2025
  • Laatst online: 21:01
FirefoxNL schreef op woensdag 3 september 2025 @ 12:59:
[...]


Hieronder even een foto uit de handleiding. :)
Er zitten twee RJ45 poorten op. De A en de C poort zijn beide RJ45.
De ene is inderdaad een LAN aansluiting maar de andere wordt als RS485 bestempeld. Ik zal vanavond ook even kijken of die poort een IP krijgt.

[Afbeelding]


[...]


Bedankt! Ik ga dit vanavond ook even testen. Nog tips voor een tooltje om Modbus berichten te versturen?
Ik zou geen ethernet kabel in de Modbus steken.

8 x 430wp, Huawei SUN2000-3KTL-L1, 2 x Marstek Venus-E (154.215), Home Assistant


Acties:
  • +2 Henk 'm!

  • thuisbatterij
  • Registratie: Mei 2025
  • Laatst online: 08-09 22:46
Wij krijgen morgen een update vanuit Marstek over de specifieke locatie van de pins (is nu avond in china)

Die zal ik hier in posten,

Mike thuisbatterij.nl

Acties:
  • +2 Henk 'm!
thuisbatterij schreef op woensdag 3 september 2025 @ 14:27:
Wij krijgen morgen een update vanuit Marstek over de specifieke locatie van de pins (is nu avond in china)

Die zal ik hier in posten,

Mike thuisbatterij.nl
Hoi Mike, ik waardeer je mogelijke bijdrage, maar als je van plan bent hier te posten uit naam van het bedrijf, lees dan de huisregels even door en vraag een bedrijfsaccount aan voor je bedrijf.

Acties:
  • +1 Henk 'm!

  • FirefoxNL
  • Registratie: Februari 2018
  • Laatst online: 22-09 23:54
Ik had inderdaad een T-568B kabel opgeofferd, hier ook even als referentie:

Afbeeldingslocatie: https://tweakers.net/i/lrfNzbuc3AbG_TEmZlkX5R8XhXA=/fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():strip_exif()/f/image/AFQyxjPwPN42KqVRhwfzlnZD.jpg?f=user_large

Ik heb de 28 kabelcombinaties 1 keer getest, dus niet andersom, en de 0 waarden weggelaten.
Gemeten met de plus op de kabel in de headers.

1 - Oranje-wit

- 2. 5,3
- 4. -0,17
- 5. - 0,17
- 7. 5,35
- 8. 5,35

2 - Oranje

- 4. -5,47
- 5. -5,47

3 - Groen wit

Allemaal 0

4 - Blauw

- 7. 5,47
- 8. 5,47

5 - Blauw wit

- 7. 5,47
- 8. 5,47

6 - Groen

Allemaal 0

7 - Bruin wit

Allemaal 0

[ Voor 18% gewijzigd door FirefoxNL op 03-09-2025 23:04 ]

Marstek Venus-E V2 v153 - Marstek Venus-E V3 v112


Acties:
  • 0 Henk 'm!
FirefoxNL schreef op woensdag 3 september 2025 @ 19:23:
Ik sta een beetje op tijd dus zal de formatting later nog even aanpassen maar hier alvast de meetresultaten:
Volgens T-568B, hier ook even als referentie:

[Afbeelding]

Ik heb de 28 mogelijkheden (dus bijvoorbeeld 1-7 wel maar 7-1 niet) getest en de 0 waarden weggelaten.

1 - Oranje-wit

- 2. 5,3
- 4. -0,17
- 5. - 0,17
- 7. 5,35
- 8. 5,35

2 - Oranje

- 4. - 5,47
- 5. - 5,47

3 - Groen wit

Allemaal 0

4 - Blauw

- 7. 5,47
- 8. 5,47

5 - Blauw wit

- 7. 5,47
- 8. 5,47

6 - Groen

Allemaal 0

7 - Bruin wit

Allemaal 0
Weet je toevallig ook nog welke pool je aan welke kant gezet hebt?

Acties:
  • 0 Henk 'm!

  • FirefoxNL
  • Registratie: Februari 2018
  • Laatst online: 22-09 23:54
pascallj schreef op woensdag 3 september 2025 @ 19:57:
[...]
Weet je toevallig ook nog welke pool je aan welke kant gezet hebt?
Sorry, wist wel dat ik iets vergat. Plus links, dus op de draad in de headers.

[ Voor 6% gewijzigd door FirefoxNL op 03-09-2025 21:58 ]

Marstek Venus-E V2 v153 - Marstek Venus-E V3 v112


Acties:
  • +1 Henk 'm!

  • tdolder
  • Registratie: September 2007
  • Laatst online: 28-09 17:06
Meer mensen last van een broken Marstek HACS integratie van @[RNMC] Viper na update HomeAssistant naar 2025.9?

De EW11's geven aan dat ze connected zijn met HA ip,

HA Log:
Logger: custom_components.marstek_modbus.helpers.modbus_client
Bron: custom_components/marstek_modbus/helpers/modbus_client.py:126
integratie: Marstek Venus Modbus (documentatie)
Eerst voorgekomen: 07:04:36 (12 gebeurtenissen)
Laatst gelogd: 07:59:43

Modbus client not connected, attempting reconnect before register 33008 (0x80F0)
Modbus client not connected, attempting reconnect before register 35100 (0x891C)
Modbus client not connected, attempting reconnect before register 42020 (0xA424)
Modbus client not connected, attempting reconnect before register 36100 (0x8D04)
Modbus client not connected, attempting reconnect before register 31000 (0x7918)

EX30 - SMER - Ultra sinds 16-03-2024 / Wallbox Pulsar Max / HomeAssistant / Unifi / 3 x Marstek Venus E v2


  • leejoow
  • Registratie: Juni 2007
  • Niet online

leejoow

Dat ben ik!

Er is een breaking change in pymodbus geweest, wellicht dat die hier ook problemen veroorzaakt?

Dit is wat mij betreft wel het grote voordeel van een esphome infrastructuur: updates van Home Assistant slopen niet elke keer je integraties.

LilyGo behuizingen | Ontwikkelaar Itho Daalderop Warmtepomp control module


Acties:
  • +2 Henk 'm!

  • antonboonstra
  • Registratie: Augustus 2002
  • Laatst online: 19:14

antonboonstra

8815Wp | WP | Tesla | Zero

FirefoxNL schreef op woensdag 3 september 2025 @ 12:59:
[...]
Bedankt! Ik ga dit vanavond ook even testen. Nog tips voor een tooltje om Modbus berichten te versturen?
Ik gebruik hiervoor ModbusDoctor. Simpel, klein maar effectief programma voor Windows. Ondersteunt zowel modbus RTU als modbus TCP.
Afbeeldingslocatie: https://tweakers.net/i/W9lXzRAljAPxt8tCF3U4d5KutV4=/800x/filters:strip_exif()/f/image/51LVM9AWSInCPOGGyDO7TBL0.png?f=fotoalbum_large

[ Voor 28% gewijzigd door antonboonstra op 04-09-2025 09:13 ]

📸Canon EOS 5D IV 🚁DJI Mavic Pro 🏍️Zero SR ⚡Tesla M3 LR 🌡️Daikin US 3.5kW ☀️8815Wp 🔋Marstek Venus-E 5,12 kWh Tweakers PVOutput lijst


  • bvansteenselen
  • Registratie: April 2024
  • Laatst online: 27-09 17:33
Goedemorgen,

Ik heb een esp32 wroom 30 pins kan ik deze ook gebruiken i.p.v. de lillygo

En welke configuratie moet ik er dan op zetten
bvansteenselen schreef op donderdag 4 september 2025 @ 09:18:
Goedemorgen,

Ik heb een esp32 wroom 30 pins kan ik deze ook gebruiken i.p.v. de lillygo

En welke configuratie moet ik er dan op zetten
Dan heb je wel een extra RS485 to UART TTL converter nodig en zal je de configuratie aan moeten passen naar hoe je deze aansluit. Ik draai het zelf zo ook.

  • Broodro0ster
  • Registratie: September 2014
  • Laatst online: 21:42
Ik las dat er een bepaalde update de modbus integratie breekt. Ik krijg nu het voorstel om v151 naar v153 te updaten.

Wie van jullie heeft al v153? Werkt de modbus koppeling nog goed na de update?

30x Jinko JKM380M-6RL3 (11.4kWp) 12x oost 90° - 18x west 270°, 45° incl. | Marstek Venus 5.12kWh | Vaillant Arotherm 75/5 | Zehnder ComfoAir Q450 | Tesla Model 3 Performance 2025


  • Jerre78
  • Registratie: September 2025
  • Laatst online: 18-09 17:43
antonboonstra schreef op donderdag 4 september 2025 @ 09:10:
[...]

Ik gebruik hiervoor ModbusDoctor. Simpel, klein maar effectief programma voor Windows. Ondersteunt zowel modbus RTU als modbus TCP.
[Afbeelding]
Als ik niet mis ben, moet je wel de Modbus TCP via de app > communicatiemodule > modbus TCP activeren.
Broodro0ster schreef op donderdag 4 september 2025 @ 10:30:
Ik las dat er een bepaalde update de modbus integratie breekt. Ik krijg nu het voorstel om v151 naar v153 te updaten.

Wie van jullie heeft al v153? Werkt de modbus koppeling nog goed na de update?
Als je het hebt over die update van hierboven, dat ging over Home Assistant met een custom Modbus integratie. Heeft niks met de Marstek te maken. Modbus is actief op elke update.
Jerre78 schreef op donderdag 4 september 2025 @ 10:32:
[...]

Als ik niet mis ben, moet je wel de Modbus TCP via de app > communicatiemodule > modbus TCP activeren.
De Marstek heeft geen Modbus TCP.
Pagina: 1 ... 20 ... 23 Laatste