Obis_D0 Integration und ein eBZ DD3- Wechsel von Tasmota auf ESPHome

Da mir die stetigen Spitzen in meinen Werten auf den Keks gehen, habe ich mal angefangen den ESPLesekopf von Tasmota auf ESPHome umzustellen.

Dank GitHub - mampfes/esphome_obis_d0: esphome external component to support meters with OBIS D0 interface sollte neben SML auch D0-Obis möglich sein und die Sensor-Filter um “nan” “0” und andere Fehler vorher rauszuglätten.

ESPHome Firmware lässt sich auf dem esp8285 manuell über die Tasmota Firmware flashen, insofern ist der Wechsel relativ angenehm.

Warnung vorweg: Work in Progress.
Es kompiliert, aber es gibt noch keine Werte.

Die alte Tasmota Konfiguration:

>D
>B
=>sensor53 r
;Interval fuer das Senden von Daten auf 15Sekunden / Set teleperiod to 10sec  
tper=15
>M 1
; Device: eBZ DD3 
; protocol is D0 OBIS ASCII
; 9600@7E1 for OP-type devices, 9600@8N1 for SM-type devices
+1,14,o,0,9600,SM,1
; Zählerstand zu +A, tariflos, 
; Zählerstände Auflösung 10 µW*h (6 Vorkomma- und 8 Nachkommastellen)
1,1-0:1.8.0*255(@0.001,Energie Bezug,Wh,1_8_0,8
; Zählerstand zu +A, Tarif 1
1,1-0:1.8.1*255(@0.001,Energie Bezug T1,Wh,1_8_1,8
; Zählerstand zu +A, Tarif 2
1,1-0:1.8.2*255(@0.001,Energie Bezug T2,Wh,1_8_2,8
; Zählerstand zu -A, tariflos
1,1-0:2.8.0*255(@0.001,Energie Export,Wh,2_8_0,8
; Summe der Momentan-Leistungen in allen Phasen, Auflösung 0,01W (5 Vorkomma- und 2 Nachkommastellen)
1,1-0:16.7.0*255(@1,Leistung,W,16_7_0,18
; Momentane Leistung in Phase Lx, Auflösung 0,01W (5 Vorkomma- und 2 Nachkommastellen)
1,1-0:36.7.0*255(@1,Leistung L1,W,36_7_0,18
1,1-0:56.7.0*255(@1,Leistung L2,W,56_7_0,18
1,1-0:76.7.0*255(@1,Leistung L3,W,76_7_0,18
; Spannung in Phase Lx, Auflösung 0,1V (nur über MSB)
1,1-0:32.7.0*255(@1,Spannung L1,V,32_7_0,1
1,1-0:52.7.0*255(@1,Spannung L2,V,52_7_0,1
1,1-0:72.7.0*255(@1,Spannung L3,V,72_7_0,1
; Statuswort, 4 Byte Information über den Betriebszustand, HEX string
; tasmota can decode one string per device only!
;1,1-0:96.5.0*255(@#),Status1,,96_5_0,0
;1,1-0:96.8.0*255(@#),Status2,,96_8_0,0
; Geräte-Identifikation, Nach DIN 43863-5 
1,1-0:96.1.0*255(@#),Identifikation,,96_1_0,0
;1,1-0:0.0.0*255(@#),Identifikation,,0_0_0,0
#

Die ESPHome Konfiguration:

esphome:
  name: esplesekopf-strom-d0
  friendly_name: ESPLesekopf-Strom-D0

esp8266:
  board: esp8285

# Enable Home Assistant API
api:
  encryption:
    key: "yyyyyy"

ota:
  password: "xxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esplesekopf-Strom-D0"
    password: "ZZZZZZz"

external_components:
  - source: github://mampfes/esphome_obis_d0

uart:
  id: uart_bus
  tx_pin: 1
  rx_pin: 3
  baud_rate: 9600
  data_bits: 7
  parity: EVEN
  stop_bits: 1

# Example configuration entry
logger:
  level: DEBUG

obis_d0:
  id: mysml
  uart_id: uart_bus
  optimize_size: true
# Logging if needed
  on_telegram:
    then:
      - logger.log: "telegram received"

sensor:
   - platform: obis_d0
     name: "StromzEGVerbrauch"
     obis_d0_id: mysml
     obis_code: 1.8.0
     unit_of_measurement: Wh
     accuracy_decimals: 8
     device_class: energy
     state_class: total_increasing
     value_regex: \d{6}\.\d{8}\*Wh
     filters:
     - filter_out: nan

   - platform: obis_d0
     name: "StromzEGVerbrauch_T1"
     obis_d0_id: mysml
     obis_code: "1.8.1"
     unit_of_measurement: Wh
     accuracy_decimals: 8
     device_class: energy
     state_class: total_increasing
     value_regex: "\\d{6}\\.\\d{8}\\*Wh"
     # Filter, b/c sometimes NaN is received
     filters:
     - filter_out: nan

   - platform: obis_d0
     name: "StromzEGVerbrauch_T2"
     obis_d0_id: mysml
     obis_code: "1.8.2"
     unit_of_measurement: Wh
     accuracy_decimals: 8
     device_class: energy
     state_class: total_increasing
     value_regex: "\\d{6}\\.\\d{8}\\*Wh"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzEGErzeugung"
     obis_d0_id: mysml
     obis_code: "2.8.0"
     unit_of_measurement: Wh
     accuracy_decimals: 8
     device_class: energy
     state_class: total_increasing
     value_regex: "\\d{6}\\.\\d{8}\\*Wh"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomVerbrauchGesamt"
     obis_d0_id: mysml
     obis_code: "16.7.0"
     unit_of_measurement: W
     accuracy_decimals: 2
     device_class: energy
     state_class: measurement
     value_regex: "\\d{5}\\.\\d{2}\\*W"
     # Filter, b/c sometimes NaN is received
     filters:
     - filter_out: nan

   - platform: obis_d0
     name: "StromzMomVerbrauch_L1"
     obis_d0_id: mysml
     obis_code: "36.7.0"
     unit_of_measurement: W
     accuracy_decimals: 2
     device_class: energy
     state_class: measurement
     value_regex: "\\d{5}\\.\\d{2}\\*W"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomVerbrauch_L2"
     obis_d0_id: mysml
     obis_code: "56.7.0"
     unit_of_measurement: W
     accuracy_decimals: 2
     device_class: energy
     state_class: measurement
     value_regex: "\\d{5}\\.\\d{2}\\*W"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomVerbrauch_L3"
     obis_d0_id: mysml
     obis_code: "76.7.0"
     unit_of_measurement: W
     accuracy_decimals: 1
     device_class: energy
     state_class: measurement
     value_regex: "\\d{5}\\.\\d{1}\\*W"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomSpannung_L1"
     obis_d0_id: mysml
     obis_code: "32.7.0"
     unit_of_measurement: V
     accuracy_decimals: 1
     device_class: energy
     state_class: measurement
     value_regex: "\\d{5}\\.\\d{1}\\*V"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomSpannung_L2"
     obis_d0_id: mysml
     obis_code: "52.7.0"
     unit_of_measurement: V
     accuracy_decimals: 1
     device_class: energy
     state_class: measurement
     value_regex: "\\d{5}\\.\\d{1}\\*V"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomSpannung_L3"
     obis_d0_id: mysml
     obis_code: "72.7.0"
     unit_of_measurement: V
     accuracy_decimals: 2
     device_class: energy
     state_class: measurement
     value_regex: "\\d{5}\\.\\d{2}\\*V"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

text_sensor:
  - platform: obis_d0
    name: "Device Identification"
    obis_d0_id: mysml
    obis_code: "96.1.0"
    entity_category: diagnostic
    value_regex: "\\w{14}"

  - platform: obis_d0
    name: "Manufacturer ID"
    obis_d0_id: mysml
    obis_code: "id"
    entity_category: diagnostic
    value_regex: "\\w+"

Sobald ich da Werte rausbekomme dürfte Statistiken in Home Assistant korrigieren (Energie Dashboard) nicht mehr in der Häufigkeit notwendig sein.

1 „Gefällt mir“

So der Denkfehler Nummer 1 war: Pins. Sie sind verschoben.
Der RX pin ist der einzig relevante . Es muss daher für den ESPLesekopf

uart:
  id: uart_bus
  #tx_pin: 13
  rx_pin: 14
  baud_rate: 9600
  data_bits: 7
  parity: EVEN
  stop_bits: 1

lauten

Danach kommt man sehr schön auf

[13:55:46][D][main:257]: telegram received
[13:55:46][D][obis_d0:198]: Identification: EBZ5DD3......
[13:55:46][D][obis_d0:242]: OBIS info: 1-0:0.0.0*255 -> 1EBZ......
[13:55:46][D][obis_d0:242]: OBIS info: 1-0:96.1.0*255 -> 1EBZ.......
[13:55:46][W][component:214]: Component obis_d0 took a long time for an operation (0.08 s).
[13:55:46][W][component:215]: Components should block for at most 20-30ms.
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:1.8.0*255 -> 019141.43007996*kWh
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:1.8.1*255 -> 000001.009*kWh
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:1.8.2*255 -> 019140.421*kWh
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:2.8.0*255 -> 000002.47700000*kWh
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:16.7.0*255 -> 000353.94*W
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:36.7.0*255 -> 000070.23*W
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:56.7.0*255 -> 000018.42*W
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:76.7.0*255 -> 000265.29*W
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:32.7.0*255 -> 237.0*V
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:52.7.0*255 -> 236.3*V
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:72.7.0*255 -> 232.9*V
[13:55:47][D][obis_d0:242]: OBIS info: 1-0:96.5.0*255 -> .........
[13:55:47][D][obis_d0:242]: OBIS info: 0-0:96.8.0*255 -> .........
[13:55:47][D][main:257]: telegram received

Jetzt muss ich mir nur wieder mein Energie Dashboard wieder zurecht ruckeln.

Wahlweise kann man wohl auch GitHub - aquaticus/esphome-iec62056: IEC 62056-21 component for ESPHome als Komponente nehmen.
Der Test folgt noch.

So und nun die finalle Fassung die auch vom Energie Dashboard erkannt wird.

Hatte vor lauter Copy&Paste Freude nicht drauf geachtet dass verschiedene Sensoren verschiedene Genauigkeiten, sprich Nachkommastellen haben.

Damit hat die “regular expression” nicht gepasst und es kam nichts Sinnvolles raus :see_no_evil:

esphome:
  name: esplesekopf-strom-d0
  friendly_name: ESPLesekopf-Strom-D0

esp8266:
  board: esp8285

uart:
  id: uart_bus
  tx_pin: 13
  rx_pin: 14
  baud_rate: 9600
  data_bits: 7
  parity: EVEN
  stop_bits: 1

external_components:
  - source: github://mampfes/esphome_obis_d0

logger:
  baud_rate: 0

obis_d0:
  id: mysml
  uart_id: uart_bus
  optimize_size: true
# Logging if needed
  on_telegram:
    then:
      - logger.log: "telegram received"

sensor:
   - platform: obis_d0
     name: "StromzEGVerbrauch"
     obis_d0_id: mysml
     obis_code: "1-0:1.8.0*255"
     unit_of_measurement: kWh
     accuracy_decimals: 8
     device_class: energy
     state_class: total_increasing
     value_regex: "\\d{6}\\.\\d{8}\\*kWh"
     filters:
     - filter_out: nan

   - platform: obis_d0
     name: "StromzEGVerbrauch_T1"
     obis_d0_id: mysml
     obis_code: "1-0:1.8.1*255"
     unit_of_measurement: kWh
     accuracy_decimals: 3
     device_class: energy
     state_class: total_increasing
     value_regex: "\\d{6}\\.\\d{3}\\*kWh"
     # Filter, b/c sometimes NaN is received
     filters:
     - filter_out: nan

   - platform: obis_d0
     name: "StromzEGVerbrauch_T2"
     obis_d0_id: mysml
     obis_code: "1-0:1.8.2*255"
     unit_of_measurement: kWh
     accuracy_decimals: 3
     device_class: energy
     state_class: total_increasing
     value_regex: "\\d{6}\\.\\d{3}\\*kWh"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzEGErzeugung"
     obis_d0_id: mysml
     obis_code: "1-0:2.8.0*255"
     unit_of_measurement: kWh
     accuracy_decimals: 8
     device_class: energy
     state_class: total_increasing
     value_regex: "\\d{6}\\.\\d{8}\\*kWh"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomVerbrauchGesamt"
     obis_d0_id: mysml
     obis_code: "1-0:16.7.0*255"
     unit_of_measurement: W
     accuracy_decimals: 8
     device_class: energy
     state_class: measurement
     value_regex: "\\d{6}\\.\\d{2}\\*W"
     # Filter, b/c sometimes NaN is received
     filters:
     - filter_out: nan

   - platform: obis_d0
     name: "StromzMomVerbrauch_L1"
     obis_d0_id: mysml
     obis_code: "1-0:36.7.0*255"
     unit_of_measurement: W
     accuracy_decimals: 2
     device_class: energy
     state_class: measurement
     value_regex: "\\d{6}\\.\\d{2}\\*W"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomVerbrauch_L2"
     obis_d0_id: mysml
     obis_code: "1-0:56.7.0*255"
     unit_of_measurement: W
     accuracy_decimals: 2
     device_class: energy
     state_class: measurement
     value_regex: "\\d{6}\\.\\d{2}\\*W"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomVerbrauch_L3"
     obis_d0_id: mysml
     obis_code: "1-0:76.7.0*255"
     unit_of_measurement: W
     accuracy_decimals: 2
     device_class: energy
     state_class: measurement
     value_regex: "\\d{6}\\.\\d{2}\\*W"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomSpannung_L1"
     obis_d0_id: mysml
     obis_code: "1-0:32.7.0*255"
     unit_of_measurement: V
     accuracy_decimals: 1
     device_class: energy
     state_class: measurement
     value_regex: "\\d{3}\\.\\d{1}\\*V"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomSpannung_L2"
     obis_d0_id: mysml
     obis_code: "1-0:52.7.0*255"
     unit_of_measurement: V
     accuracy_decimals: 1
     device_class: energy
     state_class: measurement
     value_regex: "\\d{3}\\.\\d{1}\\*V"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

   - platform: obis_d0
     name: "StromzMomSpannung_L3"
     obis_d0_id: mysml
     obis_code: "1-0:72.7.0*255"
     unit_of_measurement: V
     accuracy_decimals: 1
     device_class: energy
     state_class: measurement
     value_regex: "\\d{3}\\.\\d{1}\\*V"
     # Filter, b/c sometimes NaN is received
     filters:
      - filter_out: nan

text_sensor:
  - platform: obis_d0
    name: "Device Identification"
    obis_d0_id: mysml
    obis_code: "1-0:96.1.0*255"
    entity_category: diagnostic
    value_regex: "\\w{14}"

Für meinen Fall wichtig sind die Filter mit “nan” da man sonst immer wieder Fälle hat wo der Gesamtverbrauch bis zum jetzigen Zeitpunkt als neuer Verbrauch dazu gezählt wird und mühsame Datenbereinigung erforderlich macht :wink:

Hi ahorn, very good job. :+1:
Hätte ich das hier doch ein paar Tage früher gelesen :crazy_face:!
Wollte den ioBroker, mit dem ich den Zähler seit Jahren auslese und auswerte, in Rente schicken. Da hängt ein ESP-Lesekopf per USB dran. Der SmartMeter-Adapter liest ohne riesigen Konfigurationsaufwand alle 351 Objekte aus und aktualisiert die, die sich veränderten. So weit, so gut. Habe mich lange nicht darum gekümmert, wie man diese Daten ins Energy-Dashboard von HA bekommt.
Dann dachte ich, lies die Werte doch gleich mit HA ESPHome oder Tasmota aus.
Habe fast zwei Tage damit verbracht das umzusetzen. Bei mir hat allerdings schon der Aufruf der external_components nicht geklappt. Man sollte aber auch keinen d1_ mini nutzen, aber auch ein ESP8266 hat‘s nicht gebracht. Mein etwa 6 (?) Jahre alter Zweit-ESP-Lesekopf hat noch keine WLAN-Anbindung. Ist vielleicht auch defekt, keine Ahnung.
Inzwischen fand ich eine eine Lösung zur Übertragung der Daten nach HA mittels MQTT. Das Energy-Dashboard funktioniert!
Dennoch bin ich am überlegen, die geplante Umstellung voranzutreiben. Zwei Dinge wären jetzt für mich interessant:

  1. Wie zuverlässig funktioniert deine Lösung bzw. wie zufrieden bist du damit? Ist ja schon ein wenig Zeit vergangen.
  2. Welchen ESPLesekopf benutzt du, bzw. welchen würdest du empfehlen?

Würde mich über entsprechende Hinweise und Tipps sehr freuen :sunglasses:

Nach dem die Tasmota+MQTT Lösung mir stets wegen Lesefehlern die Statistik verunstaltet hat, ist hier nichts mehr unangenehm aufgefallen.
Zahlenwerte entsprechen im Verlauf dem Benutzen der Großverbraucher.

Das Gerät selbst hab ich mir auf Kleinanzeigen.de gebraucht gekauft, ist aber fast baugleich mit esplesekopf · GitHub

Vielen Dank für die schnelle Antwort :+1:. Jetzt habe ich was zum abzuwägen und entscheiden. Werde erstmal ein :coffee: trinken.
Schönen Sonntag