FYI: Leistungsdaten eines Growatt Wechselrichters ändern ;-)

MoritzSt

Benutzer
Mitglied seit
05. Jun 2024
Beiträge
4
Punkte für Reaktionen
1
Punkte
3
Moin, ich habe ein kleines Problem mit meinem ESPHome code und hoffe jemand kann helfen. Ich habe den Block
YAML:
switch:
  - platform: modbus_controller
    name: "${devicename} OnOff"
    skip_updates: 5
    address: 0
    register_type: holding
bei mir drin, womit ich den Growatt auch problemlos ausschalten kann. Allerdings kann ich ihn darüber nicht mehr einschalten und ich muss jedes mal die sicherung kurz aus machen. Ich möchte diesen Schalter allerdings als Sicherung für meine Batterie verwenden, damit diese nicht so weit entlädt, dass das BMS den Output abregelt. (Das mag der MPPT leider nicht, weil er dann nicht mehr erkennt, dass eine Batterie angeschlossen ist und somit auch nicht lädt.)
Die Automatisierung zum ausschalten ist:
YAML:
alias: Growatt Ausschalten
description: Abschaltung unter 2.8V
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.jk_bms_min_cell_voltage
    below: 2.8
condition: []
action:
  - service: switch.turn_off
    metadata: {}
    data: {}
    target:
      entity_id: switch.growatt_inverter_onoff
mode: single
was auch funktioniert.
Und das einschalten, was nicht funktioniert:
YAML:
alias: Growatt Einschalten
description: Einschalten über 3.2V
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.jk_bms_min_cell_voltage
    above: 3.2
action:
  - service: switch.turn_on
    target:
      entity_id:
        - switch.growatt_inverter_onoff
    data: {}
mode: single
Habe es daher direkt manuell mit dem Schalter versucht und da kann ich leider auch nur ausschalten, nicht wieder ein... Wäre super wenn einer den switch testen könnte und evtl eine Lösung hat.
 

Jim_OS

Benutzer
Sehr erfahren
Mitglied seit
05. Nov 2015
Beiträge
5.068
Punkte für Reaktionen
2.258
Punkte
259
Ich habe das eben mal für Dich getestet. Ist bei mir auch so, sprich ich kann meinen MIC600 über den Switch auch nur aus- aber nicht wieder einschalten.

Growatt_Log.png

Der WR schaltet sich anschließend auch nicht wieder automatisch ein, so wie er das morgens macht wenn die Startspannung anliegt. Die Spannung lag eben noch bei 80 V und somit über den benötigten 50 V für die Startspannung. Wobei sich mein WR hier erst ab einer Startspannung von ~ 60 V einschaltet.

Growatt_Startspannung.png


Erst nachdem ich den WR am WR selber manuell aus- und wieder eingeschaltet habe ist er wieder normal hochgefahren.

Warum das so ist kann ich Dir auch nicht sagen. Lt. Modbus-Doku müssten die Parameter für den Switch

Code:
switch:
  - platform: modbus_controller
    name: "${devicename} OnOff"
    address: 0
    register_type: holding
eigentlich stimmen.

Growatt_Modbus.png

Theoretisch denkbar wäre das das bei den kleinen Growatt WR, die üblicherweise für BKW gedacht sind, (so) nicht implementiert ist. Denkbar wäre natürlich auch ein Bug bei ESPHome und/oder HA.

Ich meine mich daran erinnern zu können das User mit größeren Growatt WR im HA-Forum das aus- und wieder einschalten per ESPHome und HA Automatisierung erfolgreich umgesetzt haben, um eben eine entsprechende Ladesteuerung für ihren Batteriespeicher zu haben. Aber wie gesagt betraf das die größeren WR Modelle von Growatt und für mich selber hier ohne Batteriespeicher ist das Thema auch nicht relevant.

VG Jim
 

MoritzSt

Benutzer
Mitglied seit
05. Jun 2024
Beiträge
4
Punkte für Reaktionen
1
Punkte
3
Hi Jim,
Vielen Dank für's testen und schade dass es bei dir auch nicht klappt. Die Startspannung kann ich ausschließen, da bei mir nur 51v an liegen, egal ob ich per esphome Versuche oder über die Sicherung. Beim ausschalten geht er in den Standby Modus, wacht aber nicht mehr auf. Über die Growatt Cloud geht das allerdings, wodurch ich auch den mic600 als Ursache aus schließen kann (denke ich). Meine Vermutung ist daher die modbus Integration, dass diese andere Befehle sendet als über die cloud gesendet werden. Original shine-x und ESP sind über USB angeschlossen... Leider reicht mein Wissen als C# Programmierer nicht aus um den modbus evtl zu debuggen. 🤣

Bei mir ist es leider relevant, dass ich ihn regeln und notfalls ausschalten kann, was ja auch geht. Das einschalten ist nur ein nice to have, damit ich am Mittag, wenn Batterie sich erholt hat und Sonne scheint nicht in den Schuppen auf Terrasse gehen muss. Faulheit und so. 😇

Weißt du was dieses BDC ist? Denke gerade dran, evtl muss der ja auf 3 gesetzt werden statt 1 um aus dem Standby zu erwachen, oder die Beschreibung ist falsch bei den kleinen und er erwartet ein 01 statt 1 zum auf wachen. 🤔
 

Jim_OS

Benutzer
Sehr erfahren
Mitglied seit
05. Nov 2015
Beiträge
5.068
Punkte für Reaktionen
2.258
Punkte
259
BDC ist eine externe Steuereinheit von Growatt für das Batteriemanagment für bestimmte WR-Modelle von Growatt.
https://growatt.tech/de/Produktkategorie/Growatt-Batterie/Seite/3/

Ok wenn es über die Cloud - die ich schon ewig nicht mehr nutze - :LOL: funktioniert scheidet der WR als Ursache aus. Das dafür andere Befehle als über den Modbus selber genutzt werden glaube ich aber eher weniger. Auch das Holding Register dafür hat sich schon seit Jahren nicht geändert. Ich hatte vorhin extra noch in verschieden alten Modbus-Dokus von Growatt nachgeschaut.

Ich denke eher das es da ein Problem mit dem Switch bei ESPHome oder HA gibt, sprich das dieser das On (1) - warum auch immer - nicht so sendet wie der WR es erwartet. Zumindet lt. HA-Log sendet der Switch ja scheinbar einen On-Befehl. Im Prinzip müsste man die gesendeten Befehle von HA per ESPHome mal mitloggen, in der Hoffnung dann erkennen zu können was da wie gesendet wird. Aber da das für mich - wie schon gesagt - nicht relevant ist werde ich mich damit (jetzt) nicht weiter beschäftigen.

VG Jim
 
  • Like
Reaktionen: MoritzSt

MoritzSt

Benutzer
Mitglied seit
05. Jun 2024
Beiträge
4
Punkte für Reaktionen
1
Punkte
3
Hey, ich habe es geschafft. ;)
Das Problem war der switch und das "holding register". Ich habe statt switch jetzt ein select genommen und damit funktioniert es! (Zumindest wenn ich manuell den Select auswähle/umstelle.)
Code:
select:
  - platform: modbus_controller
    id: onoffsel
    name: "${friendly_name} OnOffSel"
    address: 0
    value_type: U_WORD
    entity_category: config
    icon: "mdi:toggle-switch"
    optionsmap:
      "off": 0
      "On": 1
Und damit es noch komplett ist: Hier die Automatisierung dafür:
Code:
alias: Growatt Ausschalten
description: Abschaltung unter 2.8V
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.jk_bms_min_cell_voltage
    below: 2.8
condition: []
action:
  - service: select.select_option
    metadata: {}
    data:
      option: "Off"
    target:
      entity_id: select.growatt_inverter_onoffsel
mode: single
alias: Growatt Einschalten
description: Einschalten über 3.2V
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.jk_bms_min_cell_voltage
    above: 3.2
action:
  - service: select.select_option
    metadata: {}
    data:
      option: "On"
    target:
      entity_id: select.growatt_inverter_onoffsel
mode: single
Nochmals danke für die Hilfe!
 
  • Like
Reaktionen: Jim_OS

MoritzSt

Benutzer
Mitglied seit
05. Jun 2024
Beiträge
4
Punkte für Reaktionen
1
Punkte
3
Mit der hilfe der Jungs auf Github konnte ich den Fehler finden und beheben: https://github.com/esphome/issues/issues/5888

Richtig ist der switch also:
Code:
switch:
  - platform: modbus_controller
    name: "${friendly_name} OnOff"
    skip_updates: 5
    use_write_multiple: false
    register_type: holding
    address: 0
    bitmask: 1
    entity_category: config
    icon: "mdi:toggle-switch"

Und um es einmal komplett zu haben für ESPHome und dem Growatt Mic600TL-X
Code:
substitutions:
  device_description: Growatt Inverter
  friendly_name:  Growatt Inverter
  name: Shine X 1
 
esphome:
  name: shine_x_1

esp8266:
  board: d1_mini # This is a Wemos, plugged in over USB, not the original WiFi-X Stick!

# Enable logging
logger:
  baud_rate: 0
# Enable Home Assistant API
api:
  encryption:
    key: !secret api_key


ota:
  password: !secret ota_passwd

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  power_save_mode: none
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "${name} Fallback Hotspot"
    password: !secret fallback_password

captive_portal:

time:
  - platform: homeassistant
    id: homeassistant_time

uart:
  id: mod_bus
  tx_pin: 1
  rx_pin: 3
  baud_rate: 115200
#  debug:
 
modbus:
  id: modbus1
  uart_id: mod_bus
 
modbus_controller:
  - id: growatt
# the Modbus device addr
    address: 0x1
    modbus_id: modbus1
    setup_priority: -10 
    update_interval: 5s

number:
    - platform: modbus_controller
      name: "${friendly_name} Max Output Power %" # to reduce output power in combination with a smart meter
      id: poweroutput
      address: 3
      value_type: U_WORD
      min_value: 0
      max_value: 100
      step: 1
 
    - platform: template
      name: "Power Output"
      id: "Power_Output"
      mode: slider
      optimistic: true
      min_value: 0
      initial_value: 100
      max_value: 100
      step: 1

select:
  - platform: modbus_controller
    id: powermode
    name: "${friendly_name} Power Mode" # Use with care! It's illegal to set above 800W in Germany. ;)
    address: 121
    value_type: U_WORD
    optionsmap:
      "600": 6
      "750": 7
      "800": 8
      "900": 9
      "1000": 10
      "1100": 11
      "1200": 12
      "1300": 13
      "1400": 14
      "1500": 15
      "1600": 16
      "1700": 17
      "1800": 18
      "1900": 19
      "2000": 20
  - platform: modbus_controller
    id: onoffsel
    name: "${friendly_name} OnOffSel" # Same as on/off switch
    address: 0
    value_type: U_WORD
    icon: "mdi:toggle-switch"
    optionsmap:
      "Off": 0
      "On": 1

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

  - platform: template
    name: "${friendly_name} 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!"};
      }

switch:
  - platform: modbus_controller
    name: "${friendly_name} OnOff"
    skip_updates: 5
    use_write_multiple: false
    register_type: holding
    address: 0
    bitmask: 1
    icon: "mdi:toggle-switch"

sensor:
  - platform: modbus_controller
    address: 0
    register_type: "read"
    internal: true
    id: status
  - platform: wifi_signal
    name: "${friendly_name} WiFi Signal"
    update_interval: 60s
  - platform: modbus_controller
    name: "${friendly_name} 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: "${friendly_name} 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: "${friendly_name} 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: "${friendly_name} 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: "${friendly_name} 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: "${friendly_name} 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: "${friendly_name} 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: "${friendly_name} 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: "${friendly_name} 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: "${friendly_name} 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
Die Automatisierung zum Drosseln ist:
Code:
alias: Growatt Limitieren
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.tasmota_lk13be_power_curr
condition: []
action:
  - service: number.set_value
    data:
      value: >
        {% if (not is_state('sensor.tasmota_lk13be_power_curr', 'unavailable')
        or
            not is_state('sensor.growatt_inverter_acpower', 'unavailable')) %}
          {% set curr_power = ((states('sensor.growatt_inverter_acpower')|float) + (states('sensor.tasmota_lk13be_power_curr')|float)) %}
          {% if curr_power > 1000 %}
            100
          {% elif curr_power < 100 %}
            10
          {% else %}
            {{ (curr_power /10) | round(0) }}
          {% endif %}
        {% else %}
          10
        {% endif %}
    target:
      entity_id: number.power_output
  - service: number.set_value
    data:
      value: >
        {% if (not is_state('sensor.tasmota_lk13be_power_curr', 'unavailable')
        or
            not is_state('sensor.growatt_inverter_acpower', 'unavailable')) %}
          {% set curr_power = ((states('sensor.growatt_inverter_acpower')|float) + (states('sensor.tasmota_lk13be_power_curr')|float)) %}
          {% if curr_power > 1000 %}
            100
          {% elif curr_power < 100 %}
            10
          {% else %}
            {{ (curr_power /10) | round(0) }}
          {% endif %}
        {% else %}
          10
        {% endif %}
    target:
      entity_id: number.growatt_inverter_max_output_power
mode: single
Ich benutze einen Tasmota zum auslesen meines Samrtmeters und `tasmota_lk13be_power_curr` ist der aktuelle Stromverbrauch in Watt. Der muss angepasst werden. Auserdem ist er so gesetzt das über 1000W der 100% läuft, und unter 100W 10%. Die Automatisierung im posting drüber sind für ein JK-BMS, der über BLE die niedrigste Zellspannung überwacht. Auch hier muss `jk_bms_min_cell_voltage` evtl angepasst werden. Der ESPHome code vom JK ist unter https://github.com/syssi/esphome-jk-bms zu finden.
 

soulreafer

Benutzer
Mitglied seit
08. Nov 2024
Beiträge
1
Punkte für Reaktionen
0
Punkte
1
ich erhalte komischerweise seit mehreren tagen keine daten mehr vom growatt.
[11:24:34][D][modbus_controller:037]: Modbus command to device=1 register=0x25 no response received - removed from send queue

keine ahung warum

alles find glaube ich damit an das man seit einem update von espHome etwas im script ändern musste:

ota:
platform: esphome (soll nun hinzu laut error log)
password: xxxxxxxxxxxxxxx

ohne diese änderungen bekomme ich updates nicht mehr compiled. nunja aber seitdem ich das script angepasst habe und neu hoch geladen habe erhalte ich einfach nix mehr. Wechselrichter habe ich schonmal auf Werkseinstellungen gesetzt

ESPHome Version: 2024.10.3
Geflasht auf einem Wemos D1 Mini

Code:
esphome:
  name: growatt

esp8266:
  board: d1_mini

# Enable logging
logger:
  baud_rate: 115200

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxx"

ota:
  - platform: esphome
    password: xxxxxxxxxxxxxxxxxxxxxx

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Growatt Fallback Hotspot"
    password: "12345678"

captive_portal:

time:
  - platform: homeassistant
    id: homeassistant_time

uart:
  id: mod_bus
  tx_pin: 1
  rx_pin: 3
  baud_rate: 115200
 
modbus:
  id: modbus1
  uart_id: mod_bus
 
modbus_controller:
  - id: growatt
    ## the Modbus device addr
    address: 0x1
    modbus_id: modbus1
    setup_priority: -10 

text_sensor:
  - platform: modbus_controller
    name: "Growatt Firmware Version"
    address: 9
    register_count: 3
    register_type: holding
    #internal: true
    entity_category: diagnostic

  - platform: template
    name: "Growatt 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!"};
      }

switch:
  - platform: modbus_controller
    name: "Growatt OnOff"
    address: 0
    register_type: holding

  - platform: modbus_controller
    name: "Tracking Mode"
    address: 124
    register_type: holding

number:
  - platform: modbus_controller
    name: "Growatt Max Output Power"
    address: 3
    value_type: U_WORD
    min_value: 0
    max_value: 100
    entity_category: config

select:
  - platform: modbus_controller
    id: powermode
    name: "Growatt Power Mode"
    address: 121
    value_type: U_WORD
    optionsmap:
      "600": 6
      "750": 7
      "1000": 10
      "1500": 15
      "2000": 20
    entity_category: config

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

  - platform: modbus_controller
    name: "Growatt DcPower"
    address: 3005 #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: "Growatt DcVoltage"
    address: 3003 #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: "Growatt DcInputCurrent"
    address: 3004 #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: "Growatt AcPower"
    address: 3023 #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: "Growatt AcFrequency"
    address: 3025 #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: "Growatt AcVoltage"
    address: 3026 #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: "Growatt AcOutputCurrent"
    address: 3027 #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: "Growatt AcPowerVA"
    address: 3028 #40
    register_type: "read"
    unit_of_measurement: VA
    icon: mdi:flash
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1
    
  - platform: modbus_controller
    name: "Growatt EnergyToday"
    address: 3049 #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: "Growatt EnergyTotal"
    address: 3051 #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: "Growatt 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
 
Zuletzt bearbeitet:


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat