Hoe modbus communicatie te starten op een growatt omvormer?

Pagina: 1
Acties:

  • Tieuwe
  • Registratie: Oktober 2001
  • Laatst online: 19:07
DaWizza schreef op vrijdag 6 januari 2023 @ 13:02:
Toch nog een update nadat alle hardware binnen is gekomen:
ik heb de boel aangesloten zoals hier omschreven staat:
https://community.home-as...att-shinewifi-s/369171/43

nodig:
-485 naar ttl
-D1 mini
-een paar dupont kabels (of zelf iets strippen en solderen)
-een USB stekker zoals beschreven of een stopcontact+adapter met microUSB kabel
-Home Assistant met ESPHome

Ik heb de code in de link gekopieerd, een verificatie in ESPHome gedraait en eruit gehaald wat niet correct was, daarna draaide het als een zonnetje.
Het is de goedkoopste oplossing die ik gezien heb die je helemaal van de cloud afhaalt.
Nu de API van Growatt zo brak is en na de positieve reacties op Tweakers ben ik zelf ook aan de slag gegaan. Het lukt me helaas niet om de communicatie tot gang te krijgen :'( . Ik heb:

- ESP32 Dev4
- 485 naar TTL
- aangesloten volgens plaatje :
Afbeeldingslocatie: https://community-assets.home-assistant.io/original/4X/7/1/9/719274c49f6b5dbe8808f113012ded422e9aba20.png

Verschil is wel dat ik de voeding van de ESP32 via micro usb connector heb lopen en de TTL voeding via VCC pin, zonder de mantel van usb kabel te gebruiken als "ground"

Welke pins op de connector moet ik nou aansluiten als TX en RX? Of wat anders kan er nou nog misgaan?

Ik heb deze communicatie-connector:

Afbeeldingslocatie: https://tweakers.net/i/miucOPB597fkBAfUkVG_CiJPAg0=/232x232/filters:strip_icc():strip_exif()/f/image/cWtgNi7OV7k2I5NfwFta7gbK.jpg?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/9LPNOtAQk0iktDrmqj5gmV10bXY=/232x232/filters:strip_icc():strip_exif()/f/image/evZk5hJEH2yMWtDz4XdHlHkP.jpg?f=fotoalbum_tile



In ESPHome krijg ik continue de meldingen:
"no response received - removed from send queue"

  • Tieuwe
  • Registratie: Oktober 2001
  • Laatst online: 19:07
Dit is mijn situatie
Afbeeldingslocatie: https://tweakers.net/i/xeFigdVllHhqmyTMYV0YTPaLCls=/232x232/filters:strip_icc():strip_exif()/f/image/OdQbpSyBX3J9tvQ9I4tiKgaE.jpg?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/-s2hvInJ4zOzRKhIxQYqD02H3sM=/232x232/filters:strip_icc():strip_exif()/f/image/f6m9yncQn7bGToHhByLMIrRh.jpg?f=fotoalbum_tile


In Esphome staat
TX pin op GPIO1
RX pin op GPIO3
Baud rate op 9600

Edit: Heb inmiddels 5 nieuwe 485 - TTL bordjes besteld. Ik krijg de foutmeldingen gewoon niet weg (als de omvormer aanstaat natuurlijk)

[ Voor 6% gewijzigd door Tieuwe op 24-10-2023 07:40 ]


  • JazekerXX
  • Registratie: November 2012
  • Laatst online: 27-03 01:58
bij deze even een complete samenvatting van de stappen die ik heb doorlopen om mijn Growatt min 3600TL-XE data werkend te krijgen via een esp8266 op home assistant.

in home assistant heb ik met esphome een esp8266 (nodemcu kloon) van basis firmware voorzien. als je niet weet hoe dit werkt kan ik het wel uitleggen, maar ik ga er even vanuit dat dit bekend is.

vervolgens kun je onderstaande configuratie via esphome op de esp8266 laden.
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
esphome:
  name: zonnepanelen-voor
  friendly_name: Zonnepanelen voor

esp8266:
  board: nodemcuv2

# Enable logging
logger:
  baud_rate: 0

# Enable Home Assistant API
api:
  encryption:
    key: "jouw key hier"

ota:
  password: "jouw ww hier"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Zonnepanelen-Voor"
    password: "jouw ww hier"

# Enable Web server
web_server:
  port: 80

captive_portal:

time:
  - platform: homeassistant
    id: homeassistant_time

uart:
  id: mod_bus
  tx_pin: D5
  rx_pin: D6
  baud_rate: 9600
  
modbus:
  id: modbus1
  uart_id: mod_bus
  
modbus_controller:
  - id: growatt
    modbus_id: modbus1
    setup_priority: -10
  
globals:
  - id: gstatus
    type: int
    restore_value: no
    initial_value: '0'

sensor:
  - platform: growatt_solar
    update_interval: 10s
    protocol_version: RTU2

    inverter_status:
      name: "Growatt Status Code"

    phase_a:
      voltage:
          name: "Growatt AC Voltage"
      current:
          name: "Growatt AC Current"
      active_power:
          name: "Growatt AC Power"
          id: "ac_power"

    pv1:
      voltage:
          name: "Growatt PV1 DC Voltage"
      current:
          name: "Growatt PV1 DC Current"
      active_power:
          name: "Growatt PV1 Active DC Power"

    pv2:
      voltage:
          name: "Growatt PV2 DC Voltage"
      current:
          name: "Growatt PV2 DC Current"
      active_power:
          name: "Growatt PV2 Active DC Power"

    pv_active_power:
      name: "Growatt PV Active DC Power"
      id: "dc_power"

    frequency:
      name: "Growatt Frequency"

    energy_production_day:
      name: "Growatt EnergyToday"

    total_energy_production:
      name: "Growatt EnergyTotal"

    inverter_module_temp:
      name: "Growatt Inverter Module Temp"    

  - platform: template
    name: "Inverter efficiëntie"
    lambda: |-
      return((id(ac_power).state / id(dc_power).state) * 100);
    unit_of_measurement: '%'
    update_interval: 10s


dan nog de hardware.
ik heb de voeding via usb op de inverter
de tx pin D5 (GPIO14) naar de RS485 module tx (tx op tx is wel vreemd maar zo werkt het dus...)
de rx pin D6 (GPIO12) naar de RS485 module rx (pin D5 en D6 zijn een sofware serial dus andere pinnen kunnen ook ik heb niet meer getest of UART0 - GPIO1 en GPIO3 ook werken, dit is wel een hardware serial)
en als laatste 3,3v en gnd naar de RS485

vanaf de RS485 gaat A naar de inverter pin 3 - A en RS485 gaat B naar de inverter pin 4 - B
en op de connector van de inverter komt er nog een termination weerstand van 120 ohm over pin 3 en 4 (bij de draden)

dan nog een ding, in eerste instantie werkte het bij ook niet en na een keer op het reset knopje van de esp gedrukt te hebben, begon het spontaan te werken.

zie ook onderstaande afbeeldingen van mijn testopstelling. als dit allemaal zonder problemen werkt maak ik uiteraard nog een PCB en 3D geprinte behuizing.

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

Afbeeldingslocatie: https://tweakers.net/i/48H9IHHD1RJeztUNmt0-gDMboZI=/x800/filters:strip_icc():strip_exif()/f/image/oQIut2sJWm5RcYy2DakVf2XW.jpg?f=fotoalbum_large

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

  • Dutchess_Nicole
  • Registratie: Augustus 2001
  • Laatst online: 01-04 17:14
Thijsmans schreef op woensdag 7 februari 2024 @ 09:30:
[...]


Ja maar... Als je kijkt naar de board definities zie je dat de esp01_1m geen Dx-pin definities heeft. Die horen bij boards nodemcu, d1 en d1_mini.

Ik zou uitzoeken waarom esphome niet kan compilen op board nodemcu, of de pinnen omnummeren naar de daadwerkelijke pin-nummers (terug te vinden @ bovenstaande link).
Helaas maken de definities geen verschil voor het resultaat. zowel nodemcu als nodemcuv2 als board type leveren niks op. Ook het swappen van TX/RX heeft geen resultaat, anders dan het feit dat ik op de TTL converter het andere ledje zie knipperen als de NMCU wat probeert te verzenden.

Ik heb geprobeerd om de platform: growatt_solar uit mijn code te halen en alleen met modbus_controller te werken. Dat levert niks op.

Andersom, als ik growatt_solar laat staan en de modbus controller weghaal eveneens geen resultaten.

Ik krijg gewoon op geen enkele manier een reactie en ik snap niet wat er mist.

Afbeeldingslocatie: https://tweakers.net/i/Kl2sGkEjugi2fUr50IISGnLzEz0=/232x232/filters:strip_icc():strip_exif()/f/image/fKhWSdqRad3aFIYv1WdSoX2O.jpg?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/V53prstZnNqmcYKp3gpyOJ5FiY8=/232x232/filters:strip_icc():strip_exif()/f/image/PnjhoZGoAGMk1Q2kq8DeAG0G.jpg?f=fotoalbum_tile


Dit is de nodemcu die ik gebruik. Dit is een ESP8266 variant dus ik kan geen esp32 truukjes gebruiken helaas.

Over die stekker: die is dus echt niet te vinden, zelfs niet op Aliexpress. Dit is weer een hele speciale, die schema's in de handleiding kloppen denk ik qua pinout wel maar niet qua keying:

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

Alle stekkers die ik op Ali kan vinden zijn rond van vorm, deze is dat dus niet (meer)

Kia E-Niro 2019 Executiveline. OTGW/HA Enthousiasteling.


  • Dutchess_Nicole
  • Registratie: Augustus 2001
  • Laatst online: 01-04 17:14
Even een update, sinds er laatst wat stuk ging met ESPhome en ik flink heb moeten hannessen om het weer werken te krijgen:

YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
substitutions:
  name: growatt-esp8266
  friendly_name: growatt-esp8266
  devicename: growatt-3000tl-x

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  name_add_mac_suffix: false
  project:
    name: esphome.web
    version: '1.0'

esp8266:
  board: esp01_1m
  restore_from_flash: true
  framework:
    version: latest

external_components:
  - source:
      type: git
      url: https://github.com:/martgras/esphome
      ref: modbus-queue
    components: [ modbus]
  - source:
      type: git
      url: https://github.com:/martgras/esphome
      ref: modbus-sendfix
    components: [modbus_controller]

# Enable logging
logger:
  level: WARN #makes uart stream available in esphome logstream
  baud_rate: 0 #disable logging over uart

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

api:
  encryption:
    key: "<key>"

ota:
  - platform: esphome
    password: "<password>"

# In combination with the `ap` this allows the user
# to provision wifi credentials to the device via WiFi AP.
captive_portal:

# To have a "next url" for improv serial
web_server:
  port: 80
  
time:
  - platform: homeassistant
    id: homeassistant_time

uart:
  id: gw_uart
  baud_rate: 9600
  tx_pin: GPIO5
  rx_pin: GPIO14
  parity: NONE
  stop_bits: 1
  # debug:
  #   direction: BOTH
  #   dummy_receiver: false
  #   after:
  #    delimiter: "\n"
  #   sequence:
  #     - lambda: UARTDebug::log_string(direction, bytes);

modbus:
  id: modbus1
  uart_id: gw_uart
  send_wait_time: 500ms
  # disable_crc: true

modbus_controller:
  - id: growatt
    ## the Modbus device addr
    address: 1
    modbus_id: modbus1
    setup_priority: -10  
    update_interval: 5s

sensor:
  - platform: modbus_controller
    address: 0
    register_type: "read"
    internal: true
    id: status

  - platform: modbus_controller
    name: "${devicename} DcPower"
    address: 5
    register_type: "read"
    unit_of_measurement: W
    device_class: power
    icon: mdi:flash
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1
        
  - platform: modbus_controller
    name: "${devicename} DcVoltage"
    address: 3
    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
    name: "${devicename} DcInputCurrent"
    address: 4
    register_type: "read"
    unit_of_measurement: A
    device_class: current
    icon: mdi:flash
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1
    
  - platform: modbus_controller
    name: "${devicename} AcFrequency"
    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
    name: "${devicename} AcVoltage"
    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
    name: "${devicename} AcOutputCurrent"
    address: 39
    register_type: "read"
    unit_of_measurement: A
    device_class: current
    icon: mdi:flash
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1
    
  - platform: modbus_controller
    name: "${devicename} AcPower"
    address: 35
    register_type: "read"
    unit_of_measurement: W
    device_class: power
    icon: mdi:flash
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1
    
  - platform: modbus_controller
    name: "${devicename} EnergyToday"
    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
    name: "${devicename} EnergyTotal"
    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
    name: "${devicename} Temperature"
    address: 3093
    register_type: "read"
    unit_of_measurement: C
    device_class: temperature
    icon: mdi:thermometer
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1

text_sensor:
  - platform: modbus_controller
    name: "${devicename} Firmware Version"
    address: 9
    register_count: 3
    register_type: holding
    internal: true
    entity_category: diagnostic

  - platform: template
    name: "${devicename} Status"
    icon: mdi:eye
    entity_category: diagnostic
    lambda: |-
      if (id(status).state == 1) {
        return {"Normal"};
      } else if (id(status).state == 0)  {
        return {"Waiting"};
      } else {
        return {"Fault!"};
      }
    internal: false

# select:
#   - platform: modbus_controller
#     id: onoffsel1
#     name: "${devicename} OnOffSel"
#     address: 0
#     value_type: U_WORD
#     icon: "mdi:toggle-switch"
#     internal: false
#     optionsmap:
#       "Off": 0
#       "On": 1

number:
  - platform: modbus_controller
    name: "${friendly_name} Max Output Power %"
    id: poweroutput
    address: 3
    value_type: U_WORD
    min_value: 0
    max_value: 100
    step: 1
    internal: false


Om de een of andere reden wouden de normale RX/TX pins niet meer werken dus heb ik twee andere gepakt, dat lijkt uiteindelijk nu te werken.

Ik liep ook ineens tegen CRC errors aan, zelfs met een 120Ohm weerstand, maar toen ik een 150Ohm weerstand toevoegde was het ineens prima. Go figure.

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

Dus nu heb ik het geheel in een klein boxje aan de muur hangen, naast de inverter zelf.
Afbeeldingslocatie: https://tweakers.net/i/10f1KPQpMUPvFWk6Ofmm2sV27JM=/800x/filters:strip_exif()/f/image/mZ3bgOgLqbe5EIvEnHlIL7QF.png?f=fotoalbum_large

En nu heb ik dus netjes mijn stats in HA. De 5s interval kan nog wel naar beneden, ik denk dat de inverter zelf wel elke seconde kan rapporteren, maar dit is prima voor mijn gebruik.

Kia E-Niro 2019 Executiveline. OTGW/HA Enthousiasteling.


  • ruubert
  • Registratie: Juli 2005
  • Laatst online: 31-03 18:56
Bedankt @kaasmakert , Ik heb nu een bak vol info!Afbeeldingslocatie: https://tweakers.net/i/jbSaaxcBMGSSTGk8JZvPjO6c_P4=/800x/filters:strip_exif()/f/image/aFApZoSR5olPJ07XSdJD5JxN.png?f=fotoalbum_large

Ik kan inmiddels ook de output limiteren (handig om de terugleverboete te voorkomen. Zelfs de batterij kun je instellen. Ben van plan om binnenkort deze aan te schaffen. Hieronder wat basis automations die ik nog moet gaan tunen voor dynamisch limiteren van output enzo.

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
#########################################################
#                                                       #
#         GROWATT.                                      #
#                                                       #
#########################################################

  - alias: Growatt set active rate
    description: "set active rate %"
    triggers:
      - trigger: event
        event_type: ""
    conditions: []
    actions:
      - action: mqtt.publish
        data:
          qos: "1"
          topic: energy/solar/command/power/set/activerate
          payload: |-
            {
              "correlationId": "set_activerate",
              "value": "{{ states('input_number.growatt_power')| round(0) }}"
            }
    mode: single


  - alias: Growatt Set inverter date/time
    description: "update time"
    triggers:
      - trigger: time_pattern
        enabled: true
        hours: "*"
    conditions: []
    actions:
      - action: mqtt.publish
        data:
          qos: "1"
          topic: energy/solar/command/datetime/set
          payload: |
            {
            "correlationId": "ha-datetime-set",
            "value": "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
            }
    mode: single


  - alias: Growatt - Set timeslot
    description: "set timeslot"
    triggers:
      - trigger: event
        event_type: ""
    conditions: []
    actions:
      - action: mqtt.publish
        data:
          qos: "1"
          topic: energy/solar/command/batteryfirst/set/timeslot
          payload: |
            { 
            "correlationId": "set-timeslot", 
            "slot": 1, 
            "start": "{{ states('input_datetime.input_datetime_growatt_batteryfirst_slot1_start_time')[:5] }}", 
            "stop": "{{ states('input_datetime.input_datetime_growatt_batteryfirst_slot1_stop_time')[:5] }}", 
            "enabled": {{ is_state('input_boolean.growatt_batteryfirst_slot1_enabled', 'on') | lower }}
            }
      - action: mqtt.publish
        data:
          qos: "1"
          topic: energy/solar/command/batteryfirst/set/acchargeenabled
          payload: |
            { 
            "correlationId": "set-acchargeenabled", 
            "value": {{ is_state('input_boolean.growatt_batteryfirst_accharge_enabled', 'on') | lower }}
            }
    mode: single
    
    
  - alias: Growatt Set inverter date/time
    description: "update time"
    triggers:
      - trigger: time_pattern
        enabled: true
        hours: "*"
    conditions: []
    actions:
      - action: mqtt.publish
        data:
          qos: "1"
          topic: energy/solar/command/datetime/set
          payload: |
            {
            "correlationId": "ha-datetime-set",
            "value": "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
            }
    mode: single

  - alias: Growatt Get inverter date/time
    description: ""
    triggers:
      - trigger: time_pattern
        minutes: "*"
    conditions: []
    actions:
      - action: mqtt.publish
        data:
          qos: "1"
          topic: energy/solar/command/datetime/get
          payload: "{\"correlationId\": \"ha-datetime-get\"}"
    mode: single

  - alias: Growatt Get Battery
    description: ""
    triggers:
      - trigger: time_pattern
        minutes: "*"
    conditions: []
    actions:
      - action: mqtt.publish
        data:
          qos: "1"
          topic: energy/solar/command/gridfirst/get
          payload: "{}"
    mode: single


#########################################################
#                                                       #
#            END OF CONFIGURATION FILE                  #
#                                                       #
#########################################################


Voor anderen: de basis staat hier https://github.com/OpenInverterGateway/OpenInverterGateway

De documentatie is nogal 'basic' maar de software werkt super. Het is aan te raden om de MQTT explorer te gebruiken om alles goed op HA te kunnen volgen.

  • firecaps30
  • Registratie: September 2011
  • Laatst online: 21:28
Tinusvolkel schreef op dinsdag 25 februari 2025 @ 16:38:
[...]


Klinkt goed (y) dus er zijn geen constructies zoals grott meer nodig? en alle info van de omvormer is op te halen en in te stellen?
En het neem ik aan op een veel hogere interval uit te lezen dan de 5 minuten wat nu de default is?
Overzicht van de beschikbare entiteiten in HA met de eerder genoemde Solax modbus integratie:

Afbeeldingslocatie: https://tweakers.net/i/5joyq0Rw880EZzfQVOm0x6erJrY=/232x232/filters:strip_exif()/f/image/yGXGfnmNHtKvrq8nYPWDrSYF.png?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/Wve7Jj17RgJwid1r6CbXvOpkpn8=/232x232/filters:strip_exif()/f/image/yLbOghDERvJGa9JIJZrMt4vQ.png?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/RNQlDTpSGGB9F2O9g4ippO_MZjc=/232x232/filters:strip_exif()/f/image/DdTzvXk0uh4lsnk4d082cw5d.png?f=fotoalbum_tile


Linker screenshot:
Bovenste slider is voor: Active Power Limit
Slider 2: Grid Export Limit
Slider 3: Reactive Power Limit

Grid export limit werkt in ieder geval, wel aanzetten in de dropdown ook :X

De HA integrate pollt elke 6 seconden, maar dat had ik zo ingesteld omdat op modbus RTU de baudrate maar 9600 was. Denk dat het ook wel minder kan.

Wat betreft elke 5 minuten, op elke growatt datalogger kun je dit toch aanpassen? Register 4 dacht ik, waarde uitlezen staat nu op 5, aanpassen naar 1. Dan heb je elke minuut updates.

Afbeeldingslocatie: https://tweakers.net/i/Isuqyg5lVnNhQYarj4_3rRjcmrk=/fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/6ebOcuJdwaKijLwuUQrbA0UV.png?f=user_large

  • Tinusvolkel
  • Registratie: Augustus 2014
  • Laatst online: 06:52
bpssoftware schreef op donderdag 27 februari 2025 @ 07:11:
[...]


De Growatt Smartmeter werkt niet via dezelfde interface als "pc" modbus interface. Hier acteert de computer namelijk als master.
Op de growatt heb je de mogelijkheid om een seperate modbus aansluiting naar "smart meter", hierbij is de growatt de master en "smart meter" de slave.

In de kerstvakantie heb ik een module gemaak en wat software growatt van "smart meter" te voorzien door middel van de HomeWizard P1 meter. Code is nog niet echt clean, maar bij interesse zou ik het project binnenkort kunnen delen.

Om terug te komen op de export limit. Wat de Growatt doet is kijken naar het actuele vermogen op de P1 meter, wanneer dit negatief is en ingesteld is dat je zero export mag hebben, zal hij dus zijn vermogen terug gaan knijpen.
Stel je omvormer levert nu zelf 3kW terug en de P1 meter geeft een netto vermogen van -1200 Watt, dan zal de omvormer dus 3000 terugschroeven naar 1800
Goed bezig (y) en heb hier de energiemeter idd op een andere poort aangesloten.
Afbeeldingslocatie: https://tweakers.net/i/1b3a_lpEJ_8qsJjWJq872HS_9Hc=/fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/5DNNNv9GHofSv3TQ12vyQDPm.png?f=user_large
Merk trouwens wel dat als ik via de homewizard kijk dat hij nog een 50w aan het terugleveren is, als de batterij het huis aan het voeden is. Maar hoe is dat bij jullie?

Strava | 8600 Wp zzo | 1600 Wp nnw


  • konehead
  • Registratie: Januari 2005
  • Laatst online: 31-03 19:22
Hi, ik ben al weken aan het stoeien om Modbus aan te krijgen op mijn MIN 4600TL-XH inverter. Krijg het niet voor elkaar. Ik krijg de foutmelding: Modbus command to device=1 register=0xC15 no response received.

Wat heb ik nu:
Wemos D1 mini
485 naar ttl bordje

485 naar ttl bordje => Wemos D1 mini
VCC => heb ik op V5 aangesloten
TXD -=> D6

Ik zie hier veel bovenstaande melding maar wel dat mensen het werken hebben gekregen, ik denk echt HOE dan?

Vragen:
- is bovenstaande goed aangesloten
- Is Wemos D1 mini een handig bordje?
- Nog andere feedback?
RXD => D7
GND => GND
B- => Pin 4 Sys com poort
A+ => Pin 3 Sys Com poort
GND => niet aangesloten


Afbeeldingslocatie: https://tweakers.net/i/St77Hv-4kzr7GmBCTnXSB4Qc2A0=/x800/filters:strip_icc():strip_exif()/f/image/2jQTS9UUj4642dJ3cGSonW7L.jpg?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/gKdKL-YfsTy_gAoYVQpBhs4opZ8=/x800/filters:strip_icc():strip_exif()/f/image/9bgqJtRK4kokgR9L535Plv2v.jpg?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
esphome:
  name: test-logger
  friendly_name: "ESP Logging Test"
  
esp8266:
  board: d1_mini

# Enable logging
logger:
  baud_rate: 0
  level: VERY_VERBOSE
  
# Enable Home Assistant API
api:

ota:
  platform: esphome
  

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # Optional manual IP


captive_portal:

web_server:
  port: 80

time:
  - platform: homeassistant
    id: homeassistant_time

uart:
  id: gw_uart
  baud_rate: 9600
  tx_pin: D6
  rx_pin: D7

modbus:
  id: modbus1
  uart_id: gw_uart

modbus_controller:
  - id: growatt
    address: 0x01
    modbus_id: modbus1
    setup_priority: -10
    update_interval: 15s

sensor:
  - platform: modbus_controller
    name: "${devicename} DcPower"
    address: 5
    register_type: "read"
    unit_of_measurement: W
    device_class: power
    icon: mdi:flash
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1
        
  - platform: modbus_controller
    name: "${devicename} DcVoltage"
    address: 3
    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
    name: "${devicename} DcInputCurrent"
    address: 4
    register_type: "read"
    unit_of_measurement: A
    device_class: current
    icon: mdi:flash
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1
    
  - platform: modbus_controller
    name: "${devicename} AcFrequency"
    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
    name: "${devicename} AcVoltage"
    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
    name: "${devicename} AcOutputCurrent"
    address: 39
    register_type: "read"
    unit_of_measurement: A
    device_class: current
    icon: mdi:flash
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1
    
  - platform: modbus_controller
    name: "${devicename} AcPower"
    address: 40
    register_type: "read"
    unit_of_measurement: W
    device_class: power
    icon: mdi:flash
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1
    
  - platform: modbus_controller
    name: "${devicename} EnergyToday"
    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
    name: "${devicename} EnergyTotal"
    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
    name: "${devicename} Temperature"
    address: 3093
    register_type: "read"
    unit_of_measurement: C
    device_class: temperature
    icon: mdi:thermometer
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1

switch:
  - platform: modbus_controller
    name: "${devicename} Enabled"
    address: 0
    register_type: coil

number:
  - platform: modbus_controller
    name: "${devicename} MaxOutputPct"
    address: 3
    value_type: U_WORD
    min_value: 0
    max_value: 100
    entity_category: config

  • Tinusvolkel
  • Registratie: Augustus 2014
  • Laatst online: 06:52
Afbeeldingslocatie: https://protosupplies.com/wp-content/uploads/2019/02/SCM-TTL-to-RS-485-Adapter-Module-Connections-1.jpg

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 ]

Strava | 8600 Wp zzo | 1600 Wp nnw


  • arro3038
  • Registratie: November 2023
  • Laatst online: 01-04 18:23
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
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 :)

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

[ Voor 100% gewijzigd door arro3038 op 27-06-2025 17:06 ]


  • konehead
  • Registratie: Januari 2005
  • Laatst online: 31-03 19:22
arro3038 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]
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



Afbeeldingslocatie: https://tweakers.net/i/gHXwxNZKDadOgorzLB7oz5tqeKI=/x800/filters:strip_exif()/f/image/5Lig1WpG9MYWv6sEqTI11Tbc.png?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/zqW-vQw-QlVUNH1oBwZXV5B5qAs=/x800/filters:strip_icc():strip_exif()/f/image/VhpTfIbUjsGzcNrd3NCB3MJK.jpg?f=fotoalbum_large

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

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

  • klump4u
  • Registratie: Februari 2008
  • Niet online

klump4u

Full electric in Zuid-Limburg

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

Afbeeldingslocatie: https://tweakers.net/i/Za-vpHDOknreb3LITEatkw6kMN0=/234x176/filters:strip_icc():strip_exif()/f/image/MwKb3Cz4HRRdkunUKKwW9uDp.jpg?f=fotoalbum_medium

18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 2400AC 11,5kWh🔋,Hyundai Kona 64kWh 🚗, Peblar Home ⛽, Maxima MPM 7L 🥐


  • konehead
  • Registratie: Januari 2005
  • Laatst online: 31-03 19:22
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 :X
Wat stom! En scherp van jou!! Gelijk even getest, maar helaas..

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

  • konehead
  • Registratie: Januari 2005
  • Laatst online: 31-03 19:22
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


Afbeeldingslocatie: https://tweakers.net/i/jObst5hV8EZk5nwBbqtDgFZzeCg=/800x/filters:strip_exif()/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

  • JasperE
  • Registratie: December 2003
  • Laatst online: 27-01 23:07
Grafiek erbij Afbeeldingslocatie: https://tweakers.net/i/5COtCCkgKXmhqLcTuf1SXMV_xfU=/x800/filters:strip_icc():strip_exif()/f/image/g2DMTxY4dvsZzHhXKyNDCZJw.jpg?f=fotoalbum_large

  • fissa
  • Registratie: Oktober 2019
  • Laatst online: 21:22
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
Hoe krijg ik dit aangesloten? Afbeeldingslocatie: https://tweakers.net/i/DqbfVN2jdTZn6p-s56DQPK5j79Q=/800x/filters:strip_icc():strip_exif()/f/image/C1fm7wCkjLYvxmDLpOYNBV56.jpg?f=fotoalbum_large

  • fissa
  • Registratie: Oktober 2019
  • Laatst online: 21:22
@JanWatt
Dongle is binnen. Cat6e kabel een twisted pair gebruikt. Shinewifi zit er nog in.
Afbeeldingslocatie: https://tweakers.net/i/k3Dlbl6k-fgP7vVfuToQtOmsxmo=/x800/filters:strip_icc():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.

  • fissa
  • Registratie: Oktober 2019
  • Laatst online: 21:22
@JanWatt
Afbeeldingslocatie: https://tweakers.net/i/on9685pk_VBohu5W2oVTr5wzL50=/x800/filters:strip_icc():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.

  • fissa
  • Registratie: Oktober 2019
  • Laatst online: 21:22
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!

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:
Afbeeldingslocatie: https://tweakers.net/i/DqbfVN2jdTZn6p-s56DQPK5j79Q=/800x/filters:strip_icc():strip_exif()/f/image/C1fm7wCkjLYvxmDLpOYNBV56.jpg?f=fotoalbum_large

Wat heb je allemaal nodig?

1. Een laptop
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

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!
Afbeeldingslocatie: https://tweakers.net/i/Bj-kUMyDgQtuZxeCwdcNcvC8Ixc=/x800/filters:strip_icc():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!
Afbeeldingslocatie: https://tweakers.net/i/c4lF_-L9jjWRT6Z3H5WRe4MFREg=/x800/filters:strip_exif()/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:
1
modbus: !include modbus.yaml
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-port0

Deze modbus.yaml gebruik ik, maar is voor iedereen anders natuurlijk:
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
- 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
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.

Succes!
Pagina: 1