[vz-users] WG: Zählerwechsel (optische Schnittstelle)

Frank Richter frank.richter83 at gmail.com
Fri Mar 8 11:39:45 CET 2019


Du hättest halt besser gleich damit rausrücken sollen, dass du den Code für
negative Leistungen selbst gebastelt hast. Deine erste Mail erweckt den
Eindruck, du würdest dich beim Bayernwerk darüber beschweren, dass dein
Zähler kein standardkonformes SML liefert...

Und wenn ich keine Lust hätte, hätte ich eben bestimmt keine PHP-Funktion
zur Umwandlung von hex zu signed integer rausgesucht...

Grüße
Frank

Michael Kaufmann <kaufmann-michael at outlook.com> schrieb am Fr., 8. März
2019 11:11:

> Wer sagt, dass es schlecht programmiert ist. Es gibt anscheinend auch
> Zähler die zwei Obis Kennziffern haben für die Leistung. 1x Leistung für
> Bezug und 1x Leistung für Lieferung. Jeweils in getrennte Obis Kennziffern.
> Diese Werte sind immer positiv.
>
>
>
> Bei meinem Zähler wird bei gleicher Obis Kennziffer ein negativer Wert
> ausgegeben, wenn ich Einspeise und ein positiver Wert, wenn ich beziehe.
>
>
>
> Und rumschlagen muss sich keiner von euch. Ich habe lediglich gefragt, ob
> mir von euch jemand weiterhelfen kann. Wenn du kein Zeit und Lust hast,
> brauchst du auch nicht zu schreiben.
>
>
>
> Ich habs jetzt so gelöst:
>
> case '5x': # Integer
>
>                                                                if
> ($LEN==2) {
>
>
> # 8 Bit signed Integer
>
>
> $temp = hexdec($this->read($LEN-1));
>
>
> $this->debug('Value: ('.$temp.')');
>
>
> if($temp & 0x80) {
>
>
> $temp -= 256;
>
>
> $this->debug('Value mit Vorzeichenbetrachtung: ('.$temp.')');
>
>
> return $temp;
>
>
> }
>
>
> else{
>
>
> return $temp;
>
>
> }
>
>                                                                }
>
>                                                                if
> ($LEN==3) {
>
>
> # 16 Bit signed Integer
>
>
> $temp = hexdec($this->read($LEN-1));
>
>
> $this->debug('Value Rohwert: ('.$temp.')');
>
>
> if($temp & 0x8000) {
>
>
> $temp -= 65536;
>
>
> $this->debug('Value mit Vorzeichenbetrachtung: ('.$temp.')');
>
>
> return $temp;
>
>
> }
>
>
> else{
>
>
> return $temp;
>
>
> }
>
>                                                                }
>
>                                                                break;
>
>
>
> Vielen Dank trotzdem.
>
>
>
> Gruß
>
> Michael
>
>
>
> *Von:* volkszaehler-users <
> volkszaehler-users-bounces at demo.volkszaehler.org> *Im Auftrag von *Frank
> Richter
> *Gesendet:* Freitag, 8. März 2019 11:06
> *An:* volkszaehler.org - users <volkszaehler-users at demo.volkszaehler.org>
> *Betreff:* Re: [vz-users] WG: Zählerwechsel (optische Schnittstelle)
>
>
>
> Weil du dich "nicht so richtig auskennst", willst du also lieber was
> schlecht programmiertes reparieren, als was funktionierendes zu verwenden?
> Total logisch...
>
>
>
> Und das Bayernwerk und die Volkszaehler-ML sollen sich damit rumschlagen
> ;-)
>
>
>
> Versuchs mal damit:
>
>
>
> http://php.net/manual/de/function.hexdec.php#97172
>
>
>
> Statt $dec > $_dec muss es aber IMHO $dec >= $_dec heißen.
>
>
>
> Grüße
>
> Frank
>
>
>
> Michael Kaufmann <kaufmann-michael at outlook.com> schrieb am Fr., 8. März
> 2019, 09:53:
>
> Morgen,
>
>
>
> freilich gibts SML Parser, aber das Smartmeter Plugin kann halt über das
> grafische Webif eingestellt werden. Da ich mich nicht so richtig auskenne
> möchte ich den Fehler halt in dieser Klasse ausmerzen. Außerdem schickt das
> Plugin die ausgelesenen Daten direkt über UDP an den Loxone Miniserver.
>
>
>
> Nein, es geht hier nicht um einen Fehler im vzlogger, sondern um einen
> Fehler in der SML Klasse von dem Smartmeter Plugin.
>
>
>
> Ich hoffte eigentlich nur auf eure PHP Kenntnisse und ihr versteht
> vermutlich das SML Protokoll. Ich möchte nur einen Tipp, wie man genau an
> der Stelle Case 5 den Code so abändert, das der Wert richtig berechnet
> wird. Sonst nichts 😀
>
>
>
> Gruß
>
> Michael
>
> Von meinem iPhone gesendet
>
>
> Am 08.03.2019 um 09:46 schrieb Frank Richter <frank.richter83 at gmail.com>:
>
> Moin Michael,
>
>
>
> was hast du denn eigentlich vor mit den Daten? Ist ja nicht so dass es
> keine . funktionierenden SML-Parser gäbe...
>
>
>
> Grüße
>
> Frank
>
>
>
> Michael Kaufmann <kaufmann-michael at outlook.com> schrieb am Fr., 8. März
> 2019, 09:37:
>
> Guten Morgen,
>
>
>
> der Code war zuvor so:
>
>
>
> case '5x': # Integer
>
>                 return hexdec($this->read($LEN-1));
>
>                 break;
>
>
>
> Bei negativen Werten, also Lieferung, wurde der Wert manchmal >65000 mit
> diesem Code. Es wurde anscheinend nicht berücksichtigt, dass der Wert auch
> mal negativ werden kann. Da der Wert >65000 war, ging ich davon aus, das es
> sich hier um 16 Bit Wert handeln muss. Dem ist halt nicht so, da ich nur 1
> Byte habe, im Beispiel hier 82hex.
>
>
>
> Die Funktion hexdec rechnet anscheinend wie ein Taschenrechner. Wenn ich
> im Windowsrechner 82hex umwandle in dez, kommt der Rechner nämlich auch auf
> 130. Das ist aber falsch.
>
>
>
> Nur so kommt man auf das richtige Ergebnis:
>
> 7 6 5 4 3 2 1 0 Bitwertigkeit
> 1 0 0 0 0 0 1 0 (82hex in Binärdarstellung)
> -128+0+0+0+0+0+2+0= -126 Watt
>
> Da ich es damals noch nicht gewusst habe, das man das mittel 2er
> Komplement berechnen muss, habe ich mir beholfen, und den Code so
> umgestaltet:
>
>
>
> case '5x': # Integer
>
>                                                                $temp =
> hexdec($this->read($LEN-1));
>
>
> $this->debug('Value: ('.$temp.')');
>
>
> if($temp>32768){
>
>
> return $temp -= 65536;
>
>                                                                }
>
>                                                                else{
>
>
> return $temp;
>
>                                                                }
>
>                 break;
>
>
>
> Ihr dürft aber bitte nicht vergessen, das ich mit PHP überhaupt nicht
> auskenne J
>
>
>
> Die SML Parser Klasse habe ich vom Loxberry Projekt. Hier gibt’s ein
> Smartmeter Plugin, das dieses Code verwendet. Allerdings kann mir der Autor
> auch nicht helfen, da er die Klasse von jemanden bekommen hat. Ist aber
> eigentlich auch egal. Ich will ja lernen und den Fehler selber beheben.
>
>
>
> Wir wissen nun, dass der Code so einfach falsch ist. Wie kann man in PHP
> den Wert richtig berechnen?
>
>
>
> Das Plugin Smartmeter gibt es auch her, die Leistungen mit 1.8.0 und 2.8.0
> (Kwh Lieferung und Bezug in Bezug auf Zeit zu berechnen). Ich möchte aber
> nicht dieses Verfahren verwenden, nur weil der Code falsch ist.
>
>
>
> Vielen Dank schonmal für eure Tipps.
>
>
>
> Gruß
>
> Michael
>
>
>
> *Von:* volkszaehler-users <
> volkszaehler-users-bounces at demo.volkszaehler.org> *Im Auftrag von *Frank
> Richter
> *Gesendet:* Freitag, 8. März 2019 00:07
> *An:* volkszaehler.org - users <volkszaehler-users at demo.volkszaehler.org>
> *Betreff:* Re: [vz-users] WG: Zählerwechsel (optische Schnittstelle)
>
>
>
> Hallo nochmal,
>
>
>
> dein Code bildet ein 16 Bit Zweierkomplement bei 8 Bit Nutzdaten. Das kann
> natürlich nicht funktionieren.
>
>
>
> Dürfen wir erfahren wo dieser PHP-Code herkommt?
>
>
>
> Grüße
>
> Frank
>
>
>
> Michael Kaufmann <kaufmann-michael at outlook.com> schrieb am Do., 7. März
> 2019, 13:45:
>
> Servus nochmal,
>
>
>
> habe den Fehler gefunden. Aber leider noch keine Lösung dafür J
>
>
>
> 2. Beispiel: Zähler zeigt 130 W Lieferung (A-), also -130W an: Im
> empfangenen SML Protokoll wird aber +130W ausgegeben. Logdatei 130W
> A-.log‘.
>
>
>
>
> http://bildhost.unter-limit.de/archiv.php?bild=367&bild_name=130alog061K2.jpg
>
>
>
> 77              => 7x = Liste, x7 = Liste mit 7 Einträgen
>
> 070100100700FF  => 07 = Länge in Bytes,  0100100700FF OBIS Kennzahl =>
> 16.7.0 = Gesamtwirkleistung
>
> 01             => Status: ohne Wert bzw. 01=optional
>
> 01             => ValTime: ohne Wert bzw. 01=optional
>
> 62 1B           => 6x xx = unsigned Integer, x2 xx = Länge 2 Byte, xx 1B =
> Unit: 1B = 27dez = Watt
>
> 52 00           => 5x xx = Integer, x2 xx = Länge 2 Byte, xx 00 = Scaler:
> 0 à 10^0 = 1
>
> 52 82           => Value: 5x xx = Integer, x2 xx = Länge 2 Byte, Value 82
> hex = 130 dez (entspricht +130 Watt)
>
> 01                         => ValueSignature: ohne Werte bzw. 01=optional
>
>
>
> Man darf den Wert nicht einfach von hex auf dez umrechnen, sondern man
> muss das 2er Komplement verwenden.
>
>
>
> 7 6 5 4 3 2 1 0 Bitwertigkeit
> 1 0 0 0 0 0 1 0 (82hex in Binärdarstellung)
> -128+0+0+0+0+0+2+0= -126 Watt
>
>
>
> Wie habt ihr das beim Volkszähler gelöst. Bei meinem Skript wird es
> momentan so umgerechnet.
>
>
>
> case '5x': # Integer
>
>                 $temp = hexdec($this->read($LEN-1));
>
>                 $this->debug('Value: ('.$temp.')');
>
>                 if($temp>32768){
>
>                     return $temp -= 65536;
>
>                 }
>
>                 else{
>
>                     return $temp;
>
>                 }
>
>                 break;
>
> So einfach darf man es sich aber nicht machen. Ich kann leider nicht so
> gut PHP programmieren. Habt ihr einen Vorschlag oder einen Tipp?
>
>
>
> Vielen Dank.
>
>
>
> Gruß
>
> Michael
>
>
>
>
>
> *Von:* Michael Kaufmann
> *Gesendet:* Sonntag, 24. Februar 2019 15:41
> *An:* volkszaehler-users at demo.volkszaehler.org
> *Betreff:* WG: Zählerwechsel (optische Schnittstelle)
>
>
>
> Hallo zusammen,
>
>
>
> ich habe gerade die Email an das bayerwerk geschickt, da die ich folgendes
> Problem mit der übertragenen Leistung über die Info Schnittstelle habe.
>
>
>
> Habe ich irgendwo einen Denkfehler? Auch wenn das PHP Skript nicht von
> volkszähler.org <http://xn--volkszhler-v5a.org> ist, der SML Datenstrom
> ist doch das selbe. Interpretiere ich den SML Datenstrom falsch?
>
>
>
> Wenn ich über die PV Einspeise, sollte die Leistung negativ übertragen
> werden. Wenn ich beziehe, wird die Leistung positiv übertragen. Im Prinzip
> funktioniert dies schon, allerdings wird die Leistung positiv übertragen,
> wenn sich die Leistung in einem Bereich von 0W bis ca. -135W. Ab -140W
> (also A- Lieferung) wird auch -140W übertragen, bzw. ein Wert mit
> Vorzeichen. 140W Toleranz kann doch auch nicht sein oder?
>
>
>
> Auszug aus der Email ans Bayernwerk:
>
> wie besprochen hier die verschiedenen Beispiele SML Log <-> tatsächliche
> Anzeige der Leistung am Iskra MT691. Die Obis Kennzahlen 1.8.0 und 2.8.0 in
> kWh werden korrekt übermittelt. Nur die übertragene Leistung macht
> Probleme.
>
> Die Logdateien können z. B. mit Notepad++ geöffnet werden. Notepad++
> stellt die Zeilenumbrüche korrekt dar.
>
>
>
> Die SML Protokollbeschreibung ist zu finden unter
> https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile&v=2.
> Die Methode „GetListResponse“ ist auf Seite 36 beschrieben.
>
>
>
> *Übersicht:*
>
> 1. Beispiel, fehlerhaft. Zähler zeigt 90W Lieferung (A-) an: Im
> empfangenen SML Protokoll wird aber +164W ausgegeben. Logdatei 90W A-.log‘.
>
> 2. Beispiel, fehlerhaft. Zähler zeigt 130 W Lieferung (A-), also -130W
> an: Im empfangenen SML Protokoll wird aber +130W ausgegeben. Logdatei 130W
> A-.log‘.
>
> 3. Beispiel, okay. Zähler zeigt 140 W Lieferung (A-), also -140W an: Im
> empfangenen SML Protokoll wird -140  ausgegeben. Logdatei 140W A-.log‘.
>
> 4. Beispiel, okay. Zähler zeigt 28W Bezug (A+), also +28 W an: Im
> empfangenen SML Protokoll wird auch 28W ausgegeben. Logdatei 30 W A+.log‘.
>
>
>
> *Fazit: Zähler überträgt bis ca. -130W Lieferung positive Werte. Ab ca.
> -140W Lieferung, werden die korrekten Werte übertragen. Positive Leistung
> (A+) wird aber auch im niedrigerem Leistungsbereich <100W korrekt
> übertragen. Siehe dazu Beispiel 4. *
>
>
>
> 1. Beispiel: Zähler zeigt 90W Lieferung (A-) an: Im empfangenen SML
> Protokoll wird aber +164W ausgegeben. Logdatei 90W A-.log‘.
>
>
>
>
> http://bildhost.unter-limit.de/archiv.php?bild=366&bild_name=90alogI6SFT.jpg
>
>
>
> 77              => 7x = Liste, x7 = Liste mit 7 Einträgen
>
> 070100100700FF  => 07 = Länge in Bytes,  0100100700FF OBIS Kennzahl =>
> 16.7.0 = Gesamtwirkleistung
>
> 01             => Status: ohne Wert bzw. 01=optional
>
> 01             => ValTime: ohne Wert bzw. 01=optional
>
> 62 1B           => 6x xx = unsigned Integer, x2 xx = Länge 2 Byte, xx 1B =
> Unit: 1B = 27dez = Watt
>
> 52 00           => 5x xx = Integer, x2 xx = Länge 2 Byte, xx 00 = Scaler:
> 0 à 10^0 = 1
>
> 52 A4           => Value: 5x xx = Integer, x2 xx = Länge 2 Byte, Value A4
> hex = 164 dez (entspricht +164 Watt)
>
> 01             => ValueSignature: ohne Werte bzw. 01=optional
>
>
>
> Obwohl der Zähler 90W Lieferung (A-) anzeigt, wird über das SML Protokoll
> +164 Watt vom Zähler geschickt.
>
>
>
> http://bildhost.unter-limit.de/archiv.php?bild=361&bild_name=90wa10X6A.jpg
>
>
>
>
>
> 2. Beispiel: Zähler zeigt 130 W Lieferung (A-), also -130W an: Im
> empfangenen SML Protokoll wird aber +130W ausgegeben. Logdatei 130W
> A-.log‘.
>
>
>
>
> http://bildhost.unter-limit.de/archiv.php?bild=367&bild_name=130alog061K2.jpg
>
>
>
> 77              => 7x = Liste, x7 = Liste mit 7 Einträgen
>
> 070100100700FF  => 07 = Länge in Bytes,  0100100700FF OBIS Kennzahl =>
> 16.7.0 = Gesamtwirkleistung
>
> 01             => Status: ohne Wert bzw. 01=optional
>
> 01             => ValTime: ohne Wert bzw. 01=optional
>
> 62 1B           => 6x xx = unsigned Integer, x2 xx = Länge 2 Byte, xx 1B =
> Unit: 1B = 27dez = Watt
>
> 52 00           => 5x xx = Integer, x2 xx = Länge 2 Byte, xx 00 = Scaler:
> 0 à 10^0 = 1
>
> 52 82           => Value: 5x xx = Integer, x2 xx = Länge 2 Byte, Value 84
> hex = 130 dez (entspricht +130 Watt)
>
> 01                         => ValueSignature: ohne Werte bzw. 01=optional
>
>
>
> http://bildhost.unter-limit.de/archiv.php?bild=362&bild_name=130waEBVR7.jpg
>
>
>
>
>
> 3. Beispiel: Zähler zeigt 140 W Lieferung (A-), also -140W an: Im
> empfangenen SML Protokoll wird -140  ausgegeben. Logdatei 140W A-.log‘.
>
>
>
>
> http://bildhost.unter-limit.de/archiv.php?bild=368&bild_name=140alogBYTTI.jpg
>
>
>
> 77              => 7x = Liste, x7 = Liste mit 7 Einträgen
>
> 070100100700FF  => 07 = Länge in Bytes,  0100100700FF OBIS Kennzahl =>
> 16.7.0 = Gesamtwirkleistung
>
> 01             => Status: ohne Wert bzw. 01=optional
>
> 01             => ValTime: ohne Wert bzw. 01=optional
>
> 62 1B           => 6x xx = unsigned Integer, x2 xx = Länge 2 Byte, xx 1B =
> Unit: 1B = 27dez = Watt
>
> 52 00           => 5x xx = Integer, x2 xx = Länge 2 Byte, xx 00 = Scaler:
> 0 à 10^0 = 1
>
> 53 FF 74        => Value: 5x xx xx = Integer, x3 xx xx = Länge 3 Byte,
> Value FF 74 hex = 65396 dez (16bit entsprechen 65536, 65396 – 65536 = -140
> Watt)
>
> 01              => ValueSignature: ohne Werte bzw. 01=optional
>
>
>
> http://bildhost.unter-limit.de/archiv.php?bild=363&bild_name=140waLS9OG.jpg
>
>
>
>
>
> 4. Beispiel: Zähler zeigt 28W Bezug (A+), also +28 W an: Im empfangenen
> SML Protokoll wird auch 28W ausgegeben. Logdatei 30 W A+.log‘.
>
>
>
>
> http://bildhost.unter-limit.de/archiv.php?bild=365&bild_name=30alogSA09T.jpg
>
>
>
> 77              => 7x = Liste, x7 = Liste mit 7 Einträgen
>
> 070100100700FF  => 07 = Länge in Bytes,  0100100700FF OBIS Kennzahl =>
> 16.7.0 = Gesamtwirkleistung
>
> 01             => Status: ohne Wert bzw. 01=optional
>
> 01             => ValTime: ohne Wert bzw. 01=optional
>
> 62 1B           => 6x xx = unsigned Integer, x2 xx = Länge 2 Byte, xx 1B =
> Unit: 1B = 27dez = Watt
>
> 52 00           => 5x xx = Integer, x2 xx = Länge 2 Byte, xx 00 = Scaler:
> 0 à 10^0 = 1
>
> 52 1C           => Value: 5x xx = Integer, x2 xx xx = Länge 2 Byte, Value
> 1C hex = 28 dez (entspricht +28 Watt)
>
> 01              => ValueSignature: ohne Werte bzw. 01=optional
>
>
>
> http://bildhost.unter-limit.de/archiv.php?bild=364&bild_name=30waHMPKM.jpg
>
>
>
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20190308/8d3cec55/attachment-0001.html>


More information about the volkszaehler-users mailing list