SDM630 mit D1 mini in Home Assistant

Hallo, habe folgendes Problem beim Auslesen eines SDM630 Modbus V2:
Die Daten kommen beim Home Assistant an, allerdings nur wenn der SDM630 auf address 001 steht. Der sollte jedoch, aufgrund eines ebenfalls angeschlossenen und auch gut funktionierenden Growatt 1500 tl-x, auf address 002 stehen.
Ich habe in der yaml- Datei alles versucht was mir auch nur irgendwie logisch erschien (mein Wissen ist da stark eingeschränkt), kann den SDM allerdings nicht überzeugen, auf 002 seine Daten an den Home-Assistant zu übertragen.
Bei adsress von #modbuscontroller to read SDM630 wo derzeit 002 steht, kann auch 001 oder 1 stehen, das hat leider keine Auswirkung.
Weiß jemand Rat, an welcher Stelle ich das umstellen kann?

 esphome:
   name: supply-energie-hauptanschluss
   friendly_name: supply-energie-hauptanschluss
 
  esp8266:
   board: d1_mini
 
 # Enable logging
  logger: 
   level: verbose
   baud_rate: 0
 
 # Enable Home Assistant API
  api:
   encryption:
     key: "xxx"
 
  ota:
   - platform: esphome
     password: "xxx"
 
  wifi:
   ssid: !secret wifi_ssid
   password: !secret wifi_password
 
   # Enable fallback hotspot (captive portal) in case wifi connection fails
   ap:
     ssid: "Supply-Energie-Hauptanschluss"
     password: "xxx"
 
  captive_portal:
 
  switch:
   - platform: restart
     name: Restart
 
 #serial port
  uart:
   id: mod_uart
   tx_pin: D2
   rx_pin: D1
   baud_rate: 9600
   stop_bits: 1
   debug: #Add debugging to UART
  modbus:
   send_wait_time: 500ms
   uart_id: mod_uart
   id: modbus1 
 
 #modbuscontroller to read SDM630
  modbus_controller:
   - id: SDM630
     address: 002
     modbus_id: modbus1
 
  sensor:
   - platform: sdm_meter
     phase_a:
       current:
         name: "SDM630 Current L1"
       voltage:
         name: "SDM630 Voltage L1"
       active_power:
         name: "SDM630 Power L1"
       power_factor:
         name: "SDM630 Power Factor L1"
       apparent_power:
         name: "SDM630 Apparent Power L1"
       reactive_power:
         name: "SDM630 Reactive Power L1"
       phase_angle:
         name: "SDM630 Phase Angle L1"
     phase_b:
       current:
         name: "SDM630 Current L2"
       voltage:
         name: "SDM630 Voltage L2"
       active_power:
         name: "SDM630 Power L2"
       power_factor:
         name: "SDM630 Power Factor L2"
       apparent_power:
         name: "SDM630 Apparent Power L2"
       reactive_power:
         name: "SDM630 Reactive Power L2"
       phase_angle:
         name: "SDM630 Phase Angle L2"
     phase_c:
       current:
         name: "SDM630 Current L3"
       voltage:
         name: "SDM630 Voltage L3"
       active_power:
         name: "SDM630 Power L3"
       power_factor:
         name: "SDM630 Power Factor L3"
       apparent_power:
         name: "SDM630 Apparent Power L3"
       reactive_power:
         name: "SDM630 Reactive Power L3"
       phase_angle:
         name: "SDM630 Phase Angle L3"    
     frequency:
       name: "SDM630 Frequency"
     total_power:
       name: "SDM630 Total Power"
     import_active_energy:
       name: "SDM630 Import Active Energy"
     export_active_energy:
       name: "SDM630 Export Active Energy"
     import_reactive_energy:
       name: "SDM630 Import Reactive Energy"
     export_reactive_energy:
       name: "SDM630 Export Reactive Energy"
     update_interval: 5s

Was mir jetzt noch aufgefallen ist, das auch wenn ich als Address 002 eingebe, schreibt er mir bei der Überprüfung zwar die gewünschten 0x02, ganz am ende jedoch setzt er das ganze wieder auf 0x01…wo nimmt er sich das her?

WhatsApp Bild 2025-02-24 um 07.45.28_e8878836

WhatsApp Bild 2025-02-24 um 07.46.04_0a5ab9cc

Update:
Das mit address konnte ich lösen, am Ende der Sensoren brauchte er noch mal den optionalen Hinweis das er 002 nutzen soll.

Allerdings haut er mir im logs nun das raus, und aktualisiert nicht richtig.

Es scheint so, das er mit dem Wechselrichter im Konflikt liegt…werde das noch mal beobachten, wenn der WR off geht.

Update_2

Es ist wie befürchtet, wenn der WR off ist, hören die Störungen auf, und er läuft nahezu perfekt durch und aktualisiert alle 5s.

Wo könnte ich ansetzen, um das in den Griff zu bekommen?

Danke
Gruß Andy

Danke
Gruß Andy

:crayon:by HarryP:
. Zusammenführung Mehrfachpost (bitte “bearbeiten” Funktion nutzen)
. Code-/Logzeilen formatiert (“>” entfernt)

Moin moin,

hast du auch wie in der Anleitung beschrieben, die Modbus Adresse des SDM angepasst?

VG, Cem

Moin moin,
ja, deswegen hatte ich ja erst die Probleme die Verbindung mit dem D1mini herzustellen, weil im code automatisch die 001 eingesetzt wurde, und ich es nicht geblickt hatte, wie ich den D1mini auf 002 umstelle. Das habe ich aber mittlerweile ja gelöst bekommen.
Jetzt bin ich am überlegen, ob es eventuell mit einem Modbus Gateway auf Arduino-Basis möglich ist an einen Slave (SDM) zwei oder mehr Master (WR, D1mini, WR) anzuschließen, ohne dass sich die beißen.

Okay, das war nicht direkt ersichtlich, dass du das bereits im SDM so konfiguriert hast.

Mir ist noch aufgefallen, dass die Komponente sdm_meter selbst als modbus_controller agiert. Deshalb muss die Adresse 002 auch direkt in der sdm_meter-Plattform definiert werden. Leider kann man dem sdm_meter keinen separaten Controller zuweisen, über den die Kommunikation laufen soll.

Das bedeutet, dass deine aktuelle Konfiguration zwei Modbus-Controller erzeugt, die sich wahrscheinlich gegenseitig stören. Da der D1 Mini nur einen UART besitzt, wäre die einfachste Lösung, zwei D1 Mini zu verwenden.

Viele Grüße,
Cem

Ah, ok…und schon stehe ich wieder auf dem Schlauch.
Mal sehen ob ich das richtig verstehe…den WR also nicht direkt an den SDM anschließen, sondern diesen mit den nötigen Daten auch per W-Lan versorgen?

Du hast es ja bereits selbst erkannt. Auch wenn Modbus grundsätzlich Multi-Master unterstützt, führt dies, wie in deinem Fall, oft zu Kollisionen auf dem Bus. Deshalb wird der Multi-Master-Betrieb in der Regel nicht empfohlen.

Jetzt wird auch klarer, was du vorhast und wie dein Aufbau aussieht: Der Growatt-Wechselrichter fungiert selbst als Master und pollt den SDM, während du zusätzlich mit ESPHome die Daten auslesen möchtest. Das Problem dabei ist, dass der sdm_meter zyklisch die Daten vom Stromsensor abfragt – genau wie der Growatt:

Eine Möglichkeit wäre, ESPHome so zu konfigurieren, dass es nur passiv mithört und das Anfordern der Daten dem Growatt überlässt. Dafür gibt es zwei Ansätze:

  1. Die genannte Codezeile so anpassen, dass es eine Option gibt, die zyklische Abfrage durch den sdm_meter zu deaktivieren.
  2. Die TX-Verbindung vom ESPHome zum Modbus-Treiber entfernen, sodass ESPHome nur noch als Listener fungiert.

Allerdings funktioniert das nur so lange, wie der Wechselrichter die Daten vom SDM pollt. Ist dieser offline, erhält auch ESPHome keine Informationen mehr. Damit das zuverlässig funktioniert, müsste die sdm_meter-Komponente so erweitert werden, dass das zyklische Pollen (Senden) dynamischer gesteuert werden kann.

Mit den aktuellen Möglichkeiten lässt sich dein Aufbau so leider nicht umsetzen. Den Umweg über WLAN würde ich persönlich nicht gehen.

Vielen Dank für die ausführliche Antwort und den Code, ich werde etwas experimentieren und berichten.

LG Andy