☀️ 8 x 430wp op zuid | ☀️ Huawei SUN2000-3KTL-L1 | 🔋 2 x Marstek Venus-E BMS: 155, EMS: 216 | 📱 Home Assistant | 🚗 Kia EV6-LR 2024 |🔌 Delta 8/8
(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
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.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)
☀️ 8 x 430wp op zuid | ☀️ Huawei SUN2000-3KTL-L1 | 🔋 2 x Marstek Venus-E BMS: 155, EMS: 216 | 📱 Home Assistant | 🚗 Kia EV6-LR 2024 |🔌 Delta 8/8
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
| :strip_exif()/f/image/WZBjKt7vih9yUDbAQjlKFGx2.jpg?f=fotoalbum_tile) | /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
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
:strip_exif()/f/image/RzfhscB4oOmVusLuIkrtYy81.jpg?f=fotoalbum_large) 
                                                [ Voor 20% gewijzigd door mathiasc op 26-08-2025 21:16 ]
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.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 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.
De 3x5v aan elkaar knopen is geen goed idee.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]
MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt
als ik het goed begrijp is die +5V van de marstek +5V IN en niet OUT toch?superduper1969 schreef op dinsdag 26 augustus 2025 @ 21:23:
[...]
De 3x5v aan elkaar knopen is geen goed idee.
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.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...
Ik hoop dat er goede beveiliging op dat PCB zit
 
                    *loopt vlug naar de batterijen*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
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 ]
Uit TS: De Elfin RS485 naar TCP wordt gevoed vanuit de RS485 er is geen extra power nodig.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)
Maar ik ben blij dat alles nu werkt!
MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt
Is dat wel werkbaar met 30s polling?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] 
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 ]
Ik denk dat je hiermee wel uit de voeten kunt: DinX in "Hame / Marstek / Duravolt 5,12kWh plug en play thuisaccu"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 ?
oh, bedankt voor de info !pascallj schreef op woensdag 27 augustus 2025 @ 08:49:
[...]
Ik denk dat je hiermee wel uit de voeten kunt: DinX in "Hame / Marstek / Duravolt 5,12kWh plug en play thuisaccu"
die post had ik gemist ..
maar ik zit nog op v153 en zie die optie niet , kga ze nog eens moeten contacteren vrees ik.
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.
:strip_exif()/f/image/OKUhBKioDSzxg5rajJpAu5iZ.jpg?f=fotoalbum_large)
config werkende batterij:
:no_upscale():strip_icc():strip_exif()/f/image/HVNDTBroi5mYFrYg7gt1ZZNW.jpg?f=user_large)
config niet werkende batterij:
: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?
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.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?
ik heb deze error's: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.
| 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:
| 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.mathiasc schreef op woensdag 27 augustus 2025 @ 12:37:
[...]
ik heb deze error's:
code:
terwijl er zeker geen 2 duplicate yaml's of ip's staan in de yaml's
anderzijds heb ik dit:
code:
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'
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.
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
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:
| 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
Dat ligt eraan wat je wilt,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
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
klopt, dit was de oplossing!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:
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
Polling is niet vastgelegd op 30s (en kan aangepast worden in const.py bestand):AUijtdehaag schreef op woensdag 27 augustus 2025 @ 04:54:
[...]
Is dat wel werkbaar met 30s polling?
| 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.tisniwoar schreef op woensdag 27 augustus 2025 @ 16:18:
[...]
Polling is niet vastgelegd op 30s (en kan aangepast worden in const.py bestand):
code:
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 }
He who controls the past, commands the future. He who commands the future, conquers the past.
Ik up even een hele oude comment, maar vraag me af of dit nog gelukt is?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
De B2500 emulator snap ik oprecht niks van..
MT Venus 5.12KWh V153 - HW P1 - PV 2660Wp
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.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.
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
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
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.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.
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.
Dat is meer een vraag voor dit topic: https://gathering.tweakers.net/forum/list_messages/2301062Ies 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
MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt
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?
:strip_exif()/f/image/xJYDFcHYmE2rOxY5wOArqFhB.jpg?f=fotoalbum_large) 
                    Kijk even in de TS voor de uitleg van de switch en de registers die daarbij horen.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]
wel ik had deze gelezen, echter blijkt nu plots dat de schakelaars en knoppen wel werken ... begrijp wie begrijpen kan ...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.
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.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?
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 ]
ja klopt, dat werkt nu al met een automatisatie die kijkt naar de SOC en die dan de modus verandert.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.
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 ]
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.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
Maar voor het bedenken van een leuke strategie, hebben we wel weer een ander speciaal topic als je dat verder zou willen uitdiepen.
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.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.
welk mag dat dan zijn?Maar voor het bedenken van een leuke strategie, hebben we wel weer een ander speciaal topic als je dat verder zou willen uitdiepen.
[ Voor 11% gewijzigd door mathiasc op 28-08-2025 13:00 ]
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.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?
Marstek PIB Domotica integratie en je Energierekening
Bedankt voor je antwoord.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.
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
Even inbreken in de discussie zonder al de tijd gehad te hebben om die laatste draad te lezenpascallj 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
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.
Nu is het nog 30s maar er wordt gewerkt aan een nieuwe versie met Support for Dynamic Polling IntervalsAUijtdehaag schreef op woensdag 27 augustus 2025 @ 04:54:
[...]
Is dat wel werkbaar met 30s polling?
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
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.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
He who controls the past, commands the future. He who commands the future, conquers the past.
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)
: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 ]
/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
Dit is meer een vraag voor het Reguliere topic. Dit topic richt zich eigenlijk alleen op het gebruik van Modbus.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?
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.
: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
https://www.elektroda.com/news/news4124039.htmlVerSus 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.
MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt
3x Marstek Venus E (1xV1 en 2xV2 op v153 bms 215), Marstek CT002 V120, 3x LilyGo T-CAN RS485, Home Assistant
[ Voor 100% gewijzigd door rb1213 op 02-09-2025 19:29 ]
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.
We hebben nog geen gebruikers van de V3 die zich gemeld hebben, dus geen idee! Heb jij een V3?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?
Bijna...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?
Wees een pionier en hou ons op de hoogte, we horen het graag!
[ Voor 105% gewijzigd door rb1213 op 02-09-2025 08:55 ]
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.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 }}
Als je overigens daar je code post, zet de code dan aub tussen [code][/code] tags zodat de code makkelijker leesbaar is.
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
Hier vind ik deze ook niet in Hacs.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]
BE MTVenus V2 V155 BMS 216 APP V1.6.50 HW-P1 M5stack Atom lite Modbus HA integration ZP 3,28kWp Goodwe 3kW
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.
: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.
/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
| 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:
| 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 | 
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.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:
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 weet dat het om een custom repository gaat? Zie https://www.hacs.xyz/docs/faq/custom_repositories/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]
3x MTVenus V153/V139 5.12, CT003 V117 + 40ZP SolarEdge (NO+ZW) 13300Wp + Panasonic 16kW T-CAP + Easee EV charger
Kan je je configuratie delen?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
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] <<
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] <<
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] <<
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] <<
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%
Je hebt volledig gelijk. Ik heb de code aangepast en ik krijg meteen alle data binnen.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.
Enorm bedankt! Dat ik hier al die tijd over heen heb gekeken
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.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)
??
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.
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.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.
https://github.com/WargamingPlayer/HA-Marstek-Venus-E-Modbus
☀️ 8 x 430wp op zuid | ☀️ Huawei SUN2000-3KTL-L1 | 🔋 2 x Marstek Venus-E BMS: 155, EMS: 216 | 📱 Home Assistant | 🚗 Kia EV6-LR 2024 |🔌 Delta 8/8
Ja dat wist ik maar het lukte niet om hem toe te voegen, nu is het ineens wel gelukt. Bedankt iig! Wamvolleb schreef op dinsdag 2 september 2025 @ 13:55:
[...]
Je weet dat het om een custom repository gaat? Zie https://www.hacs.xyz/docs/faq/custom_repositories/
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.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)
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 ]
Misschien dat de HA Threshold integratie hier iets kan doen?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)
Marstek Venus E (v2) V152, 1 fase 40A, Solar 2kW (max), Home Assistant, Unifi, Volvo EX30 SMER
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.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?
Marstek Venus-E V2 v153 - Marstek Venus-E V3 v112
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.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.
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 op zuid | ☀️ Huawei SUN2000-3KTL-L1 | 🔋 2 x Marstek Venus-E BMS: 155, EMS: 216 | 📱 Home Assistant | 🚗 Kia EV6-LR 2024 |🔌 Delta 8/8
Top! Alvast bedankt voor de handleiding, voor het eerst dat we die hier zien verschijnen.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.
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.
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.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.
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
Zolang er geen commando verstuurd wordt, mag je wel gelijkstroom op de RS485 bus verwachten. Inderdaad jammer dat het niet gestandaardiseerd is.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
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...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.
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.
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: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.
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 communitypascallj schreef op woensdag 3 september 2025 @ 11:53:
[...]
maar ik verwacht eigenlijk geen standaard integraties vanuit Marstek voor de Smarthome systemen.
We gaan het zien. Ik hou je op de hoogte!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.
Marstek Venus-E V2 v153 - Marstek Venus-E V3 v112
Proficiat met je aankoopFirefoxNL 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.
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.
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
De handleiding laadt hier prima.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.
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.
Hieronder even een foto uit de handleiding.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.
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.
/f/image/wVBit1NBdjfcZ4o2WtKKur7j.png?f=fotoalbum_large)
Bedankt! Ik ga dit vanavond ook even testen. Nog tips voor een tooltje om Modbus berichten te versturen?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.
[ Voor 22% gewijzigd door FirefoxNL op 03-09-2025 13:01 ]
Marstek Venus-E V2 v153 - Marstek Venus-E V3 v112
MTVenus V153 + BMSV215 + CT003 V117 Lilygo Modbus HA integration+ Anker E1600 + 16ZP Enphase + 2ZP Anker + Quatt
Ik zou geen ethernet kabel in de Modbus steken.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?
☀️ 8 x 430wp op zuid | ☀️ Huawei SUN2000-3KTL-L1 | 🔋 2 x Marstek Venus-E BMS: 155, EMS: 216 | 📱 Home Assistant | 🚗 Kia EV6-LR 2024 |🔌 Delta 8/8
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.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
: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 04 - Blauw
- 7. 5,47- 8. 5,47
5 - Blauw wit
- 7. 5,47- 8. 5,47
6 - Groen
Allemaal 07 - 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
Weet je toevallig ook nog welke pool je aan welke kant gezet hebt?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,352 - Oranje
- 4. - 5,47
- 5. - 5,473 - Groen wit
Allemaal 04 - Blauw
- 7. 5,47
- 8. 5,475 - Blauw wit
- 7. 5,47
- 8. 5,476 - Groen
Allemaal 07 - Bruin wit
Allemaal 0
Sorry, wist wel dat ik iets vergat. Plus links, dus op de draad in de headers.pascallj schreef op woensdag 3 september 2025 @ 19:57:
[...]
Weet je toevallig ook nog welke pool je aan welke kant gezet hebt?
[ Voor 6% gewijzigd door FirefoxNL op 03-09-2025 21:58 ]
Marstek Venus-E V2 v153 - Marstek Venus-E V3 v112
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
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
Ik gebruik hiervoor ModbusDoctor. Simpel, klein maar effectief programma voor Windows. Ondersteunt zowel modbus RTU als modbus TCP.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?
/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
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.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
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
Als ik niet mis ben, moet je wel de Modbus TCP via de app > communicatiemodule > modbus TCP activeren.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 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.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?
De Marstek heeft geen Modbus TCP.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.
:fill(white):strip_exif()/i/2007621700.jpeg?f=thumbmini)
:strip_icc():strip_exif()/u/232340/crop5affede7756e3_cropped.jpeg?f=community) 
            :strip_icc():strip_exif()/u/233976/crop66603b3e697bb_cropped.jpg?f=community) 
            :strip_icc():strip_exif()/u/450289/crop60618703be69c_cropped.jpg?f=community) 
            :strip_icc():strip_exif()/u/192109/zonnebloem.jpg?f=community) 
            :strip_icc():strip_exif()/u/31772/crop601c5b0229c42_cropped.jpeg?f=community) 
            :strip_icc():strip_exif()/u/1856076/crop68b41868701fd_cropped.jpg?f=community) 
            /u/2258536/crop6820923cee807_cropped.png?f=community) 
            :strip_exif()/f/image/dvK8MtcuHfgQRI8g5JnFMZxw.jpg?f=fotoalbum_large)
:strip_exif()/f/image/0MXKxSdNbukYRqCSpYArjHgh.jpg?f=fotoalbum_large)
:strip_icc():strip_exif()/u/63649/IMG_8734.jpg?f=community) 
            :strip_icc():strip_exif()/u/624591/crop5ed9fe469d156_cropped.jpeg?f=community)