SDM630Modbus V2 mit ESPHome auslesen

Hallo.
Ich versuche schon seit längere Zeit einen SDM630 Modbus Zähler (der den Strom der Wärmepumpe misst) mit einem D1 Mini und einem TTL zu RS485 Adapter mit ESPHome auszulesen. Leider funktioniert es nicht. Mit Modpol und Laptop bekomme ich eine Verbindung zum Zähler. Telefonhörer ist da. Über Homeassistant bekomme ich keine Verbindung. Habe hier einige Beiträge gefunden. Leider helfen die mir nicht.

esphome:
  name: warmepumpe
  friendly_name: Wärmepumpe

esp8266:
  board: esp01_1m

# Enable logging
logger:
  level: DEBUG
  baud_rate: 0  


web_server:
  port: 80

  
# Enable Home Assistant API
api:
  encryption:
    key: "xdf24ViLytCtc+zRUrOoLlYz8MsyjY2PRjXyIb5vIG4="

ota:
  - platform: esphome
    password: "32adf092a4a2854da5e46d55d7b5c5f7"

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

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

captive_portal:

uart:
  id: mod_bus
  tx_pin: GPIO1
  rx_pin: GPIO3
  stop_bits: 1
  baud_rate: 9600

modbus:
  uart_id: mod_bus
  id: modbus1



modbus_controller:
  - id: SDM
    address: 0x0001
    modbus_id: modbus1
    update_interval: 5s

sensor:
  # Voltages
  - platform: modbus_controller
    modbus_controller_id: SDM
    name: "L1-N Voltage"
    id: voltage_l1
    register_type: read
    address: 0x0400
    value_type: S_DWORD
    accuracy_decimals: 1
    unit_of_measurement: "V"
    state_class: measurement
    device_class: voltage
    filters:
      - multiply: 0.001 

Ich weis auch leider nicht ob die Registeradresse richtig eingegeben ist. Wenn jemand einen Fehler sieht bitte melden.
Die Log Datei mit dem Fehler sieht so aus

INFO ESPHome 2024.6.6
INFO Reading configuration /config/esphome/warmepumpe.yaml...
INFO Starting log output from 192.168.178.68 using esphome API
INFO Successfully connected to warmepumpe @ 192.168.178.68 in 0.003s
INFO Successful handshake with warmepumpe @ 192.168.178.68 in 2.401s
[15:11:05][I][app:100]: ESPHome version 2024.6.6 compiled on Jan 12 2025, 13:13:49
[15:11:05][C][wifi:599]: WiFi:
[15:11:05][C][wifi:427]:   Local MAC: C8:2B:96:1C:5E:32
[15:11:05][C][wifi:432]:   SSID: [redacted]
[15:11:05][C][wifi:435]:   IP Address: 192.168.178.68
[15:11:05][C][wifi:438]:   BSSID: [redacted]
[15:11:05][C][wifi:440]:   Hostname: 'warmepumpe'
[15:11:05][C][wifi:442]:   Signal strength: -42 dB ▂▄▆█
[15:11:05][C][wifi:446]:   Channel: 11
[15:11:05][C][wifi:447]:   Subnet: 255.255.255.0
[15:11:05][C][wifi:448]:   Gateway: 192.168.178.1
[15:11:05][C][wifi:449]:   DNS1: 192.168.178.1
[15:11:05][C][wifi:450]:   DNS2: 0.0.0.0
[15:11:05][C][logger:185]: Logger:
[15:11:05][C][logger:186]:   Level: DEBUG
[15:11:05][C][logger:188]:   Log Baud Rate: 0
[15:11:05][C][logger:189]:   Hardware UART: UART0
[15:11:05][C][uart.arduino_esp8266:118]: UART Bus:
[15:11:05][C][uart.arduino_esp8266:119]:   TX Pin: GPIO1
[15:11:05][C][uart.arduino_esp8266:120]:   RX Pin: GPIO3
[15:11:05][C][uart.arduino_esp8266:122]:   RX Buffer Size: 256
[15:11:05][C][uart.arduino_esp8266:124]:   Baud Rate: 9600 baud
[15:11:05][C][uart.arduino_esp8266:125]:   Data Bits: 8
[15:11:05][C][uart.arduino_esp8266:126]:   Parity: NONE
[15:11:05][C][uart.arduino_esp8266:127]:   Stop bits: 1
[15:11:05][C][uart.arduino_esp8266:129]:   Using hardware serial interface.
[15:11:05][C][modbus:152]: Modbus:
[15:11:05][C][modbus:154]:   Send Wait Time: 250 ms
[15:11:05][C][modbus:155]:   CRC Disabled: NO
[15:11:05][C][modbus_controller:341]: ModbusController:
[15:11:05][C][modbus_controller:342]:   Address: 0x01
[15:11:06][C][modbus_controller.sensor:010]: modbus_controller.sensorModbus Controller Sensor 'Hauptaschluss Import Leistung'
[15:11:06][C][modbus_controller.sensor:010]: modbus_controller.sensor  Device Class: 'power'
[15:11:06][C][modbus_controller.sensor:010]: modbus_controller.sensor  State Class: 'measurement'
[15:11:06][C][modbus_controller.sensor:010]: modbus_controller.sensor  Unit of Measurement: 'W'
[15:11:06][C][modbus_controller.sensor:010]: modbus_controller.sensor  Accuracy Decimals: 0
[15:11:06][C][captive_portal:088]: Captive Portal:
[15:11:06][C][web_server:173]: Web Server:
[15:11:06][C][web_server:174]:   Address: warmepumpe.local:80
[15:11:06][C][mdns:115]: mDNS:
[15:11:06][C][mdns:116]:   Hostname: warmepumpe
[15:11:06][C][esphome.ota:073]: Over-The-Air updates:
[15:11:06][C][esphome.ota:074]:   Address: warmepumpe.local:8266
[15:11:06][C][esphome.ota:075]:   Version: 2
[15:11:06][C][esphome.ota:078]:   Password configured
[15:11:06][C][safe_mode:018]: Safe Mode:
[15:11:06][C][safe_mode:019]:   Boot considered successful after 60 seconds
[15:11:06][C][safe_mode:021]:   Invoke after 10 boot attempts
[15:11:06][C][safe_mode:022]:   Remain in safe mode for 300 seconds
[15:11:06][C][api:139]: API Server:
[15:11:06][C][api:140]:   Address: warmepumpe.local:6053
[15:11:06][C][api:142]:   Using noise encryption: YES
[15:11:10][D][modbus_controller:037]: Modbus command to device=1 register=0x343 countdown=0 no response received - removed from send queue
[15:11:15][D][modbus_controller:037]: Modbus command to device=1 register=0x343 countdown=0 no response received - removed from send queue

Probiere es mal mit Tasmota und im ersten Schritt ohne HA, ob der ESP die Verbindung herstellen kann und Daten bekommt.
RX und TX schon mal vertauscht?

@noschvie
RX und TX habe ich noch nicht getauscht. Kann ich gene einmal probieren.
Mit Tasmota habe ich mich noch nicht beschäftigt. Da müsste ich mich erst einmal reinlesen.

@noschvie RX und TX habe ich getauscht. Leider keine Änderung.

Sonst niemand eine Idee woran es liegen könnte?

hat der eine automatische Flow Control?

Beispiel: uart-ttl_zu_rs485_converter

@noschvie
ich habe diesen Adapter
Adapter

Der Beschreibung nach sollte dieser Adapter passen.

SDM630-Modbus

Stimmen die Settings für Baudrate und Adresse überein?

Settings stimmen. Mit meinem Laptop und einem USB Adapter kann ich den Zähler auslesen. Habe die Schaltung auch noch einmal geprüft. Ist auch ok.
Der Adapter blinkt auch. Kann also nur an der Yaml Datei liegen.

Probiere mal Tasmota auf den ESP zu flashen. Siehe Tasmota Online Installer, die Hardware wird automatisch erkannt und installiert. Hast du einen ESP32?

Hab zwar noch einen ESP32 den bekomme ich aber nicht mehr geflasht. Warum fragst du?

Könntest du ein Bild oder ein Schema der Verkabelung zwischen dem ESP und dem Konverter hier posten? Besonders wichtig sind die Verbindungen:

  • ESPKonverter
    • GND → GND
    • RXD0 (GPIO3) → TX
    • TXD0 (GPIO1) → RX
    • 3V3 → VCC

In den Bewertungen zu deinem Konverter wird häufig erwähnt, dass er instabil sein kann. Da es sich bei deinem Set offenbar um mehrere Konverter handelt, würde ich sicherheitshalber auch den zweiten testen.

ESPHome hat auch noch zusätzlich den die sdm_meter Komponente:

Dort wird zwar nur der SDM230M erwähnt aber würde annehmen das der 630 genau so funktionieren sollte…

Warum? Defekt oder ein Problem mit dem Flashen?

Lese mehrere SDM630 und auch SDM230 mit ESP32 und diese Zusatzplatine ein, problemlos.

Raw über modbus_controller oder die sdm_meter platform?

Nachtrag zu der sdm_meter platform:

* phase_b (Optional): The group of exposed sensors for Phase B/2 on applicable meters. eg: SDM630
  * All options from phase_a
* phase_c (Optional): The group of exposed sensors for Phase C/3 on applicable meters. eg: SDM630
  * All options from phase_a

Also der SDM630 wird von dem platform ebenfalls unterstützt.

Habe es jetzt einmal hiermit probiert. Telefonhörer im Zähler leuchtet. Das neue Gerät wird aber bei den Integrationen nicht erkannt. ich musste in der Yaml bei Logger anstatt 0 für die Baud_rate 9600 eingeben. Dann kommt aber die Meldung das ich für den Seriellen Port und den UART Anschluss die gleiche Baud_rate habe. Da das Gerät bei den Integationen nicht angezeigt wird habe ich auch keine Entitäten. Kann mir jemand sagen warum das Gerät nicht erkannt wird?

hier ist noch einmal eine Log Datei.

INFO ESPHome 2024.6.6
INFO Reading configuration /config/esphome/sdm630.yaml...
INFO Detected timezone 'Europe/Berlin'
INFO Generating C++ source...
INFO Compiling app...
Processing sdm630 (board: esp01_1m; framework: arduino; platform: platformio/espressif8266@4.2.1)
--------------------------------------------------------------------------------
HARDWARE: ESP8266 80MHz, 80KB RAM, 1MB Flash
Dependency Graph
|-- ESPAsyncTCP-esphome @ 2.0.0
|-- ESPAsyncWebServer-esphome @ 3.2.2
|-- DNSServer @ 1.1.1
|-- ESP8266WiFi @ 1.0
|-- ESP8266mDNS @ 1.2
|-- noise-c @ 0.1.4
|-- ArduinoJson @ 6.18.5
RAM:   [=======   ]  68.1% (used 55776 bytes from 81920 bytes)
Flash: [======    ]  56.0% (used 573293 bytes from 1023984 bytes)
========================= [SUCCESS] Took 1.85 seconds =========================
INFO Successfully compiled program.
esptool.py v4.7.0
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: c8:2b:96:1c:5e:32
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash will be erased from 0x00000000 to 0x0008cfff...
Flash params set to 0x0340
Compressed 577440 bytes to 395032...
Wrote 577440 bytes (395032 compressed) at 0x00000000 in 9.0 seconds (effective 515.6 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
INFO Successfully uploaded program.
INFO Starting log output from /dev/ttyUSB0 with baud rate 9600
[19:01:23]0$nٴ`,ld\xf8D:\xe8U\xd8|x`\xe4\x89\x96.\xa4KC@)
[19:01:23]SDK:2.2.2-dev(38a443e)/Core:3.1.2=30102000/lwIP:STABLE-2_1_3_RELEASE/glue:1.2-65-g06164fb/BearSSL:b024386
[19:01:23][I][logger:034]: Log initialized
[19:01:23][C][safe_mode:079]: There have been 0 suspected unsuccessful boot attempts
[19:01:23][I][app:029]: Running through setup()...
[19:01:23][V][app:030]: Sorting components by setup priority...
[19:01:23][VV][scheduler:07
[19:01:23]SDK:2.2.2-dev(38a443e)/Core:3.1.2=30102000/lwIP:STABLE-2_1_3_RELEASE/glue:1.2-65-g06164fb/BearSSL:b024386
[19:01:23][VV][scheduler:063]: set_interval(name='update', interval=15000, offset=7123)
[19:01:23][VV][scheduler:063]: set_interval(name='update', interval=60000, offset=24080)
[19:01:24][VV][scheduler:063]: set_interval(name='update', interval=15000, offset=1848)
[19:01:24][VV][scheduler:063]: set_interval(name='update', interval=900000, offset=361443)
[19:01:24][D][SDM630:052]: Setup completed
[19:01:24][VV][scheduler:063]: set_interval(name='update', interval=15000, offset=6827)
[19:01:24][V][text_sensor:013]: 'SDM630 Esphome Version': Received new state 2024.6.6 Jan 26 2025, 18:52:57
[19:01:24][D][text_sensor:064]: 'SDM630 Esphome Version': Sending state '2024.6.6 Jan 26 2025, 18:52:57'
[19:01:24][V][text_sensor:013]: 'SDM630 Mac Wifi Address': Received new state C8:2B:96:1C:5E:32
[19:01:24][D][text_sensor:064]: 'SDM630 Mac Wifi Address': Sending state 'C8:2B:96:1C:5E:32'
[19:01:24][C][wifi:047]: Setting up WiFi...
[19:01:24][C][wifi:060]: Starting WiFi...
[19:01:24][C][wifi:061]:   Local MAC: C8:2B:96:1C:5E:32
[19:01:24][V][wifi_esp8266:061]: Enabling STA.
[19:01:24]mode : sta(c8:2b:96:1c:5e:32)
[19:01:24]add if0
[19:01:25][V][wifi_esp8266:556]: Event: Changed Mode old=OFF new=STA
[19:01:25]wifi evt: 8
[19:01:25]nul mode, fpm auto sleep set:enalbe
[19:01:25]sleep disable
[19:01:25][D][wifi:481]: Starting scan...
[19:01:25][VV][scheduler:225]: Running interval 'update' with interval=900000 last_execution=4293706604 (now=1845)
[19:01:25][VV][scheduler:225]: Running interval 'update' with interval=60000 last_execution=4294883778 (now=1845)
[19:01:25][V][text_sensor:013]: 'SDM630 Config Version': Received new state v2021.05.16.001
[19:01:25][D][text_sensor:064]: 'SDM630 Config Version': Sending state 'v2021.05.16.001'
[19:01:25][W][component:237]: Component template.text_sensor took a long time for an operation (195 ms).
[19:01:25][W][component:238]: Components should block for at most 30 ms.
[19:01:25][VV][scheduler:225]: Running interval '' with interval=60000 last_execution=4294896037 (now=1845)
[19:01:25][VV][scheduler:225]: Running interval 'update' with interval=15000 last_execution=4294945660 (now=1845)
[19:01:26][V][sensor:043]: 'SDM630 Uptime': Received new state 2.704000
[19:01:26][D][sensor:093]: 'SDM630 Uptime': Sending state 2.70400 s with 0 decimals of accuracy
[19:01:26][W][component:237]: Component uptime.sensor took a long time for an operation (179 ms).
[19:01:26][W][component:238]: Components should block for at most 30 ms.
[19:01:26][VV][scheduler:225]: Running interval 'update' with interval=15000 last_execution=4294946363 (now=1845)
[19:01:26][D][SDM630:056]: Start reading
[19:01:26]

Ich bin mir nicht ganz sicher, ob ich das richtig verstehe – ist dein Problem jetzt gelöst, oder hast du deinen eigenen Beitrag versehentlich als Lösung markiert?

Warum verwendest du nicht einfach den sdm_meter von ESPHome? Der ist speziell für diesen Stromzähler entwickelt worden.

logger:
  level: DEBUG
  baud_rate: 0  # wichtig beim D1 mini da nur 1x UART vorhanden

# Example configuration entry
uart:
  rx_pin: GPIO3
  tx_pin: GPIO1
  baud_rate: 9600 
  stop_bits: 1

sensor:
  - platform: sdm_meter
    phase_a:
      current:
        name: "Current"
      voltage:
        name: "Voltage"
      active_power:
        name: "Power"

Habe ich probiert. Funktioniert auch nicht. War ein versehen mit der Lösung. Problem ist nicht gelöst. Bekomme das neue Gerät ja nicht angezeigt. somit habe ich auch keine Entitäten.

was sagen die logs mit sdm_meter plattform?

Ich kann die baud_rate beim Logger nicht auf 0 setzen da dann UART nicht startet.
“INFO UART logging is disabled (baud_rate=0). Not starting UART logs.”
Wenn ich 9600 einsetze sieht die Log datei so aus. Mehr passiert nicht.
“INFO ESPHome 2024.6.6
INFO Reading configuration /config/esphome/warmepumpe.yaml…
INFO Starting log output from /dev/ttyUSB0 with baud rate 9600
[21:04:34]”

Du musst die Baudrate unbedingt Fall auf 0 setzen sonst krallt sich der Logger die UART und der Modbus funktioniert nicht richtig.

Du kannst ja auch über WiFI auf die logs zugreifen… der sollte dir dann auch alles darüber ausgeben… zeig mal bitte deine vollständige config… hast du als board noch esp01_1m oder d1_mini ?