Eastron SDM72D-M Modbus RTU zu WLAN mit ESPHome

Eine kleine Anleitung, wie ich den günstigen Eastron ins „WLAN“ gebracht habe.
Da ich mich mich die Modbus-Thematik zu 100% neu Einarbeiten musste, versuche ich es hier ebenfalls sehr Anfängerfreundlich zu gestalten und auch gleichzeitig meine Notizen niederzuschreiben.
Warum das Projekt? In unserem Mehrfamilienhaus wollen wir die Verbräuche genauer aufschlüsseln können – was nicht zuletzt den Strompreisen geschuldet ist.
Wenn man weiß, wie es geht, dann ist es gar nicht so kompliziert, aber der Weg dahin war für mich schon steiniger…

Der Aufbau ist ja relativ einfach, im Prinzip.
Der TTL-Adapter wird an RX/TX vom ESP verbunden (Je nach dem welchen Hardwareserial-Port man verwendet) und dann wird für die Flow-Controll noch ein PIN benötigt.

Moment? Flow-Controll? RE/DE-PIN?
Mit den PINs wird die standardmäßige Halfduplexverbindung passend umgeschaltet. Wird der DE Pin auf High gezogen, sprich mit Spannung beaufschlagt, ist der RS485 Chip bereit zu senden. DE steht für Driver Enable. Beim RE-Pin (Receiver Enable) wird der Pin gegen 0-Volt gezogen – sprich ist definitiv spannungslos. Dieses Verhalten hat den entspannten Vorteil, dass man am ESPxxx nur ein „Flow-Control“ Pin braucht. RE/DE-PIN können gebrückt und dann über ein PIN geschaltet werden.

Über die generelle Funktionsweise von MODBUS werde ich mich nicht auslassen, da mein Verständnis zu einem nicht tiefgreifend genug ist und zum anderen auch sonst sehr, sehr gut beschrieben.
Aber kurz zusammengefasst – gerade für die aus der IT:
Modbus-Master: Ist ein Client!
Modbus-Slave: Ist ein Server!

Verrückt!
Register01 vom „Holding Register“ ist ein anderes Register01 als „Input Register“ Das sind die sogenannten Funktionscodes. – Funktions-Was? Ja!
Holding Register (03) sind Register die Read und Write unterstützen
Input Register (04) sind nur Read Register. Nutzung z.B. Übermittlung von Temperaturen
Coils sind quasi einem Bool gleichzusetzen sowie Read und Write fähig. Nutzung: Steuerung eines PINs (z.B. High für LED einschalten)
Discrete Inputs sind die nur Read-Variante von den Coils. (z.B. Übermittlung von Taster / Schalter)
Einzig, was mir im Verständnis bei vielen Programmen fehlte:
Die Funktionsadresse mit der Registernummer sind schon als „Adressenpaar“ zu verstehen – je nach dem wie es auf dem Slave implementiert wurde.
Gleichzeitig hat jeder MODBUS-Teilnehmer eine eigene ID.
Das war es jetzt auch schon an der kurzen Zusammenfassung – hoffentlich hilft es!

Dann stecken wir es mal zusammen!
Wichtig: Bei dieser Variante wird SERIAL nicht mehr zur Verfügung stehen. Da ich mit ESPHome arbeite, wird Serial-Outputs dann auch nicht mehr klappen.

Wenn man sich die Grafik nun genau anschaut, sieht man, dass ich RX/TX am MAX485 falsch angeschlossen habe – dieser Fehler viel mir erst jetzt auf. Es funktioniert aber trotzdem, da ich im esphome Script gleichzeitig ein Dreher bei der GPIO Zuweisung habe (autsch). Also entweder geht man diese Anleitung so mit, und macht die selbigen beiden Fehler wie ich oder man dreht es einfach richtig.

Breadboard: Fehlerhafter Aufbau
  • RS485-1 RO
  • RS485-2 RE
  • RS485-3 DE
  • RS485-4 DI
  • RS485-5 GND
  • RS485-6 A (DATA)
  • RS485-7 B (DATA)
  • RS485-8 VCC
  • Richtig wäre: RO <-> RX und DI <-> TX

Jetzt machen wir uns an den ESPHome-Part:
Vorweg: Einige Infos gibt es hier: https://esphome.io/components/modbus_controller.html

Achtung: das untere Script kann nicht 1:1 kopiert werden, weil ich in der base.yaml die Konfiguration für die API, den Web_server, MQTT usw. ausgelagert habe.

Was man für die Abfrage der MODBUS Register braucht, sind die Infos über den Inhalt der Register. Das steht im Handbuch. Ich habe hier eine ausgewählte Anzahl an Register – was auch ziemlich das Maximum für den WEMOS D1 ist.
Die Register beim Eastron sind als Float ausgeführt, i.d.R. wird sonst wohl mit Int-Werte gearbeitet. Darum stehen an den einzelnen Entitäten immer der folgende Inhalt: value_type: FP32

Hinweis: Direkt nach einem Tag hab ich Änderungen vorgenommen, da ich bei einer Idee auf ein kleines Detail nicht geachtet habe.
Im Grunde wollte ich mit den entnommenen Strom (Ampere) aus dem Register 30049 die Leistung in Watt errechnen (Weil Watt=Strom(A)*Spannung(V)) und in DE ist es ja immer ca. 230V. Tja, bei einem Testaufbau mit Balkonkraftwerk hab ich festgestellt, das A nie Negativ wird.

esphome:
  name: device-006-04 #Gerätename
  platform: ESP8266 #Platform
  board: d1_mini #Wemos D1 Mini
  comment: "006 Keller - Eastron Wohnungsmesswerte"

substitutions:  ## Definition der Variablen
  rs485rx: GPIO1 #RX
  rs485tx: GPIO3 #TX
  rs485flow: GPIO5 #D1
  rs485br: "9600" #Baud
  rs485_adr_zaehler1: "1"
  rs485_adr_zaehler2: "2"
  rs485_adr_zaehler3: "3"

<<: !include base.yaml

logger:
    level: INFO # WICHTIG!!!! Ändern, sonst kann der RAM Volllaufen
    baud_rate: 0 # WICHTIG!!!! Ändern, damit keine Ausgaben auf Serial


uart:
  - id: uart0
    baud_rate: $rs485br
    rx_pin: $rs485rx
    tx_pin: $rs485tx
    debug:
      direction: BOTH

modbus:
  flow_control_pin: $rs485flow
  id: modbus1

modbus_controller:
  - id: SDM72DM0$rs485_adr_zaehler3
    ## the Modbus device addr
    modbus_id: modbus1
    address: $rs485_adr_zaehler3
    setup_priority: -10
  - id: SDM72DM0$rs485_adr_zaehler2
    ## the Modbus device addr
    modbus_id: modbus1
    address: $rs485_adr_zaehler2
    setup_priority: -10
  - id: SDM72DM0$rs485_adr_zaehler1
    ## the Modbus device addr
    modbus_id: modbus1
    address: $rs485_adr_zaehler1
    setup_priority: -10

sensor:
  - platform: wifi_signal
    name: 006-04-Sensor Wifi-Signal
    update_interval: 60s
#---------------------------------------------------------- CONTROLLER 03 ----------------------------------------------------------
  #--------------------------------------------------PHASE1
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler3
    name: 006-04-$rs485_adr_zaehler3-30013-Phase1_W
    register_type: read
    address: 0x000C
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
  #--------------------------------------------------PHASE2
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler3
    name: 006-04-$rs485_adr_zaehler3-30015-Phase2_W
    register_type: read
    address: 0x000E
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
  #--------------------------------------------------PHASE3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler3
    name: 006-04-$rs485_adr_zaehler3-30017-Phase3_W
    register_type: read
    address: 0x0010
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
  #--------------------------------------------------General
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler3
    name: 006-04-$rs485_adr_zaehler3-30071-AvgFreq
    register_type: read
    address: 0x0046
    value_type: FP32
    unit_of_measurement: Hz
    accuracy_decimals: 3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler3
    name: 006-04-$rs485_adr_zaehler3-30049-SUM_A
    register_type: read
    address: 0x0030
    value_type: FP32
    unit_of_measurement: A
    accuracy_decimals: 3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler3
    name: 006-04-$rs485_adr_zaehler3-30053-SUM_W
    register_type: read
    address: 0x0034
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
    device_class: "power"
    state_class: "measurement"
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler3
    name: 006-04-$rs485_adr_zaehler3-30073-Import_KWH
    register_type: read
    address: 0x0048
    value_type: FP32
    unit_of_measurement: kWh
    accuracy_decimals: 3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler3
    name: 006-04-$rs485_adr_zaehler3-30075-Export_KWH
    register_type: read
    address: 0x004A
    value_type: FP32
    unit_of_measurement: kWh
    accuracy_decimals: 3
#---------------------------------------------------------- CONTROLLER 02 ----------------------------------------------------------
  #--------------------------------------------------PHASE1
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler2
    name: 006-04-$rs485_adr_zaehler2-30013-Phase1_W
    register_type: read
    address: 0x000C
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
  #--------------------------------------------------PHASE2
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler2
    name: 006-04-$rs485_adr_zaehler2-30015-Phase2_W
    register_type: read
    address: 0x000E
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
  #--------------------------------------------------PHASE3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler2
    name: 006-04-$rs485_adr_zaehler2-30017-Phase3_W
    register_type: read
    address: 0x0010
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
  #--------------------------------------------------General
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler2
    name: 006-04-$rs485_adr_zaehler2-30071-AvgFreq
    register_type: read
    address: 0x0046
    value_type: FP32
    unit_of_measurement: Hz
    accuracy_decimals: 3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler2
    name: 006-04-$rs485_adr_zaehler2-30049-SUM_A
    register_type: read
    address: 0x0030
    value_type: FP32
    unit_of_measurement: A
    accuracy_decimals: 3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler2
    name: 006-04-$rs485_adr_zaehler2-30053-SUM_W
    register_type: read
    address: 0x0034
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
    device_class: "power"
    state_class: "measurement"
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler2
    name: 006-04-$rs485_adr_zaehler2-30073-Import_KWH
    register_type: read
    address: 0x0048
    value_type: FP32
    unit_of_measurement: kWh
    accuracy_decimals: 3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler2
    name: 006-04-$rs485_adr_zaehler2-30075-Export_KWH
    register_type: read
    address: 0x004A
    value_type: FP32
    unit_of_measurement: kWh
    accuracy_decimals: 3
#---------------------------------------------------------- CONTROLLER 01 ----------------------------------------------------------
  #--------------------------------------------------PHASE1
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler1
    name: 006-04-$rs485_adr_zaehler1-30013-Phase1_W
    register_type: read
    #register_count: 1
    #response_size: 4
    address: 0x000C
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
  #--------------------------------------------------PHASE2
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler1
    name: 006-04-$rs485_adr_zaehler1-30015-Phase2_W
    register_type: read
    #register_count: 1
    #response_size: 4
    address: 0x000E
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
  #--------------------------------------------------PHASE3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler1
    name: 006-04-$rs485_adr_zaehler1-30017-Phase3_W
    register_type: read
    #register_count: 1
    #response_size: 4
    address: 0x0010
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
  #--------------------------------------------------General
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler1
    name: 006-04-$rs485_adr_zaehler1-30071-AvgFreq
    register_type: read
    address: 0x0046
    value_type: FP32
    unit_of_measurement: Hz
    accuracy_decimals: 3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler1
    name: 006-04-$rs485_adr_zaehler1-30049-SUM_A
    register_type: read
    address: 0x0030
    value_type: FP32
    unit_of_measurement: A
    accuracy_decimals: 3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler1
    name: 006-04-$rs485_adr_zaehler1-30053-SUM_W
    register_type: read
    address: 0x0034
    value_type: FP32
    unit_of_measurement: W
    accuracy_decimals: 3
    device_class: "power"
    state_class: "measurement"
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler1
    name: 006-04-$rs485_adr_zaehler1-30073-Import_KWH
    register_type: read
    address: 0x0048
    value_type: FP32
    unit_of_measurement: kWh
    accuracy_decimals: 3
  - platform: modbus_controller
    modbus_controller_id: SDM72DM0$rs485_adr_zaehler1
    name: 006-04-$rs485_adr_zaehler1-30075-Export_KWH
    register_type: read
    address: 0x004A
    value_type: FP32
    unit_of_measurement: kWh
    accuracy_decimals: 3


text_sensor:
  - platform: wifi_info
    ip_address:
      name: "006-04-Sensor WifiIP"
    ssid:
      name: "006-04-Sensor WifiSSID"
    mac_address:
      name: "006-04-Sensor WifiMAC"
  - platform: version
    name: "006-04-Sensor ESPVersion"

switch:
  - platform: restart
    name: "006-04-Schalter Restart"

Und so sieht auf der GUI das komplette Ergebnis aus:

Fehlen noch ein paar Infos?
Schreibt in den Kommentaren!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.