Wechselstromzähler WS7412.1 mit HICHI-IR Lesekopf auslesen

Leider hat die offizielle Tasmota Anleitung für meinen Smart Meter von der Firma DZG (Model: DWS7412.1.G2 (SML) ) nicht auf Anhieb funktioniert.

Code:

>D
>B
=>sensor53 r
>M 1
+1,3,s,16,9600,DWS7412
1,77070100010800ff@1000,Energy,kWh,energy,4
1,77070100240700ff@1,Power,W,power,2
1,7707010060320101@#,Service ID,,meter_id,0
#

Problem

Es wurde nur der gesamte Verbrauch in kWh angezeigt, nicht aber die aktuelle Leistung / Power in W.

Obwohl ich mit der Taschenlampe die PIN eingeben hatte und die Inf Umschalten Anzeige Umfang Push Datensatz auf on gestellt hatte, wurden diese Werte nicht übermittelt. Auch das Deaktivieren der PIN hat keine Abhilfe geschaffen.

Lösung

In dem Modus, bei dem die PIN Abfrage deaktiviert ist, nochmal die Inf Umschalten Anzeige Umfang Push Datensatz auf off stellen. Nachdem der Modus wieder auf Normal ist die Inf Umschalten Anzeige Umfang Push Datensatz wieder auf on stellen

MQTT Sendeintervall erhöhen

Standardmäßig sendet der Tasmota alle 300 Sekunden ein Status update
Mit folgendem Command Befehl habe ich diesen auf 2 Minuten (120 Sekunden) erhöt.
TelePeriod 120

Template Sensor in Home Assistant erstellen

Damit die Werte entsprechend in Home Assistant auch ausgewertet und nicht nur angezeigt werden, benötigt man einen Template-Sensor.

Der Sensor für die aktuelle Leistung macht auch hier wieder Probleme. Als ich den TV Eingeschaltet habe, gab es auf einmal einen negativen Wert. Sehr cool - also wenn ich TV schaue, dann generiere ich also Strom und speise ein :joy:

Code mit Korrektur des negativ Werts

template:
  - sensor:
      - name: "Smart Meter Verbrauch"
        unit_of_measurement: "kWh"
        device_class: "energy"
        state_class: "total_increasing"
        state: >-
          {{ float(states('sensor.bitshake_smartmeterreader_dws7412_energy')) }}
      - name: "Smart Meter aktuelle Leistung"
        unit_of_measurement: "W"
        device_class: "energy"
        state: >-
          {% set original_value = float(states('sensor.bitshake_smartmeterreader_dws7412_power')) %}
          {% if original_value >= 0 %}
            {{ original_value }}
          {% else %}
            {{ - original_value + (70) }}
          {% endif %}

Energiewende in der Praxis

Das wird ja noch spannend werden. Dass es so eine solche Herausforderung ist, Smart Meter auszulesen, ist eine absolute Katastrophe. Energiewende, Wärmepumpe und Elektromobilität - alles schön und gut, aber wer kommt für die Kosten auf, um entsprechend Modifikationen vorzunehmen? Alles ist individuell und dann auch noch teilweise fehlerhaft, weil man sich (mal wieder in der Vergangenheit) auf keine Standards einigen konnte!

Reset des Stromzählers

Wenn man sich beim Einrichten vertippt und der Sensor z.B. keine Verbindung zum Wi-Fi Netzwerk bekommt, kann man durch siebenmaliges Trennen der Stromversorgung den Werksreset durchführen.

Moin Amon,
vielen Dank für deinen hilfreichen Beitrag. Bei mir ist exakt der gleiche Zählertyp verbaut.
Ich habe in meinem Tasmota Skript nach der Zeile mit +1 folgendes eingefügt:
1,=so2,1
Damit konnte ich das Problem mit negativen Werten lösen.
Vielleicht funktioniert, dass bei dir und anderen auch.
ich bin über folgenden Artikel auf den auf diesen Work-Around für den Firmware-Bug dieses Zählermodells aufmerksamgeworden: https://ottelo.jimdofree.com/stromzähler-auslesen-tasmota/

1 „Gefällt mir“

Guten Morgen,
vielen Dank für Deinen Beitrag!
Ich habe den Sensor leider nicht mehr bei mir und kann das aktuell nicht testen. Sieht dann so der komplette Code von Dir aus?

>D
>B
=>sensor53 r
>M 1
+1,3,s,16,9600,DWS7412
1,=so2,1
1,77070100010800ff@1000,Energy,kWh,energy,4
1,77070100240700ff@1,Power,W,power,2
1,7707010060320101@#,Service ID,,meter_id,0
#

Moin,
ja richtig, genau sollte der Code für deinen Anwendungsfall aussehen.
In meinem Fall sieht der Code so aus (weil ich den bitShake SmartMeterReader verwende):

>D
>B
=>sensor53 r
>M 1
+1,5,s,0,9600,DWS7412,4
1,=so2,1
1,=soC,1024,0
1,77070100010800ff@1000,Energy,kWh,E_in,4
1,77070100240700ff@1,Power,W,power_L1,0
1,7707010060320101@#,Service ID,,meter_id,0
#

Alternativ könnte dein Home Assistant Template auch so aussehen (negativen Wert +655), um den Fehler zu beheben:

template:
  - sensor:
      - name: "Smart Meter Verbrauch"
        unit_of_measurement: "kWh"
        device_class: "energy"
        state_class: "total_increasing"
        state: >-
          {{ float(states('sensor.bitshake_smartmeterreader_dws7412_energy')) }}
      - name: "Smart Meter aktuelle Leistung"
        unit_of_measurement: "W"
        device_class: "energy"
        state: >-
          {% set original_value = float(states('sensor.bitshake_smartmeterreader_dws7412_power')) %}
          {% if original_value >= 0 %}
            {{ original_value }}
          {% else %}
            {{ original_value + 655 }}
          {% endif %}

Hintergrund ist, dass der Zähler die momentan Leistung L1 mit 16 Bit überträgt. Da dieses Modell ein Einrichtungzähler ist, sind negative Leistungen nicht möglich. Tasmota SML Decoder interpretiert diese 16-Bit-Werte nach Vorgabe des Zählers (das ist der Fehler in der Frimeware) als vorzeichenbehaftet bzw signed integer (SINT16). Daher kommt es ab Werten von 32768 bzw 327,68 W zu Fehlinterpretationen, da das erste Bit (erste 1 in binärdarstellung) als Vorzeichen und nicht als 2 hoch 16 interpretiert wird. Ab einem Wert von 65536 bzw 655,36 W wechselt der Zähler von 16 Bit zu 24bit, da 16 Bit nicht mehr ausreichen. Hiermit sind Werte bis 16777215 bzw. 167772,15 W möglich, womit Werte bis 8388607 bzw. 83886,07 W ohne Fehlinterpretation übertragen werden können. Da diese Leistung größer der technische maximalen Leistung ist, ist keine erneute Fehlinterpretation zu erwarten.

1 „Gefällt mir“

Super, vielen Dank für die ausführliche Erklärung. Absolut verständlich und nachvollziehbar.