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…
- Einkaufslisten:
- SDM72D-M (Achtung 230V!)
https://www.eastroneurope.com/products/view/sdm72modbus - TTL-RS485 (Halfduplex) Adapter (MAX485)
- ESPxxx in meinem Fall habe ich ein Wemos D1 Mini verwendet
- 5 Kabel, USB-Stecker, Netzteil… das Übliche
- SDM72D-M (Achtung 230V!)
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.
- 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