Smartmeter SML Tasmota negative Momentanleistung mit signed Wert von Zähler DVSB20.2TH

#7605894
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

Angehängte Dateien:
#7643097
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

#7643173
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.

#7643355
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.

Angehängte Dateien:
#7643608
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

#7643630
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.

Angehängte Dateien:
#7643827
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.

#7687880
Lesenswert?

Hallo zusammen

Vielleicht könnt ihr mir helfen, bei mir funktioniert die codierung überhapt nicht. Ich besitze ein Drehstromzähler vom Typ DZG DWSB06.2TH. Der Tasmota gibt folgende Zeichenfolge aus.

19:11:04.197 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 89 19:11:04.216 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:05.167 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:05.216 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 4a d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:06.168 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:06.215 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 25 d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:07.167 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:07.197 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 89 19:11:07.214 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:08.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:08.197 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 a2 19:11:08.215 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:09.167 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:09.216 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 4b d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:10.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:10.197 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 a2 19:11:10.214 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:11.165 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:11.197 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 a2 19:11:11.214 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:12.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:12.196 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 f3 19:11:12.213 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:13.167 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:13.215 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 4c d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:14.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:14.214 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 26 d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:15.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:15.214 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 37 d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:16.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:16.214 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 13 d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:17.167 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:17.214 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 4d d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:18.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:18.196 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 f3 19:11:18.214 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:19.167 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:19.196 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 f3 19:11:19.213 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:20.165 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:20.196 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 f3 19:11:20.213 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:21.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:21.215 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 4e d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:22.165 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:22.213 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 27 d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:23.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:23.196 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 f3 19:11:23.213 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:24.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:24.195 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 f3 19:11:24.214 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:25.164 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:25.212 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 4f d7 07 01 00 60 32 01 01 01 01 01 01 04 44 19:11:26.165 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:26.196 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 f3 19:11:26.213 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:27.165 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:27.195 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 f3 19:11:27.212 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:28.165 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:28.194 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 d1 19:11:28.212 : 77 07 01 00 60 32 01 01 01 01 01 01 04 44 5a 47 01 19:11:29.166 : 77 07 01 00 60 01 00 ff 40 40 40 40 48 28 44 5a 47 00 02 63 4a ed 40 07 01 00 01 08 00 ff f6 1c 01 04 72 62 01 65 08 96 19:11:29.214 : 77 01 0b 0a 01 44 5a 47 00 02 63 4a ed 78 00 62 0a ff fb 62 01 65 08 96 43 50 d7 07 01 00 60 32 01 01 01 01 01 01 04 44

Doch leider finde ich nicht die passenden einträge wie Energie bezogen, geliefert, aktuelle Leistung. Am Zähler konnte ich den Code vom Energiezuliefer eintragen und sehe am Zähler die aktuelle Leistung. Kann mir bitte jemand helfen beim richtigen Codieren, aktuelle habe ich im Tasmota dieses script laufen:

D B =>sensor53 r M 1 +1,3,s,16,9600,DWSB122 1,77070100010800ff@1000,Energie bezogen,kWh,energy,0 1,77070100020800ff@1000,Energie geliefert,kWh,energy,0 1,77070100100700ff@1,Leistung,W,power,2 1,7707010060320101@#,Service ID,,meter_id,0 1,77010b0a01445a47@#,Unbekannt,,unknown,0 1,77070100600100ff@#,Zählernummer,,meter_number,0

doch es kommt nur so was heraus (siehe Bild)

Für Hilfe wäre ich sehr dankbar. toptobias

Angehängte Dateien:
#7687916
Lesenswert?

Probier mal das....

D B =>sensor53 r M 1 ;1. line = sml[1] (actual power W), 2. = sml[2] (energy from grid kWh), 3. = sml[3] (energy to grid kWh) +1,5,s,16,9600,DZG 1,=so1,00010800,64,11,65,11,00100700 1,00100700ff@1,Leistung,W,Power_cur,2 1,00010800ff@1000,Verbrauch,kWh,energy180,4 1,00020800ff@1000,Einspeisung,kWh,energy280,4

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren