Aarde aan je wemos idd. Niet aan de inverterkonehead schreef op vrijdag 27 juni 2025 @ 08:54:
[...]
Ik heb de aarde aangesloten van TLL bordje naar de wemos. Ik kan ook de aarde aansluiten van TLL bordje naar de inveter? Had gehoopt dat er in de Sys Com connecter een aardepin zou zitten, die zit er dus niet in. Waar moet je de aarde aansluiten van het TLL bordje?
Pak eens 30cm om te testen. Werkt dat, dan kan je verder proberen met die 2m.konehead schreef op vrijdag 27 juni 2025 @ 13:11:
[...]
Ow echt, heb je daar een foto van? Ik heb een kabel van 2 meter.. Nooit gedacht aan een weerstand..
Modbus werkt zoals zo veel protocollen door een hoog/laag op de datakabels te zetten. Weerstand van de kabel/systeem beïnvloedt het verschil tussen een hoog en een laag waardoor het mis kan gaan.
Edit:
Ik heb zo’n 50cm zonder gedoe met weerstandjes.
[ Voor 6% gewijzigd door sjorsjuhmaniac op 27-06-2025 13:44 ]

Je kan R0 nog shorten om de 120 ohm termination resistor toe te voegen in het circuit.
Verder verwacht ik dat de bus in de omvormer zelf ook al 120 ohm is afgesloten.
@Dutchess_Nicole wat is de beredenering geweest om een weerstand toe te voegen in het midden van de transmissielijn?
Modbus (rs485) zou een 1200meter moeten kunnen overbruggen, dus ik verwacht dat het dan met 30cm nog net wel werkt met niet juist geplaatste afsluitweerstanden en met 50cm niet meer.
Is die kabel zelf getwisted? verwacht dat een ethernetkabel prima gaat werken.
[ Voor 24% gewijzigd door Tinusvolkel op 27-06-2025 14:04 ]
Ingekort, helaas:sjorsjuhmaniac schreef op vrijdag 27 juni 2025 @ 13:43:
[...]
Pak eens 30cm om te testen. Werkt dat, dan kan je verder proberen met die 2m.
Modbus werkt zoals zo veel protocollen door een hoog/laag op de datakabels te zetten. Weerstand van de kabel/systeem beïnvloedt het verschil tussen een hoog en een laag waardoor het mis kan gaan.
Edit:
Ik heb zo’n 50cm zonder gedoe met weerstandjes.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
| [14:24:21][C][logger:211]: Logger:
[14:24:21][C][logger:211]: Max Level: VERY_VERBOSE
[14:24:21][C][logger:211]: Initial Level: VERY_VERBOSE
[14:24:21][C][logger:217]: Log Baud Rate: 0
[14:24:21][C][logger:217]: Hardware UART: UART0
[14:24:21][C][uart.arduino_esp8266:118]: UART Bus:
[14:24:21][C][uart.arduino_esp8266:119]: TX Pin: GPIO13
[14:24:21][C][uart.arduino_esp8266:120]: RX Pin: GPIO12
[14:24:21][C][uart.arduino_esp8266:122]: RX Buffer Size: 256
[14:24:21][C][uart.arduino_esp8266:124]: Baud Rate: 9600 baud
[14:24:21][C][uart.arduino_esp8266:124]: Data Bits: 8
[14:24:21][C][uart.arduino_esp8266:124]: Parity: NONE
[14:24:21][C][uart.arduino_esp8266:124]: Stop bits: 1
[14:24:21][C][uart.arduino_esp8266:133]: Using software serial
[14:24:21][C][modbus:166]: Modbus:
[14:24:21][C][modbus:168]: Send Wait Time: 250 ms
[14:24:21][C][modbus:168]: CRC Disabled: NO
[14:24:21][C][modbus.number:083]: modbus.numberModbus Number '${devicename} MaxOutputPct'
[14:24:22][C][homeassistant.time:010]: Home Assistant Time:
[14:24:22][C][homeassistant.time:010]: Timezone: 'CET-1CEST,M3.5.0,M10.5.0/3'
[14:24:22][V][modbus:043]: Stop waiting for response from 1
[14:24:22][V][modbus_controller:043]: Sending next modbus command to device 1 register 0xC15 count 1
[14:24:22][VV][uart.arduino_esp8266:198]: Flushing
[14:24:22][V][modbus:226]: Modbus write: 01.04.0C.15.00.01.23.5E (8)
[14:24:22][V][modbus_controller:570]: Command sent 4 0xC15 1 send_count: 5
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} DcPower'
[14:24:22]modbus_controller.sensor State Class: ''
[14:24:22]modbus_controller.sensor Unit of Measurement: 'W'
[14:24:22]modbus_controller.sensor Accuracy Decimals: 1
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'power'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} DcVoltage'
[14:24:22]modbus_controller.sensor State Class: ''
[14:24:22]modbus_controller.sensor Unit of Measurement: 'V'
[14:24:22]modbus_controller.sensor Accuracy Decimals: 1
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'voltage'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} DcInputCurrent'
[14:24:22]modbus_controller.sensor State Class: ''
[14:24:22]modbus_controller.sensor Unit of Measurement: 'A'
[14:24:22]modbus_controller.sensor Accuracy Decimals: 1
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'current'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} AcFrequency'
[14:24:22]modbus_controller.sensor State Class: ''
[14:24:22]modbus_controller.sensor Unit of Measurement: 'Hz'
[14:24:22]modbus_controller.sensor Accuracy Decimals: 1
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} AcVoltage'
[14:24:22]modbus_controller.sensor State Class: ''
[14:24:22]modbus_controller.sensor Unit of Measurement: 'V'
[14:24:22]modbus_controller.sensor Accuracy Decimals: 1
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'voltage'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} AcOutputCurrent'
[14:24:22]modbus_controller.sensor State Class: ''
[14:24:22]modbus_controller.sensor Unit of Measurement: 'A'
[14:24:22]modbus_controller.sensor Accuracy Decimals: 1
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'current'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} AcPower'
[14:24:22]modbus_controller.sensor State Class: ''
[14:24:22]modbus_controller.sensor Unit of Measurement: 'W'
[14:24:22]modbus_controller.sensor Accuracy Decimals: 1
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'power'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} EnergyToday'
[14:24:22]modbus_controller.sensor State Class: ''
[14:24:22]modbus_controller.sensor Unit of Measurement: 'kWh'
[14:24:22]modbus_controller.sensor Accuracy Decimals: 1
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'energy'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} EnergyTotal'
[14:24:22]modbus_controller.sensor State Class: 'total_increasing'
[14:24:22]modbus_controller.sensor Unit of Measurement: 'kWh'
[14:24:22]modbus_controller.sensor Accuracy Decimals: 1
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'energy'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash'
[14:24:22][D][uart_debug:114]: >>> 01:04:0C:15:00:01:23:5E
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} Temperature'
[14:24:22]modbus_controller.sensor State Class: ''
[14:24:22]modbus_controller.sensor Unit of Measurement: 'C'
[14:24:22]modbus_controller.sensor Accuracy Decimals: 1
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'temperature'
[14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:thermometer'
[14:24:22][C][modbus_controller.switch:079]: modbus_controller.switchModbus Controller Switch '${devicename} Enabled'
[14:24:22]modbus_controller.switch Restore Mode: disabled
[14:24:22][C][captive_portal:089]: Captive Portal:
[14:24:22][C][web_server:285]: Web Server:
[14:24:22][C][web_server:285]: Address: test-logger.local:80
[14:24:22][C][esphome.ota:073]: Over-The-Air updates:
[14:24:22][C][esphome.ota:073]: Address: test-logger.local:8266
[14:24:22][C][esphome.ota:073]: Version: 2
[14:24:22][C][safe_mode:018]: Safe Mode:
[14:24:22][C][safe_mode:019]: Boot considered successful after 60 seconds
[14:24:22][C][safe_mode:019]: Invoke after 10 boot attempts
[14:24:22][C][safe_mode:019]: Remain for 300 seconds
[14:24:22][C][api:182]: API Server:
[14:24:22][C][api:182]: Address: test-logger.local:6053
[14:24:22][C][api:192]: Using noise encryption: NO
[14:24:22][C][mdns:122]: mDNS:
[14:24:22][C][mdns:122]: Hostname: test-logger
[14:24:22][V][mdns:126]: Services:
[14:24:22][V][mdns:128]: - _esphomelib, _tcp, 6053
[14:24:22][V][mdns:131]: TXT: friendly_name = ESP Logging Test
[14:24:22][V][mdns:131]: TXT: version = 2025.6.1
[14:24:22][V][mdns:131]: TXT: mac = e8db84daba1b
[14:24:22][V][mdns:131]: TXT: platform = ESP8266
[14:24:22][V][mdns:131]: TXT: board = d1_mini
[14:24:22][V][mdns:131]: TXT: network = wifi
[14:24:22][V][mdns:128]: - _http, _tcp, 80
[14:24:22][C][modbus_controller:349]: ModbusController:
[14:24:22][C][modbus_controller:349]: Address: 0x01
[14:24:22][C][modbus_controller:349]: Max Command Retries: 4
[14:24:22][C][modbus_controller:349]: Offline Skip Updates: 0
[14:24:22][C][modbus_controller:356]: sensormap
[14:24:22][C][modbus_controller:358]: Sensor type=1 start=0x0 offset=0x0 count=1 size=1
[14:24:22][C][modbus_controller:358]: Sensor type=3 start=0x3 offset=0x0 count=1 size=2
[14:24:22][C][modbus_controller:358]: Sensor type=3 start=0x3 offset=0x0 count=1 size=2
[14:24:22][C][modbus_controller:358]: Sensor type=3 start=0x5 offset=0x0 count=2 size=4
[14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x4 offset=0x0 count=1 size=2
[14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x25 offset=0x0 count=1 size=2
[14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x25 offset=0x2 count=1 size=2
[14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x25 offset=0x4 count=1 size=2
[14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x25 offset=0x6 count=2 size=4
[14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x35 offset=0x0 count=2 size=4
[14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x35 offset=0x4 count=2 size=4
[14:24:22][C][modbus_controller:358]: Sensor type=4 start=0xC15 offset=0x0 count=1 size=2
[14:24:22][C][modbus_controller:362]: ranges
[14:24:22][C][modbus_controller:364]: Range type=1 start=0x0 count=1 skip_updates=0
[14:24:22][C][modbus_controller:364]: Range type=3 start=0x3 count=1 skip_updates=0
[14:24:22][C][modbus_controller:364]: Range type=3 start=0x5 count=2 skip_updates=0
[14:24:22][C][modbus_controller:364]: Range type=4 start=0x4 count=1 skip_updates=0
[14:24:22][C][modbus_controller:364]: Range type=4 start=0x25 count=5 skip_updates=0
[14:24:22][C][modbus_controller:364]: Range type=4 start=0x35 count=4 skip_updates=0
[14:24:22][C][modbus_controller:364]: Range type=4 start=0xC15 count=1 skip_updates=0
[14:24:22][C][modbus_controller:367]: server registers
[14:24:22][V][modbus:043]: Stop waiting for response from 1
[14:24:22][D][modbus_controller:039]: Modbus command to device=1 register=0xC15 no response received - removed from send queue
[14:24:27][V][modbus_controller:232]: Updating modbus component
[14:24:27][VV][modbus_controller:236]: Updating range 0x0
[14:24:27][V][modbus_controller:198]: Range : 0 Size: 1 (1) skip: 0
[14:24:27][VV][modbus_controller:236]: Updating range 0x3
[14:24:27][V][modbus_controller:198]: Range : 3 Size: 1 (3) skip: 0
[14:24:27][VV][modbus_controller:236]: Updating range 0x5
[14:24:27][V][modbus_controller:198]: Range : 5 Size: 2 (3) skip: 0
[14:24:27][VV][modbus_controller:236]: Updating range 0x4
[14:24:27][V][modbus_controller:198]: Range : 4 Size: 1 (4) skip: 0
[14:24:27][VV][modbus_controller:236]: Updating range 0x25
[14:24:27][V][modbus_controller:198]: Range : 25 Size: 5 (4) skip: 0
[14:24:27][VV][modbus_controller:236]: Updating range 0x35
[14:24:27][V][modbus_controller:198]: Range : 35 Size: 4 (4) skip: 0
[14:24:27][VV][modbus_controller:236]: Updating range 0xC15
[14:24:27][V][modbus_controller:198]: Range : C15 Size: 1 (4) skip: 0
[14:24:27][V][modbus_controller:043]: Sending next modbus command to device 1 register 0x00 count 1
[14:24:27][VV][uart.arduino_esp8266:198]: Flushing
[14:24:27][V][modbus:226]: Modbus write: 01.01.00.00.00.01.FD.CA (8)
[14:24:27][V][modbus_controller:570]: Command sent 1 0x0 1 send_count: 1
[14:24:27][D][uart_debug:114]: >>> 01:01:00:00:00:01:FD:CA
[14:24:28][V][modbus:043]: Stop waiting for response from 1
[14:24:28][V][modbus_controller:043]: Sending next modbus command to device 1 register 0x00 count 1
[14:24:28][VV][uart.arduino_esp8266:198]: Flushing
[14:24:28][V][modbus:226]: Modbus write: 01.01.00.00.00.01.FD.CA (8)
[14:24:28][V][modbus_controller:570]: Command sent 1 0x0 1 send_count: 2
[14:24:28][D][uart_debug:114]: >>> 01:01:00:00:00:01:FD:CA
[14:24:28][V][modbus:043]: Stop waiting for response from 1
[14:24:28][V][modbus_controller:043]: Sending next modbus command to device 1 register 0x00 count 1
[14:24:28][VV][uart.arduino_esp8266:198]: Flushing
[14:24:28][V][modbus:226]: Modbus write: 01.01.00.00.00.01.FD.CA (8)
[14:24:28][V][modbus_controller:570]: Command sent 1 0x0 1 send_count: 3
[14:24:28][D][uart_debug:114]: >>> 01:01:00:00:00:01:FD:CA
[14:24:28][V][modbus:043]: Stop waiting for response from 1
[14:24:28][V][modbus_controller:043]: Sending next modbus command to device 1 register 0x00 count 1
[14:24:28][VV][uart.arduino_esp8266:198]: Flushing
[14:24:28][V][modbus:226]: Modbus write: 01.01.00.00.00.01.FD.CA (8)
[14:24:28][V][modbus_controller:570]: Command sent 1 0x0 1 send_count: 4
[14:24:28][D][uart_debug:114]: >>> 01:01:00:00:00:01:FD:CA
[14:24:28][VV][modbus:054]: Modbus received Byte 255 (0Xff)
[14:24:28][V][modbus:036]: Clearing buffer of 1 bytes - timeout
[14:24:28][D][uart_debug:114]: <<< FF
[14:24:28][V][modbus:043]: Stop waiting for response from 1
[14:24:28][V][modbus_controller:043]: Sending next modbus command to device 1 register 0x00 count 1
[14:24:28][VV][uart.arduino_esp8266:198]: Flushing
[14:24:28][V][modbus:226]: Modbus write: 01.01.00.00.00.01.FD.CA (8)
[14:24:28][V][modbus_controller:570]: Command sent 1 0x0 1 send_count: 5
[14:24:28][D][uart_debug:114]: >>> 01:01:00:00:00:01:FD:CA
[14:24:28][VV][modbus:054]: Modbus received Byte 255 (0Xff)
[14:24:28][V][modbus:036]: Clearing buffer of 1 bytes - timeout
[14:24:28][D][uart_debug:114]: <<< FF |
Goede vraag! Daar was ik mee begonnen (heb zo'n stick en ook de WIFI variant zelfs). Om heel eerlijk te zijn was dat mijn droom implementatie. Maar krijg daar dezelfde foutmelding. Ik ben ook in contact met @Growatt hierover.firecaps30 schreef op vrijdag 27 juni 2025 @ 14:07:
@konehead Waarom gebruik je niet zo een simpele modbus - USB adapter die je in je Pi/PC steekt waar Home Assistant op draait? Zoals deze, en installeer je de Solax Modbus integratie?
Zij zeggen:
The wifi-stick can worked with SYSCOM. Beacuse without the stick we cannot setting your inverter. When you get your IP addres s you can use this command to check if the ShineWiFi-X's Modbus TCP port is open. [Test-NetConnection -ComputerName x.x.x.x -Port 502]
Dat heb ik gedaan, resultaat:
Connection to 192.168.1.72 port 502 [tcp/asa-appl-proto] succeeded!
192.168.1.72 port 80 (tcp) failed: Connection refused
Reply terug: This shows the inverter and wifi sitck is correct. You may check your Home Assistant settimg.
Gebruik je ook een flow control pin? Bij mijn versie van het TTL bordje bleek dat nodig te zijn.konehead schreef op vrijdag 27 juni 2025 @ 14:25:
[...]
Ingekort, helaas:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189[14:24:21][C][logger:211]: Logger: [14:24:21][C][logger:211]: Max Level: VERY_VERBOSE [14:24:21][C][logger:211]: Initial Level: VERY_VERBOSE [14:24:21][C][logger:217]: Log Baud Rate: 0 [14:24:21][C][logger:217]: Hardware UART: UART0 [14:24:21][C][uart.arduino_esp8266:118]: UART Bus: [14:24:21][C][uart.arduino_esp8266:119]: TX Pin: GPIO13 [14:24:21][C][uart.arduino_esp8266:120]: RX Pin: GPIO12 [14:24:21][C][uart.arduino_esp8266:122]: RX Buffer Size: 256 [14:24:21][C][uart.arduino_esp8266:124]: Baud Rate: 9600 baud [14:24:21][C][uart.arduino_esp8266:124]: Data Bits: 8 [14:24:21][C][uart.arduino_esp8266:124]: Parity: NONE [14:24:21][C][uart.arduino_esp8266:124]: Stop bits: 1 [14:24:21][C][uart.arduino_esp8266:133]: Using software serial [14:24:21][C][modbus:166]: Modbus: [14:24:21][C][modbus:168]: Send Wait Time: 250 ms [14:24:21][C][modbus:168]: CRC Disabled: NO [14:24:21][C][modbus.number:083]: modbus.numberModbus Number '${devicename} MaxOutputPct' [14:24:22][C][homeassistant.time:010]: Home Assistant Time: [14:24:22][C][homeassistant.time:010]: Timezone: 'CET-1CEST,M3.5.0,M10.5.0/3' [14:24:22][V][modbus:043]: Stop waiting for response from 1 [14:24:22][V][modbus_controller:043]: Sending next modbus command to device 1 register 0xC15 count 1 [14:24:22][VV][uart.arduino_esp8266:198]: Flushing [14:24:22][V][modbus:226]: Modbus write: 01.04.0C.15.00.01.23.5E (8) [14:24:22][V][modbus_controller:570]: Command sent 4 0xC15 1 send_count: 5 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} DcPower' [14:24:22]modbus_controller.sensor State Class: '' [14:24:22]modbus_controller.sensor Unit of Measurement: 'W' [14:24:22]modbus_controller.sensor Accuracy Decimals: 1 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'power' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} DcVoltage' [14:24:22]modbus_controller.sensor State Class: '' [14:24:22]modbus_controller.sensor Unit of Measurement: 'V' [14:24:22]modbus_controller.sensor Accuracy Decimals: 1 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'voltage' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} DcInputCurrent' [14:24:22]modbus_controller.sensor State Class: '' [14:24:22]modbus_controller.sensor Unit of Measurement: 'A' [14:24:22]modbus_controller.sensor Accuracy Decimals: 1 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'current' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} AcFrequency' [14:24:22]modbus_controller.sensor State Class: '' [14:24:22]modbus_controller.sensor Unit of Measurement: 'Hz' [14:24:22]modbus_controller.sensor Accuracy Decimals: 1 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} AcVoltage' [14:24:22]modbus_controller.sensor State Class: '' [14:24:22]modbus_controller.sensor Unit of Measurement: 'V' [14:24:22]modbus_controller.sensor Accuracy Decimals: 1 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'voltage' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} AcOutputCurrent' [14:24:22]modbus_controller.sensor State Class: '' [14:24:22]modbus_controller.sensor Unit of Measurement: 'A' [14:24:22]modbus_controller.sensor Accuracy Decimals: 1 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'current' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} AcPower' [14:24:22]modbus_controller.sensor State Class: '' [14:24:22]modbus_controller.sensor Unit of Measurement: 'W' [14:24:22]modbus_controller.sensor Accuracy Decimals: 1 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'power' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} EnergyToday' [14:24:22]modbus_controller.sensor State Class: '' [14:24:22]modbus_controller.sensor Unit of Measurement: 'kWh' [14:24:22]modbus_controller.sensor Accuracy Decimals: 1 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'energy' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} EnergyTotal' [14:24:22]modbus_controller.sensor State Class: 'total_increasing' [14:24:22]modbus_controller.sensor Unit of Measurement: 'kWh' [14:24:22]modbus_controller.sensor Accuracy Decimals: 1 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'energy' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:flash' [14:24:22][D][uart_debug:114]: >>> 01:04:0C:15:00:01:23:5E [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor '${devicename} Temperature' [14:24:22]modbus_controller.sensor State Class: '' [14:24:22]modbus_controller.sensor Unit of Measurement: 'C' [14:24:22]modbus_controller.sensor Accuracy Decimals: 1 [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Device Class: 'temperature' [14:24:22][C][modbus_controller.sensor:010]: modbus_controller.sensor Icon: 'mdi:thermometer' [14:24:22][C][modbus_controller.switch:079]: modbus_controller.switchModbus Controller Switch '${devicename} Enabled' [14:24:22]modbus_controller.switch Restore Mode: disabled [14:24:22][C][captive_portal:089]: Captive Portal: [14:24:22][C][web_server:285]: Web Server: [14:24:22][C][web_server:285]: Address: test-logger.local:80 [14:24:22][C][esphome.ota:073]: Over-The-Air updates: [14:24:22][C][esphome.ota:073]: Address: test-logger.local:8266 [14:24:22][C][esphome.ota:073]: Version: 2 [14:24:22][C][safe_mode:018]: Safe Mode: [14:24:22][C][safe_mode:019]: Boot considered successful after 60 seconds [14:24:22][C][safe_mode:019]: Invoke after 10 boot attempts [14:24:22][C][safe_mode:019]: Remain for 300 seconds [14:24:22][C][api:182]: API Server: [14:24:22][C][api:182]: Address: test-logger.local:6053 [14:24:22][C][api:192]: Using noise encryption: NO [14:24:22][C][mdns:122]: mDNS: [14:24:22][C][mdns:122]: Hostname: test-logger [14:24:22][V][mdns:126]: Services: [14:24:22][V][mdns:128]: - _esphomelib, _tcp, 6053 [14:24:22][V][mdns:131]: TXT: friendly_name = ESP Logging Test [14:24:22][V][mdns:131]: TXT: version = 2025.6.1 [14:24:22][V][mdns:131]: TXT: mac = e8db84daba1b [14:24:22][V][mdns:131]: TXT: platform = ESP8266 [14:24:22][V][mdns:131]: TXT: board = d1_mini [14:24:22][V][mdns:131]: TXT: network = wifi [14:24:22][V][mdns:128]: - _http, _tcp, 80 [14:24:22][C][modbus_controller:349]: ModbusController: [14:24:22][C][modbus_controller:349]: Address: 0x01 [14:24:22][C][modbus_controller:349]: Max Command Retries: 4 [14:24:22][C][modbus_controller:349]: Offline Skip Updates: 0 [14:24:22][C][modbus_controller:356]: sensormap [14:24:22][C][modbus_controller:358]: Sensor type=1 start=0x0 offset=0x0 count=1 size=1 [14:24:22][C][modbus_controller:358]: Sensor type=3 start=0x3 offset=0x0 count=1 size=2 [14:24:22][C][modbus_controller:358]: Sensor type=3 start=0x3 offset=0x0 count=1 size=2 [14:24:22][C][modbus_controller:358]: Sensor type=3 start=0x5 offset=0x0 count=2 size=4 [14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x4 offset=0x0 count=1 size=2 [14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x25 offset=0x0 count=1 size=2 [14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x25 offset=0x2 count=1 size=2 [14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x25 offset=0x4 count=1 size=2 [14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x25 offset=0x6 count=2 size=4 [14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x35 offset=0x0 count=2 size=4 [14:24:22][C][modbus_controller:358]: Sensor type=4 start=0x35 offset=0x4 count=2 size=4 [14:24:22][C][modbus_controller:358]: Sensor type=4 start=0xC15 offset=0x0 count=1 size=2 [14:24:22][C][modbus_controller:362]: ranges [14:24:22][C][modbus_controller:364]: Range type=1 start=0x0 count=1 skip_updates=0 [14:24:22][C][modbus_controller:364]: Range type=3 start=0x3 count=1 skip_updates=0 [14:24:22][C][modbus_controller:364]: Range type=3 start=0x5 count=2 skip_updates=0 [14:24:22][C][modbus_controller:364]: Range type=4 start=0x4 count=1 skip_updates=0 [14:24:22][C][modbus_controller:364]: Range type=4 start=0x25 count=5 skip_updates=0 [14:24:22][C][modbus_controller:364]: Range type=4 start=0x35 count=4 skip_updates=0 [14:24:22][C][modbus_controller:364]: Range type=4 start=0xC15 count=1 skip_updates=0 [14:24:22][C][modbus_controller:367]: server registers [14:24:22][V][modbus:043]: Stop waiting for response from 1 [14:24:22][D][modbus_controller:039]: Modbus command to device=1 register=0xC15 no response received - removed from send queue [14:24:27][V][modbus_controller:232]: Updating modbus component [14:24:27][VV][modbus_controller:236]: Updating range 0x0 [14:24:27][V][modbus_controller:198]: Range : 0 Size: 1 (1) skip: 0 [14:24:27][VV][modbus_controller:236]: Updating range 0x3 [14:24:27][V][modbus_controller:198]: Range : 3 Size: 1 (3) skip: 0 [14:24:27][VV][modbus_controller:236]: Updating range 0x5 [14:24:27][V][modbus_controller:198]: Range : 5 Size: 2 (3) skip: 0 [14:24:27][VV][modbus_controller:236]: Updating range 0x4 [14:24:27][V][modbus_controller:198]: Range : 4 Size: 1 (4) skip: 0 [14:24:27][VV][modbus_controller:236]: Updating range 0x25 [14:24:27][V][modbus_controller:198]: Range : 25 Size: 5 (4) skip: 0 [14:24:27][VV][modbus_controller:236]: Updating range 0x35 [14:24:27][V][modbus_controller:198]: Range : 35 Size: 4 (4) skip: 0 [14:24:27][VV][modbus_controller:236]: Updating range 0xC15 [14:24:27][V][modbus_controller:198]: Range : C15 Size: 1 (4) skip: 0 [14:24:27][V][modbus_controller:043]: Sending next modbus command to device 1 register 0x00 count 1 [14:24:27][VV][uart.arduino_esp8266:198]: Flushing [14:24:27][V][modbus:226]: Modbus write: 01.01.00.00.00.01.FD.CA (8) [14:24:27][V][modbus_controller:570]: Command sent 1 0x0 1 send_count: 1 [14:24:27][D][uart_debug:114]: >>> 01:01:00:00:00:01:FD:CA [14:24:28][V][modbus:043]: Stop waiting for response from 1 [14:24:28][V][modbus_controller:043]: Sending next modbus command to device 1 register 0x00 count 1 [14:24:28][VV][uart.arduino_esp8266:198]: Flushing [14:24:28][V][modbus:226]: Modbus write: 01.01.00.00.00.01.FD.CA (8) [14:24:28][V][modbus_controller:570]: Command sent 1 0x0 1 send_count: 2 [14:24:28][D][uart_debug:114]: >>> 01:01:00:00:00:01:FD:CA [14:24:28][V][modbus:043]: Stop waiting for response from 1 [14:24:28][V][modbus_controller:043]: Sending next modbus command to device 1 register 0x00 count 1 [14:24:28][VV][uart.arduino_esp8266:198]: Flushing [14:24:28][V][modbus:226]: Modbus write: 01.01.00.00.00.01.FD.CA (8) [14:24:28][V][modbus_controller:570]: Command sent 1 0x0 1 send_count: 3 [14:24:28][D][uart_debug:114]: >>> 01:01:00:00:00:01:FD:CA [14:24:28][V][modbus:043]: Stop waiting for response from 1 [14:24:28][V][modbus_controller:043]: Sending next modbus command to device 1 register 0x00 count 1 [14:24:28][VV][uart.arduino_esp8266:198]: Flushing [14:24:28][V][modbus:226]: Modbus write: 01.01.00.00.00.01.FD.CA (8) [14:24:28][V][modbus_controller:570]: Command sent 1 0x0 1 send_count: 4 [14:24:28][D][uart_debug:114]: >>> 01:01:00:00:00:01:FD:CA [14:24:28][VV][modbus:054]: Modbus received Byte 255 (0Xff) [14:24:28][V][modbus:036]: Clearing buffer of 1 bytes - timeout [14:24:28][D][uart_debug:114]: <<< FF [14:24:28][V][modbus:043]: Stop waiting for response from 1 [14:24:28][V][modbus_controller:043]: Sending next modbus command to device 1 register 0x00 count 1 [14:24:28][VV][uart.arduino_esp8266:198]: Flushing [14:24:28][V][modbus:226]: Modbus write: 01.01.00.00.00.01.FD.CA (8) [14:24:28][V][modbus_controller:570]: Command sent 1 0x0 1 send_count: 5 [14:24:28][D][uart_debug:114]: >>> 01:01:00:00:00:01:FD:CA [14:24:28][VV][modbus:054]: Modbus received Byte 255 (0Xff) [14:24:28][V][modbus:036]: Clearing buffer of 1 bytes - timeout [14:24:28][D][uart_debug:114]: <<< FF
In de ESPHOME code heb ik het volgende staan:
modbus:
id: modbus1
uart_id: mod_bus
flow_control_pin: 5
Die pin 5 (witte kabel) is aangesloten op zowel DE en RE (blauw en zwart) van het TTL boardje aangesloten.
Voordat ik dit had gedaan kreeg ik ook geen contact met de omvormer er daarna wel
Zie de foto ter illustratie. Zit allemaal nog op een breadboard totdat ik eens een keer de moed krijg om het echt netjes te maken
[ Voor 100% gewijzigd door arro3038 op 27-06-2025 17:06 ]
Dankjewel! Ik heb je boardje nagebouwd (ik had nog hetzelfde TLL bordje liggen). Helaas zelfde uitkomstarro3038 schreef op vrijdag 27 juni 2025 @ 17:02:
[...]
Gebruik je ook een flow control pin? Bij mijn versie van het TTL bordje bleek dat nodig te zijn.
In de ESPHOME code heb ik het volgende staan:
modbus:
id: modbus1
uart_id: mod_bus
flow_control_pin: 5
Die pin 5 (witte kabel) is aangesloten op zowel DE en RE (blauw en zwart) van het TTL boardje aangesloten.
Voordat ik dit had gedaan kreeg ik ook geen contact met de omvormer er daarna wel
Zie de foto ter illustratie. Zit allemaal nog op een breadboard totdat ik eens een keer de moed krijg om het echt netjes te maken![]()
[Afbeelding]
TLL => Wemos D1 mini
DI => Aangesloten op D6
DE/RE => aangesloten op D1 (dus DE en RE samengevoegd)
RO => aangesloten op D7
VCC => 5v
GND =.> GND
Aansluiting naar inverter (SYS COM)
B (groen) > Pin 4
A (wit groen > Pin 3
code:
1
2
3
4
5
6
7
8
9
10
| uart: id: gw_uart baud_rate: 9600 tx_pin: GPIO12 rx_pin: GPIO13 modbus: id: modbus1 uart_id: gw_uart flow_control_pin: 5 |
/f/image/5Lig1WpG9MYWv6sEqTI11Tbc.png?f=fotoalbum_large)
:strip_exif()/f/image/VhpTfIbUjsGzcNrd3NCB3MJK.jpg?f=fotoalbum_large)
:strip_exif()/f/image/eAq51LfGg1GDhumiR9Rb7RRz.jpg?f=fotoalbum_large)
Irritant zeg, ik heb helaas ook geen andere ideeën.konehead schreef op vrijdag 27 juni 2025 @ 21:37:
[...]
Dankjewel! Ik heb je boardje nagebouwd (ik had nog hetzelfde TLL bordje liggen). Helaas zelfde uitkomst![]()
TLL => Wemos D1 mini
DI => Aangesloten op D6
DE/RE => aangesloten op D1 (dus DE en RE samengevoegd)
RO => aangesloten op D7
VCC => 5v
GND =.> GND
Aansluiting naar inverter (SYS COM)
B (groen) > Pin 4
A (wit groen > Pin 3
code:
1 2 3 4 5 6 7 8 9 10 uart: id: gw_uart baud_rate: 9600 tx_pin: GPIO12 rx_pin: GPIO13 modbus: id: modbus1 uart_id: gw_uart flow_control_pin: 5
[Afbeelding]
[Afbeelding]
[Afbeelding]
[Afbeelding]
Experimenteren, min of meer. Met een kabel direct, 2 aderig en niet getwist werkte het signaaloverdracht niet. Ik stuurde wel signalen naar de omvormer maar kreeg geen reactie. Er zit al een weerstand op het TTL bordje, dus dat zou wat moeten doen maar was blijkbaar niet genoeg. Nog een weerstand aan de plug kant gaf ook geen soelaas, dus toen heb ik maar besloten om er in het midden nog 1tje te plaatsen.Tinusvolkel schreef op vrijdag 27 juni 2025 @ 14:00:
@Dutchess_Nicole wat is de beredenering geweest om een weerstand toe te voegen in het midden van de transmissielijn?
Modbus (rs485) zou een 1200meter moeten kunnen overbruggen, dus ik verwacht dat het dan met 30cm nog net wel werkt met niet juist geplaatste afsluitweerstanden en met 50cm niet meer.
Is die kabel zelf getwisted? verwacht dat een ethernetkabel prima gaat werken.
Ineens begon dat te werken.
Ik heb geen idee waarom een weerstand daar verschil zou maken maar voor mij is dat blijkbaar de oplossing.
Kia E-Niro 2019 Executiveline. OTGW/HA Enthousiasteling.
Ik probeer het ook te begrijpen: heb jij naast de ESP/TLL oplossing ook je ShineWifi stick in je inverter zitten?Dutchess_Nicole schreef op zaterdag 28 juni 2025 @ 08:33:
[...]
Experimenteren, min of meer. Met een kabel direct, 2 aderig en niet getwist werkte het signaaloverdracht niet. Ik stuurde wel signalen naar de omvormer maar kreeg geen reactie. Er zit al een weerstand op het TTL bordje, dus dat zou wat moeten doen maar was blijkbaar niet genoeg. Nog een weerstand aan de plug kant gaf ook geen soelaas, dus toen heb ik maar besloten om er in het midden nog 1tje te plaatsen.
Ineens begon dat te werken.
Ik heb geen idee waarom een weerstand daar verschil zou maken maar voor mij is dat blijkbaar de oplossing.
Ik begin steeds meer te vermoeden dat hier iets niet lekker zit. Voor de fijnproevers; ik heb de oplossingen ook getest zonder shinestick
Ik heb gewoon de wifi stick in de omvormer zitten en lees deze ook met Grott en HA uit.
De modbus wordt uitgelezen door een python script op een raspberry pi en een CH340 USB to RS485 converter en parallel daaraan heb ik een wemos d1 mini met onderstaande module en deze loopt op ESPHome in HA. De A+ gaat naar pin 3 van de Growatt en de B- naar pin 4
De modbus wordt uitgelezen door een python script op een raspberry pi en een CH340 USB to RS485 converter en parallel daaraan heb ik een wemos d1 mini met onderstaande module en deze loopt op ESPHome in HA. De A+ gaat naar pin 3 van de Growatt en de B- naar pin 4
18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 2400AC 11,5kWh🔋,Hyundai Kona 64kWh 🚗, Peblar Home ⛽, Maxima MPM 7L 🥐
Volgens mij hebt de RS485 module sowieso een slag verkeerd op breadboard zitten.konehead schreef op vrijdag 27 juni 2025 @ 21:37:
[...]
Dankjewel! Ik heb je boardje nagebouwd (ik had nog hetzelfde TLL bordje liggen). Helaas zelfde uitkomst![]()
TLL => Wemos D1 mini
DI => Aangesloten op D6
DE/RE => aangesloten op D1 (dus DE en RE samengevoegd)
RO => aangesloten op D7
VCC => 5v
GND =.> GND
Aansluiting naar inverter (SYS COM)
B (groen) > Pin 4
A (wit groen > Pin 3
code:
1 2 3 4 5 6 7 8 9 10 uart: id: gw_uart baud_rate: 9600 tx_pin: GPIO12 rx_pin: GPIO13 modbus: id: modbus1 uart_id: gw_uart flow_control_pin: 5
[Afbeelding]
[Afbeelding]
[Afbeelding]
[Afbeelding]
Alle communicatie pinnen van je module zijn nu met elkaar verbonden en hebben geen verbinding met je draden
Nee, die heb ik niet. Ik heb alleen de modbus connector die aangesloten zit.konehead schreef op zaterdag 28 juni 2025 @ 15:28:
[...]
Ik probeer het ook te begrijpen: heb jij naast de ESP/TLL oplossing ook je ShineWifi stick in je inverter zitten?
Ik begin steeds meer te vermoeden dat hier iets niet lekker zit. Voor de fijnproevers; ik heb de oplossingen ook getest zonder shinestick
Ter verduidelijking: Ik heb origineel in 2004 inderdaad zo'n Shinewatdanook stick gekregen. Die heeft net iets langer dan een jaar gewerkt and gaf daarna de geest.
Ik was in die tijd nog niet bezig met Home Automation dus ik had geen interresse in een nieuwe dus die heb ik nooit besteld.
9 jaar na installatie van de toenmalige inverter begon dat ding ook kuren te vertonen (niet opstarten, relais bleef maar in- en uitschakelen en wat andere maffe dingen) dus ik heb dat ding laten vervangen door een nieuwe, en daarbij dus ook geen Shinedinges bestelt want die dingen gaan in mijn ervaring direct stuk.
[ Voor 40% gewijzigd door Dutchess_Nicole op 29-06-2025 09:21 ]
Kia E-Niro 2019 Executiveline. OTGW/HA Enthousiasteling.
Wat stom! En scherp van jou!! Gelijk even getest, maar helaas..brambo123 schreef op zaterdag 28 juni 2025 @ 18:37:
[...]
Volgens mij hebt de RS485 module sowieso een slag verkeerd op breadboard zitten.
Alle communicatie pinnen van je module zijn nu met elkaar verbonden en hebben geen verbinding met je draden
Ik zou flow_control_pin ook even netjes GPIO5 van maken.konehead schreef op zondag 29 juni 2025 @ 09:44:
[...]
Wat stom! En scherp van jou!! Gelijk even getest, maar helaas..
[Afbeelding]
Weet niet of die nu die nu pin D5 of GPIO5 pakt.
Beste kun je overigens je gnd ergens aan aarde hangen.
Van stopcontact of koelblok van omvormer.
Gnd doe je toch aan de gnd van de Wemos.
Mijn werkende code met een Wemos D1 mini.
Mijn werkende code met een Wemos D1 mini.
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
| esphome: name: growatt8266 esp8266: board: d1_mini # Enable logging logger: baud_rate: 0 # Enable Home Assistant API api: ota: platform: esphome wifi: ssid: !secret wifi_ssid password: !secret wifi_password captive_portal: # Example configuration entry uart: - id: uart_0 baud_rate: 9600 tx_pin: GPIO12 rx_pin: GPIO14 rx_buffer_size: 2048 debug: direction: both modbus: uart_id: uart_0 flow_control_pin: GPIO4 send_wait_time: 10ms disable_crc: true modbus_controller: - id: epever ## the Modbus device addr address: 0x1 setup_priority: -10 command_throttle: 25ms sensor: - platform: growatt_solar update_interval: 60s protocol_version: RTU2 phase_a: voltage: name: "Growatt Voltage Phase A" filters: lambda: float MIN_VALUE = 210.0; float MAX_VALUE = 270.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; current: name: "Growatt Current Phase A" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 45.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; active_power: name: "Growatt Power Phase A" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 7000.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; phase_b: voltage: name: "Growatt Voltage Phase B" filters: lambda: float MIN_VALUE = 210.0; float MAX_VALUE = 270.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; current: name: "Growatt Current Phase B" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 45.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; active_power: name: "Growatt Power Phase B" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 7000.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; phase_c: voltage: name: "Growatt Voltage Phase C" filters: lambda: float MIN_VALUE = 210.0; float MAX_VALUE = 270.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; current: name: "Growatt Current Phase C" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 45.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; active_power: name: "Growatt Power Phase C" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 7000.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; pv1: voltage: name: "Growatt PV1 Voltage" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 400.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; current: name: "Growatt PV1 Current" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 20.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; active_power: name: "Growatt PV1 Active Power" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 3000.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; pv2: voltage: name: "Growatt PV2 Voltage" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 400.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; current: name: "Growatt PV2 Current" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 20.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; active_power: name: "Growatt PV2 Active Power" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 3000.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; active_power: name: "Growatt Grid Active Power" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 12000.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; pv_active_power: name: "Growatt PV Active Power" filters: - lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 6000.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; frequency: name: "Growatt Frequency" filters: lambda: float MIN_VALUE = 47.0; float MAX_VALUE = 53.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; energy_production_day: name: "Growatt Today's Generation" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 100.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; total_energy_production: name: "Growatt Total Energy Production" inverter_module_temp: name: "Growatt Inverter Module Temp" filters: lambda: float MIN_VALUE = 0.0; float MAX_VALUE = 100.0; if (MIN_VALUE <= x && x <= MAX_VALUE) return x; else return {}; |
[ Voor 98% gewijzigd door klump4u op 29-06-2025 11:11 ]
18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 2400AC 11,5kWh🔋,Hyundai Kona 64kWh 🚗, Peblar Home ⛽, Maxima MPM 7L 🥐
Ja, gnd van Wemos en RS485 module moeten aan elkaar.
Maar gnd moet ook verbonden zijn met een aardpunt.
RS485 is een 3 draads verbinding, A B en GND.
GND wordt vaak weg gelaten omdat beide zijden meestel wel hun GND aan de aarde hebben hangen.
Zou je de Wemos voeden met een vaste desktop pc, dan is die via usb automatisch geaard.
Maar niet als je laptop of een telefoon lader pakt.
Waarom nemen jullie geen m5stack ipv die losse printjes?
(ik heb in het verleden veel uitvallende RS485 bordjes gehad van ALI toen ik ze nog zelf samenstelde en sinds m5stack RS485 base is dat niet meer voorgekomen)
Ik heb hier code staan voor een MOD TL3-X
Eventueel nog HA yaml om naar pvoutput te gaan:
(ik heb in het verleden veel uitvallende RS485 bordjes gehad van ALI toen ik ze nog zelf samenstelde en sinds m5stack RS485 base is dat niet meer voorgekomen)
Ik heb hier code staan voor een MOD TL3-X
Eventueel nog HA yaml om naar pvoutput te gaan:
YAML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ## elke 5 minuten naar pvoutput automation: - id: 4f863af550147e2b3170 alias: update pvoutput trigger: platform: time_pattern minutes: /5 condition: and: - condition: state entity_id: sensor.growatt_status state: Normal - condition: numeric_state entity_id: sensor.growatt_ac_power above: 16 action: service: rest_command.update_pvoutput data: {} mode: single ## v1 = Energy Generation (Wh) / v2 = Power Generation (W) / v3 = Energy Production (Wh) / v4 = Power Production (W) / v5 = Temperature (degr. C) rest_command: update_pvoutput: url: "https://pvoutput.org/service/r2/addstatus.jsp" method: post headers: X-Pvoutput-Apikey: !secret pvoutput_api_key X-Pvoutput-SystemId: !secret pvoutput_system_id_1 Content-Type: 'application/x-www-form-urlencoded' payload: >- d={{now().strftime("%Y%m%d")}} {#- date -#} &t={{now().strftime("%H:%M")}} {#- time -#} &v1= &v2={{states('sensor.growatt_ac_power')|float(0) |round(0)}} {#- Power generation (W) -#} &v5={{states('sensor.growatt_temperature')|float(0) |round(0)}} {#- temperature (C) -#} &v7={{states('sensor.growatt_pv1_power')|float(0) |round(0)}} {#- Power Pv1 (W) -#} &v8={{states('sensor.growatt_pv2_power')|float(0) |round(0)}} {#- Power PV2 (W) -#} &v9={{states('sensor.growatt_pv1_voltage')|float(0) |round(0)}} {#- Voltage PV1 (V) -#} &v10={{states('sensor.growatt_pv2_voltage')|float(0) |round(0)}} {#- Voltage PV2 (V) -#} &c1=1
[ Voor 77% gewijzigd door AUijtdehaag op 29-06-2025 17:36 ]
Tja, waarom niet een ethernet <> RS485/modbus converter? Twee stekkers aansluiten en je bent klaar.AUijtdehaag schreef op zondag 29 juni 2025 @ 17:24:
Waarom nemen jullie geen m5stack ipv die losse printjes?
@jadjong
Vind het wel fijn dat alle software in de esp draait ipv een extra stuk hardware naast de converter waar code op moet draaien.
Mijn marstek kan ik zo nog de backup wcd aanzetten bij komplete stroomuitval.
Vind het wel fijn dat alle software in de esp draait ipv een extra stuk hardware naast de converter waar code op moet draaien.
Mijn marstek kan ik zo nog de backup wcd aanzetten bij komplete stroomuitval.
[ Voor 6% gewijzigd door AUijtdehaag op 29-06-2025 18:05 ]
Of nog makkelijker, de nieuwe ShineWiLan-X2 er in stoppen.jadjong schreef op zondag 29 juni 2025 @ 17:59:
[...]
Tja, waarom niet een ethernet <> RS485/modbus converter? Twee stekkers aansluiten en je bent klaar.
Heeft modbus TCP, krijgt voeding direct van omvormer, en kan zowel wifi als bedraad netwerk.
Zo, twee weken verder en behoorlijke stappen gemaakt. Dank voor alle reacties en input! Met hulp van een topper van hier: @sjorsjuhmaniac! Ik mocht zijn ESP kastje lenen welke op zijn inverter goed werkte. En via deze stap hebben we een nog al stomme fout gevonden: Ik had de modbus draadjes op de verkeerde SysCom poort aangesloten..
Er zijn dus twee SysCom poorten op mijn inverter. Conclusie: Was behoorlijk de tunnel ingelopen 
Maar veel belangrijker: Data lezen gaat erg goed, schrijven nog niet. Is er iemand die hier succesvol waarde kan schrijven voor de batterij? Ik krijg foutmeldingen terwijl ik wel de Growatt Documentatie (met Hulp van Chat) gebruik... Maar helaas. Ik heb een MIN 4600 TL-XH met Growatt ARK XH Batterijset.
Lessons learnt:
1) Blijf volhouden, de aanhouder wint
2) het kastje van @AUijtdehaag lijkt idd de beste oplossing
3) Mijn wens is dat voor garantie e.d. de data naar Growatt geupload wordt. Ik wil dus de ShineStick én modbus kunnen gebruiken
4) De ModbusTCP oplossing (Via Wifi) lijkt mooi via Solax maar deze oplossing pushed de data naar HA, terwijl de ESPhome oplossing de data eruit trekt (via polling). Voor mijn usecase een substantieel verschil, de SOC van de batterij liep wel eens 8-10 min achter.
5) Als je via Modbus laadt en ontlaadt commando's geeft, dan is er geen limitatie. Ik heb gelezen dat het ESPRom dit niet aankan. Ik heb dit besproken met Growatt en op papier dat je dit onbeperkt kan gebruiken
/f/image/CS9Xs3j9jaMAUzkYnrsRl8OI.png?f=fotoalbum_large)
Maar veel belangrijker: Data lezen gaat erg goed, schrijven nog niet. Is er iemand die hier succesvol waarde kan schrijven voor de batterij? Ik krijg foutmeldingen terwijl ik wel de Growatt Documentatie (met Hulp van Chat) gebruik... Maar helaas. Ik heb een MIN 4600 TL-XH met Growatt ARK XH Batterijset.
Lessons learnt:
1) Blijf volhouden, de aanhouder wint
2) het kastje van @AUijtdehaag lijkt idd de beste oplossing
3) Mijn wens is dat voor garantie e.d. de data naar Growatt geupload wordt. Ik wil dus de ShineStick én modbus kunnen gebruiken
4) De ModbusTCP oplossing (Via Wifi) lijkt mooi via Solax maar deze oplossing pushed de data naar HA, terwijl de ESPhome oplossing de data eruit trekt (via polling). Voor mijn usecase een substantieel verschil, de SOC van de batterij liep wel eens 8-10 min achter.
5) Als je via Modbus laadt en ontlaadt commando's geeft, dan is er geen limitatie. Ik heb gelezen dat het ESPRom dit niet aankan. Ik heb dit besproken met Growatt en op papier dat je dit onbeperkt kan gebruiken
/f/image/CS9Xs3j9jaMAUzkYnrsRl8OI.png?f=fotoalbum_large)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
| #
# SENSOR NAMING CONVENTION
#
# The data here is pushed to mqtt and from there picked up by telegraf.
# Current config has some logic built into it so that telegraf does not require
# to have all topics hardcoded. This logic uses the topic/endpoint name to determine
# the type of data (Temperature, Power, Voltage, Percent, etc).
# convention is:
#
# DEVICENAME_ANY_TEXT_NAME_YOU_WANT_DATATYPE
# | | |
# | | |
# | | |_____ The type of data
# | | |_____ EX: POWER, VOLTGE, PERCENT
# | |
# | |____Any user friend text descriptor
# |
# |____ The device name
substitutions:
version: "1.1.10"
project_name: "growatt"
project_author: "me"
esphome:
name: ${project_name}
comment: "${project_name} inverter - v${version}"
project:
name: "${project_author}.${project_name}"
version: "${version}"
esp32:
board: mhetesp32minikit
framework:
type: arduino
logger:
logs:
modbus_controller.sensor: WARN
modbus_controller.output: WARN
modbus_controller: DEBUG
modbus: DEBUG
modbus.number: WARN
esp32.preferences: WARN
sensor: WARN
text_sensor: WARN
number: WARN
log_topic: NONE
# Enable Home Assistant API
api:
ota:
- platform: esphome
# password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Optional manual IP
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "${project_name} Fallback Hotspot"
password: "iEA7MxzX4hb6"
captive_portal:
web_server:
port: 80
# mqtt
#mqtt:
# broker: 192.168.88.117
# topic_prefix: "esphome/inverter2"
# #discovery_prefix: "testinggggg"
# discovery_unique_id_generator: mac
### Modbus Communicatie ###
uart:
id: mod_bus
tx_pin: 23
rx_pin: 19
baud_rate: 9600
parity: none
stop_bits: 1
modbus:
- send_wait_time: 1000ms
modbus_controller:
- id: ${project_name}
address: 0x1
update_interval: 10s
command_throttle: 10ms
### Sensoren ###
sensor:
# Inverter Status & Info
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: inverter_status_state
name: Inverter Status State
address: 0
icon: mdi:flash
register_type: read
value_type: U_WORD
accuracy_decimals: 0
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Inverter Temperature
id: inverter_temperature
address: 93
register_type: read
unit_of_measurement: "°C"
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: IPM Temperature
id: ipm_temperature
address: 94
register_type: read
unit_of_measurement: "°C"
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Boost Temperature
id: boost_temperature
address: 95
register_type: read
unit_of_measurement: "°C"
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: OUT Temperature
id: out_temperature
address: 96
register_type: read
unit_of_measurement: "°C"
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: STM32 Temperature
id: stm32_temperature
address: 97
register_type: read
unit_of_measurement: "°C"
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: derating_mode_status_state
name: Derating Mode Status State
icon: mdi:home-heart
address: 104
register_type: read
value_type: U_WORD
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Inverter Fault State
id: inverter_fault_state
address: 105
register_type: read
icon: mdi:alert-circle
value_type: U_WORD
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Real Power Percent
id: real_power_percent
address: 113
register_type: read
device_class: power_factor
icon: mdi:percent
value_type: U_WORD
unit_of_measurement: "%"
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: PV Insulation Resistance
id: pv_insulation_resistance
address: 3060 # Gecorrigeerd adres voor PV Isolation Resistance (voorheen 200)
register_type: read
unit_of_measurement: "KΩ"
icon: mdi:resistor
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
# PV Strings
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: total_pv_input_power
name: Total PV Input Power
address: 1
unit_of_measurement: W
device_class: power
icon: mdi:flash
register_type: read
value_type: U_DWORD
accuracy_decimals: 0
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: PV2 Voltage
id: pv2_voltage
address: 52 # Correct: Dit is PV2 Voltage volgens protocol (voorheen AC TR Voltage)
register_type: read
unit_of_measurement: V
device_class: voltage
icon: mdi:solar-panel
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: PV2 Current
id: pv2_current
address: 3008
register_type: read
value_type: U_WORD
unit_of_measurement: A
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: PV2 Power
id: pv2_power
address: 3009
register_type: read
value_type: U_DWORD
unit_of_measurement: W
accuracy_decimals: 1
filters:
- multiply: 0.1
# AC Net (Grid) & Belasting (Load)
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: AC Power
id: ac_power
address: 35
register_type: read
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 0
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: ac_frequency
name: AC Frequency
address: 37
register_type: read
unit_of_measurement: Hz
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.01
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: AC L1 Voltage
id: ac_l1_voltage
address: 38
register_type: read
unit_of_measurement: V
device_class: voltage
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: ac_l1_current
name: AC L1 Current
address: 39
unit_of_measurement: A
device_class: current
icon: mdi:flash
register_type: read
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: ac_l1_power
name: AC L1 Power
address: 40
unit_of_measurement: W
device_class: power
icon: mdi:flash
register_type: read
value_type: U_DWORD
accuracy_decimals: 0
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Grid Current
id: grid_current
address: 3027
register_type: read
value_type: U_WORD
unit_of_measurement: A
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Grid Frequency
id: grid_frequency
address: 3025
register_type: read
value_type: U_WORD
unit_of_measurement: Hz
accuracy_decimals: 2
filters:
- multiply: 0.01
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Grid Voltage
id: grid_voltage
address: 3026
register_type: read
value_type: U_WORD
unit_of_measurement: V
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Grid Power VA
id: grid_power_va
address: 3028
register_type: read
value_type: U_DWORD
unit_of_measurement: VA
device_class: apparent_power
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Output Power
id: output_power
address: 3023
register_type: read
value_type: U_DWORD
unit_of_measurement: W
device_class: power
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: output_maxpower_limited_power
name: Output Maxpower Limited Power
address: 102
unit_of_measurement: W
device_class: power
icon: mdi:flash
register_type: read
value_type: U_DWORD
accuracy_decimals: 0
filters:
- multiply: 0.1
# Batterij
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Battery Voltage
id: battery_voltage
address: 3170
register_type: read
value_type: U_WORD
unit_of_measurement: V
accuracy_decimals: 2
filters:
- multiply: 0.01
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Battery Current
id: battery_current
address: 3171
register_type: read
value_type: U_WORD
unit_of_measurement: A
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Battery SOC"
address: 3171
register_type: read
value_type: U_WORD
unit_of_measurement: "%"
accuracy_decimals: 1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Battery Charge Power
id: battery_charge_power
address: 3180
register_type: read
value_type: U_DWORD
unit_of_measurement: W
device_class: power
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Battery Discharge Power
id: battery_discharge_power
address: 3178
register_type: read
value_type: U_DWORD
unit_of_measurement: W
device_class: power
accuracy_decimals: 1
filters:
- multiply: 0.1
# Energie Totalen
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Today Energy
id: today_energy
address: 53
register_type: read
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Total Energy
id: total_energy
address: 55
register_type: read
unit_of_measurement: kWh
state_class: total_increasing
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Total Working Time Sec
id: total_working_time_sec
address: 57
register_type: read
unit_of_measurement: s
state_class: total_increasing
device_class: duration
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Today's Grid Export
id: today_grid_export
address: 3071
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Today's Grid Import
id: today_grid_import
address: 3075
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Total Reverse Energy (Output)
id: total_reverse_energy_output
address: 3043 # Gecorrigeerd: Dit is energie, geen vermogen
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh # Gecorrigeerd
device_class: energy # Gecorrigeerd
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: growatt2
name: "Today's Battery Output Energy"
id: today_battery_output_energy
address: 3126
register_type: holding
value_type: U_WORD
register_count: 2
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
lambda: |-
uint32_t high = data[0];
uint32_t low = data[1];
return (high << 16 | low) * 0.1;
- platform: modbus_controller
name: "Today's Battery Input Energy"
address: 3130
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Today's Power Generation
id: today_power_generation
address: 3049
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Total Yield
id: total_yield
address: 3051
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
# Overige Sensoren
- platform: wifi_signal
name: WiFi Signal
update_interval: 60s
- platform: uptime
name: Sensor sec
id: growatt_uptime_sensor
update_interval: 60s
on_raw_value:
then:
- text_sensor.template.publish:
id: growatt_uptime_human
state: !lambda |-
int seconds = round(id(growatt_uptime_sensor).raw_state);
int days = seconds / (24 * 3600);
seconds = seconds % (24 * 3600);
int hours = seconds / 3600;
seconds = seconds % 3600;
int minutes = seconds / 60;
seconds = seconds % 60;
return (
(days ? to_string(days) + "d " : "") +
(hours ? to_string(hours) + "h " : "") +
(minutes ? to_string(minutes) + "m " : "")
).c_str();
### Configureerbare Waarden (Numbers) ###
number:
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Max Output Power Setting Percent
id: max_output_power_setting_percent
address: 3
register_type: holding
value_type: U_WORD
min_value: 0 # Gecorrigeerd: 0-100% volgens protocol
max_value: 100
step: 1
entity_category: config
unit_of_measurement: "%"
icon: mdi:percent
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Active Power Output Limit Rate
id: active_power_output_limit_rate
address: 3070 # Gecorrigeerd: Naam verduidelijkt, dubbeling opgelost
register_type: holding
value_type: U_WORD
min_value: 0 # Gecorrigeerd: 0-100% volgens protocol
max_value: 100
step: 1
unit_of_measurement: "%"
mode: slider
icon: mdi:battery-arrow-down
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Active Power Input Limit Rate
id: active_power_input_limit_rate
address: 3090 # Gecorrigeerd: Naam verduidelijkt, dubbeling opgelost
register_type: holding
value_type: U_WORD # Gecorrigeerd: U_WORD volgens protocol (was U_DWORD)
min_value: 0 # Gecorrigeerd: 0-100% volgens protocol
max_value: 100
step: 1
unit_of_measurement: "%"
icon: mdi:battery-arrow-up
mode: slider
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Total Output Power Percent Setting
id: total_output_power_percent_setting
address: 3102
value_type: U_WORD
min_value: 0
max_value: 100
entity_category: config
unit_of_measurement: "%"
icon: mdi:percent
# Tijdsegment Instellingen
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 1 Begin"
id: time1_begin
address: 3146
register_type: holding
value_type: U_WORD
min_value: 0 # 00:00
max_value: 2359 # 23:59
step: 1
entity_category: config
icon: mdi:clock-start
on_value:
then:
- lambda: |-
int hours = int(x / 100);
int minutes = static_cast<int>(x) % 100;
id(time1_begin_text).publish_state(
(hours < 10 ? "0" : "") + to_string(hours) + ":" +
(minutes < 10 ? "0" : "") + to_string(minutes)
);
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 1 End"
id: time1_end
address: 3147
register_type: holding
value_type: U_WORD
min_value: 0 # 00:00
max_value: 2359 # 23:59
step: 1
entity_category: config
icon: mdi:clock-end
on_value:
then:
- lambda: |-
int hours = int(x / 100);
int minutes = static_cast<int>(x) % 100;
id(time1_end_text).publish_state(
(hours < 10 ? "0" : "") + to_string(hours) + ":" +
(minutes < 10 ? "0" : "") + to_string(minutes)
);
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 2 Begin"
id: time2_begin
address: 3150
register_type: holding
value_type: U_WORD
min_value: 0
max_value: 2359
step: 1
entity_category: config
icon: mdi:clock-start
on_value:
then:
- lambda: |-
int hours = int(x / 100);
int minutes = static_cast<int>(x) % 100;
id(time2_begin_text).publish_state(
(hours < 10 ? "0" : "") + to_string(hours) + ":" +
(minutes < 10 ? "0" : "") + to_string(minutes)
);
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 2 End"
id: time2_end
address: 3151
register_type: holding
value_type: U_WORD
min_value: 0
max_value: 2359
step: 1
entity_category: config
icon: mdi:clock-end
on_value:
then:
- lambda: |-
int hours = int(x / 100);
int minutes = static_cast<int>(x) % 100;
id(time2_end_text).publish_state(
(hours < 10 ? "0" : "") + to_string(hours) + ":" +
(minutes < 10 ? "0" : "") + to_string(minutes)
);
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 3 Begin"
id: time3_begin
address: 3154
register_type: holding
value_type: U_WORD
min_value: 0
max_value: 2359
step: 1
entity_category: config
icon: mdi:clock-start
on_value:
then:
- lambda: |-
int hours = int(x / 100);
int minutes = static_cast<int>(x) % 100;
id(time3_begin_text).publish_state(
(hours < 10 ? "0" : "") + to_string(hours) + ":" +
(minutes < 10 ? "0" : "") + to_string(minutes)
);
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 3 End"
id: time3_end
address: 3155
register_type: holding
value_type: U_WORD
min_value: 0
max_value: 2359
step: 1
entity_category: config
icon: mdi:clock-end
on_value:
then:
- lambda: |-
int hours = int(x / 100);
int minutes = static_cast<int>(x) % 100;
id(time3_end_text).publish_state(
(hours < 10 ? "0" : "") + to_string(hours) + ":" +
(minutes < 10 ? "0" : "") + to_string(minutes)
);
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "EMS Control Enable Status"
address: 3500
register_type: holding
value_type: U_WORD
### Operationele Modes (Selects) ###
select:
# Opladen/Prioriteit
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "AC Charging"
id: ac_charging
icon: mdi:battery-charging-100
address: 3134
value_type: U_WORD
optionsmap:
"Disabled": 0
"Enabled": 1
entity_category: config # Toegevoegd voor consistentie
skip_updates: 21
# Tijdsegment Actief/Modus
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 1 Active"
id: time1_active
address: 3145
value_type: U_WORD
optionsmap:
"Disabled": 0
"Enabled": 1
entity_category: config
icon: mdi:timer-outline
skip_updates: 21
- platform: modbus_controller
modbus_controller_id: growatt2
name: "Time Slot 1 ActiveUBER "
id: time_slot_1_active
address: 3515
value_type: U_WORD
optionsmap:
Disabled: 0
Enabled: 1
entity_category: config
icon: mdi:timer-outline
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 1 Mode"
id: time1_mode
address: 3148
value_type: U_WORD
optionsmap:
"Load First": 0
"Battery First": 1
"Grid First": 2
# "ECO": 3 # Verwijderd, niet in protocol voor dit register
entity_category: config
icon: mdi:arrow-decision-outline
skip_updates: 21
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 2 Active"
id: time2_active
address: 3149
value_type: U_WORD
optionsmap:
"Disabled": 0
"Enabled": 1
entity_category: config
icon: mdi:timer-outline
skip_updates: 21
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 2 Mode"
id: time2_mode
address: 3152
value_type: U_WORD
optionsmap:
"Load First": 0
"Battery First": 1
"Grid First": 2
# "ECO": 3 # Verwijderd, niet in protocol voor dit register
entity_category: config
icon: mdi:arrow-decision-outline
skip_updates: 21
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 3 Active"
id: time3_active
address: 3153
value_type: U_WORD
optionsmap:
"Disabled": 0
"Enabled": 1
entity_category: config
icon: mdi:timer-outline
skip_updates: 21
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Time 3 Mode"
id: time3_mode
address: 3156
value_type: U_WORD
optionsmap:
"Load First": 0
"Battery First": 1
"Grid First": 2
# "ECO": 3 # Verwijderd, niet in protocol voor dit register
entity_category: config
icon: mdi:arrow-decision-outline
skip_updates: 21
- platform: template
name: "Inverter Priority SPECIAL"
id: inverter_priority_select
icon: mdi:arrow-decision-outline
optimistic: true # Set to true as there's no direct readback for immediate verification
restore_value: true # Restore the last set value on reboot
# Define the options for the drop-down menu
options:
- "Load First"
- "Battery First"
- "Grid First"
# If you need to map internal values to options, you can use:
# options:
# - value: "Load First"
# key: 0 # Internal value for Load First
# - value: "Battery First"
# key: 1 # Internal value for Battery First
# - value: "Grid First"
# key: 2 # Internal value for Grid First
# When a new option is selected, this lambda will execute the Modbus write
on_value:
lambda: |-
std::vector<uint16_t> values_to_write;
int start_address = 3038;
// Determine which values to send based on the selected option (x is the selected string)
if (x == "Load First") {
values_to_write = {32768, 5947}; // Encoded values for Load First (0x8000, 0x173B)
ESP_LOGD("inverter_priority", "Setting Inverter Priority to: Load First");
} else if (x == "Battery First") {
values_to_write = {40960, 5947}; // Encoded values for Battery First (0xA000, 0x173B)
ESP_LOGD("inverter_priority", "Setting Inverter Priority to: Battery First");
} else if (x == "Grid First") {
values_to_write = {49152, 5947}; // Encoded values for Grid First (0xC000, 0x173B)
ESP_LOGD("inverter_priority", "Setting Inverter Priority to: Grid First");
} else {
ESP_LOGW("inverter_priority", "Unknown option selected: %s", x.c_str());
return; // Do nothing if an unknown option is somehow selected
}
// Queue the Modbus write multiple command
id(growatt2)->queue_command(
esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(
id(growatt2), start_address, values_to_write.size(), values_to_write
)
);
entity_category: config
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "EMS Control Enable"
address: 3500
value_type: U_WORD
optionsmap:
"Disabled": 0
"Enabled": 1
entity_category: config
icon: mdi:toggle-switch
### Schakelaars (Switches) ###
switch:
# Veiligheidsfuncties (omgezet van sensor naar switch)
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: safety_function_spi_enable
name: Safety Function SPI Enable
icon: mdi:home-heart
address: 1
register_type: holding
bitmask: 0x0001
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: safety_function_auto_test_start
name: Safety Function AutoTestStart
icon: mdi:home-heart
address: 1
register_type: holding
bitmask: 0x0002
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: safety_function_lvfrt_enable
name: Safety Function LVFRT Enable
icon: mdi:home-heart
address: 1
register_type: holding
bitmask: 0x0004
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: safety_function_freq_derating_enable
name: Safety Function FreqDerating Enable
icon: mdi:home-heart
address: 1
register_type: holding
bitmask: 0x0008
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: safety_function_soft_start_enable
name: Safety Function SoftStart Enable
icon: mdi:home-heart
address: 1
register_type: holding
bitmask: 0x0010
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: safety_function_drms_enable
name: Safety Function DRMS Enable
icon: mdi:home-heart
address: 1
register_type: holding
bitmask: 0x0020
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: safety_function_power_volt_func_enable
name: Safety Function PowerVoltFunc Enable
icon: mdi:home-heart
address: 1
register_type: holding
bitmask: 0x0040
# Apparaat Besturing
- platform: restart
id: "${project_name}_switch_restart"
name: "Restart ESP"
icon: "mdi:restart"
### Tekstuele Weergaven (Text Sensors) ###
text_sensor:
# Geformatteerde Tijden
- platform: template
name: "Time 1 Begin Formatted"
id: time1_begin_text
icon: mdi:clock-start
- platform: template
name: "Time 1 End Formatted"
id: time1_end_text
icon: mdi:clock-end
- platform: template
name: "Time 2 Begin Formatted"
id: time2_begin_text
icon: mdi:clock-start
- platform: template
name: "Time 2 End Formatted"
id: time2_end_text
icon: mdi:clock-end
- platform: template
name: "Time 3 Begin Formatted"
id: time3_begin_text
icon: mdi:clock-start
- platform: template
name: "Time 3 End Formatted"
id: time3_end_text
icon: mdi:clock-end
# Status Indicatoren
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: firmwareversion
name: Firmware Version
icon: mdi:home-heart
address: 9
register_count: 3
register_type: holding
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: status
name: Status
icon: mdi:home-heart
address: 0x00
register_type: read
bitmask: 0
# raw_encode: HEXBYTES # Niet nodig, lambda werkt direct met integer waarde
lambda: |-
uint16_t value = id(inverter_status_state).state; // Gebruik de state van de gekoppelde sensor
switch (value) {
case 0: return std::string("Waiting");
case 1: return std::string("Normal");
case 2: return std::string("Fault");
default: return std::to_string(value);
}
return x;
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: deratingmode
name: Derating Mode Status
icon: mdi:home-heart
address: 104
register_type: read
bitmask: 0
raw_encode: HEXBYTES
lambda: |-
uint16_t value = modbus_controller::word_from_hex_str(x, 0);
switch (value) {
case 0: return std::string("No Derating");
case 1: return std::string("Voltage PV");
case 2: return std::string("*Not Assigned*");
case 3: return std::string("Voltage AC");
case 4: return std::string("Frequency AC");
case 5: return std::string("Temp Boost");
case 6: return std::string("Temp Inverter");
case 7: return std::string("Control - Max Output Power Manual Limit (addr 3)");
case 8: return std::string("*Not Assigned*");
case 9: return std::string("Overback by Time");
default: return std::to_string(value);
}
return x;
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: inverter_fault_status
name: Inverter Fault Status
icon: mdi:alert-circle
address: 105
register_type: read
bitmask: 0
# raw_encode: HEXBYTES # Niet nodig
lambda: |-
uint16_t value = id(inverter_fault_state).state; // Gebruik de state van de gekoppelde sensor
switch (value) {
case 0: return std::string("ALL OK");
case 1 ... 23: return std::string("Error " + std::to_string(99 + value));
case 24: return std::string("Auto Test Failed");
case 25: return std::string("No AC Connection");
case 26: return std::string("PV Isolation Low");
case 27: return std::string("Residual I High");
case 28: return std::string("Ouput DCI High");
case 29: return std::string("PV Voltage High");
case 30: return std::string("AC Voltage Out of Range");
case 31: return std::string("AC Frequency Out of Range");
case 32: return std::string("Module Hot - Temperatur High");
default: return std::to_string(value);
}
return x;
# ESPHome & WiFi Info
- platform: version
name: ESPHome Version
id: esphome_version
hide_timestamp: true
- platform: wifi_info
ip_address:
name: WiFi IP Address
id: wifi_ip_address
ssid:
name: WiFi SSID
id: wifi_ssid
bssid:
name: WiFi BSSID
id: wifi_bssid
- platform: template
name: Uptime (Human Readable)
id: growatt_uptime_human
icon: mdi:clock-start |
Welke modbus documentatie heb je?konehead schreef op zondag 6 juli 2025 @ 14:44:
Zo, twee weken verder en behoorlijke stappen gemaakt. Dank voor alle reacties en input! Met hulp van een topper van hier: @sjorsjuhmaniac! Ik mocht zijn ESP kastje lenen welke op zijn inverter goed werkte. En via deze stap hebben we een nog al stomme fout gevonden: Ik had de modbus draadjes op de verkeerde SysCom poort aangesloten..Er zijn dus twee SysCom poorten op mijn inverter. Conclusie: Was behoorlijk de tunnel ingelopen
Maar veel belangrijker: Data lezen gaat erg goed, schrijven nog niet. Is er iemand die hier succesvol waarde kan schrijven voor de batterij? Ik krijg foutmeldingen terwijl ik wel de Growatt Documentatie (met Hulp van Chat) gebruik... Maar helaas. Ik heb een MIN 4600 TL-XH met Growatt ARK XH Batterijset.
Lessons learnt:
1) Blijf volhouden, de aanhouder wint
2) het kastje van @AUijtdehaag lijkt idd de beste oplossing
3) Mijn wens is dat voor garantie e.d. de data naar Growatt geupload wordt. Ik wil dus de ShineStick én modbus kunnen gebruiken
4) De ModbusTCP oplossing (Via Wifi) lijkt mooi via Solax maar deze oplossing pushed de data naar HA, terwijl de ESPhome oplossing de data eruit trekt (via polling). Voor mijn usecase een substantieel verschil, de SOC van de batterij liep wel eens 8-10 min achter.
5) Als je via Modbus laadt en ontlaadt commando's geeft, dan is er geen limitatie. Ik heb gelezen dat het ESPRom dit niet aankan. Ik heb dit besproken met Growatt en op papier dat je dit onbeperkt kan gebruiken
[Afbeelding]
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233# # SENSOR NAMING CONVENTION # # The data here is pushed to mqtt and from there picked up by telegraf. # Current config has some logic built into it so that telegraf does not require # to have all topics hardcoded. This logic uses the topic/endpoint name to determine # the type of data (Temperature, Power, Voltage, Percent, etc). # convention is: # # DEVICENAME_ANY_TEXT_NAME_YOU_WANT_DATATYPE # | | | # | | | # | | |_____ The type of data # | | |_____ EX: POWER, VOLTGE, PERCENT # | | # | |____Any user friend text descriptor # | # |____ The device name substitutions: version: "1.1.10" project_name: "growatt" project_author: "me" esphome: name: ${project_name} comment: "${project_name} inverter - v${version}" project: name: "${project_author}.${project_name}" version: "${version}" esp32: board: mhetesp32minikit framework: type: arduino logger: logs: modbus_controller.sensor: WARN modbus_controller.output: WARN modbus_controller: DEBUG modbus: DEBUG modbus.number: WARN esp32.preferences: WARN sensor: WARN text_sensor: WARN number: WARN log_topic: NONE # Enable Home Assistant API api: ota: - platform: esphome # password: !secret ota_password wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Optional manual IP # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "${project_name} Fallback Hotspot" password: "iEA7MxzX4hb6" captive_portal: web_server: port: 80 # mqtt #mqtt: # broker: 192.168.88.117 # topic_prefix: "esphome/inverter2" # #discovery_prefix: "testinggggg" # discovery_unique_id_generator: mac ### Modbus Communicatie ### uart: id: mod_bus tx_pin: 23 rx_pin: 19 baud_rate: 9600 parity: none stop_bits: 1 modbus: - send_wait_time: 1000ms modbus_controller: - id: ${project_name} address: 0x1 update_interval: 10s command_throttle: 10ms ### Sensoren ### sensor: # Inverter Status & Info - platform: modbus_controller modbus_controller_id: ${project_name} id: inverter_status_state name: Inverter Status State address: 0 icon: mdi:flash register_type: read value_type: U_WORD accuracy_decimals: 0 - platform: modbus_controller modbus_controller_id: ${project_name} name: Inverter Temperature id: inverter_temperature address: 93 register_type: read unit_of_measurement: "°C" device_class: temperature icon: mdi:thermometer value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: IPM Temperature id: ipm_temperature address: 94 register_type: read unit_of_measurement: "°C" device_class: temperature icon: mdi:thermometer value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Boost Temperature id: boost_temperature address: 95 register_type: read unit_of_measurement: "°C" device_class: temperature icon: mdi:thermometer value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: OUT Temperature id: out_temperature address: 96 register_type: read unit_of_measurement: "°C" device_class: temperature icon: mdi:thermometer value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: STM32 Temperature id: stm32_temperature address: 97 register_type: read unit_of_measurement: "°C" device_class: temperature icon: mdi:thermometer value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} id: derating_mode_status_state name: Derating Mode Status State icon: mdi:home-heart address: 104 register_type: read value_type: U_WORD - platform: modbus_controller modbus_controller_id: ${project_name} name: Inverter Fault State id: inverter_fault_state address: 105 register_type: read icon: mdi:alert-circle value_type: U_WORD - platform: modbus_controller modbus_controller_id: ${project_name} name: Real Power Percent id: real_power_percent address: 113 register_type: read device_class: power_factor icon: mdi:percent value_type: U_WORD unit_of_measurement: "%" - platform: modbus_controller modbus_controller_id: ${project_name} name: PV Insulation Resistance id: pv_insulation_resistance address: 3060 # Gecorrigeerd adres voor PV Isolation Resistance (voorheen 200) register_type: read unit_of_measurement: "KΩ" icon: mdi:resistor value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 # PV Strings - platform: modbus_controller modbus_controller_id: ${project_name} id: total_pv_input_power name: Total PV Input Power address: 1 unit_of_measurement: W device_class: power icon: mdi:flash register_type: read value_type: U_DWORD accuracy_decimals: 0 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: PV2 Voltage id: pv2_voltage address: 52 # Correct: Dit is PV2 Voltage volgens protocol (voorheen AC TR Voltage) register_type: read unit_of_measurement: V device_class: voltage icon: mdi:solar-panel value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: PV2 Current id: pv2_current address: 3008 register_type: read value_type: U_WORD unit_of_measurement: A accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: PV2 Power id: pv2_power address: 3009 register_type: read value_type: U_DWORD unit_of_measurement: W accuracy_decimals: 1 filters: - multiply: 0.1 # AC Net (Grid) & Belasting (Load) - platform: modbus_controller modbus_controller_id: ${project_name} name: AC Power id: ac_power address: 35 register_type: read unit_of_measurement: W device_class: power icon: mdi:flash value_type: U_DWORD accuracy_decimals: 0 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} id: ac_frequency name: AC Frequency address: 37 register_type: read unit_of_measurement: Hz icon: mdi:flash value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.01 - platform: modbus_controller modbus_controller_id: ${project_name} name: AC L1 Voltage id: ac_l1_voltage address: 38 register_type: read unit_of_measurement: V device_class: voltage icon: mdi:flash value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} id: ac_l1_current name: AC L1 Current address: 39 unit_of_measurement: A device_class: current icon: mdi:flash register_type: read value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} id: ac_l1_power name: AC L1 Power address: 40 unit_of_measurement: W device_class: power icon: mdi:flash register_type: read value_type: U_DWORD accuracy_decimals: 0 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Grid Current id: grid_current address: 3027 register_type: read value_type: U_WORD unit_of_measurement: A accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Grid Frequency id: grid_frequency address: 3025 register_type: read value_type: U_WORD unit_of_measurement: Hz accuracy_decimals: 2 filters: - multiply: 0.01 - platform: modbus_controller modbus_controller_id: ${project_name} name: Grid Voltage id: grid_voltage address: 3026 register_type: read value_type: U_WORD unit_of_measurement: V accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Grid Power VA id: grid_power_va address: 3028 register_type: read value_type: U_DWORD unit_of_measurement: VA device_class: apparent_power accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Output Power id: output_power address: 3023 register_type: read value_type: U_DWORD unit_of_measurement: W device_class: power accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} id: output_maxpower_limited_power name: Output Maxpower Limited Power address: 102 unit_of_measurement: W device_class: power icon: mdi:flash register_type: read value_type: U_DWORD accuracy_decimals: 0 filters: - multiply: 0.1 # Batterij - platform: modbus_controller modbus_controller_id: ${project_name} name: Battery Voltage id: battery_voltage address: 3170 register_type: read value_type: U_WORD unit_of_measurement: V accuracy_decimals: 2 filters: - multiply: 0.01 - platform: modbus_controller modbus_controller_id: ${project_name} name: Battery Current id: battery_current address: 3171 register_type: read value_type: U_WORD unit_of_measurement: A accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller name: "Battery SOC" address: 3171 register_type: read value_type: U_WORD unit_of_measurement: "%" accuracy_decimals: 1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Battery Charge Power id: battery_charge_power address: 3180 register_type: read value_type: U_DWORD unit_of_measurement: W device_class: power accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Battery Discharge Power id: battery_discharge_power address: 3178 register_type: read value_type: U_DWORD unit_of_measurement: W device_class: power accuracy_decimals: 1 filters: - multiply: 0.1 # Energie Totalen - platform: modbus_controller modbus_controller_id: ${project_name} name: Today Energy id: today_energy address: 53 register_type: read unit_of_measurement: kWh device_class: energy icon: mdi:flash value_type: U_DWORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Total Energy id: total_energy address: 55 register_type: read unit_of_measurement: kWh state_class: total_increasing device_class: energy icon: mdi:flash value_type: U_DWORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Total Working Time Sec id: total_working_time_sec address: 57 register_type: read unit_of_measurement: s state_class: total_increasing device_class: duration icon: mdi:flash value_type: U_DWORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Today's Grid Export id: today_grid_export address: 3071 register_type: read value_type: U_DWORD unit_of_measurement: kWh device_class: energy state_class: total_increasing accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Today's Grid Import id: today_grid_import address: 3075 register_type: read value_type: U_DWORD unit_of_measurement: kWh device_class: energy state_class: total_increasing accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Total Reverse Energy (Output) id: total_reverse_energy_output address: 3043 # Gecorrigeerd: Dit is energie, geen vermogen register_type: read value_type: U_DWORD unit_of_measurement: kWh # Gecorrigeerd device_class: energy # Gecorrigeerd accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: growatt2 name: "Today's Battery Output Energy" id: today_battery_output_energy address: 3126 register_type: holding value_type: U_WORD register_count: 2 unit_of_measurement: "kWh" device_class: energy state_class: total_increasing accuracy_decimals: 1 lambda: |- uint32_t high = data[0]; uint32_t low = data[1]; return (high << 16 | low) * 0.1; - platform: modbus_controller name: "Today's Battery Input Energy" address: 3130 register_type: read value_type: U_DWORD unit_of_measurement: kWh device_class: energy state_class: total_increasing accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Today's Power Generation id: today_power_generation address: 3049 register_type: read value_type: U_DWORD unit_of_measurement: kWh device_class: energy state_class: total_increasing accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller modbus_controller_id: ${project_name} name: Total Yield id: total_yield address: 3051 register_type: read value_type: U_DWORD unit_of_measurement: kWh device_class: energy state_class: total_increasing accuracy_decimals: 1 filters: - multiply: 0.1 # Overige Sensoren - platform: wifi_signal name: WiFi Signal update_interval: 60s - platform: uptime name: Sensor sec id: growatt_uptime_sensor update_interval: 60s on_raw_value: then: - text_sensor.template.publish: id: growatt_uptime_human state: !lambda |- int seconds = round(id(growatt_uptime_sensor).raw_state); int days = seconds / (24 * 3600); seconds = seconds % (24 * 3600); int hours = seconds / 3600; seconds = seconds % 3600; int minutes = seconds / 60; seconds = seconds % 60; return ( (days ? to_string(days) + "d " : "") + (hours ? to_string(hours) + "h " : "") + (minutes ? to_string(minutes) + "m " : "") ).c_str(); ### Configureerbare Waarden (Numbers) ### number: - platform: modbus_controller modbus_controller_id: ${project_name} name: Max Output Power Setting Percent id: max_output_power_setting_percent address: 3 register_type: holding value_type: U_WORD min_value: 0 # Gecorrigeerd: 0-100% volgens protocol max_value: 100 step: 1 entity_category: config unit_of_measurement: "%" icon: mdi:percent - platform: modbus_controller modbus_controller_id: ${project_name} name: Active Power Output Limit Rate id: active_power_output_limit_rate address: 3070 # Gecorrigeerd: Naam verduidelijkt, dubbeling opgelost register_type: holding value_type: U_WORD min_value: 0 # Gecorrigeerd: 0-100% volgens protocol max_value: 100 step: 1 unit_of_measurement: "%" mode: slider icon: mdi:battery-arrow-down - platform: modbus_controller modbus_controller_id: ${project_name} name: Active Power Input Limit Rate id: active_power_input_limit_rate address: 3090 # Gecorrigeerd: Naam verduidelijkt, dubbeling opgelost register_type: holding value_type: U_WORD # Gecorrigeerd: U_WORD volgens protocol (was U_DWORD) min_value: 0 # Gecorrigeerd: 0-100% volgens protocol max_value: 100 step: 1 unit_of_measurement: "%" icon: mdi:battery-arrow-up mode: slider - platform: modbus_controller modbus_controller_id: ${project_name} name: Total Output Power Percent Setting id: total_output_power_percent_setting address: 3102 value_type: U_WORD min_value: 0 max_value: 100 entity_category: config unit_of_measurement: "%" icon: mdi:percent # Tijdsegment Instellingen - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 1 Begin" id: time1_begin address: 3146 register_type: holding value_type: U_WORD min_value: 0 # 00:00 max_value: 2359 # 23:59 step: 1 entity_category: config icon: mdi:clock-start on_value: then: - lambda: |- int hours = int(x / 100); int minutes = static_cast<int>(x) % 100; id(time1_begin_text).publish_state( (hours < 10 ? "0" : "") + to_string(hours) + ":" + (minutes < 10 ? "0" : "") + to_string(minutes) ); - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 1 End" id: time1_end address: 3147 register_type: holding value_type: U_WORD min_value: 0 # 00:00 max_value: 2359 # 23:59 step: 1 entity_category: config icon: mdi:clock-end on_value: then: - lambda: |- int hours = int(x / 100); int minutes = static_cast<int>(x) % 100; id(time1_end_text).publish_state( (hours < 10 ? "0" : "") + to_string(hours) + ":" + (minutes < 10 ? "0" : "") + to_string(minutes) ); - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 2 Begin" id: time2_begin address: 3150 register_type: holding value_type: U_WORD min_value: 0 max_value: 2359 step: 1 entity_category: config icon: mdi:clock-start on_value: then: - lambda: |- int hours = int(x / 100); int minutes = static_cast<int>(x) % 100; id(time2_begin_text).publish_state( (hours < 10 ? "0" : "") + to_string(hours) + ":" + (minutes < 10 ? "0" : "") + to_string(minutes) ); - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 2 End" id: time2_end address: 3151 register_type: holding value_type: U_WORD min_value: 0 max_value: 2359 step: 1 entity_category: config icon: mdi:clock-end on_value: then: - lambda: |- int hours = int(x / 100); int minutes = static_cast<int>(x) % 100; id(time2_end_text).publish_state( (hours < 10 ? "0" : "") + to_string(hours) + ":" + (minutes < 10 ? "0" : "") + to_string(minutes) ); - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 3 Begin" id: time3_begin address: 3154 register_type: holding value_type: U_WORD min_value: 0 max_value: 2359 step: 1 entity_category: config icon: mdi:clock-start on_value: then: - lambda: |- int hours = int(x / 100); int minutes = static_cast<int>(x) % 100; id(time3_begin_text).publish_state( (hours < 10 ? "0" : "") + to_string(hours) + ":" + (minutes < 10 ? "0" : "") + to_string(minutes) ); - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 3 End" id: time3_end address: 3155 register_type: holding value_type: U_WORD min_value: 0 max_value: 2359 step: 1 entity_category: config icon: mdi:clock-end on_value: then: - lambda: |- int hours = int(x / 100); int minutes = static_cast<int>(x) % 100; id(time3_end_text).publish_state( (hours < 10 ? "0" : "") + to_string(hours) + ":" + (minutes < 10 ? "0" : "") + to_string(minutes) ); - platform: modbus_controller modbus_controller_id: ${project_name} name: "EMS Control Enable Status" address: 3500 register_type: holding value_type: U_WORD ### Operationele Modes (Selects) ### select: # Opladen/Prioriteit - platform: modbus_controller modbus_controller_id: ${project_name} name: "AC Charging" id: ac_charging icon: mdi:battery-charging-100 address: 3134 value_type: U_WORD optionsmap: "Disabled": 0 "Enabled": 1 entity_category: config # Toegevoegd voor consistentie skip_updates: 21 # Tijdsegment Actief/Modus - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 1 Active" id: time1_active address: 3145 value_type: U_WORD optionsmap: "Disabled": 0 "Enabled": 1 entity_category: config icon: mdi:timer-outline skip_updates: 21 - platform: modbus_controller modbus_controller_id: growatt2 name: "Time Slot 1 ActiveUBER " id: time_slot_1_active address: 3515 value_type: U_WORD optionsmap: Disabled: 0 Enabled: 1 entity_category: config icon: mdi:timer-outline - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 1 Mode" id: time1_mode address: 3148 value_type: U_WORD optionsmap: "Load First": 0 "Battery First": 1 "Grid First": 2 # "ECO": 3 # Verwijderd, niet in protocol voor dit register entity_category: config icon: mdi:arrow-decision-outline skip_updates: 21 - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 2 Active" id: time2_active address: 3149 value_type: U_WORD optionsmap: "Disabled": 0 "Enabled": 1 entity_category: config icon: mdi:timer-outline skip_updates: 21 - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 2 Mode" id: time2_mode address: 3152 value_type: U_WORD optionsmap: "Load First": 0 "Battery First": 1 "Grid First": 2 # "ECO": 3 # Verwijderd, niet in protocol voor dit register entity_category: config icon: mdi:arrow-decision-outline skip_updates: 21 - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 3 Active" id: time3_active address: 3153 value_type: U_WORD optionsmap: "Disabled": 0 "Enabled": 1 entity_category: config icon: mdi:timer-outline skip_updates: 21 - platform: modbus_controller modbus_controller_id: ${project_name} name: "Time 3 Mode" id: time3_mode address: 3156 value_type: U_WORD optionsmap: "Load First": 0 "Battery First": 1 "Grid First": 2 # "ECO": 3 # Verwijderd, niet in protocol voor dit register entity_category: config icon: mdi:arrow-decision-outline skip_updates: 21 - platform: template name: "Inverter Priority SPECIAL" id: inverter_priority_select icon: mdi:arrow-decision-outline optimistic: true # Set to true as there's no direct readback for immediate verification restore_value: true # Restore the last set value on reboot # Define the options for the drop-down menu options: - "Load First" - "Battery First" - "Grid First" # If you need to map internal values to options, you can use: # options: # - value: "Load First" # key: 0 # Internal value for Load First # - value: "Battery First" # key: 1 # Internal value for Battery First # - value: "Grid First" # key: 2 # Internal value for Grid First # When a new option is selected, this lambda will execute the Modbus write on_value: lambda: |- std::vector<uint16_t> values_to_write; int start_address = 3038; // Determine which values to send based on the selected option (x is the selected string) if (x == "Load First") { values_to_write = {32768, 5947}; // Encoded values for Load First (0x8000, 0x173B) ESP_LOGD("inverter_priority", "Setting Inverter Priority to: Load First"); } else if (x == "Battery First") { values_to_write = {40960, 5947}; // Encoded values for Battery First (0xA000, 0x173B) ESP_LOGD("inverter_priority", "Setting Inverter Priority to: Battery First"); } else if (x == "Grid First") { values_to_write = {49152, 5947}; // Encoded values for Grid First (0xC000, 0x173B) ESP_LOGD("inverter_priority", "Setting Inverter Priority to: Grid First"); } else { ESP_LOGW("inverter_priority", "Unknown option selected: %s", x.c_str()); return; // Do nothing if an unknown option is somehow selected } // Queue the Modbus write multiple command id(growatt2)->queue_command( esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command( id(growatt2), start_address, values_to_write.size(), values_to_write ) ); entity_category: config - platform: modbus_controller modbus_controller_id: ${project_name} name: "EMS Control Enable" address: 3500 value_type: U_WORD optionsmap: "Disabled": 0 "Enabled": 1 entity_category: config icon: mdi:toggle-switch ### Schakelaars (Switches) ### switch: # Veiligheidsfuncties (omgezet van sensor naar switch) - platform: modbus_controller modbus_controller_id: ${project_name} id: safety_function_spi_enable name: Safety Function SPI Enable icon: mdi:home-heart address: 1 register_type: holding bitmask: 0x0001 - platform: modbus_controller modbus_controller_id: ${project_name} id: safety_function_auto_test_start name: Safety Function AutoTestStart icon: mdi:home-heart address: 1 register_type: holding bitmask: 0x0002 - platform: modbus_controller modbus_controller_id: ${project_name} id: safety_function_lvfrt_enable name: Safety Function LVFRT Enable icon: mdi:home-heart address: 1 register_type: holding bitmask: 0x0004 - platform: modbus_controller modbus_controller_id: ${project_name} id: safety_function_freq_derating_enable name: Safety Function FreqDerating Enable icon: mdi:home-heart address: 1 register_type: holding bitmask: 0x0008 - platform: modbus_controller modbus_controller_id: ${project_name} id: safety_function_soft_start_enable name: Safety Function SoftStart Enable icon: mdi:home-heart address: 1 register_type: holding bitmask: 0x0010 - platform: modbus_controller modbus_controller_id: ${project_name} id: safety_function_drms_enable name: Safety Function DRMS Enable icon: mdi:home-heart address: 1 register_type: holding bitmask: 0x0020 - platform: modbus_controller modbus_controller_id: ${project_name} id: safety_function_power_volt_func_enable name: Safety Function PowerVoltFunc Enable icon: mdi:home-heart address: 1 register_type: holding bitmask: 0x0040 # Apparaat Besturing - platform: restart id: "${project_name}_switch_restart" name: "Restart ESP" icon: "mdi:restart" ### Tekstuele Weergaven (Text Sensors) ### text_sensor: # Geformatteerde Tijden - platform: template name: "Time 1 Begin Formatted" id: time1_begin_text icon: mdi:clock-start - platform: template name: "Time 1 End Formatted" id: time1_end_text icon: mdi:clock-end - platform: template name: "Time 2 Begin Formatted" id: time2_begin_text icon: mdi:clock-start - platform: template name: "Time 2 End Formatted" id: time2_end_text icon: mdi:clock-end - platform: template name: "Time 3 Begin Formatted" id: time3_begin_text icon: mdi:clock-start - platform: template name: "Time 3 End Formatted" id: time3_end_text icon: mdi:clock-end # Status Indicatoren - platform: modbus_controller modbus_controller_id: ${project_name} id: firmwareversion name: Firmware Version icon: mdi:home-heart address: 9 register_count: 3 register_type: holding - platform: modbus_controller modbus_controller_id: ${project_name} id: status name: Status icon: mdi:home-heart address: 0x00 register_type: read bitmask: 0 # raw_encode: HEXBYTES # Niet nodig, lambda werkt direct met integer waarde lambda: |- uint16_t value = id(inverter_status_state).state; // Gebruik de state van de gekoppelde sensor switch (value) { case 0: return std::string("Waiting"); case 1: return std::string("Normal"); case 2: return std::string("Fault"); default: return std::to_string(value); } return x; - platform: modbus_controller modbus_controller_id: ${project_name} id: deratingmode name: Derating Mode Status icon: mdi:home-heart address: 104 register_type: read bitmask: 0 raw_encode: HEXBYTES lambda: |- uint16_t value = modbus_controller::word_from_hex_str(x, 0); switch (value) { case 0: return std::string("No Derating"); case 1: return std::string("Voltage PV"); case 2: return std::string("*Not Assigned*"); case 3: return std::string("Voltage AC"); case 4: return std::string("Frequency AC"); case 5: return std::string("Temp Boost"); case 6: return std::string("Temp Inverter"); case 7: return std::string("Control - Max Output Power Manual Limit (addr 3)"); case 8: return std::string("*Not Assigned*"); case 9: return std::string("Overback by Time"); default: return std::to_string(value); } return x; - platform: modbus_controller modbus_controller_id: ${project_name} id: inverter_fault_status name: Inverter Fault Status icon: mdi:alert-circle address: 105 register_type: read bitmask: 0 # raw_encode: HEXBYTES # Niet nodig lambda: |- uint16_t value = id(inverter_fault_state).state; // Gebruik de state van de gekoppelde sensor switch (value) { case 0: return std::string("ALL OK"); case 1 ... 23: return std::string("Error " + std::to_string(99 + value)); case 24: return std::string("Auto Test Failed"); case 25: return std::string("No AC Connection"); case 26: return std::string("PV Isolation Low"); case 27: return std::string("Residual I High"); case 28: return std::string("Ouput DCI High"); case 29: return std::string("PV Voltage High"); case 30: return std::string("AC Voltage Out of Range"); case 31: return std::string("AC Frequency Out of Range"); case 32: return std::string("Module Hot - Temperatur High"); default: return std::to_string(value); } return x; # ESPHome & WiFi Info - platform: version name: ESPHome Version id: esphome_version hide_timestamp: true - platform: wifi_info ip_address: name: WiFi IP Address id: wifi_ip_address ssid: name: WiFi SSID id: wifi_ssid bssid: name: WiFi BSSID id: wifi_bssid - platform: template name: Uptime (Human Readable) id: growatt_uptime_human icon: mdi:clock-start
Ik zie namelijk een aantal parameters (zoals tijden) die alleen voor US model zijn.
Je zou Growatt eventueel kunnen vragen of de omvormer ook op VPP mode gezet kan.
Dan krijg je beetje andere protocol waarbij je 20 tijdsperiodes per dag kan instellen met elk eigen laad/ontlaad vermogen instelling.
Hieronder de werkende YAML, werkt perfect nu!brambo123 schreef op zondag 6 juli 2025 @ 18:29:
[...]
Welke modbus documentatie heb je?
Ik zie namelijk een aantal parameters (zoals tijden) die alleen voor US model zijn.
Je zou Growatt eventueel kunnen vragen of de omvormer ook op VPP mode gezet kan.
Dan krijg je beetje andere protocol waarbij je 20 tijdsperiodes per dag kan instellen met elk eigen laad/ontlaad vermogen instelling.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
| #
# SENSOR NAMING CONVENTION
#
# The data here is pushed to mqtt and from there picked up by telegraf.
# Current config has some logic built into it so that telegraf does not require
# to have all topics hardcoded. This logic uses the topic/endpoint name to determine
# the type of data (Temperature, Power, Voltage, Percent, etc).
# convention is:
#
# DEVICENAME_ANY_TEXT_NAME_YOU_WANT_DATATYPE
# | | |
# | | |
# | | |_____ The type of data
# | | |_____ EX: POWER, VOLTGE, PERCENT
# | |
# | |____Any user friend text descriptor
# |
# |____ The device name
substitutions:
version: "1.1.10"
project_name: "growatt2"
project_author: "me"
esphome:
name: ${project_name}
comment: "${project_name} inverter - v${version}"
project:
name: "${project_author}.${project_name}"
version: "${version}"
esp32:
board: mhetesp32minikit
framework:
type: arduino
logger:
logs:
modbus_controller.sensor: WARN
modbus_controller.output: WARN
modbus_controller: DEBUG
modbus: DEBUG
modbus.number: WARN
esp32.preferences: WARN
sensor: WARN
text_sensor: WARN
number: WARN
log_topic: NONE
# Enable Home Assistant API
api:
ota:
- platform: esphome
# password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Optional manual IP
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "${project_name} Fallback Hotspot"
password: "iEA7MxzX4hb6"
captive_portal:
web_server:
port: 80
# mqtt
#mqtt:
# broker: 192.168.88.117
# topic_prefix: "esphome/inverter2"
# #discovery_prefix: "testinggggg"
# discovery_unique_id_generator: mac
### Modbus Communicatie ###
uart:
id: mod_bus
tx_pin: 23
rx_pin: 19
baud_rate: 9600
parity: none
stop_bits: 1
modbus:
- send_wait_time: 1000ms
modbus_controller:
- id: ${project_name}
address: 0x1
update_interval: 10s
command_throttle: 10ms
### Sensoren ###
sensor:
# Inverter Status & Info
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: inverter_status_state
name: Inverter Status State
address: 0
icon: mdi:flash
register_type: read
value_type: U_WORD
accuracy_decimals: 0
- platform: modbus_controller
address: 3000
register_type: "read"
internal: true
accuracy_decimals: 0
id: Status
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Inverter Temperature
id: inverter_temperature
address: 93
register_type: read
unit_of_measurement: "°C"
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: IPM Temperature
id: ipm_temperature
address: 94
register_type: read
unit_of_measurement: "°C"
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Boost Temperature
id: boost_temperature
address: 95
register_type: read
unit_of_measurement: "°C"
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: OUT Temperature
id: out_temperature
address: 96
register_type: read
unit_of_measurement: "°C"
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: STM32 Temperature
id: stm32_temperature
address: 97
register_type: read
unit_of_measurement: "°C"
device_class: temperature
icon: mdi:thermometer
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: derating_mode_status_state
name: Derating Mode Status State
icon: mdi:home-heart
address: 104
register_type: read
value_type: U_WORD
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Inverter Fault State
id: inverter_fault_state
address: 105
register_type: read
icon: mdi:alert-circle
value_type: U_WORD
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Real Power Percent
id: real_power_percent
address: 113
register_type: read
device_class: power_factor
icon: mdi:percent
value_type: U_WORD
unit_of_measurement: "%"
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: PV Insulation Resistance
id: pv_insulation_resistance
address: 3060 # Gecorrigeerd adres voor PV Isolation Resistance (voorheen 200)
register_type: read
unit_of_measurement: "KΩ"
icon: mdi:resistor
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
# PV Strings
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: total_pv_input_power
name: Total PV Input Power
address: 1
unit_of_measurement: W
device_class: power
icon: mdi:flash
register_type: read
value_type: U_DWORD
accuracy_decimals: 0
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: PV2 Voltage
id: pv2_voltage
address: 52 # Correct: Dit is PV2 Voltage volgens protocol (voorheen AC TR Voltage)
register_type: read
unit_of_measurement: V
device_class: voltage
icon: mdi:solar-panel
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: PV2 Current
id: pv2_current
address: 3008
register_type: read
value_type: U_WORD
unit_of_measurement: A
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: PV2 Power
id: pv2_power
address: 3009
register_type: read
value_type: U_DWORD
unit_of_measurement: W
accuracy_decimals: 1
filters:
- multiply: 0.1
# AC Net (Grid) & Belasting (Load)
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: AC Power
id: ac_power
address: 35
register_type: read
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 0
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: ac_frequency
name: AC Frequency
address: 37
register_type: read
unit_of_measurement: Hz
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.01
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: AC L1 Voltage
id: ac_l1_voltage
address: 38
register_type: read
unit_of_measurement: V
device_class: voltage
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: ac_l1_current
name: AC L1 Current
address: 39
unit_of_measurement: A
device_class: current
icon: mdi:flash
register_type: read
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: ac_l1_power
name: AC L1 Power
address: 40
unit_of_measurement: W
device_class: power
icon: mdi:flash
register_type: read
value_type: U_DWORD
accuracy_decimals: 0
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Grid Current Output
id: grid_current_output
address: 3027
register_type: read
value_type: U_WORD
unit_of_measurement: A
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Grid Frequency
id: grid_frequency
address: 3025
register_type: read
value_type: U_WORD
unit_of_measurement: Hz
accuracy_decimals: 2
filters:
- multiply: 0.01
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Grid Voltage
id: grid_voltage
address: 3026
register_type: read
value_type: U_WORD
unit_of_measurement: V
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Grid Power VA
id: grid_power_va
address: 3028
register_type: read
value_type: U_DWORD
unit_of_measurement: VA
device_class: apparent_power
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Output Power
id: output_power
address: 3023
register_type: read
value_type: U_DWORD
unit_of_measurement: W
device_class: power
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: output_maxpower_limited_power
name: Output Maxpower Limited Power
address: 102
unit_of_measurement: W
device_class: power
icon: mdi:flash
register_type: read
value_type: U_DWORD
accuracy_decimals: 0
filters:
- multiply: 0.1
# Batterij
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Battery Voltage
id: battery_voltage
address: 3170
register_type: read
value_type: U_WORD
unit_of_measurement: V
accuracy_decimals: 2
filters:
- multiply: 0.01
- platform: modbus_controller
name: "Battery SOC"
id: battery_SOC
address: 3171
register_type: read
value_type: U_WORD
unit_of_measurement: "%"
accuracy_decimals: 1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Battery Charge Power
id: battery_charge_power
address: 3180
register_type: read
value_type: U_DWORD
unit_of_measurement: W
device_class: power
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Battery Discharge Power
id: battery_discharge_power
address: 3178
register_type: read
value_type: U_DWORD
unit_of_measurement: W
device_class: power
accuracy_decimals: 1
filters:
- multiply: 0.1
# Energie Totalen
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Today Energy
id: today_energy
address: 53
register_type: read
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Total Energy
id: total_energy
address: 55
register_type: read
unit_of_measurement: kWh
state_class: total_increasing
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Total Working Time Sec
id: total_working_time_sec
address: 57
register_type: read
unit_of_measurement: s
state_class: total_increasing
device_class: duration
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Today's Grid Import
id: today_grid_import
address: 3075
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Total Reverse Energy (Output)
id: total_reverse_energy_output
address: 3043 # Gecorrigeerd: Dit is energie, geen vermogen
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh # Gecorrigeerd
device_class: energy # Gecorrigeerd
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: growatt2
name: "Today's Battery Output Energy"
id: today_battery_output_energy
address: 3126
register_type: holding
value_type: U_WORD
register_count: 2
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
lambda: |-
uint32_t high = data[0];
uint32_t low = data[1];
return (high << 16 | low) * 0.1;
- platform: modbus_controller
name: "Today's Battery Input Energy"
address: 3130
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Today's Power Generation
id: today_power_generation
address: 3049
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Total Yield
id: total_yield
address: 3051
register_type: read
value_type: U_DWORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
# Overige Sensoren
- platform: wifi_signal
name: WiFi Signal
update_interval: 60s
- platform: uptime
name: Sensor sec
id: growatt_uptime_sensor
update_interval: 60s
on_raw_value:
then:
- text_sensor.template.publish:
id: growatt_uptime_human
state: !lambda |-
int seconds = round(id(growatt_uptime_sensor).raw_state);
int days = seconds / (24 * 3600);
seconds = seconds % (24 * 3600);
int hours = seconds / 3600;
seconds = seconds % 3600;
int minutes = seconds / 60;
seconds = seconds % 60;
return (
(days ? to_string(days) + "d " : "") +
(hours ? to_string(hours) + "h " : "") +
(minutes ? to_string(minutes) + "m " : "")
).c_str();
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: safetyfunctionautoteststart
name: "a_Period 1 prohibited read-only"
address: 3038
register_type: holding
bitmask: 0x8000
## nieuwe sensoren correct
- platform: modbus_controller
name: "Battery Charge"
address: 3215
register_type: read
unit_of_measurement: "%"
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 0
- platform: modbus_controller
name: "Today Battery Discharge"
address: 3125
register_type: read
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Total Battery Discharge"
address: 3127
register_type: read
unit_of_measurement: kWh
state_class: total
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Today Battery Charge"
address: 3129
register_type: read
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Total Battery Charge"
address: 3131
register_type: read
unit_of_measurement: kWh
state_class: total
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Today From Grid"
address: 3067
register_type: read
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Total From Grid"
address: 3069
register_type: read
unit_of_measurement: kWh
state_class: total
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Today To Grid"
address: 3071
register_type: read
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Total To Grid"
address: 3073
register_type: read
unit_of_measurement: kWh
state_class: total
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Total To User Load"
address: 3077
register_type: read
unit_of_measurement: kWh
state_class: total
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "AC Load consumption"
address: 3045
register_type: read
unit_of_measurement: W
state_class: measurement
device_class: power
icon: mdi:flash
value_type: S_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Total Production PV2"
address: 3061
register_type: read
unit_of_measurement: kWh
state_class: total
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
name: "Today Production PV2"
address: 3059
register_type: read
unit_of_measurement: kWh
device_class: energy
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
id: todaypv2
filters:
- multiply: 0.1
- platform: modbus_controller
name: "DcVoltage PV2"
address: 3007
register_type: "read"
unit_of_measurement: V
device_class: voltage
icon: mdi:flash
value_type: U_WORD
accuracy_decimals: 1
filters:
- multiply: 0.1
### Configureerbare Waarden (Numbers) ###
number:
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Max Output Power Setting Percent
id: max_output_power_setting_percent
address: 3
register_type: holding
value_type: U_WORD
min_value: 0 # Gecorrigeerd: 0-100% volgens protocol
max_value: 100
step: 1
entity_category: config
unit_of_measurement: "%"
icon: mdi:percent
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Discharge Power Rate"
register_type: holding
address: 3036 # Het registeradres
value_type: U_WORD # Dit is meestal een 16-bit unsigned integer voor percentages
unit_of_measurement: "%"
# De 'multiply' optie wordt gebruikt voor schaalvergroting.
# Aangezien 1% overeenkomt met een registerwaarde van 1 (0-100 bereik),
# is een vermenigvuldiger van 1.0 correct.
multiply: 1.0
min_value: 0
max_value: 100
step: 1
write_lambda: |-
return x;
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: "Charge Power Rate"
register_type: holding
address: 3047 # Het registeradres
value_type: U_WORD # Dit is meestal een 16-bit unsigned integer voor percentages
unit_of_measurement: "%"
# De 'multiply' optie wordt gebruikt voor schaalvergroting.
# Aangezien 1% overeenkomt met een registerwaarde van 1 (0-100 bereik),
# is een vermenigvuldiger van 1.0 correct.
multiply: 1.0
min_value: 0
max_value: 100
step: 1
write_lambda: |-
return x;
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Active Power Output Limit Rate
id: active_power_output_limit_rate
address: 3070 # Gecorrigeerd: Naam verduidelijkt, dubbeling opgelost
register_type: holding
value_type: U_WORD
min_value: 0 # Gecorrigeerd: 0-100% volgens protocol
max_value: 100
step: 1
unit_of_measurement: "%"
mode: slider
icon: mdi:battery-arrow-down
- platform: modbus_controller
modbus_controller_id: ${project_name}
name: Active Power Input Limit Rate
id: active_power_input_limit_rate
address: 3090 # Gecorrigeerd: Naam verduidelijkt, dubbeling opgelost
register_type: holding
value_type: U_WORD # Gecorrigeerd: U_WORD volgens protocol (was U_DWORD)
min_value: 0 # Gecorrigeerd: 0-100% volgens protocol
max_value: 100
step: 1
unit_of_measurement: "%"
icon: mdi:battery-arrow-up
mode: slider
- platform: template
id: period_1_priority_num
#type: int
step: 1
min_value: 0
max_value: 2
optimistic: True
# remove name to make internal
name: "a_Period 1 Priority Number"
- platform: template
id: period_2_priority_num
step: 1
min_value: 0
max_value: 2
optimistic: True
name: "a_Period 2 Priority Number"
### Operationele Modes (Selects) ###
select:
- platform: template
name: "Time1 Priority"
id: period_1_priority
optimistic: true
restore_value: true
options:
- "Load First"
- "Battery First"
- "Grid First"
on_value:
then:
- lambda: |-
int value = 0;
if (x == "Load First") {
value = 0;
ESP_LOGD("inverter_priority", "Setting Inverter Priority to: Load First");
} else if (x == "Battery First") {
value = 1;
ESP_LOGD("inverter_priority", "Setting Inverter Priority to: Battery First");
} else if (x == "Grid First") {
value = 2;
ESP_LOGD("inverter_priority", "Setting Inverter Priority to: Grid First");
} else {
ESP_LOGW("inverter_priority", "Unknown option selected: %s", x.c_str());
return;
}
id(period_1_priority_num).publish_state(value);
- platform: template
name: "Time2 Priority"
id: period_2_priority
optimistic: true
restore_value: true
options:
- "Load First"
- "Battery First"
- "Grid First"
on_value:
then:
- lambda: |-
int value = 0;
if (x == "Load First") {
value = 0;
ESP_LOGD("inverter_priority", "Setting Period 2 Priority to: Load First");
} else if (x == "Battery First") {
value = 1;
ESP_LOGD("inverter_priority", "Setting Period 2 Priority to: Battery First");
} else if (x == "Grid First") {
value = 2;
ESP_LOGD("inverter_priority", "Setting Period 2 Priority to: Grid First");
} else {
ESP_LOGW("inverter_priority", "Unknown option selected: %s", x.c_str());
return;
}
id(period_2_priority_num).publish_state(value);
### Schakelaars (Switches) ###
switch:
# Apparaat Besturing
- platform: restart
id: "${project_name}_switch_restart"
name: "Restart ESP"
icon: "mdi:restart"
- platform: template
name: "Time1 Enable"
id: period_1_switch_enable
optimistic: True
# Optional variables:
# icon: "mdi:emoticon-outline"
on_turn_on:
- logger.log: "Period 1 Enable switched on"
- lambda: |-
bool p1_prohibited = false;
// Get user inputs
ESP_LOGD("Save button","get user inputs.");
int start_minutes = id(period_1_time_start).minute; // Get start time in minutes
int start_hour = id(period_1_time_start).hour; // Get start time in hours
int end_minutes = id(period_1_time_end).minute; // Get end time in minutes
int end_hour = id(period_1_time_end).hour; // Get end time in hours
int priority = 0; // Default priority
// Determine priority based on selection
if (id(period_1_priority).state == "Load First") {
priority = 0; // Load priority
} else if (id(period_1_priority).state == "Battery First") {
priority = 1; // Battery priority
} else if (id(period_1_priority).state == "Grid First") {
priority = 2; // Grid priority
}
ESP_LOGD("Save button","sanatizing user inputs");
// Ensure values are within valid ranges
start_minutes = start_minutes & 0x3F; // Keep only the lower 6 bits (0-59)
start_hour = start_hour & 0x1F; // Keep only the lower 5 bits (0-23)
end_minutes = end_minutes & 0x3F; // Keep only the lower 6 bits (0-59)
end_hour = end_hour & 0x1F; // Keep only the lower 5 bits (0-23)
// Build the 16-bit value for reg 3038
uint16_t valuea = (start_minutes & 0xFF) | // Bits 0-7 for start minutes
((start_hour & 0x1F) << 8) | // Bits 8-12 for start hour
((priority & 0x03) << 13) | // Bits 13-14 for priority
(1 << 15); // Bit 15 for prohibited
// Build the 16-bit value for reg 3039
uint16_t valueb = (end_minutes & 0xFF) | // Bits 0-7 for end minutes
((end_hour & 0x1F) << 8); // Bits 8-12 for end hour
// Bits 13-15 are reserved (set to 0)
std::vector<uint16_t> values_to_write;
int start_address = 3038;
//valuea = 43559;
values_to_write = {valuea, valueb};
ESP_LOGD("save button", "The uint16 value is: %u", valuea);
std::string binary = "";
for (int i = 15; i >= 0; --i) {
// Check if the i-th bit is set
if (valuea & (1 << i)) {
binary += '1';
} else {
binary += '0';
}
}
ESP_LOGD("save button","save button binary value %s", binary.c_str());
// Queue the Modbus write multiple command
ESP_LOGD("Save button","send modbus command");
id(growatt2)->queue_command(
esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(
id(growatt2), start_address, values_to_write.size(), values_to_write
)
);
on_turn_off:
- logger.log: "Period 1 Enable switched off"
- lambda: |-
bool p1_prohibited = true;
// Get user inputs
ESP_LOGD("Save button","get user inputs.");
int start_minutes = id(period_1_time_start).minute; // Get start time in minutes
int start_hour = id(period_1_time_start).hour; // Get start time in hours
int end_minutes = id(period_1_time_end).minute; // Get end time in minutes
int end_hour = id(period_1_time_end).hour; // Get end time in hours
int priority = 0; // Default priority
// Determine priority based on selection
if (id(period_1_priority).state == "Load First") {
priority = 0; // Load priority
} else if (id(period_1_priority).state == "Battery First") {
priority = 1; // Battery priority
} else if (id(period_1_priority).state == "Grid First") {
priority = 2; // Grid priority
}
ESP_LOGD("Save button","sanatizing user inputs");
// Ensure values are within valid ranges
start_minutes = start_minutes & 0x3F; // Keep only the lower 6 bits (0-59)
start_hour = start_hour & 0x1F; // Keep only the lower 5 bits (0-23)
end_minutes = end_minutes & 0x3F; // Keep only the lower 6 bits (0-59)
end_hour = end_hour & 0x1F; // Keep only the lower 5 bits (0-23)
// Build the 16-bit value for reg 3038
uint16_t valuea = (start_minutes & 0xFF) | // Bits 0-7 for start minutes
((start_hour & 0x1F) << 8) | // Bits 8-12 for start hour
((priority & 0x03) << 13) | // Bits 13-14 for priority
(0 << 15); // Bit 15 for prohibited
// Build the 16-bit value for reg 3039
uint16_t valueb = (end_minutes & 0xFF) | // Bits 0-7 for end minutes
((end_hour & 0x1F) << 8); // Bits 8-12 for end hour
// Bits 13-15 are reserved (set to 0)
std::vector<uint16_t> values_to_write;
int start_address = 3038;
values_to_write = {valuea, valueb};
ESP_LOGD("save button", "The uint16 value is: %u", valuea);
std::string binary = "";
for (int i = 15; i >= 0; --i) {
// Check if the i-th bit is set
if (valuea & (1 << i)) {
binary += '1';
} else {
binary += '0';
}
}
ESP_LOGD("save button","save button binary value %s", binary.c_str());
// Queue the Modbus write multiple command
ESP_LOGD("Save button","send modbus command");
id(growatt2)->queue_command(
esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(
id(growatt2), start_address, values_to_write.size(), values_to_write
)
);
###############################
- platform: template
name: "Time2 Enable"
id: period_2_switch_enable
optimistic: True
# Optional variables:
# icon: "mdi:emoticon-outline"
on_turn_on:
- logger.log: "Period 2 Enable switched on"
- lambda: |-
bool p1_prohibited = false;
// Get user inputs
ESP_LOGD("Save button","get user inputs.");
int start_minutes = id(period_2_time_start).minute; // Get start time in minutes
int start_hour = id(period_2_time_start).hour; // Get start time in hours
int end_minutes = id(period_2_time_end).minute; // Get end time in minutes
int end_hour = id(period_2_time_end).hour; // Get end time in hours
int priority = 0; // Default priority
// Determine priority based on selection
if (id(period_2_priority).state == "Load First") {
priority = 0; // Load priority
} else if (id(period_2_priority).state == "Battery First") {
priority = 1; // Battery priority
} else if (id(period_2_priority).state == "Grid First") {
priority = 2; // Grid priority
}
ESP_LOGD("Save button","sanatizing user inputs");
// Ensure values are within valid ranges
start_minutes = start_minutes & 0x3F; // Keep only the lower 6 bits (0-59)
start_hour = start_hour & 0x1F; // Keep only the lower 5 bits (0-23)
end_minutes = end_minutes & 0x3F; // Keep only the lower 6 bits (0-59)
end_hour = end_hour & 0x1F; // Keep only the lower 5 bits (0-23)
// Build the 16-bit value for reg 3040
uint16_t valuea = (start_minutes & 0xFF) | // Bits 0-7 for start minutes
((start_hour & 0x1F) << 8) | // Bits 8-12 for start hour
((priority & 0x03) << 13) | // Bits 13-14 for priority
(1 << 15); // Bit 15 for prohibited
// Build the 16-bit value for reg 3041
uint16_t valueb = (end_minutes & 0xFF) | // Bits 0-7 for end minutes
((end_hour & 0x1F) << 8); // Bits 8-12 for end hour
// Bits 13-15 are reserved (set to 0)
std::vector<uint16_t> values_to_write;
int start_address = 3040;
//valuea = 43559;
values_to_write = {valuea, valueb};
ESP_LOGD("save button", "The uint16 value is: %u", valuea);
std::string binary = "";
for (int i = 15; i >= 0; --i) {
// Check if the i-th bit is set
if (valuea & (1 << i)) {
binary += '1';
} else {
binary += '0';
}
}
ESP_LOGD("save button","save button binary value %s", binary.c_str());
// Queue the Modbus write multiple command
ESP_LOGD("Save button","send modbus command");
id(growatt2)->queue_command(
esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(
id(growatt2), start_address, values_to_write.size(), values_to_write
)
);
on_turn_off:
- logger.log: "Period 1 Enable switched off"
- lambda: |-
bool p1_prohibited = true;
// Get user inputs
ESP_LOGD("Save button","get user inputs.");
int start_minutes = id(period_2_time_start).minute; // Get start time in minutes
int start_hour = id(period_2_time_start).hour; // Get start time in hours
int end_minutes = id(period_2_time_end).minute; // Get end time in minutes
int end_hour = id(period_2_time_end).hour; // Get end time in hours
int priority = 0; // Default priority
// Determine priority based on selection
if (id(period_2_priority).state == "Load First") {
priority = 0; // Load priority
} else if (id(period_2_priority).state == "Battery First") {
priority = 1; // Battery priority
} else if (id(period_2_priority).state == "Grid First") {
priority = 2; // Grid priority
}
ESP_LOGD("Save button","sanatizing user inputs");
// Ensure values are within valid ranges
start_minutes = start_minutes & 0x3F; // Keep only the lower 6 bits (0-59)
start_hour = start_hour & 0x1F; // Keep only the lower 5 bits (0-23)
end_minutes = end_minutes & 0x3F; // Keep only the lower 6 bits (0-59)
end_hour = end_hour & 0x1F; // Keep only the lower 5 bits (0-23)
// Build the 16-bit value for reg 3040
uint16_t valuea = (start_minutes & 0xFF) | // Bits 0-7 for start minutes
((start_hour & 0x1F) << 8) | // Bits 8-12 for start hour
((priority & 0x03) << 13) | // Bits 13-14 for priority
(0 << 15); // Bit 15 for prohibited
// Build the 16-bit value for reg 3041
uint16_t valueb = (end_minutes & 0xFF) | // Bits 0-7 for end minutes
((end_hour & 0x1F) << 8); // Bits 8-12 for end hour
// Bits 13-15 are reserved (set to 0)
std::vector<uint16_t> values_to_write;
int start_address = 3040;
values_to_write = {valuea, valueb};
ESP_LOGD("save button", "The uint16 value is: %u", valuea);
std::string binary = "";
for (int i = 15; i >= 0; --i) {
// Check if the i-th bit is set
if (valuea & (1 << i)) {
binary += '1';
} else {
binary += '0';
}
}
ESP_LOGD("save button","save button binary value %s", binary.c_str());
// Queue the Modbus write multiple command
ESP_LOGD("Save button","send modbus command");
id(growatt2)->queue_command(
esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(
id(growatt2), start_address, values_to_write.size(), values_to_write
)
);
### Tekstuele Weergaven (Text Sensors) ###
text_sensor:
# Status Indicatoren
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: firmwareversion
name: Firmware Version
icon: mdi:home-heart
address: 9
register_count: 3
register_type: holding
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: status
name: Status
icon: mdi:home-heart
address: 0x00
register_type: read
bitmask: 0
# raw_encode: HEXBYTES # Niet nodig, lambda werkt direct met integer waarde
lambda: |-
uint16_t value = id(inverter_status_state).state; // Gebruik de state van de gekoppelde sensor
switch (value) {
case 0: return std::string("Waiting");
case 1: return std::string("Normal");
case 2: return std::string("Fault");
default: return std::to_string(value);
}
return x;
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: deratingmode
name: Derating Mode Status
icon: mdi:home-heart
address: 104
register_type: read
bitmask: 0
raw_encode: HEXBYTES
lambda: |-
uint16_t value = modbus_controller::word_from_hex_str(x, 0);
switch (value) {
case 0: return std::string("No Derating");
case 1: return std::string("Voltage PV");
case 2: return std::string("*Not Assigned*");
case 3: return std::string("Voltage AC");
case 4: return std::string("Frequency AC");
case 5: return std::string("Temp Boost");
case 6: return std::string("Temp Inverter");
case 7: return std::string("Control - Max Output Power Manual Limit (addr 3)");
case 8: return std::string("*Not Assigned*");
case 9: return std::string("Overback by Time");
default: return std::to_string(value);
}
return x;
- platform: modbus_controller
modbus_controller_id: ${project_name}
id: inverter_fault_status
name: Inverter Fault Status
icon: mdi:alert-circle
address: 105
register_type: read
bitmask: 0
# raw_encode: HEXBYTES # Niet nodig
lambda: |-
uint16_t value = id(inverter_fault_state).state; // Gebruik de state van de gekoppelde sensor
switch (value) {
case 0: return std::string("ALL OK");
case 1 ... 23: return std::string("Error " + std::to_string(99 + value));
case 24: return std::string("Auto Test Failed");
case 25: return std::string("No AC Connection");
case 26: return std::string("PV Isolation Low");
case 27: return std::string("Residual I High");
case 28: return std::string("Ouput DCI High");
case 29: return std::string("PV Voltage High");
case 30: return std::string("AC Voltage Out of Range");
case 31: return std::string("AC Frequency Out of Range");
case 32: return std::string("Module Hot - Temperatur High");
default: return std::to_string(value);
}
return x;
# ESPHome & WiFi Info
- platform: version
name: ESPHome Version
id: esphome_version
hide_timestamp: true
- platform: wifi_info
ip_address:
name: WiFi IP Address
id: wifi_ip_address
ssid:
name: WiFi SSID
id: wifi_ssid
bssid:
name: WiFi BSSID
id: wifi_bssid
- platform: template
name: Uptime (Human Readable)
id: growatt_uptime_human
icon: mdi:clock-start
### testing
### testing
### testing
datetime:
# Example Time 1
- platform: template
id: period_1_time_start
type: time
name: "Time1 Start"
optimistic: yes
initial_value: "08:00:00"
restore_value: true
- platform: template
id: period_1_time_end
type: time
name: "Time1 Stop"
optimistic: yes
initial_value: "12:00:00"
restore_value: true
# Example Time 2
- platform: template
id: period_2_time_start
type: time
name: "Time2 Start"
optimistic: yes
initial_value: "08:00:00"
restore_value: true
- platform: template
id: period_2_time_end
type: time
name: "Time2 Stop"
optimistic: yes
initial_value: "12:00:00"
restore_value: true |
Ik heb deze github pagina gemaakt waarin ik heb beschreven hoe ik mijn Growatt MOD 5000TL3-X via modbus/ESP32 met Home Assistant heb verbonden. Incl. aansluitinstructies, esphome config en een boodschappenlijstje:
https://github.com/Jasper...SP32_Modbus_RS485_Example
Misschien helpt het mensen in de toekomst!
https://github.com/Jasper...SP32_Modbus_RS485_Example
Misschien helpt het mensen in de toekomst!
[ Voor 19% gewijzigd door JasperE op 31-08-2025 21:31 ]
De foto erbij is toch niet jouw thuis situatie. De omvormer heeft geen ventilatie ruimte onder en boven zichzelfJasperE schreef op zondag 31 augustus 2025 @ 19:32:
Ik heb deze github pagina gemaakt waarin ik heb beschreven hoe ik mijn Growatt MOD 5000TL3-X via modbus/ESP32 met Home Assistant heb verbonden:
https://github.com/Jasper...SP32_Modbus_RS485_Example
Misschien helpt het mensen in de toekomst!
18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 2400AC 11,5kWh🔋,Hyundai Kona 64kWh 🚗, Peblar Home ⛽, Maxima MPM 7L 🥐
In de plank aan de bovenkant is daarom een stuk uitgezaagd. Kan je niet zien op de foto. Was inderdaad niet heel blij hoe de installateur dit had opgeleverd.klump4u schreef op zondag 31 augustus 2025 @ 19:46:
[...]
De foto erbij is toch niet jouw thuis situatie. De omvormer heeft geen ventilatie ruimte onder en boven zichzelf
Kleine aanvulling: ben wel benieuwd welke temperatuur jullie sensor via modbus weergeeft. Bij mij piekt het op 75C interne temp op een dag als vandaag (wat wolkjes maar ook veel volle zon).
[ Voor 19% gewijzigd door JasperE op 31-08-2025 20:33 ]
Die op NO 39 graden, plat dak 53 graden en op ZW 43 graden.
Drie maal een 7000MOD 3tl-x
Drie maal een 7000MOD 3tl-x
[ Voor 20% gewijzigd door klump4u op 31-08-2025 22:00 ]
18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 2400AC 11,5kWh🔋,Hyundai Kona 64kWh 🚗, Peblar Home ⛽, Maxima MPM 7L 🥐
Toevallig iets meer informatie hierover? Ik krijg dit met geen kanten werkend. Een portscan naar die X2 op poort 502 geeft aan dat de poort dichtstaat. Werkt totaal niet.firecaps30 schreef op dinsdag 25 februari 2025 @ 16:11:
Vandaag de Growatt ShineWiLan-X2 datalogger stick binnen gekregen. Inpluggen, netwerkkabel er in, statisch IP in de router ingesteld en gekoppeld via de ShinePhone app.
Vervolgens met de HA integratie een nieuw device toegevoegd, protcocol modbus TCP, en verbonden! Werkt trouwens ook via draadloos netwerk (Wi-Fi).
Iets speciaals voor moeten doen om dit werkend te krijgen? Ik probeer het over wifi en over LAN, zelfde resultaat...
Werkt normaal out-of-the-box, gewoon op tcp port 502.Pharos1985 schreef op zondag 7 september 2025 @ 12:18:
[...]
Toevallig iets meer informatie hierover? Ik krijg dit met geen kanten werkend. Een portscan naar die X2 op poort 502 geeft aan dat de poort dichtstaat. Werkt totaal niet.
Iets speciaals voor moeten doen om dit werkend te krijgen? Ik probeer het over wifi en over LAN, zelfde resultaat...
Kan zijn dat er hele oude firmware op staan, laatste versie is 7.6.1.3
Makkelijk te zien/updaten via website:
https://server.growatt.com/
Onderaan heb je "My Photovoltaic Devices", daar staat helemaal rechts "All Devices"
Daar kun je via "Data Logger" > "Datalogger Setting" > "Update Datalogger" de firmware een update geven.
Wachtwoord is growatt + huidige datum in YYYYMMDD formaat, dus vandaag growatt20250907.
Tnx!
Intussen ben ik een stap verder. Wanneer ik HA volledig platleg en de X2 herstart, dan is poort 502 wel open.
Van zodra ik HA start, een een discover doe via SolarEdge van een modbus apparaat: dan sluit poort 502 zich op de X2. Dat blijft zo tot ik die X2 dan herstart.
Wanneer ik weer een modbus apparaat wil toevoegen via Solaredge, dan begint het weer opnieuw.
Uiteindelijk kan ik het apparaat niet toevoegen via Solaredge en na een minuut of 2 komt Solaredge terug met melding "ongeldige flow".
Enig idee hoe dit kan? Wat zou ik nog kunnen proberen?
Intussen ben ik een stap verder. Wanneer ik HA volledig platleg en de X2 herstart, dan is poort 502 wel open.
Van zodra ik HA start, een een discover doe via SolarEdge van een modbus apparaat: dan sluit poort 502 zich op de X2. Dat blijft zo tot ik die X2 dan herstart.
Wanneer ik weer een modbus apparaat wil toevoegen via Solaredge, dan begint het weer opnieuw.
Uiteindelijk kan ik het apparaat niet toevoegen via Solaredge en na een minuut of 2 komt Solaredge terug met melding "ongeldige flow".
Enig idee hoe dit kan? Wat zou ik nog kunnen proberen?
Zal waarschijnlijk komen omdat de stick maar 1 verbinding accepteert.Pharos1985 schreef op zondag 7 september 2025 @ 13:53:
Tnx!
Intussen ben ik een stap verder. Wanneer ik HA volledig platleg en de X2 herstart, dan is poort 502 wel open.
Van zodra ik HA start, een een discover doe via SolarEdge van een modbus apparaat: dan sluit poort 502 zich op de X2. Dat blijft zo tot ik die X2 dan herstart.
Wanneer ik weer een modbus apparaat wil toevoegen via Solaredge, dan begint het weer opnieuw.
Uiteindelijk kan ik het apparaat niet toevoegen via Solaredge en na een minuut of 2 komt Solaredge terug met melding "ongeldige flow".
Enig idee hoe dit kan? Wat zou ik nog kunnen proberen?
Misschien zoiets een oplossing: https://github.com/tiagocoutinho/modbus-proxy
Bedankt! Maar ik wil maar 1 verbinding, en dat is die met SolaxInverterModbus te doen. Kortom: ik wil die stick via Modbus integreren in mijn HA en ik dacht dat met SolaxInverterModbus te doen, maar dat werkt dus niet.brambo123 schreef op zondag 7 september 2025 @ 14:02:
[...]
Zal waarschijnlijk komen omdat de stick maar 1 verbinding accepteert.
Misschien zoiets een oplossing: https://github.com/tiagocoutinho/modbus-proxy
Nog mogelijkheden?
Dit heeft bij mij wel gewerkt @Pharos1985. X2 stick bedraad verbonden met mijn LAN, Solax integratie op mijn Pi waar Home Assistant op draait.
Inderdaad het heeft mij geholpen, al had ik al wat werkend.JasperE schreef op zondag 31 augustus 2025 @ 19:32:
Ik heb deze github pagina gemaakt waarin ik heb beschreven hoe ik mijn Growatt MOD 5000TL3-X via modbus/ESP32 met Home Assistant heb verbonden. Incl. aansluitinstructies, esphome config en een boodschappenlijstje:
https://github.com/Jasper...SP32_Modbus_RS485_Example
Misschien helpt het mensen in de toekomst!
Maar de twee register truc leverde bij het totaal geproduceerd vermogen nu de correcte waarde op.
Ik gebruik een PID regeling om bij een omvormer (MTL) de waarde van register 3 te regelen en bij een andere omvormer (XH) het laad vermogen te regelen op basis van het net vermogen.
Het is in ESP (en HA) een enorme toestand om van de ene output de input van iets anders te maken.
Ik zag dat je een SLIDER gebruikt om register 3 te regelen.
Wordt die geregeld? En zo ja hoe?
Bij mij ziet het er bij de XH zo uit in de ESP:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| number:
- platform: modbus_controller
modbus_controller_id: controller
id: regel_input_3047 # snelheid laden batterij 0 tot 100%
name: "laden 3047"
address: 3047
register_type: holding
value_type: U_WORD
multiply: 1.0
min_value: 0.00
max_value: 50.00
step: 1
sensor:
- platform: homeassistant
id: regel_input_van_HA #
entity_id: number.v4_4_regeling_laden #
on_raw_value:
then:
- lambda: |-
auto call = id(regel_input_3047).make_call();
call.set_value(x);
call.perform();
internal: True |
number.v4_4_regeling_laden is een templated number waar gekozen wordt uit drie waardes 0/100/ en output van de regeling.
Mooi uitgewerkt ! Met een Growatt Shinewifi S waar ik ESPHome in heb geblazen lukt het prima de data uit te lezen zoals vermogen, stroom en spanning. Ook in- en uitschakelen werkt.JasperE schreef op zondag 31 augustus 2025 @ 19:32:
Ik heb deze github pagina gemaakt waarin ik heb beschreven hoe ik mijn Growatt MOD 5000TL3-X via modbus/ESP32 met Home Assistant heb verbonden. Incl. aansluitinstructies, esphome config en een boodschappenlijstje:
https://github.com/Jasper...SP32_Modbus_RS485_Example
Misschien helpt het mensen in de toekomst!
Het schrijven van de gewenst output reductie naar Holding register 3 werkt echter niet. Toch kan deze inverter dat wel degelijk, als ik het via de server.growatt.com portal doe, geen probleem.
Iemand een idee waarom dat niet lukt ? Een trace van de RS485 pakketten levert geen verschil op: als ik via de portal de output tot 50% reduceer, zie ik dezelfde pakketten op de RS485 bus voorbij komen. rara ?
Inverter 3000MTL / SAAA1700
Voor een MTL-S kan het zijn dat je een firmware update nodig hebt.
In de originele software heeft holding register 3 een wachtwoord.
Als het een (oudere) MTL is helpt het data modem te verwijderen, helemaal spanningsloos maken en dan via de RS485 aansluiting een modbus verbinding maken.
Als je het aan Growatt vraagt, krijg je onderstaande link:
https://www.amosplanet.or...-s-inverter-via-shinebus/
In de originele software heeft holding register 3 een wachtwoord.
Als het een (oudere) MTL is helpt het data modem te verwijderen, helemaal spanningsloos maken en dan via de RS485 aansluiting een modbus verbinding maken.
Als je het aan Growatt vraagt, krijg je onderstaande link:
https://www.amosplanet.or...-s-inverter-via-shinebus/
[ Voor 19% gewijzigd door JanWatt op 21-12-2025 13:47 ]
Hmm, modem en RS485 aansluiting is dezelfde db9 connector, dus het is het een of het ander.JanWatt schreef op zondag 21 december 2025 @ 13:24:
Voor een MTL-S kan het zijn dat je een firmware update nodig hebt.
In de originele software heeft holding register 3 een wachtwoord.
Als het een (oudere) MTL is helpt het data modem te verwijderen, helemaal spanningsloos maken en dan via de RS485 aansluiting een modbus verbinding maken.
Wachtwoord klinkt plausibel, alleen hoe en wat, dat is nergens beschreven. Ik zie ook niets dergelijks voorbij komen in een trace met de originele stick waarbij ik het afgegeven vermogen in % via de website van growatt (inverter settings) aanpas.
afbeeldingen verwijderd
[ Voor 98% gewijzigd door JanWatt op 22-12-2025 11:59 ]
Ik gebruik simpelweg de "RS232" port, daar steekt een ge-reflashte shinewifi-s stick in met ESPhome er op. wel zo handig, want dan hoef ik niet zelf met een losse RS485 interface aan de gang, die zit immers al in de shine wifistick. Voeding wordt ook op die connector geleverd , dus ook geen losse adapter oid.JanWatt schreef op zondag 21 december 2025 @ 14:20:
Zo ziet mijn MTL-S er aan de onder kant uit.
[Afbeelding]
En zo de MTL
[Afbeelding]
Het label RS232 is foutief, de port draait op RS485 signalen en voeding zit ook niet echt standaard op een RS-232 port
Ik ga er dan vanuit dat je de wachtwoord beveiligde firmware hebt.
Quote
&*7: Grid network power control command password:
Inverter is in lock state after power on; change the power control by network command should unlock inverter
first; default pw is XXXXXX;
Unlock: send 0 to 3-135, then send password to 3-136~138; inverter will auto lock in 5min after
unlocked;
Change PW: unlock first, then send 1 to 3-135, then send new password to 3-136~138;
Unquote
Updaten is de enige uitweg.
Quote
&*7: Grid network power control command password:
Inverter is in lock state after power on; change the power control by network command should unlock inverter
first; default pw is XXXXXX;
Unlock: send 0 to 3-135, then send password to 3-136~138; inverter will auto lock in 5min after
unlocked;
Change PW: unlock first, then send 1 to 3-135, then send new password to 3-136~138;
Unquote
Updaten is de enige uitweg.
bronvermelding zou leuk zijnJanWatt schreef op zondag 21 december 2025 @ 14:50:
Ik ga er dan vanuit dat je de wachtwoord beveiligde firmware hebt.
Quote
&*7: Grid network power control command password:
Inverter is in lock state after power on; change the power control by network command should unlock inverter
first; default pw is XXXXXX;
Unlock: send 0 to 3-135, then send password to 3-136~138; inverter will auto lock in 5min after
unlocked;
Change PW: unlock first, then send 1 to 3-135, then send new password to 3-136~138;
Unquote
Updaten is de enige uitweg.
zal er eens in duikenJanWatt schreef op zondag 21 december 2025 @ 13:24:
Voor een MTL-S kan het zijn dat je een firmware update nodig hebt.
In de originele software heeft holding register 3 een wachtwoord.
Als het een (oudere) MTL is helpt het data modem te verwijderen, helemaal spanningsloos maken en dan via de RS485 aansluiting een modbus verbinding maken.
Als je het aan Growatt vraagt, krijg je onderstaande link:
https://www.amosplanet.or...-s-inverter-via-shinebus/
Growatt Inverter Modbus RTU Protocol_II
V1.05
2018-04-19
Growatt New Energy CO.,LTD
In de latere versies is het stukje over het password er uit.
Was niet meer nodig omdat de software aangepast was.
V1.05
2018-04-19
Growatt New Energy CO.,LTD
In de latere versies is het stukje over het password er uit.
Was niet meer nodig omdat de software aangepast was.
nu nog zien dat dat ding veilig te updaten is - hoe en waarmee ..JanWatt schreef op zondag 21 december 2025 @ 15:31:
Growatt Inverter Modbus RTU Protocol_II
V1.05
2018-04-19
Growatt New Energy CO.,LTD
In de latere versies is het stukje over het password er uit.
Was niet meer nodig omdat de software aangepast was.
In de link bij tab 2 onder "Continue reading" staan de files.
Nog even een toevoeging aan boven staande.
Als je het ShineBus programma hebt draaien op een PC en met en USB naar RS485 dongle verbinding maakt met de omvormer.
En je krijgt de correcte device info...
Dan onder de tab Configuraties:
02 set active power ratio(03)
dan geen value invullen
tick read
dan set
Dan krijg je 100
Dan naar 99 veranderen
kijken of hij het accepteert..
Dan nog een keer read.
Is het value dan nog 99, dan werkt het.
Is het value 100, dan heeft hij hem niet gepakt.
Dan procedure nog een keer maar dan met "Recall Enable" ticked.
Als het dan nog niet werkt, heb je de verkeerde software.
Recall Enable is holding register 2.
Aan (1) dan zie je blijvend effect van een verandering van holding register 3.
Uit (0) dan veranderd de waarde die je terug krijgt van register 3 niet maar mogelijk veranderd de instelling wel tot de volgende keer dat de omvormer gestart wordt.
Recall Enable moet iedere keer na een paar minuten opnieuw aan gezet worden.
Als je het ShineBus programma hebt draaien op een PC en met en USB naar RS485 dongle verbinding maakt met de omvormer.
En je krijgt de correcte device info...
Dan onder de tab Configuraties:
02 set active power ratio(03)
dan geen value invullen
tick read
dan set
Dan krijg je 100
Dan naar 99 veranderen
kijken of hij het accepteert..
Dan nog een keer read.
Is het value dan nog 99, dan werkt het.
Is het value 100, dan heeft hij hem niet gepakt.
Dan procedure nog een keer maar dan met "Recall Enable" ticked.
Als het dan nog niet werkt, heb je de verkeerde software.
Recall Enable is holding register 2.
Aan (1) dan zie je blijvend effect van een verandering van holding register 3.
Uit (0) dan veranderd de waarde die je terug krijgt van register 3 niet maar mogelijk veranderd de instelling wel tot de volgende keer dat de omvormer gestart wordt.
Recall Enable moet iedere keer na een paar minuten opnieuw aan gezet worden.
[ Voor 26% gewijzigd door JanWatt op 03-01-2026 15:32 ]
Dank, ga ik zeker even testen !JanWatt schreef op vrijdag 2 januari 2026 @ 15:29:
Nog even een toevoeging aan boven staande.
Als je het ShineBus programma hebt draaien op een PC en met en USB naar RS485 dongle verbinding maakt met de omvormer.
En je krijgt de correcte device info...
Dan onder de tab Configuraties:
02 set active power ratio(03)
dan geen value invullen
tick read
dan set
Dan krijg je 100
Dan naar 99 veranderen
kijken of hij het accepteert..
Dan nog een keer read.
Is het value dan nog 99, dan werkt het.
Is het value 100, dan heeft hij hem niet gepakt.
Dan procedure nog een keer maar dan met "Recall Enable" ticked.
Als het dan nog niet werkt, heb je de verkeerde software.
Recall Enable is holding register 2.
Aan (1) dan zie je blijvend effect van een verandering van holding register 3.
Uit (0) dan veranderd de waarde die je terug krijgt van register 3 niet maar mogelijk veranderd de instelling wel tot de volgende keer dat de omvormer gestart wordt.
Recall Enable moet iedere keer na een paar minuten opnieuw aan gezet worden.
gezien, maar zo te zien niet voor de 3000 MTL (zonder -S).JanWatt schreef op zondag 21 december 2025 @ 23:00:
In de link bij tab 2 onder "Continue reading" staan de files.
Hallo allemaal, ik ben een aardige n00b op dit technische vlak maar ben net tegen issues aangelopen in mn home assistant setup en mn growatt inverter. Blijkt dat username-password geen betrouwbare oplossing is in de integratie. De api key wel, maar die heeft geen huidige power weer. Dat is natuurlijk wel cruciaal voor mn energiemanagement. Na wat googlen kwam ik op dit topic uit, maar heb niet bepaald idee wat ik moet doen, om deze gegevens lokaal uit te lezen.
Ik heb een Growatt 5000MTL inverter. Hier zitten twee RS-485 op (niet gebruikt). Shinewifibox (datalogger) die in principe prima werkt in de Shinephone app.
Maar wat nu? Hoe kan ik ervoor zorgen dat ik mijn live power uit kan lezen in home assistant? In principe zou ik ook gewoon de shinephone willen blijven gebruiken. Wat is de snelste / beste oplossing, zonder een te grote technische uitdaging. Geen probleem om iets van $ uit te geven.
Ik heb een Growatt 5000MTL inverter. Hier zitten twee RS-485 op (niet gebruikt). Shinewifibox (datalogger) die in principe prima werkt in de Shinephone app.
Maar wat nu? Hoe kan ik ervoor zorgen dat ik mijn live power uit kan lezen in home assistant? In principe zou ik ook gewoon de shinephone willen blijven gebruiken. Wat is de snelste / beste oplossing, zonder een te grote technische uitdaging. Geen probleem om iets van $ uit te geven.
[ Voor 7% gewijzigd door fissa op 07-01-2026 11:39 ]
@fissa Ik heb laatst m'n datalogger geupgrade naar een shinewilan-x2, die heeft modbus-TCP ondersteuning.
Had hem binnen notime in HA zitten met de SolaX Inverter Modbus integratie.
Nu heb ik ook meteen veel sneller m'n data binnen, heb hem nu op 15 seconden interval staan.
Had hem binnen notime in HA zitten met de SolaX Inverter Modbus integratie.
Nu heb ik ook meteen veel sneller m'n data binnen, heb hem nu op 15 seconden interval staan.
Dat klinkt als een snelle uit te voeren oplossing. Als je de datalogger vervangt, ben je dan de historie kwijt in shinephone/server.growatt?Tinusvolkel schreef op woensdag 7 januari 2026 @ 11:55:
@fissa Ik heb laatst m'n datalogger geupgrade naar een shinewilan-x2, die heeft modbus-TCP ondersteuning.
Had hem binnen notime in HA zitten met de SolaX Inverter Modbus integratie.
Nu heb ik ook meteen veel sneller m'n data binnen, heb hem nu op 15 seconden interval staan.
En hoe vervang je de boel dan?
Is dit wat je bedoelt?:
https://www.stralendgroen...NTEALw_wcB&v=1a13105b7e4e
@fissa Het is van belang meteen te bedenken wat je wil.
Alleen power meten of als je de power weet, ook wat gaan regelen...
Ik neem aan dat de shinewilan-x2 oplossing van Tinusvolkel niet werkt. Die maakt via USB verbinding met de omvormer. Die heeft een MTL volgens mij niet.
Als het alleen om power meten gaan dan is een vermogens meting op de stroom kabel waarschijnlijk de simpelste oplossing. En de Shinephone app blijft dan gewoon werken.
Als je wil kijken wat er mogelijk is met modbus dan kun je beginnen met een USB naar RS485 dongel te kopen en via de hier boven beschreven procedure te werk gaan.
Als de modbus aansluiting van de omvormer actief is staat er (open) ongeveer 3 V op.
Alleen power meten of als je de power weet, ook wat gaan regelen...
Ik neem aan dat de shinewilan-x2 oplossing van Tinusvolkel niet werkt. Die maakt via USB verbinding met de omvormer. Die heeft een MTL volgens mij niet.
Als het alleen om power meten gaan dan is een vermogens meting op de stroom kabel waarschijnlijk de simpelste oplossing. En de Shinephone app blijft dan gewoon werken.
Als je wil kijken wat er mogelijk is met modbus dan kun je beginnen met een USB naar RS485 dongel te kopen en via de hier boven beschreven procedure te werk gaan.
Als de modbus aansluiting van de omvormer actief is staat er (open) ongeveer 3 V op.
Ik wil in principe de datalogger entiteiten lokaal kunnen lezen, omdat de cloud oplossing via Growatt kennelijk niet betrouwbaar blijkt te zijn in home assistantJanWatt schreef op woensdag 7 januari 2026 @ 13:29:
@fissa Het is van belang meteen te bedenken wat je wil.
Alleen power meten of als je de power weet, ook wat gaan regelen...
Ik neem aan dat de shinewilan-x2 oplossing van Tinusvolkel niet werkt. Die maakt via USB verbinding met de omvormer. Die heeft een MTL volgens mij niet.
Als het alleen om power meten gaan dan is een vermogens meting op de stroom kabel waarschijnlijk de simpelste oplossing. En de Shinephone app blijft dan gewoon werken.
Als je wil kijken wat er mogelijk is met modbus dan kun je beginnen met een USB naar RS485 dongel te kopen en via de hier boven beschreven procedure te werk gaan.
Als de modbus aansluiting van de omvormer actief is staat er (open) ongeveer 3 V op.
Wat moet ik precies kopen? Zoals gezegd ik ben echt een beginner en heb met name home assistant ingericht vanuit het afschaffen van saldering in 2027, om slimmer om te gaan met m’n eigen opgewekte energie.
Ik vind het overigens ook wel interessant hoor, maar dit topic is wel heel erg in het diepe springen haha.
M’n Growatt omvormer is volgens mij 11 jaar oud. Geen idee of die op korte termijn aan vervanging toe is.
Bedankt allebei, voor het meedenken ook al is het eerste voorstel geen oplossing op mijn hulpvraag
En wat is jullie mening over Grott? (Is wel een beetje off-topic natuurlijk)
@fissa De optie van jadjong is een optie.
Dan gaat de verbinding via een ethernet kabel.
Andere mogelijkheid is via een esp32 esphome module dan wordt de verbinding met wifi gemaakt.
De mogelijkheid die ik (om te beginnen) aandraag met de USB/RS485 adapter, gaat via een twee aderige kabel.
Ik raad je sterk aan om hier mee te beginnen, want een modbus verbinding met een MTL is niet bepaalt plug en play.
Als je de modbus verbinding aan de praat hebt dan kun je daarna kijken hoe je het naar HA krijgt.
Koop eerst een "USB naar RS485 Adapter - CH340" kosten bij Tinytronics 3 euro.
Deze kan later (als je een directe kabel naar HA hebt) ook in HA direct.
Maar ik zou beginnen met de de adapter op een laptop of andere computer aan te sluiten en dan met het hierboven beschreven ShineBus programma kijken of je verbinding krijgt, lukt dat niet dan volgende optie: https://github.com/ClassicDIY/ModbusTool
Deze tool is buitengewoon handig. Je kunt er een master of slave mee simuleren.
In jouw geval: sluit je de adapter aan, start de master op
Mode:RTU Baud=9600 Parity= none Data Bits= 8 bits Stop Bits= 1 bit Slave ID = 1
en laat hem naar de eerste 10 holding registers kijken.
Start Address 0 Size 10
Dan hoort bij 00 de integer 257 te staan. 02 staat 0. 03 staat 100.
Als je dit aan de praat krijgt dan weet je dat het werkt.
Lukt het niet meteen dan loop je tegen met een MTL probleem aan: hij kan maar een verbinding aan. (mijn ervaring)
Dus of de Shinewifibox via RS232 of modbus via RS485.
Omschakelen doe je door opnieuw op te starten met alleen de verbinding naar keuze.
Lukt het niet dan kun je weer terug naar de Shinewifibox.
Lukt het wel, de rest is kinderspel..
Dan gaat de verbinding via een ethernet kabel.
Andere mogelijkheid is via een esp32 esphome module dan wordt de verbinding met wifi gemaakt.
De mogelijkheid die ik (om te beginnen) aandraag met de USB/RS485 adapter, gaat via een twee aderige kabel.
Ik raad je sterk aan om hier mee te beginnen, want een modbus verbinding met een MTL is niet bepaalt plug en play.
Als je de modbus verbinding aan de praat hebt dan kun je daarna kijken hoe je het naar HA krijgt.
Koop eerst een "USB naar RS485 Adapter - CH340" kosten bij Tinytronics 3 euro.
Deze kan later (als je een directe kabel naar HA hebt) ook in HA direct.
Maar ik zou beginnen met de de adapter op een laptop of andere computer aan te sluiten en dan met het hierboven beschreven ShineBus programma kijken of je verbinding krijgt, lukt dat niet dan volgende optie: https://github.com/ClassicDIY/ModbusTool
Deze tool is buitengewoon handig. Je kunt er een master of slave mee simuleren.
In jouw geval: sluit je de adapter aan, start de master op
Mode:RTU Baud=9600 Parity= none Data Bits= 8 bits Stop Bits= 1 bit Slave ID = 1
en laat hem naar de eerste 10 holding registers kijken.
Start Address 0 Size 10
Dan hoort bij 00 de integer 257 te staan. 02 staat 0. 03 staat 100.
Als je dit aan de praat krijgt dan weet je dat het werkt.
Lukt het niet meteen dan loop je tegen met een MTL probleem aan: hij kan maar een verbinding aan. (mijn ervaring)
Dus of de Shinewifibox via RS232 of modbus via RS485.
Omschakelen doe je door opnieuw op te starten met alleen de verbinding naar keuze.
Lukt het niet dan kun je weer terug naar de Shinewifibox.
Lukt het wel, de rest is kinderspel..
Super fijn deze antwoorden. Ik ga ermee aan de slag en heb de adapter reeds besteld!JanWatt schreef op woensdag 7 januari 2026 @ 20:15:
@fissa De optie van jadjong is een optie.
Dan gaat de verbinding via een ethernet kabel.
Andere mogelijkheid is via een esp32 esphome module dan wordt de verbinding met wifi gemaakt.
De mogelijkheid die ik (om te beginnen) aandraag met de USB/RS485 adapter, gaat via een twee aderige kabel.
Ik raad je sterk aan om hier mee te beginnen, want een modbus verbinding met een MTL is niet bepaalt plug en play.
Als je de modbus verbinding aan de praat hebt dan kun je daarna kijken hoe je het naar HA krijgt.
Koop eerst een "USB naar RS485 Adapter - CH340" kosten bij Tinytronics 3 euro.
Deze kan later (als je een directe kabel naar HA hebt) ook in HA direct.
Maar ik zou beginnen met de de adapter op een laptop of andere computer aan te sluiten en dan met het hierboven beschreven ShineBus programma kijken of je verbinding krijgt, lukt dat niet dan volgende optie: https://github.com/ClassicDIY/ModbusTool
Deze tool is buitengewoon handig. Je kunt er een master of slave mee simuleren.
In jouw geval: sluit je de adapter aan, start de master op
Mode:RTU Baud=9600 Parity= none Data Bits= 8 bits Stop Bits= 1 bit Slave ID = 1
en laat hem naar de eerste 10 holding registers kijken.
Start Address 0 Size 10
Dan hoort bij 00 de integer 257 te staan. 02 staat 0. 03 staat 100.
Als je dit aan de praat krijgt dan weet je dat het werkt.
Lukt het niet meteen dan loop je tegen met een MTL probleem aan: hij kan maar een verbinding aan. (mijn ervaring)
Dus of de Shinewifibox via RS232 of modbus via RS485.
Omschakelen doe je door opnieuw op te starten met alleen de verbinding naar keuze.
Lukt het niet dan kun je weer terug naar de Shinewifibox.
Lukt het wel, de rest is kinderspel..
En hoe (welke kabel) sluit ik deze aan op de RS485 adapter? gewoon van een utp-kabel een twisted pair gebruiken? En klopt het dat de 5000MTL inverter OF de shinewifi ondersteund OF modbus communicatie? Allebei gaat dus niet? Dit zal @JanWatt wel weten omdat hij volgens mij dezelfde inverter heeft
De optie van jadjong is uiteindelijk de beste vermoed ik. Ik kom relatief eenvoudig met een netwerkkabel bij mijn inverter.
[ Voor 10% gewijzigd door fissa op 08-01-2026 09:17 ]
https://www.tinytronics.n...-naar-rs485-adapter-ch340
Je kunt ook bij Amazon kijken.
Zit er een aan sluit blok op de RS485 connector van de omvormer?
Zo niet dan is dit een optie:
https://www.amazon.nl/YIX...nector/dp/B0CBWTZXX3?th=1
Je kunt ook bij Amazon kijken.
Zit er een aan sluit blok op de RS485 connector van de omvormer?
Zo niet dan is dit een optie:
https://www.amazon.nl/YIX...nector/dp/B0CBWTZXX3?th=1
[ Voor 52% gewijzigd door JanWatt op 08-01-2026 11:34 ]
Hoe krijg ik dit aangesloten?JanWatt schreef op donderdag 8 januari 2026 @ 11:14:
https://www.tinytronics.n...-naar-rs485-adapter-ch340
Je kunt ook bij Amazon kijken.
Zit er een aan sluit blok op de RS485 connector van de omvormer?
Zo niet dan is dit een optie:
https://www.amazon.nl/YIX...nector/dp/B0CBWTZXX3?th=1
Dat is even iets anders dan verwacht.
Geen Phoenix contact dus.
Staat er bij een van de twee ongeveer 3 Volt DC tussen de contacten?
Controleer ook even of er geen spanning op staat tov aarde voor de veiligheid.
Geen Phoenix contact dus.
Staat er bij een van de twee ongeveer 3 Volt DC tussen de contacten?
Controleer ook even of er geen spanning op staat tov aarde voor de veiligheid.
Nee, staat er niet op. Alleen een 1 en 2, en opschrift “WEIPU” wat kennelijk de RS-485 is.JanWatt schreef op donderdag 8 januari 2026 @ 13:10:
Dat is even iets anders dan verwacht.
Geen Phoenix contact dus.
Staat er bij een van de twee ongeveer 3 Volt DC tussen de contacten?
Controleer ook even of er geen spanning op staat tov aarde voor de veiligheid.
De shine dongle zit op de RS232.
Ik heb even een manual opgezocht.
Dit zijn de RS485 aansluitingen.
Ik bedoelde te vragen of er spanning tussen de contacten staat.
Waar het mij om gaat is er achter te komen of we tot een werkend iets kunnen komen.
Als het werkt kun je altijd nog achter de juiste stekker aan gaan.
Dit zijn de RS485 aansluitingen.
Ik bedoelde te vragen of er spanning tussen de contacten staat.
Waar het mij om gaat is er achter te komen of we tot een werkend iets kunnen komen.
Als het werkt kun je altijd nog achter de juiste stekker aan gaan.
Het antwoord is Ja. Schommelt tussen de 3.31 en 3.32V.JanWatt schreef op donderdag 8 januari 2026 @ 13:29:
Ik heb even een manual opgezocht.
Dit zijn de RS485 aansluitingen.
Ik bedoelde te vragen of er spanning tussen de contacten staat.
Waar het mij om gaat is er achter te komen of we tot een werkend iets kunnen komen.
Als het werkt kun je altijd nog achter de juiste stekker aan gaan.
Perfect.
Als je de dongle hebt dan sluit je de + van de dongle aan op de + van de aansluiting van de omvormer en - op de min met twee 0,5 mm2 kabels die je 1 cm blank maakt en dan terug vouwt over de isolatie en dan in de respectievelijke opening duwt.
USB in de computer, programma opstarten, Shinebus of Modbus Master, en kijken wat er te zien is.
Voordeel van Modbus Master is dat je kunt zien wat er fout gaat.
Als je de dongle hebt dan sluit je de + van de dongle aan op de + van de aansluiting van de omvormer en - op de min met twee 0,5 mm2 kabels die je 1 cm blank maakt en dan terug vouwt over de isolatie en dan in de respectievelijke opening duwt.
USB in de computer, programma opstarten, Shinebus of Modbus Master, en kijken wat er te zien is.
Voordeel van Modbus Master is dat je kunt zien wat er fout gaat.
Ga ik doen. Ik laat je weten hoe het gegaan isJanWatt schreef op donderdag 8 januari 2026 @ 14:59:
Perfect.
Als je de dongle hebt dan sluit je de + van de dongle aan op de + van de aansluiting van de omvormer en - op de min met twee 0,5 mm2 kabels die je 1 cm blank maakt en dan terug vouwt over de isolatie en dan in de respectievelijke opening duwt.
USB in de computer, programma opstarten, Shinebus of Modbus Master, en kijken wat er te zien is.
Voordeel van Modbus Master is dat je kunt zien wat er fout gaat.
@JanWatt
Dongle is binnen. Cat6e kabel een twisted pair gebruikt. Shinewifi zit er nog in.
:strip_exif()/f/image/P0255zfcuE7WsG5DkLuH6Bp4.jpg?f=fotoalbum_large)
modbus master opgestart. Startingregister 0 size 10, start 1 size 10, start 40001 size 10 geprobeerd, de variatie slave 1 2 en 3.
Ik krijg de melding Connected Using RTU to COM4.
Read Holding Registers:
>19:32:00: Connected using RTU to COM4
>19:34:35: Disconnected
>19:34:51: Connected using RTU to COM4
>19:35:23: Disconnected
>19:35:51: Connected using RTU to COM4
>19:36:09: Disconnected
>19:36:20: Connected using RTU to COM4
>19:36:35: Disconnected
>19:36:42: Connected using RTU to COM4
>19:36:59: Disconnected
>19:40:53: Connected using RTU to COM4
>19:41:01: TX: 03 03 10 04 00 7f 40 c9
>19:41:01: Failed to execute Read: Error code:2
>19:41:05: Disconnected
>19:41:18: Connected using RTU to COM4
>19:41:25: TX: 01 03 10 04 00 7f 41 2b
>19:41:25: Failed to execute Read: Error code:2
>19:43:15: Disconnected
>19:43:21: Connected using RTU to COM4
>19:43:31: TX: 01 03 10 04 00 7f 41 2b
>19:43:31: Failed to execute Read: Error code:2
>19:43:47: Disconnected
>19:43:54: Connected using RTU to COM4
>19:44:04: TX: 01 03 10 04 00 7f 41 2b
>19:44:04: Failed to execute Read: Error code:2
Heb de kabel nog een keer omgedraaid; dezelfde output.
Dongle is binnen. Cat6e kabel een twisted pair gebruikt. Shinewifi zit er nog in.
:strip_exif()/f/image/P0255zfcuE7WsG5DkLuH6Bp4.jpg?f=fotoalbum_large)
modbus master opgestart. Startingregister 0 size 10, start 1 size 10, start 40001 size 10 geprobeerd, de variatie slave 1 2 en 3.
Ik krijg de melding Connected Using RTU to COM4.
Read Holding Registers:
>19:32:00: Connected using RTU to COM4
>19:34:35: Disconnected
>19:34:51: Connected using RTU to COM4
>19:35:23: Disconnected
>19:35:51: Connected using RTU to COM4
>19:36:09: Disconnected
>19:36:20: Connected using RTU to COM4
>19:36:35: Disconnected
>19:36:42: Connected using RTU to COM4
>19:36:59: Disconnected
>19:40:53: Connected using RTU to COM4
>19:41:01: TX: 03 03 10 04 00 7f 40 c9
>19:41:01: Failed to execute Read: Error code:2
>19:41:05: Disconnected
>19:41:18: Connected using RTU to COM4
>19:41:25: TX: 01 03 10 04 00 7f 41 2b
>19:41:25: Failed to execute Read: Error code:2
>19:43:15: Disconnected
>19:43:21: Connected using RTU to COM4
>19:43:31: TX: 01 03 10 04 00 7f 41 2b
>19:43:31: Failed to execute Read: Error code:2
>19:43:47: Disconnected
>19:43:54: Connected using RTU to COM4
>19:44:04: TX: 01 03 10 04 00 7f 41 2b
>19:44:04: Failed to execute Read: Error code:2
Heb de kabel nog een keer omgedraaid; dezelfde output.
2e ronde shinewifi eruit gehaald. Dezelfde resultaten. Error code 2.
Nu de growatt 5000mtl uitgezet met de fysieke knop en weer aangezet; fingers crossed.
Nu de growatt 5000mtl uitgezet met de fysieke knop en weer aangezet; fingers crossed.
Iets anders resultaat, maar nog steeds error 2. Andere poort op mn pc gebruikt;
>21:04:37: Connected using RTU to COM5
>21:04:48: TX: 01 03 00 00 00 0a c5 cd
>21:04:48: RX: bf ff
>21:04:48: Failed to execute Read: Error code:2
>21:05:41: TX: 01 03 00 01 00 0a 94 0d
>21:05:41: RX: ef ff
>21:05:41: Failed to execute Read: Error code:2
>21:06:00: TX: 01 03 9c 41 00 0a bb 89
>21:06:00: Failed to execute Read: Error code:2
>21:06:24: TX: 01 03 9c 41 00 0a bb 89
>21:06:24: Failed to execute Read: Error code:2
>21:07:36: TX: 01 03 00 01 00 0a 94 0d
>21:07:36: Failed to execute Read: Error code:2
>21:07:53: TX: 01 03 00 00 00 0a c5 cd
>21:07:53: Failed to execute Read: Error code:2
>21:04:37: Connected using RTU to COM5
>21:04:48: TX: 01 03 00 00 00 0a c5 cd
>21:04:48: RX: bf ff
>21:04:48: Failed to execute Read: Error code:2
>21:05:41: TX: 01 03 00 01 00 0a 94 0d
>21:05:41: RX: ef ff
>21:05:41: Failed to execute Read: Error code:2
>21:06:00: TX: 01 03 9c 41 00 0a bb 89
>21:06:00: Failed to execute Read: Error code:2
>21:06:24: TX: 01 03 9c 41 00 0a bb 89
>21:06:24: Failed to execute Read: Error code:2
>21:07:36: TX: 01 03 00 01 00 0a 94 0d
>21:07:36: Failed to execute Read: Error code:2
>21:07:53: TX: 01 03 00 00 00 0a c5 cd
>21:07:53: Failed to execute Read: Error code:2
Nog tips? Ik zal nog een nieuwe kabel maken (misschien 1 twisted pair als 1 gebruiken), zodat er iets meer massa zit in de poort van de inverter. Geen idee of ik goed connectie maak namelijk. Zal dit vanavond proberen.
Het start adres in 00 veranderen om te beginnen.
Ja heb ik gedaan. Ben begonnen met 00. 01. 40001. Allemaal dezelfde resultaten.JanWatt schreef op zondag 11 januari 2026 @ 09:41:
Het start adres in 00 veranderen om te beginnen.
Ook wisselend de slave veranderd van 1-2-3.
Heb je op de dongle tussen + en - met de dongle uit de computer een positieve spanning?
Bijna 1 V?
Bijna 1 V?
Als dat ok is dan met de dongle aangesloten de Shinewifi verwijderen.
Dan de omvormer helemaal spanningsloos maken.
Door de AC spanning er af te halen en de zonnepalen schakelaar uit te zetten.
Wachten tot het scherm helemaal uit is. Dan na een minuut de net spanning er weer op en dan de zonnepanelen schakelaar weer aan en dan nog eens proberen.
Begin adres 00 laten.
En opnieuw proberen.
Dan de omvormer helemaal spanningsloos maken.
Door de AC spanning er af te halen en de zonnepalen schakelaar uit te zetten.
Wachten tot het scherm helemaal uit is. Dan na een minuut de net spanning er weer op en dan de zonnepanelen schakelaar weer aan en dan nog eens proberen.
Begin adres 00 laten.
En opnieuw proberen.
Ga ik checken. Dus (mijn eigen gemaakte) de kabels aansluiten op de interter, en dan de + - op de dongle meten met een multi meter, dat is wat je bedoelt?JanWatt schreef op zondag 11 januari 2026 @ 09:58:
Heb je op de dongle tussen + en - met de dongle uit de computer een positieve spanning?
Bijna 1 V?
Dongle aansluiten en dan shinewifi verwijderen?JanWatt schreef op zondag 11 januari 2026 @ 10:06:
Als dat ok is dan met de dongle aangesloten de Shinewifi verwijderen.
Dan de omvormer helemaal spanningsloos maken.
Door de AC spanning er af te halen en de zonnepalen schakelaar uit te zetten.
Wachten tot het scherm helemaal uit is. Dan na een minuut de net spanning er weer op en dan de zonnepanelen schakelaar weer aan en dan nog eens proberen.
Begin adres 00 laten.
En opnieuw proberen.
In de meterkast de omvormer uitschakelen?
Ff dubbelcheck...
Als je op de omvormer door het menu scrolt dan com je daar ergens "COM address : 01 " tegen.
Dit is het slave ID dat je in moet vullen. Is bijna zeker 01.
Dus dat is goed.
Die error code geeft aan dat de master geen response krijgt van de slave (de omvormer).
Officieel heeft een modbus netwerk een eindweerstand nodig.
Dat kan ook nog helpen. 120ohm.
Kan direct op de dongel. Maar ook bij de omvormer.
Dit is het slave ID dat je in moet vullen. Is bijna zeker 01.
Dus dat is goed.
Die error code geeft aan dat de master geen response krijgt van de slave (de omvormer).
Officieel heeft een modbus netwerk een eindweerstand nodig.
Dat kan ook nog helpen. 120ohm.
Kan direct op de dongel. Maar ook bij de omvormer.
[ Voor 22% gewijzigd door JanWatt op 11-01-2026 12:49 ]
Dus, computer - dongel - kabel - weerstand - inverter?JanWatt schreef op zondag 11 januari 2026 @ 10:37:
Als je op de omvormer door het menu scrolt dan com je daar ergens "COM address : 01 " tegen.
Dit is het slave ID dat je in moet vullen. Is bijna zeker 01.
Dus dat is goed.
Die error code geeft aan dat de master geen response krijgt van de slave (de omvormer).
Officieel heeft een modbus netwerk een eindweerstand nodig.
Dat kan ook nog helpen. 120ohm.
Kan direct op de dongel. Maar ook bij de omvormer.
Zal het eerst eens zonder proberen.
Oke dus ik meet geen spanning meer op de twee poorten, alsof de omvormer gesneuveld is 🫣
Vanzelfsprekend geen spanning van 1v op de + - van de dongle.
Spanning er volledig af geweest (via meterkast). Fysieke knop omvormer op uit gezet.
Shinewifi verwijderd.
Kabels aangesloten + dongle. Nog steeds error code 2. Startadres 0, 00, 01 gebruikt. Slave 1.
Vanzelfsprekend geen spanning van 1v op de + - van de dongle.
Spanning er volledig af geweest (via meterkast). Fysieke knop omvormer op uit gezet.
Shinewifi verwijderd.
Kabels aangesloten + dongle. Nog steeds error code 2. Startadres 0, 00, 01 gebruikt. Slave 1.
Er moet wel zon zijn. De omvormer gaat helemaal uit 's nachts, tenzij het een batterij omvormer is.
Ik moet dus sowieso de testen uitvoeren, overdag als er opbrengst is? Dan is het logisch dat er nu geen resultaten zijn behaald omdat ik het ‘s avonds uitgevoerd heb. @JanWattJanWatt schreef op zondag 11 januari 2026 @ 21:02:
Er moet wel zon zijn. De omvormer gaat helemaal uit 's nachts, tenzij het een batterij omvormer is.
Dit document heb ik nog ontvangen van Growatt. Modbus protocol Growatt 5000MTL omvormer.
https://p29.zdusercontent...h0.aj0eOnmZbiBSy57wkQv3FA
https://p29.zdusercontent...h0.aj0eOnmZbiBSy57wkQv3FA
[ Voor 4% gewijzigd door fissa op 14-01-2026 15:32 ]
Perfect. Het juiste Modbus protocol (voor deze omvormer!)
Hier zie je bijvoorbeeld bij holding register 00 het initial value = 0x0101, dit is in hex.
In int is dit 257.
Op blz 30 staat een stukje over een paswoord beveiliging.
Hier kun je mogelijkerwijs tegen aan lopen.
Dat gaan we zien als je modbus aan de praat hebt.
Hier zie je bijvoorbeeld bij holding register 00 het initial value = 0x0101, dit is in hex.
In int is dit 257.
Op blz 30 staat een stukje over een paswoord beveiliging.
Hier kun je mogelijkerwijs tegen aan lopen.
Dat gaan we zien als je modbus aan de praat hebt.
[ Voor 31% gewijzigd door JanWatt op 14-01-2026 13:44 ]
Wat bedoelt Growatt hiermee:
“Normally, connecting the A port to the A port and the B port to the B port on RS485 can enable RTU. The attachment is the RTU file for the older model, which you can refer to.”
“Normally, connecting the A port to the A port and the B port to the B port on RS485 can enable RTU. The attachment is the RTU file for the older model, which you can refer to.”
plus naar de plus.
Zie onderkant dongel.
Zie onderkant dongel.
@JanWatt
:strip_exif()/f/image/RhZU3Ql1YMIDtcVezUY6bKH6.jpg?f=fotoalbum_large)
Succes! De slave was 22.. De instellingen op de inverterer 'doorgeklopt' en toen zag ik 22 staan. Er staat 1.6v op de + - van de dongle, als deze niet is ingestoken op de computer.
:strip_exif()/f/image/RhZU3Ql1YMIDtcVezUY6bKH6.jpg?f=fotoalbum_large)
Succes! De slave was 22.. De instellingen op de inverterer 'doorgeklopt' en toen zag ik 22 staan. Er staat 1.6v op de + - van de dongle, als deze niet is ingestoken op de computer.
Perfect.
Nu de modbus gegevens naar HA brengen.
Opties:
1) dongel in rechtstreeks in HA steken.
2) via een ethernet verbinding (bv waveshare RS485 to ETH)
3) via een wifi verbinding met een ESP
Nu de modbus gegevens naar HA brengen.
Opties:
1) dongel in rechtstreeks in HA steken.
2) via een ethernet verbinding (bv waveshare RS485 to ETH)
3) via een wifi verbinding met een ESP
Ik denk dat optie 3 de snelste manier is. Wat heb ik daar precies voor nodig?JanWatt schreef op donderdag 15 januari 2026 @ 17:21:
Perfect.
Nu de modbus gegevens naar HA brengen.
Opties:
1) dongel in rechtstreeks in HA steken.
2) via een ethernet verbinding (bv waveshare RS485 to ETH)
3) via een wifi verbinding met een ESP
En ik ben nog op zoek naar een 2-pin connector. De huidige opzet is redelijk gammel natuurlijk.
[ Voor 11% gewijzigd door fissa op 15-01-2026 18:28 ]
Bij alle drie de opties heb je modbus via de 2 pin connector nodig.
Er staan eerder in dit topic enige voorbeelden van mogelijkheden.
De bedrade versies 1 en 2 zijn het stabielst. Maar ik begrijp dat de kabel een probleem is.
De ESP versie geeft wat meer mogelijkheden maar is bewerkelijk.
Er is nog een optie dat is een RS485 naar wifi converter kopen.
Dan krijg je een modbus naar ethernet verbinding via wifi. Heb ik geen ervaring mee.
Maar ziet er veel belovend uit.
Er is ook nog een serieel naar wifi dongel te koop, die doet in feite hetzelfde als deShineWifi datalogger nu doet maar dan heb je wel direct toegang tot de gegevens. Probleem zal zijn om het werkend te krijgen.
Voor de ESP manier moet je een ESP32 dev board kopen met wifi en een TTL to RS485 omvormer (max485).
Dan via ESPhome dat board aan HA koppelen.
En dan via de MAX485 aan de modbus verbinding hangen.
Er staan eerder in dit topic enige voorbeelden van mogelijkheden.
De bedrade versies 1 en 2 zijn het stabielst. Maar ik begrijp dat de kabel een probleem is.
De ESP versie geeft wat meer mogelijkheden maar is bewerkelijk.
Er is nog een optie dat is een RS485 naar wifi converter kopen.
Dan krijg je een modbus naar ethernet verbinding via wifi. Heb ik geen ervaring mee.
Maar ziet er veel belovend uit.
Er is ook nog een serieel naar wifi dongel te koop, die doet in feite hetzelfde als deShineWifi datalogger nu doet maar dan heb je wel direct toegang tot de gegevens. Probleem zal zijn om het werkend te krijgen.
Voor de ESP manier moet je een ESP32 dev board kopen met wifi en een TTL to RS485 omvormer (max485).
Dan via ESPhome dat board aan HA koppelen.
En dan via de MAX485 aan de modbus verbinding hangen.
De keuze die ik maak is ook een beetje afhankelijk van de hulp die ik (van jullie) kan krijgen. Allemaal geen ervaring mee, hoe ik de gegevens in HA kan krijgen… Ik kan wel een kabel trekken als het moet, maar gaat een exercitie worden en met een lengte van 20 meter ongeveer.JanWatt schreef op donderdag 15 januari 2026 @ 19:51:
Bij alle drie de opties heb je modbus via de 2 pin connector nodig.
Er staan eerder in dit topic enige voorbeelden van mogelijkheden.
De bedrade versies 1 en 2 zijn het stabielst. Maar ik begrijp dat de kabel een probleem is.
De ESP versie geeft wat meer mogelijkheden maar is bewerkelijk.
Er is nog een optie dat is een RS485 naar wifi converter kopen.
Dan krijg je een modbus naar ethernet verbinding via wifi. Heb ik geen ervaring mee.
Maar ziet er veel belovend uit.
Er is ook nog een serieel naar wifi dongel te koop, die doet in feite hetzelfde als deShineWifi datalogger nu doet maar dan heb je wel direct toegang tot de gegevens. Probleem zal zijn om het werkend te krijgen.
Voor de ESP manier moet je een ESP32 dev board kopen met wifi en een TTL to RS485 omvormer (max485).
Dan via ESPhome dat board aan HA koppelen.
En dan via de MAX485 aan de modbus verbinding hangen.
Wat is de meest eenvoudige manier om de data in HA te krijgen?
Hé @jadjong , als je een waveshare gebruikt(bijvoorbeeld https://www.amazon.nl/Wav...rageCustomerReviewsAnchor), zie je dan enkel waarden als de inverter aanspringt bij zon? Ik kan nu een drietal waarden aflezen via een rs485 naar usb dongle (big shout out naar @JanWatt voor zijn hulp) die ik direct heb aangesloten op mn home assistant nuc. Het werkt, maar in HA zie ik bij geen zon “unavailable”. Logisch op zich, maar de solar total zou je bv. wel willen zien.jadjong schreef op woensdag 7 januari 2026 @ 18:15:
Waveshare modbus 》ethernet converter en wat tijd om te configureren.
Dat hangt naar mijn idee heel erg van HA af. De inverter voor de eerste keer toevoegen in HA zou ik alleen met zonneschijn doen, ben te lang bezig geweest met klooien in de nacht terwijl het de volgende dag in 1x werkte.
Daarnaast is HA bij mij niet consistent met getallen als de inverter uit staat. De ene keer blijft het laatst geregistreerde getal staan tot er de volgende dag een nieuwe waarde voorbij komt en de andere keer staat er 0 of unavailable gedurende de nacht.
Daarnaast is HA bij mij niet consistent met getallen als de inverter uit staat. De ene keer blijft het laatst geregistreerde getal staan tot er de volgende dag een nieuwe waarde voorbij komt en de andere keer staat er 0 of unavailable gedurende de nacht.
Ik heb net wat zitten testen.
Het is mogelijk om de waarde altijd available te hebben.
Je moet dan de waarde van de omvormer via een helper laten lopen.
Settings/helpers/create helper/utility meter
Als input sensor vul je de originele waarde in.
En je kunt daar aangeven wat je wil dat hij laat zien.
Het is mogelijk om de waarde altijd available te hebben.
Je moet dan de waarde van de omvormer via een helper laten lopen.
Settings/helpers/create helper/utility meter
Als input sensor vul je de originele waarde in.
En je kunt daar aangeven wat je wil dat hij laat zien.
Om toekomstige mensen zoals ik een beetje op weg te helpen een klein stukje proza, over welke stappen ik heb doorlopen om de Modbus verbinding op te zetten tussen mijn Home Assistant (nucje) en mn Growatt omvormer. Voordat ik mn proza ga schrijven, wil ik dit @JanWatt en dit topic heel erg bedanken. Zonder jullie hulp a publiek en in dm was het mij nooit gelukt. Super bedankt Tweakers!
Deze heeft een RS-232 aansluiting waar de shinewifi (datalogger) op aangesloten wordt. Deze wil ik in mijn geval niet meer gebruiken.
En hij deze heeft twee RS-485 (modbus) aansluitingen, waarvan ik er 1 in gebruik heb genomen:
:strip_exif()/f/image/C1fm7wCkjLYvxmDLpOYNBV56.jpg?f=fotoalbum_large)
2. Een UTP-kabel
3. Een USB naar RS-485 (CPH340) dongle: bijvoorbeeld te koop voor 3 euro bij https://www.tinytronics.n...-naar-rs485-adapter-ch340
4. Een multi meter om voltage/spanning te meten
5. Modbus Master (software) via github te verkrijgen: https://github.com/ClassicDIY/ModbusTool/tree/master
1.
Meet met een multi meter of er stroom op de modbus (RS-485) poorten staat. Er zou ongeveer 3 volt op moeten staan. In mijn geval was dit 3.31-3.32 volt.
Zo nee, dan is deze modbus poort mogelijk dicht en moet deze opengezet worden via bv. Growatt zelf.
Zo nee, de RS-232 poort is actief en deze moet je eerst verwijderen, omvormer uitzetten & spanningloos maken in de meterkast om na 1 minuut weer alles aan te zetten. Dit activeerd mogelijk de modbus poort. In mijn geval was dit niet nodig.
Zo ja, ga naar stap 2.
2.
- Pak een utp-kabel (lang genoeg om van je laptop naar de omvormer te kunnen) en strip de twee uiteinden zodat je de vier twisted pairs ziet (8 draden).
- Je hebt 2 twisted pairs aan iedere zijde nodig (4 enkele draden). Strip de pairs (+- 2 cm lang) tot op het koper en draai 2 kabels in elkaar. Zorg dat je dezelfde pairs gebruikt aan de andere kant!
:strip_exif()/f/image/IWquoHCMke1YSxItp13L1BO8.jpg?f=fotoalbum_large)
- Steek vervolgens een kant van de kabel in de modbus-aansluiting.
- Meet vervolgens met een multi meter de andere zijde van je gemaakte kabel. Hier moet ongeveer 1 volt op staan. In mijn geval was dit 1.6 volt.
Zo nee, probeer de kabel opnieuw in de modbus te steken, misschien maakt de kabel geen goede verbinding of moet je iets aanpassen aan jouw (koper) uiteinden.
Zo ja, ga door naar de volgende stap.
3.
Check op jouw omvormer wat het slave adress (COM-adress) is. In veel gevallen is dit gewoon 1, maar in mijn geval was het 22! Dit poortnummer heb je nodig om te communiceren met de omvormer.
4.
1. Verwijder nu de shinewifi (datalogger). Bij sommige omvormers is het niet mogelijk om 2 poorten tegelijk te gebruiken, dus of de RS-232 of de RS-485.
2. Verbindt de kabel met de omvormer -> RS485 naar usb dongle -> laptop.
3. Zet de omvormer uit (handmatig de fysieke knop omzetten) naar 0.
4. Maak de omvormer spanningloos (in de meterkast de zekering omlaag).
5. Wacht minimaal 1 minuut.
6. Zet alles weer aan.
5.
- Start nu op je laptop Modbus Master op
- Voer de volgende waarden in:
Mode = RTU
Portname = COM1 of COM2 of COM3 of COM4 of COM6 enz enz. (deze waarde wordt door Windows zelf bepaald afhankelijk op welke usb-poort je de dongle hebt ingeprikt)
Baud = 9600
Parity = None
Data Bits = 8
Stop Bits = 1
Slave ID = 1 (of een andere waarde afhankelijk van je achterhaalde COM Adress op jouw omvormer! Ik had 22)
- Klik vervolgens op Connect. Onderin het scherm zou je moeten zien "Connected using RTU to COM#".
Zo nee, controleer je kabels. Zijn de twisted pairs gelijk aan iedere kant? Wissel de twisted pairs IN de modbus poort even om. Check de aansluiting op de RS485 naar USB dongle en zet ze opnieuw vast.
Zo ja, ga naar stap 6.
6.
Lees nu de eerste 10 Holding Registers uit.
- Start adress op 00 zetten.
- Size op 10 zetten.
- Klik vervolgens op Read Holding Register
Zie je een Read Succes onderin het scherm zoals hieronder, dan zit je goed! Er is verbinding en je kan communiceren met jouw omvormer!
/f/image/Rdf4v67Qd887Cmd99RBEDHvo.png?f=fotoalbum_large)
7.
Nu gaan we naar home assistant. Verbindt je utp kabel ( Ik heb een 30 meter CAT 5e kabel gebruikt waar ik 3 meter van heb afgeknipt) van jouw omvormer naar jouw home assistant instance. In mijn geval een nucje met hierop Proxmox in een HA virtuele omgeving.
Als je de dongle hebt ingeprikt vergeet niet in proxmox de Dongle (usb) beschikbaar te maken in HA.
Maak met bv. File Editor in de root van home assistant een bestand aan met de naam: modbus.yaml en maak deze beschikbaar in configuration.yaml via de volgende code:
Deze modbus.yaml gebruik ik, maar is voor iedereen anders natuurlijk:
Succes!
De wat en waarom?
Ik ben sinds kort begonnen met Home Assistant (HA) en wil onder andere efficienter omgaan met mijn eigen opwek via mijn zonnepanelen (met het oog op het stoppen van salderen in 2027). Hier wil ik diverse waarden van mijn zonnepanelen uitlezen en daar automatiseringen op loslaten. Wat bleek uit ervaring en de HA documentatie; de waarden via de Growatt server (username + password) uitlezen geeft authenticatieproblemen waarbij je meermaals 1 dag uitgesloten wordt van je account. Volgens de HA documentatie werkt de Api wel, maar dan krijg je alleen totalen terug in HA en geen actuele waarden zoals Power. Conclusie: ik zocht een andere manier om de gegevens in HA te krijgen & modbus is daar een manier voor.Mijn omvormer
Ik heb een Growatt 5000MTL omvormer, geinstalleerd in 2015 (dus een relatief oud beestje).Deze heeft een RS-232 aansluiting waar de shinewifi (datalogger) op aangesloten wordt. Deze wil ik in mijn geval niet meer gebruiken.
En hij deze heeft twee RS-485 (modbus) aansluitingen, waarvan ik er 1 in gebruik heb genomen:
:strip_exif()/f/image/C1fm7wCkjLYvxmDLpOYNBV56.jpg?f=fotoalbum_large)
Wat heb je allemaal nodig?
1. Een laptop2. Een UTP-kabel
3. Een USB naar RS-485 (CPH340) dongle: bijvoorbeeld te koop voor 3 euro bij https://www.tinytronics.n...-naar-rs485-adapter-ch340
4. Een multi meter om voltage/spanning te meten
5. Modbus Master (software) via github te verkrijgen: https://github.com/ClassicDIY/ModbusTool/tree/master
De stappen
Doorloop de stappen bij voorkeur overdag, als er zon(opbrengst) is. Ik heb eerst geprutst in de avond, bij geen zon. De omvormer is op dat moment uit & er kan dan geen verbinding mee worden gemaakt!1.
Meet met een multi meter of er stroom op de modbus (RS-485) poorten staat. Er zou ongeveer 3 volt op moeten staan. In mijn geval was dit 3.31-3.32 volt.
Zo nee, dan is deze modbus poort mogelijk dicht en moet deze opengezet worden via bv. Growatt zelf.
Zo nee, de RS-232 poort is actief en deze moet je eerst verwijderen, omvormer uitzetten & spanningloos maken in de meterkast om na 1 minuut weer alles aan te zetten. Dit activeerd mogelijk de modbus poort. In mijn geval was dit niet nodig.
Zo ja, ga naar stap 2.
2.
- Pak een utp-kabel (lang genoeg om van je laptop naar de omvormer te kunnen) en strip de twee uiteinden zodat je de vier twisted pairs ziet (8 draden).
- Je hebt 2 twisted pairs aan iedere zijde nodig (4 enkele draden). Strip de pairs (+- 2 cm lang) tot op het koper en draai 2 kabels in elkaar. Zorg dat je dezelfde pairs gebruikt aan de andere kant!
:strip_exif()/f/image/IWquoHCMke1YSxItp13L1BO8.jpg?f=fotoalbum_large)
- Steek vervolgens een kant van de kabel in de modbus-aansluiting.
- Meet vervolgens met een multi meter de andere zijde van je gemaakte kabel. Hier moet ongeveer 1 volt op staan. In mijn geval was dit 1.6 volt.
Zo nee, probeer de kabel opnieuw in de modbus te steken, misschien maakt de kabel geen goede verbinding of moet je iets aanpassen aan jouw (koper) uiteinden.
Zo ja, ga door naar de volgende stap.
3.
Check op jouw omvormer wat het slave adress (COM-adress) is. In veel gevallen is dit gewoon 1, maar in mijn geval was het 22! Dit poortnummer heb je nodig om te communiceren met de omvormer.
4.
1. Verwijder nu de shinewifi (datalogger). Bij sommige omvormers is het niet mogelijk om 2 poorten tegelijk te gebruiken, dus of de RS-232 of de RS-485.
2. Verbindt de kabel met de omvormer -> RS485 naar usb dongle -> laptop.
3. Zet de omvormer uit (handmatig de fysieke knop omzetten) naar 0.
4. Maak de omvormer spanningloos (in de meterkast de zekering omlaag).
5. Wacht minimaal 1 minuut.
6. Zet alles weer aan.
5.
- Start nu op je laptop Modbus Master op
- Voer de volgende waarden in:
Mode = RTU
Portname = COM1 of COM2 of COM3 of COM4 of COM6 enz enz. (deze waarde wordt door Windows zelf bepaald afhankelijk op welke usb-poort je de dongle hebt ingeprikt)
Baud = 9600
Parity = None
Data Bits = 8
Stop Bits = 1
Slave ID = 1 (of een andere waarde afhankelijk van je achterhaalde COM Adress op jouw omvormer! Ik had 22)
- Klik vervolgens op Connect. Onderin het scherm zou je moeten zien "Connected using RTU to COM#".
Zo nee, controleer je kabels. Zijn de twisted pairs gelijk aan iedere kant? Wissel de twisted pairs IN de modbus poort even om. Check de aansluiting op de RS485 naar USB dongle en zet ze opnieuw vast.
Zo ja, ga naar stap 6.
6.
Lees nu de eerste 10 Holding Registers uit.
- Start adress op 00 zetten.
- Size op 10 zetten.
- Klik vervolgens op Read Holding Register
Zie je een Read Succes onderin het scherm zoals hieronder, dan zit je goed! Er is verbinding en je kan communiceren met jouw omvormer!
/f/image/Rdf4v67Qd887Cmd99RBEDHvo.png?f=fotoalbum_large)
7.
Nu gaan we naar home assistant. Verbindt je utp kabel ( Ik heb een 30 meter CAT 5e kabel gebruikt waar ik 3 meter van heb afgeknipt) van jouw omvormer naar jouw home assistant instance. In mijn geval een nucje met hierop Proxmox in een HA virtuele omgeving.
Als je de dongle hebt ingeprikt vergeet niet in proxmox de Dongle (usb) beschikbaar te maken in HA.
Maak met bv. File Editor in de root van home assistant een bestand aan met de naam: modbus.yaml en maak deze beschikbaar in configuration.yaml via de volgende code:
code:
Voordat je jouw modbus.yaml aanmaakt zoek de poort-id op van jouw RS-485 naar USB dongle. Deze vindt je onder hardware in jouw HA omgeving. In mijn geval is dit: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port01
| modbus: !include modbus.yaml |
Deze modbus.yaml gebruik ik, maar is voor iedereen anders natuurlijk:
code:
Voor het bepalen welke waarde op welk adress te vinden is moet je op het www, of via Growatt, de modbus documentatie raadplegen. Ik heb via de klantenservice van Growatt het document Growatt OLD_Growatt-PV-Inverter-Modbus-RS485-RTU-Protocol-V3-14.pdf gekregen waar exact staat vermeld welke waarde op welk adress staat. 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
| - name: GROWATT_MTL
#RS485to USB voor Growatt MTL
type: serial
baudrate: 9600
bytesize: 8
method: rtu
parity: N
port: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
stopbits: 1
sensors:
#3 Growatt
- name: Growatt_MTL_power
unique_id: Growatt_MTL_power
precision: 0
address: 11
scan_interval: 10
input_type: input
slave: 22
scale: 0.1
data_type: uint32
unit_of_measurement: W
state_class: measurement
device_class: power
#adress 11 is high, 12 is low: samen (uint32) maakt hem volledig
- name: Growatt_MTL_load
unique_id: Growatt_MTL_load
precision: 1
address: 3
#scan_interval: 10
input_type: holding
slave: 22
unit_of_measurement: "%"
- name: Growatt_MTL_total_energy
unique_id: Growatt_MTL_total_energy
precision: 1
address: 28
input_type: input
slave: 22
scale: 0.1
data_type: uint32
unit_of_measurement: kWh
state_class: total_increasing
device_class: energy
#Ik kijk nu naar adress 28 en 29, energy total high en low samen, door uint32 te gebruiken als data_type
- name: Growatt_MTL_Energy_Today
unique_id: growatt_MTL_energy_today
precision: 1
address: 26
input_type: input
slave: 22
scale: 0.1
data_type: uint32
unit_of_measurement: kWh
state_class: measurement
#Ik kijk nu naar adress 26 en 27, energy today high en low samen, door uint32 te gebruiken als data_type
- name: Growatt_Inverter_Status
slave: 22
address: 0
input_type: input
data_type: uint16
unit_of_measurement: ""
state_class: measurement
- name: Growatt_MTL_Inverter_Temperature
unique_id: growatt_mtl_inverter_temperature
slave: 22
address: 32
input_type: input
data_type: uint16
scale: 0.1
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement |
Succes!
Interessant!
Ben je ook in staat om de vermogen van zonne energie te besturen zodat er geen stroom naar de net (grid) gaat? Dit is belangrijk als de saldering van 1 januari 2027 wegvalt.
Ben je ook in staat om de vermogen van zonne energie te besturen zodat er geen stroom naar de net (grid) gaat? Dit is belangrijk als de saldering van 1 januari 2027 wegvalt.
4900/4920 Wp ZW + 2520/2100 Wp ZO : SMA STP10.0-3AV-40/STP4.0-3AV-40 : 3xMP2-5000VA : 3xSeplos Mason 280L+42,9kWh : Arotherm VWL125/6+MEH97/6+VIH-RW300/3 : 100 m2 vvw als bijverwarming : Bouwjaar 2008
Ja, dit is ook gelukt! (Nogmaals thanks @JanWatt)Eriko schreef op vrijdag 30 januari 2026 @ 10:26:
Interessant!
Ben je ook in staat om de vermogen van zonne energie te besturen zodat er geen stroom naar de net (grid) gaat? Dit is belangrijk als de saldering van 1 januari 2027 wegvalt.
Als je de afbeelding onder stap 6 bekijkt, zie je dat het vermogen via Modbus Master van de omvormer ingesteld wordt op 98.
Op adress 3 staat het vermogen (in percentage 0-100).
Start Address = 3 (naar dit adress wil je schrijven/een nieuwe waarde instellen)
Size = 1 (je wil alleen naar adress 3 schrijven, niet meer! Dus size 1)
En dan onder 3 type je handmatig 98.
Door dan op de knop Write single register te klikken schrijft hij de nieuwe waarde.
Deze kan je dan weer uitlezen door op de Read holding register knop te klikken. Dan krijg je de volgende output:
TX 16 03 00 03 00 01 77 2D
RX 16 03 02 00 62 4D ae
De RX-waarde moet je als volgt lezen:
16 = Is het slave adress, namelijk hex 16 is 22 decimaal (mijn COM adress).
03 =Adress waar wij de waarde 98 hebben ingevoerd
02 = Aantal bytes
00 62 = Dit zijn de twee bytes, waarvan de decimale waarde 98 is! (wat we zojuist hebben ingesteld!)
4D AE = ? (Als ik chatgpt mag geloven een CRC checksum)
Dit heb ik ook geimplementeerd & getest in HA. Ik heb drie knoppen gemaakt die Adress 3 op 0 kan zetten, op 99 kan zetten & op 100 kan zetten.
1 klik op de 0 knop zorgde er direct voor dat mn zonnepanelen opwek (Power) nul werd. Ik kan de opzet van deze knoppen ook nog wel even delen.
[ Voor 8% gewijzigd door fissa op 30-01-2026 15:27 ]
Goedemiddag,
Ik wil ook graag mijn Growatt omvormer aansturen via modbus. Omdat ik een noob ben op dit gebied loop ik al vast bij het werkend krijgen van een Waveshare 2-CH RS485 TO ETH.
Als ik de wiki van dit apparaat goed begrijp heeft dit device een gegeven ip adress 192.168.1.200 of 201.
Mijn Ziggo router geeft ip's uit in de range van 192.168.178.
Angry ip scanner geeft geen resultaten in de range 192.168.1. en de Ziggo router laat geen verbinding zien in de range 192.168.178.
Wat mis ik hier?
Dank alvast voor enige hulp.
Ik wil ook graag mijn Growatt omvormer aansturen via modbus. Omdat ik een noob ben op dit gebied loop ik al vast bij het werkend krijgen van een Waveshare 2-CH RS485 TO ETH.
Als ik de wiki van dit apparaat goed begrijp heeft dit device een gegeven ip adress 192.168.1.200 of 201.
Mijn Ziggo router geeft ip's uit in de range van 192.168.178.
Angry ip scanner geeft geen resultaten in de range 192.168.1. en de Ziggo router laat geen verbinding zien in de range 192.168.178.
Wat mis ik hier?
Dank alvast voor enige hulp.
Zonnepanelen: 6 stuks, 2640 wp op ZZW. | Warmtepomp: Adlar Aurora II 6kw | Geschakelde bungalow - 90m² vloerverwarming - 95m² totaal woning - overal HR++ | Warmtepompboiler: Atlantic Calypso 100L | Thuisaccu: Marstek 5 kWh |
:strip_exif()/f/image/g2DMTxY4dvsZzHhXKyNDCZJw.jpg?f=fotoalbum_large)