Forum: Haus & Smart Home Smartmeter SML Tasmota negative Momentanleistung mit signed Wert von Zähler DVSB20.2TH


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von MINION (minion56)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

wie im Betreff geschrieben habe ich den Zweirichtungszähler DZG 
DVBS20.2TH. Aus diesem möchte ich über einen Infrarotlesekopf und einen 
Wemos D1 Mini mit Tasmota die Zählerstände und den aktuellen 
Verbrauch/Einspeisung auslesen.
Dafür benutze ich folgendes SML Skript:
1
>D
2
>B
3
=>sensor53 r
4
>M 1
5
+1,3,s,0,9600,#
6
7
;Zählerstände
8
1,00010800ff@1000,Energie bezogen,kWh,energy,4
9
1,00020800ff@1000,Energie geliefert,kWh,energy,4
10
11
;Leistung
12
1,=so1,00010800,64,11,65,11,00100700
13
1,00100700ff@1,Leistung,W,power,2
14
#
Das funktioniert für die Zählerstände so weit auch (siehe Bild). Die 
aktuelle Leistung wird bei Netzbezug auch richtig dargestellt, wenn 
jedoch Strom eingespeist wird, bekomme ich wie auf dem Screenshot zu 
sehen eine falsche Ausgabe. Der Zähler liefert in der Nachricht 00100700 
einen signed Wert, Tasmota verrechnet diesen aber als unsigned. Über die 
Zeile 1,=so1,00010800,64,11,65,11,00100700 wird im Statuswort der 
Nachricht 00010800 überprüft wie die aktuelle Energierichtung ist und 
dadurch auch das Minuszeichen für die Leistung richtig gesetzt, jedoch 
ist der Wert an sich ja noch falsch da das Vorzeichenbit aus dem 
Leistungswert falsch interpretiert wird. Gibt es hier eine Möglichkeit 
im Skript festzulegen, das es sich um einen signed Wert handelt?

Als Rohdaten bekomme ich von dem Sensor:

Fall Einspeisung:

77 07 01 00 10 07 00 ff 01 72 62 01 62 00 62 1b 52 fe 55 00 fc 9a 4b 01 
01 01 63 d9 91 00 76 05 62 00 1b 1b 1b 1b 01 01

--> 55 00 fc 9a 4b := aktuelle Leistung

fc 9a 4b --> -222645 = -2226,45 Watt (richtiger Wert)

Tasmota Skript --> 16554571 = 165545,71 Watt (falscher Wert)

Fall Netzbezug:

77 07 01 00 10 07 00 FF 01 72 62 01 62 00 62 1B 52 FE 54 01 5E 9F 01 01 
01 63 E1 D7 00 76 05 B6 29 1F 00 1B 1B 1B 1B 01

--> 54 01 5E 9F := aktuelle Leistung

01 5E 9F --> 89759 = 897,59 Watt (richtiger Wert)

Tasmota Skript --> 89759 = 897,59 Watt (wird korrekt angezeigt)

Ein weiteres Problem ist, dass im Fall Einspeisung noch ein leeres Byte 
(00 nach 55) mit ausgegeben wird, wodurch das Vorzeichenbit auch nicht 
mehr an erster Stelle steht.

Weiß hier jemand eine Lösung?

Vielen Dank im Vorraus

von Georg (georgg)


Lesenswert?

Hallo,
da ich das gleiche Problem habe,
wollte ich höflich fragen, ob es denn schon einen Lösungsweg gibt?
Grüße
Georg

von MINION (minion56)


Lesenswert?

Hallo Georg,

ich habs mitllerweile über einen kleinen Umweg für mich gelöst. Im 
Endeffekt schaue ich ob die Leistung negativ ist und rechne dann 
entsprechend den Bitfehler raus. Hab das im Tasmota Skript mit 
einprogrammiert. Kann dir heute Abend gern den Codeausschnitt hier 
hochladen dann wirds glaube ich deutlicher, bin nur gerade noch 
unterwegs.

Grüße
Chris

von Heinz R. (heijz)


Lesenswert?

Ist es evtl. dieses Problem hier:

https://ottelo.jimdofree.com/2022/12/16/update-stromz%C3%A4hler-auslesen-bugfix-f%C3%BCr-dws74/

sonst versuche es mal mit einer anderen Tasmota-Version - ich hatte mit 
der 13.1 auch große Probleme bei einem DZG-Zähler

von Rüdiger B. (rbruns)


Lesenswert?

Bei meinem Zähler funktioniert das Problemlos.
Info1_Module
Sonoff Basic
Info1_Version
9.5.0(tasmota)

mit MQTT
mein Script:
>D
>B
=>sensor53 r
>M 1
+1,3,s,20,9600,E320
1,77070100020800ff@1000,Total Delivered,KWh,Total_out,3
1,77070100010800ff@1000,Total Consumed,KWh,Total_in,3
1,77070100100700ff@1,Current power,W,Power_in,3
1,77070100600100ff@#,Server-ID,,Meter_Number,0
#

Der Zähler ist ein E320.

von Georg (georgg)


Lesenswert?

MINION schrieb:
> Kann dir heute Abend gern den Codeausschnitt hier
> hochladen dann wirds glaube ich deutlicher,
>
> Grüße
> Chris

Das wäre natürlich super!
Gruß Georg

von Georg (georgg)


Lesenswert?

Ich habe:
Tasmota Version  13.3.0(tasmota32)
Erstellungszeitpunkt  2024.01.18 10:41:04
Core-/SDK-Version  2_0_14/4.4.6.231122

Bei meinem Zähler ist das Problem "nur" wenn die Leistung Prinzipiell 
negativ ist.

von MINION (minion56)


Angehängte Dateien:

Lesenswert?

Guten Abend,

hier ist mal der Ausschnitt aus meinem Skript, hab im Grunde das 
Volkszähler Tasmota Skript mit den Google Charts Anzeigen von dieser 
Seite:
https://ottelo.jimdofree.com/stromz%C3%A4hler-auslesen-tasmota/
1
;-- SML --
2
>M 1
3
4
;1. line = sml[1] (actual power W), 2. = sml[2] (energy from grid kWh), 3. = sml[3] (energy to grid kWh)
5
+1,3,s,16,9600,DZG
6
1,=so1,00010800,64,11,65,11,00100700
7
1,00100700ff@1,Leistung (falsch bei -),W,Power_curr,2
8
1,00010800ff@1000,Verbrauch,kWh,Total_in,4
9
1,00020800ff@1000,Einspeisung,kWh,Total_out,4
10
#
11
12
13
14
; -- EVERY SECOND --
15
>S
16
;start mqtt if smartmeter is sending
17
if (sml[2]>0)
18
{
19
  smlj=1
20
}
21
22
;check if Power is negative and correct value
23
pnew=sml[1]
24
if (pnew<0)
25
{
26
  pnew*=-1
27
  if (pnew>=655.36)
28
  {
29
    pnew-=167772.16
30
  }
31
32
  if (pnew>=2.56)
33
  {
34
    pnew-=655.36
35
  }
36
  else
37
  {
38
    pnew-=2.56
39
  }
40
}
41
power=pnew
Das Problem ist ja, dass der Zähler ein Vorzeichenbit mitschickt, das 
von dem Skript falsch interpretiert wird. Ich schaue also, ob die 
aktuelle Leistung negativ ist (das wird ja durch die Energierichtung 
trotzdem erkannt) und wenn ja, wie groß der Wert ist. Je nachdem wie 
groß der richtige Wert ist, rutscht das Vorzeichenbit noch ein Byte nach 
vorne und deshalb muss die Korrektur größer werden. 2^8=256; 2^16=65536; 
2^24=16777216 und so weiter, aber so große Werte sollten nicht mehr 
auftreten.
Das funktioniert wie auf den Screenshots zu sehen soweit ganz gut, nur 
wenn die Leistung gerade öfters zwischen positiv und negativ wechselt 
bekomme ich noch manchmal Ausreißer von ca. -17000 die ich noch nicht 
ganz nachvollziehen kann.

von Georg (georgg)


Lesenswert?

Danke Für das Script,
Leider korrigiert das bei mir die Werte nicht. Wobei ich mich auch 
frage, wie denn die Werte, die in "check if Power is negative and 
correct value" überhaupt auf den Ausgangswert zurück gespielt werden? 
Also power -> Power_Curr

Danke
Georg

von MINION (minion56)


Angehängte Dateien:

Lesenswert?

Hallo,

wie auf den Screenshots zu sehen bleibt der Leistungswert in der ersten 
Zeile falsch. Der Ausgangswert wird also nicht überschrieben, im Skript 
wird dann aber mit power weitergerechnet, was ja über die letzte Zeile 
power=pnew auf den richtigen Wert gesetzt wird. Dadurch bekomme ich in 
der vierten Zeile in den Schreenshots bei "Leistung:" den richtigen Wert 
angezeigt und die Diagramme werden auch mit den richtigen Daten 
gefüttert.
Hab das gesamte Skript mal als Datei angehängt. Falls du auch einen 
ESP8622 hast musst du das allerdings wie in der zuvor genannten Website 
beschrieben über ein das Tool ScriptEditor hochladen da der Controller 
sonst zu wenig RAM hat.

von Georg (georgg)


Lesenswert?

Ahh, ich verstehe,
du korrigierst gar nicht die Werte die das Tasmota via MQTT überträgt 
sondern korrigiert sie in deiner Anzeigelogig.

Für mich hiese das, ich müsste die Umrechnung im Home Assistant 
vornehmen, oder?
Danke
Georg

von MINION (minion56)


Lesenswert?

Ja genau bei mir läuft alles nur über den einen Tasmota.
Mit MQTT und HomeAssistant habe ich mich bisher noch nicht befasst, da 
kann ich leider auch nicht weiterhelfen.

von Georg (georgg)


Lesenswert?

Danke sehr,
Deine Rechenmurmel hat mir sehr geholfen. Ich habe das in Home Assistant 
im configuration.yaml wie folgt gelöst:
1
template:
2
  - sensor:
3
      - name: "Leistungsaufnahme"
4
        unique_id: latasmta
5
        unit_of_measurement: W
6
        state_class: measurement
7
        device_class: power
8
        state: >
9
          {% set mypower = (states("sensor.strom_dzg_Power_cur") | float(0)) %}
10
          {% if mypower < 0 %}
11
             {% set mypower = -1 * mypower %}
12
             {% if mypower >= 655.38 %}
13
                {% set mypower = mypower - 167772.16 %}
14
                {% if mypower >= 2.56 %}
15
                  {% set mypower = mypower - 655.36 %}
16
                {% else %}
17
                  {%set mypower = mypower - 2.56 %}
18
                {% endif %}
19
             {% endif %}
20
          {% endif %}
21
          {{ mypower | round (1) }}

Grüße Georg.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.