Smartmeter Stromzähler ESPHome und SML für Homeassistant auslesen

Da aktuell die meisten Projekte zum Auslesen von Stromzählern mit dem SML-Protokoll und ESP32/ ESP8266 aus Tasmota beruhen, hier mal meine Erfolgreiche Implementation mit ESPHome.

Ich habe mir die TTL-Version des Volkszählers auf eBay besorgt und mit einem Wemos D1 mini verbunden. Ground und Spannung kommen an die 5V und Ground vom ESP RX und TX-Leitungen des Volkszählers über kreuz an die RX/TX-Pins des ESP.

Hier sind meine YAML-Einstellungen um den Stromzähler auszulesen.

uart:
  id: uart_bus
  tx_pin: 1
  rx_pin: 3
  baud_rate: 9600
  debug:

sml:
  id: mysml
  uart_id: uart_bus

sensor:
  - platform: sml
    name: "Total energy"
    sml_id: mysml
    obis_code: "1-0:1.8.0"
    unit_of_measurement: kWh
    accuracy_decimals: 0
    device_class: energy
    state_class: total_increasing
    filters:
      - throttle_average: 60s

Ich habe beim Suchen ein Beispiel gefunden, was die UART-Baudrate auf 300 hatte. Damit kamen im Debug-Log des ESP zwar ständig UART-Daten, aber keine dekodierten SML-Daten. Toll war aber, dass man sehen konnte, dass der Zähler etwas sendet. Beim Abnehmen des Sensors vom Zähler ist das UART-Log sofort ruhig geworden. Nach dem Umstellen auf 9600 Baud dekodierte er dann sofort die UART-Daten zu SML. Dann kann man auch sehen, welche OBIS-Codes der Zähler sendet. Das sieht dann bei mir so aus:

[16:40:14][D][sml:065]: OBIS info:
[16:40:14][D][sml:071]:   (0a014546521901d94a67) 1-0:96.50.1 [0x12345]
[16:40:14][D][sml:071]:   (0a014546521901d94a67) 1-0:96.1.0 [0x013124234]
[16:40:14][D][sml:071]:   (0a014546521901d94a67) 1-0:1.8.0 [0x31ba]
[16:40:14][D][sml:071]:   (0a014546521901d94a67) 1-0:0.2.0 [0x31234345]
[16:40:14][D][sml:071]:   (0a014546521901d94a67) 1-0:96.90.2 [0xa90a]
[16:40:14][D][sml:071]:   (0a014546521901d94a67) 1-0:97.97.0 [0x0000]
[16:40:14][D][sml:071]:   (0a014546521901d94a67) 1-0:96.50.1 [0x12345677898]

Mit dieser Info kann man dann auf der Tasmota-SML-Seite nachschauen, ob die einzelnen OBIS-Werte nützlich sind. Leider gibt mein Zähler nicht die aktuelle Wirkleistung aus. Hier muss ich mir wohl noch die PIN meines Zählers von meiner Netzgesellschaft holen.

Mein ESP8266 hängt aktuell an einer Powerbank, da ich keine Steckdose in der Nähe des Zählers habe. Mal sehen wie lange das hält.

Update

Nach einer Woche kam jetzt die PIN für meinen Stromzähler. Durch das aktivieren des erweiterten Modus bei meinem Stromzähler tauchte nun auch die aktuelle Wirkleistung auf. Das ist echt toll. Auch der Zählerstand hat plötzlich drei Nachkommastellen. Das führte dazu, dass ich nach der Umstellung die Wert nochmal anpassen musste.

uart:
  id: uart_bus
  tx_pin: 1
  rx_pin: 3
  baud_rate: 9600
  debug:

sml:
  id: mysml
  uart_id: uart_bus

sensor:
  - platform: sml
    name: "Total energy"
    sml_id: mysml
    obis_code: "1-0:1.8.0"
    unit_of_measurement: kWh
    accuracy_decimals: 3
    device_class: energy
    state_class: total_increasing
    filters:
      - multiply: 0.0001
      - throttle_average: 300s
  - platform: sml
    name: "Current Power"
    sml_id: mysml
    obis_code: "1-0:16.7.0"
    unit_of_measurement: W
    accuracy_decimals: 0
    device_class: power
    state_class: measurement
  - platform: sml
    name: "Current Voltage"
    sml_id: mysml
    obis_code: "1-0:32.7.0"
    unit_of_measurement: V
    accuracy_decimals: 1
    device_class: voltage
    state_class: measurement    
    filters:
      - multiply: 0.1
  - platform: sml
    name: "Current Current"
    sml_id: mysml
    obis_code: "1-0:31.7.0"
    unit_of_measurement: A
    accuracy_decimals: 2
    device_class: current
    state_class: measurement    
    filters:
      - multiply: 0.01
  - platform: sml
    name: "Current Frequency"
    sml_id: mysml
    obis_code: "1-0:14.7.0"
    unit_of_measurement: Hz
    accuracy_decimals: 3
    device_class: frequency
    state_class: measurement    
    filters:
      - multiply: 0.1