[Smarthome - Home Assistent] Waveshare RS485 to Wifi und Eastron SDM120M Zähler einbinden

Hallo Zusammen,
ich habe Ende 2022 meine Jeisha installiert - damals noch ohne eigenen Stromzähler und ohne WMZ.
Ich habe damals irgendwo die Empfehlung gelesen, die folgenden Komponenten als "einfache" Lösung für einen Stromzähler zu nutzen, die im Smarthome auslesbar sind:
Waveshare RS485 to Wifi
und dem Zähler:
SDM120Modbus
Die Teile lagen nun bestimmt 6 Monate im Schrank und kurz vor Weihnachten kam der Elektriker hat die Wallbox angeschlossen und in dem Zuge auch den Zähler vor die Jeisha gebaut.
Ich bin aber ein wenig ratlos, wie ich das ganze nun tatsächlich bediene bzw. über HomeAssistant auslese.
Der Waveshare ist im Netzwerk eingebunden und ich kann über die IP-Adresse auf das Web UI zugreifen.
MQTT Server von meinem HA hab ich dort auch hinterlegt, aber es kommen keine Daten an.
Hat jemand die Kombination im Einsatz und kann mir ein paar Informationen zur korrekten Konfiguration geben?
Leider werde ich aus den Dokumenten die ich Online finden konnte nicht wirklich schlau ;(
Sämtliche Ergebnisse über Google nutzen leider immer einen anderen Waveshare .... bin mir mittlerweile gar nicht mehr sicher, ob die Kombination so wirklich funktioniert.

Sonst nutze ich eigentlich überall die Shellys - leider gibt es dort aber keinen PM, der die 25A der Jeisha unterstützt und über den 3EM hatte ich bisher eher negatives gehört.

Falls jemand Tipps oder Ideen hat, bin für alles dankbar

Danke :slight_smile:

(PS: wusste nicht, wo das Thema am besten reinpasst ... hoffe ist hier richtig)

Ja, du verkaufst den waveshare und holst dir ein ESP8285 ESP-M3 Modul oder so was in der Größe oder kleiner.
Die Dinger sind so klein, die bekommst du locker mit ttl-rs485 und mini dc Wandler und nen Kondensator in ein Leergehäuse mit einer Teilungseinheit rein.
Die Eastron SDM sind Standardkomponenten in esphome.

ich habe den Waveshare hier => WaveShare Industrial Serial Server with POE Function RS485 to RJ45 Et, 28,95 €

und der geht problemlos auszulesen. Ich nutze allerdings FHEM und kein Home Assistant.

Hast du dazu einen Link? Ist die galvanische Trennung dann kein Problem? Wie ist die Verlustleistung?

@und-mehr , hallo und sorry die frage, wie meinst du das mit standardkomponente ein addon oder frontend?

Ich möchte auch gerne meine 2 sdm230 ubd den dcm230 eastron auslesen und irgendwie einbinden verrechnen :face_with_peeking_eye:

schöne Grüsse und danke

Ich ging davon aus, dass ESPHome bekannt ist.
Es war mal ein Add-on ist aber vor ein paar Jahren die Installation geändert.

Wenn du mehrere Zähler im Bus hängen hast, kommt er mit dem Autoupdate in Konflikt,
Ich hatte die dann manuell nacheinander refresht (unter Time: ),
Ansonsten gibt es da nichts, besonders, was man wissen muss.
Ich verwende mqtt da es zuverlässiger ist, es geht auch mit api.

substitutions:
update_interval: never
bus1: modbus1
#  bus2: modbus2
name: esp8266-modbus
esphome:
name: ${name}
on_boot:
priority: 250
then:
- light.turn_on:
id: neopix
- light.addressable_set:
id: neopix
color_brightness: 100%
red: 10%
green: 0%
blue: 70%
- lambda: !lambda >-
id(ha_lastupdatemqtt).state -= 100000;
esp8266:
board: esp01_1m
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_key
fast_connect: true
manual_ip:
static_ip: 192.168.66.30
gateway: 192.168.66.1
subnet: 255.255.255.0
captive_portal:
api:
password: !secret api_key
reboot_timeout: 5min
ota:
password: !secret ota_key
#debug:
logger:
baud_rate: 0
hardware_uart: UART1
level: info
web_server:
port: 80
version: 2
include_internal: true
mqtt:
broker: !secret mqtt_host
username: !secret mqtt_username
password: !secret mqtt_password
id: mqtt_client
#  discovery: false
topic_prefix: 'powermeter'
reboot_timeout: 3min
script:
- id: venus_update
then:
- logger.log:
format: "publish ${name} update"
level: DEBUG
- mqtt.publish_json:
topic: venus/powermeter/values
payload: |-
root["Reverse"] = 132;
root["Forward"] = 142;
root["Power"] = 12;
root["L1Voltage"] = 12;
root["L2Voltage"] = 12;
root["L3Voltage"] = id(L3Voltage).state;
root["L1Current"] = 12;
root["L2Current"] = 12;
root["L3Current"] = id(L3Current).state;
root["L1Power"] = 12;
root["L2Power"] = 12;
root["L3Power"] = id(SDM72_3_p3).state;
root["L1EnergyForward"] = 12;
root["L1EnergyReverse"] = 12;
root["L2EnergyForward"] = 12;
root["L2EnergyReverse"] = 12;
root["L3EnergyForward"] = 12;
root["L3EnergyReverse"] = 12;
root["timestamp"] = id(sntp_time).now().timestamp;
time:
- platform: sntp
id: sntp_time
servers: 192.168.66.1
on_time:
- seconds: /2
then:
- logger.log:
format: "start modbus update()"
level: INFO
- lambda: !lambda |-
id(sdm_meter_3).update();
- delay: 333ms
- lambda: !lambda |-
id(sdm_meter_4).update();
- delay: 333ms
- lambda: !lambda |-
id(sdm_meter_5).update();
- delay: 333ms
- script.execute: venus_update
- lambda: !lambda |-
id(sdm_meter_11).update();
- delay: 333ms
- logger.log:
format: "end modbus update()"
level: INFO
uart:
- tx_pin: 1
rx_pin: 3
baud_rate: 9600
stop_bits: 1
id: _uart1
#    debug:
#      direction: RX
#      dummy_receiver: false
#      after:
#        delimiter: "\n"
#      sequence:
#        - lambda: UARTDebug::log_string(direction, bytes);
#  - rx_pin: GPIO14
#    tx_pin: GPIO12
#    baud_rate: 9600
#    stop_bits: 1
#    parity: none
#    id: uart2
button:
- platform: safe_mode
name: "Restart (Safe Mode)"
- platform: restart
name: "Restart"
light:
- platform: neopixelbus
id: neopix
type: RGB
variant: WS2812
pin: GPIO12
num_leds: 1
name: "NeoPixel"
method:
type: bit_bang
default_transition_length: 0s
restore_mode: ALWAYS_OFF
modbus:
- id: modbus1
uart_id: _uart1
#  - id: modbus2
#    uart_id: uart2
sensor:
- platform: wifi_signal
name: "WiFi Signal Sensor"
update_interval: 60s
internal: true
#  - platform: homeassistant
#    id: ha_lastupdate
#    entity_id: sensor.powermeter_lastupdates
#    internal: true
- platform: mqtt_subscribe
id: ha_lastupdatemqtt
topic: powermeter_lastupdates
- platform: template
name: "ha_lastupdatediff"
internal: true
lambda: |-
if (isnan(id(ha_lastupdatemqtt).state)) {
return id(sntp_time).now().timestamp;
} else {
return id(sntp_time).now().timestamp - id(ha_lastupdatemqtt).state;
}
update_interval: 5s
on_value_range:
- below: 10
then:
- light.turn_on:
id: neopix
- light.addressable_set:
id: neopix
color_brightness: 50%
red: 0%
green: 30%
blue: 0%
- below: 89
above: 30
then:
- light.turn_on:
id: neopix
- light.addressable_set:
id: neopix
color_brightness: 100%
red: 50%
green: 40%
blue: 0%
- above: 90
then:
- light.turn_on:
id: neopix
- light.addressable_set:
id: neopix
color_brightness: 100%
red: 75%
green: 33%
blue: 0%
- platform: sdm_meter
id: sdm_meter_3
modbus_id: ${bus1}
update_interval: ${update_interval}
address: 3
phase_a:
current:
name: "SDM72_1_p1 Current"
voltage:
name: "SDM72_1_p1 Voltage"
active_power:
name: "SDM72_1_p1 Power"
id: SDM72_1_p1
phase_b:
current:
name: "SDM72_1_p2 Current"
voltage:
name: "SDM72_1_p2 Voltage"
active_power:
name: "SDM72_1_p2 Power"
phase_c:
current:
name: "SDM72_1_p3 Current"
voltage:
name: "SDM72_1_p3 Voltage"
active_power:
name: "SDM72_1_p3 Power"
- platform: sdm_meter
id: sdm_meter_4
modbus_id: ${bus1}
update_interval: ${update_interval}
address: 4
phase_a:
current:
name: "SDM72_2_p1 Current"
voltage:
name: "SDM72_2_p1 Voltage"
active_power:
name: "SDM72_2_p1 Power"
id: SDM72_2_p1
phase_b:
current:
name: "SDM72_2_p2 Current"
voltage:
name: "SDM72_2_p2 Voltage"
active_power:
name: "SDM72_2_p2 Power"
id: SDM72_2_p2
phase_c:
current:
name: "SDM72_2_p3 Current"
voltage:
name: "SDM72_2_p3 Voltage"
active_power:
name: "SDM72_2_p3 Power"
id: SDM72_2_p3
- platform: sdm_meter
modbus_id: ${bus1}
id: sdm_meter_5
update_interval: ${update_interval}
address: 5
phase_a:
current:
name: "SDM72_3_p1 Current"
voltage:
name: "SDM72_3_p1 Voltage"
active_power:
name: "SDM72_3_p1 Power"
id: SDM72_3_p1
phase_b:
current:
name: "SDM72_3_p2 Current"
voltage:
name: "SDM72_3_p2 Voltage"
active_power:
name: "SDM72_3_p2 Power"
id: SDM72_3_p2
phase_c:
current:
name: "SDM72_3_p3 Current"
id: L3Current
voltage:
name: "SDM72_3_p3 Voltage"
id: L3Voltage
active_power:
name: "SDM72_3_p3 Power"
id: SDM72_3_p3
- platform: sdm_meter
id: sdm_meter_11
modbus_id: ${bus1}
update_interval: ${update_interval}
address: 11
frequency:
name: "SDM120_1 Frequency"
total_power:
name: "SDM120_1 Total Power"
phase_a:
current:
name: "SDM120_1_p1 Current"
voltage:
name: "SDM120_1_p1 Voltage"
active_power:
name: "SDM120_1_p1 Power"
id: SDM120_1_p1

@und-mehr sei ihnen verziehen ich entschuldige mich förmlich

Nur leider kommt das zu oft vor

die forensoftware hat wohl den text gefressen,
ich antworte vielleicht später noch mal

Prinzipiell kannst du sicher den Zähler auch an den Waveshare hängen und auslesen, ist nur die Frage, ob man sich durch das alles durchwühlen will und Lust hat die Modulregistertabelle der Zähler zu lesen. Kann auch sein, dass da was drin ist, was man neu flashen kann, ich weiß es nicht. Ich kenne die Dinger nicht und hatte auch nie das Bedürfnis das zu ändern.
ESPHome war mal ein Addon von HA, ist vor einigen Jahren aber irgendwo verschoben worden, ich glaube, es wird jetzt unter Geräten hinzugefügt.

Die Konfiguration zur Anbindung der SDMs ist hier beschrieben:

Es ist ne Yaml Datei aus der beim Kompilieren eine Firmware erzeugt, die man auf einen esp oder pico flashen kann.
Ähnlich wie Tasmota nur viele flexibler nutzbar als tasmota.
Es gibt allerdings einen Designfehler in esphome. Wenn man mehrere Modulbusgeräte am Bus hat kommt es vor das sie zu gleichen Zeit gelesen werden sollen.
Das lässt sich lösen, wenn man sich selbst um die Reihenfolgen kümmert, mit der die Teile gelesen werden.
Hier ist mal ein Beispiel aus meiner yaml mit der ich 3 sdm72 und einen sdm120 gelesen habe,
Der interessante Teil ist unter Time: + update_interval zu finden.
Mqtt ist nur drin, da es zuverlässiger ist als api (bzw. damals war), geht aber auch über api ohne mqtt.

substitutions:
update_interval: never
bus1: modbus1
#  bus2: modbus2
name: esp8266-modbus
esphome:
name: ${name}
on_boot:
priority: 250
then:
- light.turn_on:
id: neopix
- light.addressable_set:
id: neopix
color_brightness: 100%
red: 10%
green: 0%
blue: 70%
- lambda: !lambda >-
id(ha_lastupdatemqtt).state -= 100000;
esp8266:
board: esp01_1m
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_key
fast_connect: true
manual_ip:
static_ip: 192.168.66.30
gateway: 192.168.66.1
subnet: 255.255.255.0
captive_portal:
api:
password: !secret api_key
reboot_timeout: 5min
ota:
password: !secret ota_key
#debug:
logger:
baud_rate: 0
hardware_uart: UART1
level: info
web_server:
port: 80
version: 2
include_internal: true
mqtt:
broker: !secret mqtt_host
username: !secret mqtt_username
password: !secret mqtt_password
id: mqtt_client
#  discovery: false
topic_prefix: 'powermeter'
reboot_timeout: 3min
script:
- id: venus_update
then:
- logger.log:
format: "publish ${name} update"
level: DEBUG
- mqtt.publish_json:
topic: venus/powermeter/values
payload: |-
root["Reverse"] = 132;
root["Forward"] = 142;
root["Power"] = 12;
root["L1Voltage"] = 12;
root["L2Voltage"] = 12;
root["L3Voltage"] = id(L3Voltage).state;
root["L1Current"] = 12;
root["L2Current"] = 12;
root["L3Current"] = id(L3Current).state;
root["L1Power"] = 12;
root["L2Power"] = 12;
root["L3Power"] = id(SDM72_3_p3).state;
root["L1EnergyForward"] = 12;
root["L1EnergyReverse"] = 12;
root["L2EnergyForward"] = 12;
root["L2EnergyReverse"] = 12;
root["L3EnergyForward"] = 12;
root["L3EnergyReverse"] = 12;
root["timestamp"] = id(sntp_time).now().timestamp;
time:
- platform: sntp
id: sntp_time
servers: 192.168.66.1
on_time:
- seconds: /2
then:
- logger.log:
format: "start modbus update()"
level: INFO
- lambda: !lambda |-
id(sdm_meter_3).update();
- delay: 333ms
- lambda: !lambda |-
id(sdm_meter_4).update();
- delay: 333ms
- lambda: !lambda |-
id(sdm_meter_5).update();
- delay: 333ms
- script.execute: venus_update
- lambda: !lambda |-
id(sdm_meter_11).update();
- delay: 333ms
- logger.log:
format: "end modbus update()"
level: INFO
uart:
- tx_pin: 1
rx_pin: 3
baud_rate: 9600
stop_bits: 1
id: _uart1
#    debug:
#      direction: RX
#      dummy_receiver: false
#      after:
#        delimiter: "\n"
#      sequence:
#        - lambda: UARTDebug::log_string(direction, bytes);
#  - rx_pin: GPIO14
#    tx_pin: GPIO12
#    baud_rate: 9600
#    stop_bits: 1
#    parity: none
#    id: uart2
button:
- platform: safe_mode
name: "Restart (Safe Mode)"
- platform: restart
name: "Restart"
light:
- platform: neopixelbus
id: neopix
type: RGB
variant: WS2812
pin: GPIO12
num_leds: 1
name: "NeoPixel"
method:
type: bit_bang
default_transition_length: 0s
restore_mode: ALWAYS_OFF
modbus:
- id: modbus1
uart_id: _uart1
#  - id: modbus2
#    uart_id: uart2
sensor:
- platform: wifi_signal
name: "WiFi Signal Sensor"
update_interval: 60s
internal: true
#  - platform: homeassistant
#    id: ha_lastupdate
#    entity_id: sensor.powermeter_lastupdates
#    internal: true
- platform: mqtt_subscribe
id: ha_lastupdatemqtt
topic: powermeter_lastupdates
- platform: template
name: "ha_lastupdatediff"
internal: true
lambda: |-
if (isnan(id(ha_lastupdatemqtt).state)) {
return id(sntp_time).now().timestamp;
} else {
return id(sntp_time).now().timestamp - id(ha_lastupdatemqtt).state;
}
update_interval: 5s
on_value_range:
- below: 10
then:
- light.turn_on:
id: neopix
- light.addressable_set:
id: neopix
color_brightness: 50%
red: 0%
green: 30%
blue: 0%
- below: 89
above: 30
then:
- light.turn_on:
id: neopix
- light.addressable_set:
id: neopix
color_brightness: 100%
red: 50%
green: 40%
blue: 0%
- above: 90
then:
- light.turn_on:
id: neopix
- light.addressable_set:
id: neopix
color_brightness: 100%
red: 75%
green: 33%
blue: 0%
- platform: sdm_meter
id: sdm_meter_3
modbus_id: ${bus1}
update_interval: ${update_interval}
address: 3
phase_a:
current:
name: "SDM72_1_p1 Current"
voltage:
name: "SDM72_1_p1 Voltage"
active_power:
name: "SDM72_1_p1 Power"
id: SDM72_1_p1
phase_b:
current:
name: "SDM72_1_p2 Current"
voltage:
name: "SDM72_1_p2 Voltage"
active_power:
name: "SDM72_1_p2 Power"
phase_c:
current:
name: "SDM72_1_p3 Current"
voltage:
name: "SDM72_1_p3 Voltage"
active_power:
name: "SDM72_1_p3 Power"
- platform: sdm_meter
id: sdm_meter_4
modbus_id: ${bus1}
update_interval: ${update_interval}
address: 4
phase_a:
current:
name: "SDM72_2_p1 Current"
voltage:
name: "SDM72_2_p1 Voltage"
active_power:
name: "SDM72_2_p1 Power"
id: SDM72_2_p1
phase_b:
current:
name: "SDM72_2_p2 Current"
voltage:
name: "SDM72_2_p2 Voltage"
active_power:
name: "SDM72_2_p2 Power"
id: SDM72_2_p2
phase_c:
current:
name: "SDM72_2_p3 Current"
voltage:
name: "SDM72_2_p3 Voltage"
active_power:
name: "SDM72_2_p3 Power"
id: SDM72_2_p3
- platform: sdm_meter
modbus_id: ${bus1}
id: sdm_meter_5
update_interval: ${update_interval}
address: 5
phase_a:
current:
name: "SDM72_3_p1 Current"
voltage:
name: "SDM72_3_p1 Voltage"
active_power:
name: "SDM72_3_p1 Power"
id: SDM72_3_p1
phase_b:
current:
name: "SDM72_3_p2 Current"
voltage:
name: "SDM72_3_p2 Voltage"
active_power:
name: "SDM72_3_p2 Power"
id: SDM72_3_p2
phase_c:
current:
name: "SDM72_3_p3 Current"
id: L3Current
voltage:
name: "SDM72_3_p3 Voltage"
id: L3Voltage
active_power:
name: "SDM72_3_p3 Power"
id: SDM72_3_p3
- platform: sdm_meter
id: sdm_meter_11
modbus_id: ${bus1}
update_interval: ${update_interval}
address: 11
frequency:
name: "SDM120_1 Frequency"
total_power:
name: "SDM120_1 Total Power"
phase_a:
current:
name: "SDM120_1_p1 Current"
voltage:
name: "SDM120_1_p1 Voltage"
active_power:
name: "SDM120_1_p1 Power"
id: SDM120_1_p1

dann_halt_so.txt (9.14 KB)

Guten morgen,

Danke für deine beschreibung, du zeigst deinen zähler in venus os an und sieht einfach aus, was mir aus meinen Versuchen bewust wurde das dies nicht so ist und man mehr wissen braucht als ich aktuell verfüge.

Danke fur den Denkanstoss und alles gute