Neues Plugin: Smartmeter - Stromzähler auslesen

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • whe
    Smart Home'r
    • 18.10.2018
    • 32

    Bin leider nicht so sehr fit in PHP.
    könnte man nicht den alten case in einen else Zweig packen und erreichen, dass alle unsigned integer, wie bisher behandelt werden.

    Kommentar

    • blacksun
      MS Profi
      • 20.01.2016
      • 557

      Guckst du hier. Da steht nix von Länge 56.

      If Else geht da eher nicht, da über das 2er Komplement das Vorzeichen beachtet wird. Sonst wird wieder kein negativer Wert ausgegeben. So wars ja schonmal :-)

      Was machen wir da jetzt. Kann man denn pauschal sagen, das wenn 56 geschickt wird, immer 5 x die 0 kommt? Vermutlich nicht oder? Hab mir grad dein Telegramm vom vorherigen Post angeschaut. Da werden auch Werte übertragen mit Länge 56, allerdings sind diese immer Positive, da Obis 1.8.0, 1.8.1 usw. als kWh. Die können nicht negativ Werten :-), müsste also somit mit dem neuen Code, siehe weiter unten, funktionieren.

      Ich kann PHP auch nicht wirklich. Da habe ich ewig lang gebastelt daran.

      Ich habe wegen deinem Problem, jetzt auch mal eine Email an EMH geschrieben. Mal sehen, was die dazu sagen. Ist ja nicht korrekt.

      Probiere das mal so. Ersetze die Function parse_sml_data

      Code:
      private function parse_sml_data($list_item=0) {
              global $list_indent;
              $TYPE_LEN = $this->read(1);
              if($TYPE_LEN=='00') {
                  return $TYPE_LEN; # EndOfSmlMessage
              }
              $TYPE = $TYPE_LEN{0}.'x';     # only high-nibble
              $LEN  = hexdec($TYPE_LEN{1}); # only low-nibble
              while($TYPE{0} &0x8) {  # Multi-Byte TypeLen-Field
                  $LEN = $LEN * 0x10;
                  $TYPE_LEN = $this->read(1);
                  $TYPE = $TYPE_LEN{0}.'x';     # only high-nibble
                  $LEN  += hexdec($TYPE_LEN{1}); # only low-nibble
                  $LEN--; # 1 abziehen wegen zusätzlichem TL-Byte
              }
              if($LEN==1) return;
              switch($TYPE) {
                  case '0x': # Octet
                      #return $this->hex2bin($this->read($LEN-1));
                      return $this->read($LEN-1);
                      break;
                  case '5x': # Integer
                      if ($LEN==2) {
                          # 8 Bit signed Integer
                          $temp = hexdec($this->read($LEN-1));
                          $this->debug('Value: ('.$temp.')');
                          if($temp & 0x80) {
                              # negativer Wert, Umrechnung 2er Komplement    
                              $temp -= pow(2,8); # 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) {
                              # negativer Wert, Umrechnung 2er Komplement    
                              $temp -= pow(2,16); # 65536
                              $this->debug('Value mit Vorzeichenbetrachtung: ('.$temp.')');
                              return $temp;
                          }
                          else{
                              return $temp;
                          }
                      }
                      if ($LEN==5) {
                          # 32 Bit signed Integer
                          $temp = hexdec($this->read($LEN-1));
                          $this->debug('Value Rohwert: ('.$temp.')');
                          if($temp & 0x80000000) {
                              # negativer Wert, Umrechnung 2er Komplement    
                              $temp -= pow(2,32); # 4294967296
                              $this->debug('Value mit Vorzeichenbetrachtung: ('.$temp.')');
                              return $temp;
                          }
                          else{
                              return $temp;
                          }
                      }
                      if ($LEN==6) {
                          # Eigenart von ED300L Zähler
                          $temp = hexdec($this->read($LEN-1));
                          $this->debug('Value Rohwert: ('.$temp.')');
                          return $temp;
                      }
                      if ($LEN==9) {
                          # 64 Bit signed Integer
                          $temp = hexdec($this->read($LEN-1));
                          $this->debug('Value Rohwert: ('.$temp.')');
                          if($temp & 0x8000000000000000) {
                              # negativer Wert, Umrechnung 2er Komplement    
                              $temp -= pow(2,64); # 18446744073709551616
                              $this->debug('Value mit Vorzeichenbetrachtung: ('.$temp.')');
                              return $temp;
                          }
                          else{
                              return $temp;
                          }
                      }
                      break;
                  case '6x': # UnsignedInt
                      return hexdec($this->read($LEN-1));
                      break;
                  case '7x': # List
                      $list_indent++;
                      for($i=1;$i<=$LEN;$i++) $this->parse_sml_data($i);
                      $list_indent--;
                      break;
                  default :
                      $this->error("Error, unexpected type '$TYPE' TL=$TYPE_LEN ".$this->data);
              }
              #echo "\n";
              return $TYPE_LEN;
          }
      Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 12.png Ansichten: 0 Größe: 31,9 KB ID: 210081
      Angehängte Dateien
      Zuletzt geändert von blacksun; 19.08.2019, 23:02.

      Kommentar

      • whe
        Smart Home'r
        • 18.10.2018
        • 32

        vielen Dank für Deine Aufwände; als Rentner habe ich ja auch Zeit und bei dem aktuellen Wetter kann ich ja auch mal üben.
        das SML Protokoll habe ich jetzt auch mal auseinander dividiert. Der EMH Zähler liefert nur die OBIS Werte: 1.8.0, 2.8.0 1.8.1, 2.8.1, 1.8.2, 2.8.2 ( alle positive, da kWh ) und halt 1.7.0.
        bei 1.7.0 halt positive und negative Werte je nachdem ob Bezug oder Einspeisung.
        da kann ich mir sicher jetzte eine eigene Lösung nur für diesen Zähler bauen, da muss ich aber bei jedem update des plugins selber nachbessern.

        ich schaue mal, ob ich irgendwo eine allgemeine Lösung finde.

        wenn's funktioniert, poste ich es natürlich hier.

        ist halt schwierig zu testen für mich, da ich die Installation nicht vor Ort habe.
        Zuletzt geändert von whe; 20.08.2019, 07:34.

        Kommentar

        • blacksun
          MS Profi
          • 20.01.2016
          • 557

          Schau bitte mal, ob’s so jetzt läuft. Ich habe heute schon eine Nachricht von emh bekommen. Allerdings geben sie mir direkt keine Antwort, wegen besonderem vertraglichen Verhältnis mit ihren Kunden. Man müsste sich jetzt an eueren Netzbetreiber wenden, der wiederum wendet sich an EMH.

          Wäre ja vermutlich nicht weiter schlimm, wenn man die LEN=6 Abfrage fest mit einbaut, sodass beim Updaten keine Probleme entstehen.

          Kommentar

          • whe
            Smart Home'r
            • 18.10.2018
            • 32

            OK,

            dann fahre ich noch mal zu meiner Tochter und teste.
            so wird es dann wohl funktionieren.
            mit meinem Netzbetreiber hatte ich auch schon kommuniziert, der ist sehr unbeweglich.

            Kommentar

            • whe
              Smart Home'r
              • 18.10.2018
              • 32

              Der Parser scheint jetzt zu funktionieren, gibt keine Fehlermeldungen mehr.
              allerdings erscheint kein Wert bei 1.70 auf der XML Seite.
              wo werden denn die Werte übertragen ?

              Kommentar

              • blacksun
                MS Profi
                • 20.01.2016
                • 557

                Okay, schick mir bitte nochmal diese fetch Datei. Ich glaube mich zu erinnern, das noch ein Fehler drin war, wenn der zu übertragene Wert negativ ist. Kann aber wieder gegen 23:00 nach schauen, da ich jetzt arbeiten muss.

                Also ich hatte mit dem Netzbetreiber bayernwerk sehr gute Erfahrung gemacht, allerdings erst als ich auch jemanden am Telefon hatte, der auch zuständig war. Hotline war furchtbar. Am besten mit jemanden vom Messstellenbetrieb verbinden lassen.

                Zuletzt geändert von blacksun; 20.08.2019, 11:32.

                Kommentar

                • whe
                  Smart Home'r
                  • 18.10.2018
                  • 32

                  Code:
                  [LEFT][COLOR=#000000][FONT=Consolas]D306MJCW:Last_Update:2019-08-20 21:01:33
                  D306MJCW:Last_UpdateLoxEpoche:335566893
                  D306MJCW:Consumption_Total_OBIS_1.8.0:1663.5825
                  D306MJCW:Consumption_Tarif1_OBIS_1.8.1:1663.5825
                  D306MJCW:Consumption_Tarif2_OBIS_1.8.2:0
                  D306MJCW:Consumption_Tarif3_OBIS_1.8.3:
                  D306MJCW:Consumption_Tarif4_OBIS_1.8.4:
                  D306MJCW:Consumption_Tarif5_OBIS_1.8.5:
                  D306MJCW:Consumption_Tarif6_OBIS_1.8.6:
                  D306MJCW:Consumption_Tarif7_OBIS_1.8.7:
                  D306MJCW:Consumption_Tarif8_OBIS_1.8.8:
                  D306MJCW:Consumption_Tarif9_OBIS_1.8.9:
                  D306MJCW:Consumption_CalculatedPower_OBIS_1.99.0:0.1532
                  D306MJCW:Consumption_Power_OBIS_1.7.0:
                  D306MJCW:Delivery_Total_OBIS_2.8.0:
                  D306MJCW:Delivery_Tarif1_OBIS_2.8.1:3615.5785
                  D306MJCW:Delivery_Tarif2_OBIS_2.8.2:0
                  D306MJCW:Delivery_Tarif3_OBIS_2.8.3:
                  D306MJCW:Delivery_Tarif4_OBIS_2.8.4:
                  D306MJCW:Delivery_Tarif5_OBIS_2.8.5:
                  D306MJCW:Delivery_Tarif6_OBIS_2.8.6:
                  D306MJCW:Delivery_Tarif7_OBIS_2.8.7:
                  D306MJCW:Delivery_Tarif8_OBIS_2.8.8:
                  D306MJCW:Delivery_Tarif9_OBIS_2.8.9:
                  D306MJCW:Delivery_CalculatedPower_OBIS_2.99.0:0.0000
                  D306MJCW:Delivery_Power_OBIS_2.7.0:
                  D306MJCW:Total_Power_OBIS_15.7.0:
                  D306MJCW:Total_Power_OBIS_16.7.0:1.881
                  #EOF[/FONT][/COLOR][/LEFT]
                  Angehängte Dateien

                  Kommentar

                  • blacksun
                    MS Profi
                    • 20.01.2016
                    • 557

                    Schau ganz unten, 16.7.0:1881 Watt

                    Kommentar

                    • whe
                      Smart Home'r
                      • 18.10.2018
                      • 32

                      aber wieso steht denn da OBIS_16.7.0
                      das habe ich nirgendwo in den Spezifikationen gefunden.
                      ich würde das bei OBIS_1.7.0 erwarten und dann als negativen Wert.
                      wo wird denn das Zeugs in diese XML Datei geschoben ?
                      und wie und wo kann ich mal das DEBUG log einschalten um zu sehen was wo passiert.

                      der aktuelle Bezug erscheint bei 1.99.0 hier würde ich dann die 1.881 Wat entspr. bei 2.99.0 erwarten.
                      ich frage mich, was denn nun die "Norm" ist ?

                      und wo es zu dem Plugin eine Dokumentation gibt, wie ich mit den Daten umgehen soll.

                      Kommentar

                      • whe
                        Smart Home'r
                        • 18.10.2018
                        • 32

                        In der XML Datei steht:
                        D306MJCW:Total_Power_OBIS_16.7.0:1.881
                        das ist zwar neu, aber auf keinen Fall die aktuelle Einspeisung nach der ich suche.
                        im LOG erscheint oben: 1-0:16.7.0*255(2.847*kW)

                        das passt doch alles vorne unf hinten nicht zusammen.

                        im Datenstrom des Zählers finde ich aber (im log oben ) "5500000752" das bedeutet für mich: aktueller Bezug 752 Watt und erscheint im XML File als:
                        OBIS_1.99.0:0.1532
                        das passt; heute Mittag, wurde eingespeist, dieser Wert erscheint weiterhin nicht.

                        Kommentar

                        • blacksun
                          MS Profi
                          • 20.01.2016
                          • 557

                          Servus,

                          warum die Ausgabe nicht bei 1.7.0 kommt weiß ich nicht, warum das so gemacht worden ist. Die "Umwandlung" von 1.7.0 in 16.7.0 erfolgt gleich am Anfang des Skriptes im Array.

                          Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 12.png Ansichten: 0 Größe: 43,7 KB ID: 210288

                          Die Ausgabe von 1874 Watt ist korrekt, da 5500000752 bedeutet 5x=signed Integer, x5=Länge 5 Byte, und 752hex sind umgerechnet in Dezimal 1874.

                          Obis 1.99.0 ist nix offizielles vermutlich, die Zahl wurde vom Programmierer festgelegt. 1.99.0 und 2.99.0 sind vom Skript berechnete Werte, deshalb steht auch Calculated dabei. Im Prinzip funktioniert das so, Skript merkt sich bei der ersten Abfrage die kWh und die Zeit, bei der nächsten Abfrage rechnet das Skript die Differenz der beiden kWh und die Zeitdifferenz um in Watt. Deshalb Calculated, fall ein Zähler mal keine Leistung über OBIS ausgibt. Und das einmal für Bezug und einmal für Lieferung.

                          Beispiel von mir:
                          Code:
                          015A98CB:Consumption_CalculatedPower_OBIS_1.99.0:0 .0000
                          015A98CB:Delivery_CalculatedPower_OBIS_2.99.0:4.1891;
                          D.h. ich liefere momentan 4189,1 Watt.

                          Ich schicke die Daten dann über UDP an meinen Miniserver. Was meinst du genau mit XML. Entweder man holt die Daten per http ab oder man schickt die Daten per UDP wegW
                          Du musst darauf achten, die gleichen Logfiles zum gleichen Zeitpunkt zu betrachten bzw. zu kopieren. Die Leistung kann ja schwanken, dann vergleichst du evtl. zwei verschiedene Zeitpunkte. Das einzige Problem, was ich jetzt noch sehe, da bei einem negativen Wert 16.7.0, also Einspeisung, der negative Wert nicht angezeigt wird. Aber das könntest vorab nochmal testen, da ich mir nicht mehr 100% sicher bin. Aber ich glaube, ich an noch einer Stelle was ändern müssen.

                          Die Debug Funktion kann man in der Function Debug ein- und ausschalten. Dazu muss das return; mit # auskommentiert werden. Aber erhoffe Dir davon nicht zu viel. Da müsstest schon selber an den Stellen Code einfügen mit der Variablenangaben, damit hier auch das gewünschte ausgegeben wird.

                          Klicke auf die Grafik für eine vergrößerte Ansicht

Name: 13.png
Ansichten: 577
Größe: 10,8 KB
ID: 210289

                          Frage den Zähler nochmal ab, wenn eingespeist wird und schicke mir alle Logfiles.
                          Zuletzt geändert von blacksun; 21.08.2019, 10:22.

                          Kommentar

                          • whe
                            Smart Home'r
                            • 18.10.2018
                            • 32

                            vorhin habe ich noch ein paar Tests gemacht, die Ergebnisse stelle ich gleich hier ein.

                            was bei uns in 16.7.0 ankommt ist undefinierbar, die Werte sind nicht logisch.
                            ich habe zwei Tests gemacht, einmal mit Bezug und einmal mit Einspeisung.

                            im XML kommt manchmal nichts und manchmal etwas undefinierbares in 16.7.0 an.
                            die anderen Werte sind alle O.K. lediglich bei "Einspeisung" habe ich immer noch keine brauchbare Lösung.

                            später mehr.

                            Kommentar

                            • whe
                              Smart Home'r
                              • 18.10.2018
                              • 32

                              hier die Anlagen vom Test heute Mittag.
                              ich schaue da nochmal selber rein und teste mal mit dem debugger.
                              ( ich nutze nicht UPD sondern HTTP ) deshalb kann ich mir den HTTP Request ( XML ) anschauen.
                              ich befürchte, dass es bei der Umsetzung der negativen Zahlen noch ein Problem gibt.
                              Angehängte Dateien

                              Kommentar

                              • whe
                                Smart Home'r
                                • 18.10.2018
                                • 32

                                ich glaube ich habe jetzt das Problem erkannt.
                                der Debugger hat schon geholfen.
                                es wird kein Wert geliefert, bei 1.7.0 oder 2.7.0 wenn Strom eingespeist wird, deshalb kommt da auch nichts.
                                jetzt muss ich noch mal den String untersuchen, ob der Wert, den ich auf dem Zähler als Einspeisewert ablesen kann, irgendwo erscheint. und dann diesen nehmen.
                                was unter 16.7.0 geliefert wird, kann ich noch nicht einschätzen;
                                aber wir kommen dem Problem jetzt näher.
                                Angehängte Dateien

                                Kommentar

                                Lädt...