Der Eastron SDM72DR ist ein weit verbreiteter, günstiger dreiphasiger Stromzähler für die Hutschiene – aber anders als seine Modbus-Geschwister (SDM72D-M, SDM72DM-V2) hat er kein RS485/Modbus-Interface, sondern nur einen S0-Impulsausgang. Wer online nach „SDM72 ESPHome“ sucht, stolpert fast ausschließlich über Modbus-Anleitungen, die für den DR schlicht nicht passen. Diese Anleitung zeigt den funktionierenden Weg über den S0-Ausgang – inklusive der Stolperfallen, über die ich selbst gestolpert bin.

Ziel: Momentanleistung (W) und Verbrauch (kWh) eines Durchlauferhitzers per ESPHome in Home Assistant.

Was der SDM72DR liefert – und was nicht

  • Kein Modbus/RS485. Falls du RS485 brauchst, ist das der falsche Zähler – dann eher SDM72D-M oder SDM72DM-V2.
  • S0-Impulsausgang: 1000 Impulse pro kWh, nur Importrichtung (der Zähler ist rücklaufgesperrt, taugt also nicht für Einspeisemessung).
  • Der Ausgang ist kein simpler potentialfreier Kontakt, sondern ein polaritätsabhängiger, aktiv gespeister Transistorausgang. Die beiden Klemmen sind mit + und beschriftet:
    • + benötigt eine externe Versorgungsspannung (5–27 V DC)
    • ist die Signal-/Rückleitung, über die der Impulsstrom fließt, wenn der interne Transistor beim Zählimpuls durchschaltet

Das ist der wichtigste Unterschied zu einem einfachen Reedkontakt-Zähler, den man stromlos brücken kann – hier braucht der Ausgang aktiv Strom von außen, um überhaupt einen Impuls „senden“ zu können.

Hardware

  • ESP8266 (hier: Wemos/LOLIN D1 Mini V4.0.0) oder ESP32
  • 1x Widerstand im Bereich 1–47 kΩ (genutzt: 2 kΩ, unkritisch)
  • Lötkolben, Kabel

Schaltung

3,3V (ESP) ──────────────► Zähler-Klemme "+"

Zähler-Klemme "−" ────────► GPIO4 (ESP) ──┬── zum ESP-Eingang
                                            │
                                       2 kΩ Widerstand
                                            │
                                           GND (ESP)

Warum der Widerstand?

Kurz gesagt: Damit GPIO4 in der Pulspause einen definierten Zustand (0V/Low) hat, statt elektrisch in der Luft zu hängen

Das Problem ohne Widerstand

Der S0-Ausgang des Zählers ist ein Transistorausgang (genauer: ein Optokoppler-Ausgang). Der Transistor schaltet nur während eines Impulses durch. Dann verbindet er die „+“-Klemme (die 3,3V-Versorgung) mit der „−“-Klemme (das Signalkabel zu GPIO4).

Zwischen den Impulsen ist der Transistor gesperrt, er verhält sich dann wie ein offener Schalter. Dwe GPIO4 hängt in diesem Moment an gar nichts: nicht an 3,3V, nicht an GND, einfach offen („floating“).

Warum „floating“ ein Problem ist

Ein floatender Eingang hat keinen definierten Spannungspegel. Er nimmt stattdessen zufällige Werte an, die von winzigen elektrischen Störungen in der Umgebung bestimmt werden. Einstreuungen von Netzleitungen, Nachbarkabeln, sogar von deiner Hand, wenn du in der Nähe bist.

Was der Widerstand macht

Der 2 kΩ-Widerstand liegt fest zwischen GPIO4 und GND und zieht den Pin in der Pulspause aktiv auf 0V. Das nennt man einen Pull-down-Widerstand.

  • Kein Impuls (Transistor gesperrt): GPIO4 hängt nur über den 2 kΩ-Widerstand an GND → sauber Low (0V)
  • Impuls (Transistor leitet): Jetzt fließt Strom von 3,3V über den Transistor zu GPIO4. Da 3,3V eine viel „stärkere“ Quelle ist als der hochohmige Widerstand, gewinnt die Spannungsquelle → GPIO4 springt auf High (3,3V)

Der Widerstand ist bewusst hochohmig gewählt (kΩ-Bereich), damit im Impulsmoment nicht unnötig viel Strom durch ihn verpufft.

D1 Mini

Warum nicht einfach der interne Pull-up des ESP?

Der ESP8266 kann softwareseitig nur Pull-up (Widerstand nach 3,3V), aber keinen Pull-down (Widerstand nach GND) setzen. Da unsere Schaltung aber einen Pull-down braucht (weil der Ruhezustand hier Low sein soll, nicht High), musste der Widerstand extern nachgerüstet werden.

ESPHome-Konfiguration

YAML
esphome:
  name: energymeter
  friendly_name: energymeter

esp8266:
  board: d1_mini

logger:
api:
  encryption:
    key: !secret api_key
ota:
  - platform: esphome

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "power-hotwater Fallback Hotspot"
    password: !secret ap_password

captive_portal:

sensor:
  - platform: pulse_meter
    pin:
      number: GPIO4
      mode:
        input: true
    id: sdm72dr_power
    name: "SDM72DR Leistung"
    unit_of_measurement: "W"
    device_class: power
    state_class: measurement
    accuracy_decimals: 0
    internal_filter: 10ms
    filters:
      - multiply: 60          # (60s / 1000 Imp/kWh) * 1000 W/kW

    total:
      id: sdm72dr_energy
      name: "SDM72DR Verbrauch"
      unit_of_measurement: "kWh"
      device_class: energy
      state_class: total_increasing
      accuracy_decimals: 3
      filters:
        - multiply: 0.001      # 1 Impuls = 1/1000 kWh

  - platform: uptime
    name: Uptime

Warum pulse_meter statt binary_sensor / pulse_counter

Zum reinen Verkabelungstest ist ein einfacher binary_sensor: platform: gpio praktisch, weil er den Rohzustand des Pins direkt zeigt. Für den produktiven Betrieb ist er aber ungeeignet: Ein echter S0-Impuls dauert nur wenige Dutzend Millisekunden, während binary_sensor den Pin im normalen (nicht-interruptbasierten) Loop-Zyklus abfragt – kurze Impulse können dabei durchrutschen. pulse_meter arbeitet interruptbasiert und ist speziell für kurze, schnelle Impulse ausgelegt.

Umrechnungsfaktoren erklärt

pulse_meter gibt roh Impulse pro Minute aus.

  • Leistung (W): Imp/min * 60 / 1000 Imp/kWh * 1000 W/kW = Imp/min * 60multiply: 60
  • Verbrauch (kWh): Der total-Sensor zählt die absoluten Impulse. 1 Impuls = 1/1000 kWhmultiply: 0.001

internal_filter: 10ms entprellt kurze Störimpulse; bei sehr hoher Last (viele Impulse/Sekunde) ggf. anpassen, sollte aber für haushaltsübliche Lasten unkritisch sein.

Troubleshooting – die Fehler, über die ich gestolpert bin

Falls bei dir nach dem Aufbau nichts ankommt, der Reihe nach:

  1. Polarität am Zähler prüfen. Lila/Versorgung muss an die mit „+“ beschriftete Klemme, Signal/GND-Pfad an „−“. Vertauscht liefert der Ausgang keine verwertbaren Impulse.
  2. Erst mit einem simplen binary_sensor testen, bevor du pulse_meter einsetzt – einfacher zu interpretieren beim reinen Verkabelungscheck:
YAML
 binary_sensor:
     - platform: gpio
       pin:
         number: GPIO4
         mode:
           input: true
       name: "S0 Test"</code>
  1. Manuell an den Zähler-Klemmen brücken (kurzer Draht/Schraubendreher zwischen + und −), während du das ESPHome-Log live beobachtest (esphome logs <dateiname>.yaml), nicht nur die Home-Assistant-Kachel (die kann verzögert/gecacht sein).
  2. Wackelkontakte ausschließen. Wenn sich das Verhalten „mal geht’s, mal nicht“ zeigt: Lötverbindungen statt Steckverbindungen.
  3. Auf Pin-Konflikte prüfen. GPIO4/GPIO5 sind beim D1 Mini die Standard-I2C-Pins (SDA/SCL) – falls irgendwo i2c: in der Config auftaucht, kollidiert das mit dem S0-Pin.
  4. Zähler-eigenes Display / LED als unabhängige Referenz nutzen. Momentanlast-Anzeige am Zähler / blinkender Impuls-LED gegenchecken, ob überhaupt Energie gezählt wird. Das trennt Zähler-/ Verkabelungsprobleme vom ESP.
  5. Kein Fehler, sondern Normalzustand: Beim einfachen binary_sensor-Test funktioniert das manuelle Brücken oft, während echte (kurze, schnelle) Zählerimpulse nicht ankommen – das ist genau das Timing-Problem aus Punkt „warum pulse_meter“ oben, kein Verkabelungsfehler.

Ergebnis

Mit dieser Konfiguration liefert der SDM72DR trotz fehlendem Modbus zuverlässig Momentanleistung und kumulierten Verbrauch nach Home Assistant. Ideal für Unterzähler an einzelnen Stromkreisen wie Durchlauferhitzern, wo sich eine Modbus-Nachrüstung nicht lohnt oder der verbaute Zähler schlicht schon ein DR-Modell ist.

Share