Ankündigung

Einklappen
Keine Ankündigung bisher.

SMA Energy Meter (SMA EM) auslesen per Multicast und Lieferung an edomi

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] SMA Energy Meter (SMA EM) auslesen per Multicast und Lieferung an edomi

    Hallo allerseits,

    wer ein SMA Energymeter hat, konnte vermutlich bisher nicht an die per Multicast gelieferten Daten gelangen. In Bezug auf zwei andere Threats hier und hier und mit einem PDF von SMA mit der Protokoll-Doku ("EMETER-Protokoll-TI-de-10.pdf") und ein paar Infos anderen Seiten im www habe ich nun eine lauffähige Lösung, die am Ende überraschend einfach war. Insgesamt war ich mit dem SMA EM schon zuvor zufrieden, denn damit arbeitet meine Batterielösung (SMA sunny Island + home manager) wirklich ordentlich. Mit einer iphone-App konnte ich bereits recht lange auf die Multicast-Daten zugreifen und so nutzen. Sehr hohe Liefer-Frequenz und sehr umfangreich (rund 58 Messwerte). Nun auch in edomi...

    Mein aktueller Stand:
    • Ein PHP-Script auf meinem Server, dass die Multicast-Daten vom SMA EM liest, lesbar aufbereitet und an edomi per http-API sendet. Das Script kann parametrisiert aufgerufen werden, um den Ausgabeumfang zu wählen: Grunddaten, Phasensummen, Einzelphasen. Für die Summen und Phasen kann noch gewählt werden P, S, Q, U, I cos phi, damit man nur das benötigte zu edomi sendet. Für P, S, Q wird neben dem momentan Wert auch der kumulierte Wert/Zählerstand geliefert. SMA nutzt zur Identifikation der gelieferten Messwerte die OBIS-Identifier - die meisten kennen sicher 1 oder 2 davon: "180" und "280", wenn man die Zählerstände (Wirkarbeit) von seinem Zähler abliest. Das Script erwartet beim Aufruf auch einen Parameter mit der Laufzeit in Minuten.
    • Das Script wird per cron alle 15 Minuten aufgerufen mit einem Laufzeitparameter 15 Minuten. Damit sollte der Prozess robust und verlässlich sein (auch nach reboot, etc)
    • In edomi 5 KO für Grunddaten, Summen und die 4 Phasen. Die Daten kommen in die KO als String mit ;-Trennung. Werden dann per LBS auf Ziel-KO verteilt. Technisch wird die http-API verwendet (Siehe edomi Hilfe zu lesendem und schreibendem Fernzugriff).
    • Die Sendefrequenz des Scripts kann aus edomi heraus über ein 6. KO jederzeit (alle 15 Sekunden) gesteuert werden; in edomi muss das KO in Millisekunden angegeben werden, d.h. "1000" für 1 sek oder "60000" für minütlich. So kann man die Frequenz im Normalfall z.B. auf 5 Sekunden reduzieren, doch wenn man eine Visu-Seite mit Verbrauchsdaten aufruft kann die Frequenz auf 1sek oder noch weniger gesenkt werden bis zur Maximal-Lieferrate des SMA EM.
    • Die 6 KO muss für Fernzugriff freigeschaltet sein.

    Die Lösung scheint mir hinreichend flexibel und verlässlich, ohne sonderlich Ressourcen zu fressen: Die Datenqualität scheint wirklich gut, auf dem Linux-NUC ist das Script als Last nahezu nicht messbar, in edomi ist bei einer Sendefrequenz von 2-3 Sekunden auch wenig zu spüren. Bei sekündlicher Lieferung steigt die Last nur durch die Lieferung reproduzierbar um 1-2% (edomi-NUC).
    Voraussetzung ist hier eine andere Linux-Umgebung mit einer höheren Version als edomi. Es gibt sicher verschienden Wege dafür (anderer Linux-Server, VM, ggf. auch auf edomi mit einer zusätzlich(!) installierten höheren PHP-Version,...). Die verwendete Multicast-Lösung geht nicht mit der edomi-PHP-Version 5.3.3! (siehe oben 1. Link auf Threat)

    Ich lass' das mal ein paar Tage so laufen. Das Script ist sicher keine Schönheit und (zu) wenig Fehlerprüfung, aber es ist zweckdienlich und bis jetzt problemlos. Schöner geht natürlich immer... Vielleicht kann es jemand gebrauchen oder sieht Verbesserungspotential.

    Viel Spaß bei eigenen Lösungen damit!
    Carsten

    PHP-Code:
    <?php
       $len 
    700 ;                 // sind rund 600 Bytes
       
    $flags ;
       
    $from "" ;
       
    $adress "239.12.255.254";  // Multicast IP
       
    $port 9522 ;               // Multicast Port
       
    $targetAPI "http://<edomi-IP>/remote/?login=remote&pass=remote";   // an eigenen User/PW anpassen: remote/remote ist default)
       
    $targetKO = array("1388","1389","1390","1393","1394"); // Header, Summen, Phase 1, Phase 2, Phase 3
       
    $sleepKO "1395";
       
    $sleep_old 0;   // should always be zero!

       // Ausgabe-Umfang
       
    $options getopt("r:t::p::");
       
    $runtime $options["r"]; // Run time until stop [min]
       
    $type $options["t"];    // Select types of needed output values
       
    $part $options["p"];    // Select the output parts
       
    if ($runtime===false) { $runtime 60; }
       if (
    $type=="") {
         
    $type 'PU';  // P=Wirkleistung,Q=Blindleistung,S=Scheinleistung,I=Strom,U=Spoannung,C=cos phi
       
    }
       if (
    $part=="") {
         
    $part 'SL';  // H=Header,S=Summen,L=Phasen,v=verbose=lokale Ausgabe
       
    }
       echo 
    "Read SMA Energymeter ->  Runtime [min]: ".$runtime " | Type: "$type " | Part:" $part;

       
    // OBIS Parameter
       
    $list_sum = array();
       
    $list_sum[ ] = array('OBIS' => "0140",'type'=>'P','search' => "00010400",'len' => 4,'divisor' => 10);
       
    $list_sum[ ] = array('OBIS' => "0180",'type'=>'P','search' => "00010800",'len' => 8,'divisor' => 3600000);
       
    $list_sum[ ] = array('OBIS' => "0240",'type'=>'P','search' => "00020400",'len' => 4,'divisor' => 10);
       
    $list_sum[ ] = array('OBIS' => "0280",'type'=>'P','search' => "00020800",'len' => 8,'divisor' => 3600000);
       
    $list_sum[ ] = array('OBIS' => "0340",'type'=>'Q','search' => "00030400",'len' => 4,'divisor' => 10);
       
    $list_sum[ ] = array('OBIS' => "0380",'type'=>'Q','search' => "00030800",'len' => 8,'divisor' => 3600000);
       
    $list_sum[ ] = array('OBIS' => "0440",'type'=>'Q','search' => "00040400",'len' => 4,'divisor' => 10);
       
    $list_sum[ ] = array('OBIS' => "0480",'type'=>'Q','search' => "00040800",'len' => 8,'divisor' => 3600000);
       
    $list_sum[ ] = array('OBIS' => "0940",'type'=>'S','search' => "00090400",'len' => 4,'divisor' => 10);
       
    $list_sum[ ] = array('OBIS' => "0980",'type'=>'S','search' => "00090800",'len' => 8,'divisor' => 3600000);
       
    $list_sum[ ] = array('OBIS' => "1040",'type'=>'S','search' => "000a0400",'len' => 4,'divisor' => 10);
       
    $list_sum[ ] = array('OBIS' => "1080",'type'=>'S','search' => "000a0800",'len' => 8,'divisor' => 3600000);
       
    $list_sum[ ] = array('OBIS' => "1340",'type'=>'C','search' => "000d0400",'len' => 4,'divisor' => 1000);

       
    $list_l = array();
       
    $list_l[ ] = array('OBIS' => "2140",'type'=>'P','search' => "00150400",'len' => 4,'divisor' => 10);
       
    $list_l[ ] = array('OBIS' => "2180",'type'=>'P','search' => "00150800",'len' => 8,'divisor' => 3600000);
       
    $list_l[ ] = array('OBIS' => "2240",'type'=>'P','search' => "00160400",'len' => 4,'divisor' => 10);
       
    $list_l[ ] = array('OBIS' => "2280",'type'=>'P','search' => "00160800",'len' => 8,'divisor' => 3600000);
       
    $list_l[ ] = array('OBIS' => "2340",'type'=>'Q','search' => "00170400",'len' => 4,'divisor' => 10);
       
    $list_l[ ] = array('OBIS' => "2380",'type'=>'Q','search' => "00170800",'len' => 8,'divisor' => 3600000);
       
    $list_l[ ] = array('OBIS' => "2440",'type'=>'Q','search' => "00180400",'len' => 4,'divisor' => 10);
       
    $list_l[ ] = array('OBIS' => "2480",'type'=>'Q','search' => "00180800",'len' => 8,'divisor' => 3600000);
       
    $list_l[ ] = array('OBIS' => "2940",'type'=>'S','search' => "001d0400",'len' => 4,'divisor' => 10);
       
    $list_l[ ] = array('OBIS' => "2980",'type'=>'S','search' => "001d0800",'len' => 8,'divisor' => 3600000);
       
    $list_l[ ] = array('OBIS' => "3040",'type'=>'S','search' => "001e0400",'len' => 4,'divisor' => 10);
       
    $list_l[ ] = array('OBIS' => "3080",'type'=>'S','search' => "001e0800",'len' => 8,'divisor' => 3600000);
       
    $list_l[ ] = array('OBIS' => "3140",'type'=>'I','search' => "001f0400",'len' => 4,'divisor' => 1);
       
    $list_l[ ] = array('OBIS' => "3240",'type'=>'U','search' => "00200400",'len' => 4,'divisor' => 1000);
       
    $list_l[ ] = array('OBIS' => "3340",'type'=>'C','search' => "00210400",'len' => 4,'divisor' => 1000);

       
    // Listen to Multicast
       
    $grpparms = array("group"=>$adress,"interface"=>0) ;
       
    $socket socket_create(AF_INETSOCK_DGRAMSOL_UDP);
       
    socket_bind($socket,0,$port);
       
    socket_set_option($socket,IPPROTO_IP,MCAST_JOIN_GROUP,$grpparms);

       
    // Process loop for a defined runtime only...
       
    $time_end time() - + ( $runtime 60 );
       
    $time_sleep time();

     while (
    time()<$time_end) {
       
    socket_recvfrom($socket,$raw,$len,$flags,$from,$port);

       
    // Prepare data
       
    $hraw bin2hex($raw);
       
    $hraw_head substr($hraw,0,56);
       
    $hraw_sum substr($hraw,56,256);
       
    $hraw_l substr($hraw,312);

       
    // Header
       
    if (strpos($part,'H')!==false) {
         
    $res_head[1] = base_convert(substr($hraw_head,40,8),16,10);   // Zähler
         
    $res_head[2] = base_convert(substr($hraw_head,48,8),16,10);   // Ticker
         
    $url_data $targetAPI."&koid=".$targetKO[0]."&kovalue=".implode(';',$res_head);
         
    $handle fopen($url_data"r");
       }

       
    // Summen
       
    if (strpos($part,'S')!==false) {
         
    $i=0;
         foreach (
    $list_sum as &$record) {
           
    $i++;
           
    $res_sum[$i] = '';
           if (
    strpos($type,$record['type'])===false) { continue; }
           
    $pos strpos($hraw_sum,$record['search'])+8;
           if (
    $pos !== false) { $res_sum[$i] = base_convert(substr($hraw_sum,$pos,$record['len']*2),16,10) / $record['divisor']; }
         }
         
    $url_data $targetAPI."&koid=".$targetKO[1]."&kovalue=".implode(';',$res_sum);
         
    $handle fopen($url_data"r");
         if (
    strpos($part,'v')!==false) { print_r($res_sum); }
       }

       
    // Phasen
       
    if (strpos($part,'L')!==false) {
         
    $i=0;
         foreach (
    $list_l as &$record) {
           
    $i++;
           
    $res_l1[$i] = '';
           
    $res_l2[$i] = '';
           
    $res_l3[$i] = '';
           if (
    strpos($type,$record['type'])===false) { continue; }
           
    // L1
           
    $pos strpos($hraw_l,$record['search'])+8;
           if (
    $pos !== false) { $res_l1[$i] = base_convert(substr($hraw_l,$pos,$record['len']*2),16,10) / $record['divisor']; }
           
    // L2
           
    $tmp str_split($record['search'], 2);
           
    $tmp[1] = base_convert(base_convert(substr($record['search'],2,2),16,10)+20,10,16);  // transpose for L2
           
    $search implode('',$tmp);
           
    $pos strpos($hraw_l,$search)+8;
           if (
    $pos !== false) { $res_l2[$i] = base_convert(substr($hraw_l,$pos,$record['len']*2),16,10) / $record['divisor']; }
           else { 
    $res_l2[$i] = ''; }
           
    // L3
           
    $tmp str_split($record['search'], 2);
           
    $tmp[1] = base_convert(base_convert(substr($record['search'],2,2),16,10)+40,10,16);  // transpose for L3
           
    $search implode('',$tmp);
           
    $pos strpos($hraw_l,$search)+8;
           if (
    $pos !== false) { $res_l3[$i] = base_convert(substr($hraw_l,$pos,$record['len']*2),16,10) / $record['divisor']; }
           else { 
    $res_l3[$i] = ''; }
        }
        
    $url_data $targetAPI."&koid=".$targetKO[2]."&kovalue=".implode(';',$res_l1);
        
    $handle fopen($url_data"r");
        
    $url_data $targetAPI."&koid=".$targetKO[3]."&kovalue=".implode(';',$res_l2);
        
    $handle fopen($url_data"r");
        
    $url_data $targetAPI."&koid=".$targetKO[4]."&kovalue=".implode(';',$res_l3);
        
    $handle fopen($url_data"r");

        if (
    strpos($part,'v')!==false) { print_r($res_l1); print_r($res_l2); print_r($res_l3); }
      }

      
    // get sleeptime = change frequence from edomi
      
    if (time()>=$time_sleep) {
        
    $time_sleep $time_sleep 15;   // get frequence every x seconds only
        
    $url_data $targetAPI."&koid=".$sleepKO;
        
    $handle fopen($url_data"r");
        
    $value fread($handle6);
        if (
    is_numeric($value)) {
          
    $sleep intval($value);
        } else {
          
    $sleep 3000;  // as default
        
    }
        if (
    $sleep!=$sleep_old) {
         echo 
    " | Frequence [ms]: ".$sleep;
         
    $sleep_old $sleep;
        }
      }
      
    usleep(1000*$sleep);       // keep CPU cold...
    }
    socket_close($socket);
    echo 
    " -> done!\n";
    ?>
    der Crontab-Eintrag
    Code:
    1,16,31,46 * * * * root php /usr/local/bin/read_sma_energymeter_multicast.php -r15 -tPU -pSL > /dev/null 2> /dev/null
    Zuletzt geändert von saegefisch; 18.01.2017, 03:23.

    #2
    Anmerkung zu den OBIS-Codes und an alle, die Smart-Meter oder andere Geräte auslesen: Für eine langfristig bessere Vergleichbarkeit (z.B. wenn man später mal ein Gerät austauschen muss/will) wäre es vielleicht ratsam, wenn LBS/Codings Ausgabewerte mit dem passenden OBIS-Codes ergänzt oder die Ausgänge entsprechend genannt werden. Dann kann der Wechsel in Logiken einfacher und verlässlicher erfolgen.

    Und wie ich heute bei Wikipedia heraus fand: OBIS-Kennzahlen gibt es abseits elektrischer Energie auch für die eindeutige Identifikation von thermischen Größen (z.B. Gas, Wasser, Wärme). Wäre also auch für LBS zur Gasmengenermittlung oder die Benennung der eigenen Datenarchiven interessant.

    Summen/Gesamt:
    1.4.0: Wirkleistung Bezug (Watt) | 1.8.0: Wirkarbeit Bezug (kWh)
    2.4.0: Wirkleistung Einspeisung (Watt) | 2.8.0: Wirkarbeit Einspeisung (kWh)
    3.4.0/3.8.0: Blind... Bezug
    4.4.0/4.8.0: Blind... Einspeisung
    9.4.0/9.8.0: Schein... Bezug
    10.4.0/10.8.0: Schein... Einspeisung
    13.4.0: Leistungsfaktor (cos phi)
    Phase L1: (wie oben, aber mit Messwert-Index +20)
    21.4.0:...
    ...
    31.4.0: Strom
    32.4.0: Spannung
    33.4.0: Leistungsfaktor
    Phase L2: (wie oben, aber mit Messwert-Index +40)
    Phase L3: (wie oben, aber mit Messwert-Index +60)
    61.4.0:...
    ...
    73.4.0:...

    Kommentar


      #3
      Nachtrag nach 14 Tage Nutzung: Bislang völlig stabil ohne Ausfälle. Ich werde unverändert bei der Lösung bleiben.

      Neben dem SMA EM dürfte die Lösung für jeden Art von Multicast (in Anlehnung) eine Lösung sein, solange edomi angesichts der PHP-Version hier noch nicht direkt empfangen kann (ohne Umwege).

      Danke an alle, die mich in den beiden oben genannten Threads dazu inspiriert und motiviert haben.

      Kommentar


        #4
        Hallo Carsten,
        der Script funktioniert ausgezeichnet.
        Wenn ich aber Edomi neu starte bleibt immer ein Prozess übrig. Bis zum nächsten Aufruf von cron gibt es dann keine Daten mehr ab dann funktioniert es wieder, aber ich habe einen weiteren Prozess.
        PHP-Code:
        root@tk-lamp-Datenbank ~# ps alx | grep sma
        4     0 11889 11888  20   0   4336   756 wait   Ss   ?          0:00 /bin/sh -c php /home/sma-energy-meter/sma-edomi.php -r15 -tPUI -pSL  > /dev/null 2> /dev/null
        0     0 11890 11889  20   0 222628 18260 skb_re S    
        ?          0:00 php /home/sma-energy-meter/sma-edomi.php -r15 -tPUI -pSL
        4     0 12306 12305  20   0   4336   756 wait   Ss   
        ?          0:00 /bin/sh -c php /home/sma-energy-meter/sma-edomi.php -r15 -tPUI -pSL  > /dev/null 2> /dev/null
        0     0 12307 12306  20   0 222628 18292 skb_re S    
        ?          0:00 php /home/sma-energy-meter/sma-edomi.php -r15 -tPUI -pSL
        4     0 12846 12845  20   0   4336   768 wait   Ss   
        ?          0:00 /bin/sh -c php /home/sma-energy-meter/sma-edomi.php -r15 -tPUI -pSL  > /dev/null 2> /dev/null
        0     0 12847 12846  20   0 222628 18272 skb_re S    
        ?          0:00 php /home/sma-energy-meter/sma-edomi.php -r15 -tPUI -pSL
        4     0 13170 13169  20   0   4336   804 wait   Ss   
        ?          0:00 /bin/sh -c php /home/sma-energy-meter/sma-edomi.php -r15 -tPUI -pSL  > /dev/null 2> /dev/null
        0     0 13171 13170  20   0 222628 18564 skb_re S    
        ?          0:00 php /home/sma-energy-meter/sma-edomi.php -r15 -tPUI -pSL 
        Was könnte ich dagegen tun?

        Hartmut

        Kommentar


          #5
          Hi Hartmut,

          ich freue mich, dass es bei Dir auch funktioniert. Bei mir läuft es weiterhin wunderbar und liefert mir tatsächlich sehr verlässlich die Daten im 1s-Takt.

          Dein Hinweis habe ich geprüft und bei mir liefert ps das gleiche Bild. Es sei mal dahin gestellt, warum sich da zwei Prozesse ergeben (ich weiß es schlicht auch nicht), aber viel mehr sorgt mich, dass da nicht 2 sind, sondern ganz viele. Nach meinem Verständnis zeigt ps die laufenden Prozesse und ich muss annehmen, dass ich die Prozess wohl nicht wirklich sauber beende. Leider ist das WE schon für mich vorbei und kann das erst kommendes WE mal analysieren.

          Beruhigend: die stehen alle auf "S" = schlafend und zeigen TIME 0:00. Ich töte damit wohl den Server nicht, aber die Zahl der laufenden Prozesse scheint mir dringend zu klären, denn nach 15min sollte der letzte sich beenden, und der nächste startet per cron.

          Mein erster Schritt wäre, die Ausgabe nicht ins NULL laufen zu lassen, sondern in ein Log. Dann kann man sehen, ob am Ende jeweils "done!" erscheint.
          Zweiter Schritt wäre die Klärung, wie ich einen per cron aufgerufenen PHP-Prozess sauber beende - da scheine ich noch Defizite zu haben... <schäm>

          Danach würde ich hoffen, dass ps dann nur noch genau 2 Prozesse für SMA zeigt. Wie gesagt: Warum es zwei sind - keine Ahnung. Aber das scheint mir prinzipbedingt.

          VG,
          Carsten

          Kommentar


            #6
            Hallo Carsten,
            ich habe mal ein wenig gelesen, wahrscheinlich fehlt nur ein exit(); an Ende. Ich habe das mal eingefügt und werde es beobachten,
            Grüße
            Hartmut

            Kommentar


              #7
              hartmut : War bei Dir exit(); die Lösung, um die Prozesse sauber zu beenden? Oder hast Du es anders hin bekommen? Komme leider erst jetzt dazu...

              Kommentar


                #8
                Ich weis es nicht mehr ob es so funktioniert hat, ich lese die Daten zur Zeit alle 10 sek mit einem Raspberry C++ Programm aus und trage diese Werte in eine extra Mysql Datenbank ein. Diese liegt auf einem virtuellem Laufwerk. Edomi ruft dann dort bei Bedarf die Daten ab. Diese Datenbank enthält auch die anderen Werte der Photovoltaik.

                Kommentar


                  #9
                  Ah, danke für Deine Rückmeldung. Dann muss ich da noch mal selber ran und testen, warum sich die PHP-Scripte trotz exit(); nicht sauber beenden.

                  Auch eine schöne Lösung, aber mir geht es weniger um die Historie, sondern um hochfrequente aktuelle Werte, die in der edomi-Visu gepusht werden (man sieht sofort, wenn man Licht an macht...). Ach, es gibt so viele Optionen...

                  Kommentar


                    #10
                    Hallo Namensvetter,

                    ich bin jetzt kein Softwerker der mit Bits und Bytes per Du ist, trotzdem läuft bei mir SQL-Datenbank mit PHP und Html, JPGraph, Apple- und Pythonskript nach wüster Editiererei zuverlässig und macht unterm Strich was es soll. Ich kann per Knopfdruck alle relevanten Werte auslesen, je nach Gerät in die jeweilige Datenbank speichern, per Skript wieder auslesen, aufbereiten und in Excel ausarbeiten für die Steuererklärung.
                    Meinen Wechselrichtern und dem Batteriespeicher entlocke ich seit kurzem mit PHPModbus relevante Daten. Mit etwas Fummelei ging das super.

                    Nach längerer Suche nach einem klugen Helferlein bin ich auf deinen Beitrag aufmerksam geworden. Ich bin derzeit auf der Suche nach einer Möglichkeit meinem SmartMeter einige Infos zu entlocken - am liebsten per PHP und SQL.
                    Das läuft gut auf dem NAS und ist erst mal geräteunabhängig.

                    Wo ich aber offen gesagt dran verzweifle ist die Handhabung von Deinem PHP-Skript.

                    Ich habe es auf meinem NAS liegen und kann es aufrufen. Das Skript läuft auch fehlerfrei durch - zeigt nur nichts an...

                    Das einzige was angezeigt wird ist :

                    Read SMA Energymeter -> Runtime [min]: | Type: PU | Part:SL -> done!

                    Was wird hier normalerweise angezeigt?
                    Würde mir ggf weiterhelfen

                    In der Variable $targetAPI gibst du eine Edomi-IP an.

                    Sowas nutze ich nicht, da keine Hausautomation.

                    Was genau wird an diese Adresse geschickt, gibt es da eine Kommunikation in zwei Richtungen oder wird nur eine Datenzeile dahin verfrachtet?

                    Sind das klare Werte ala, 1200 Watt auf Phase 1 oder ist das ein HEX-Wert der noch umgerechnet werden muss?
                    Irgendwo habe ich was von Trennung per ";" gelesen... dass köööönnnte auf ne Zeile wie z.B. .csv für Excel hinweisen...

                    Du schreibst dass das Skript parametrisiert aufgerufen werden kann/muss?
                    (was meinst du damit genau?)

                    Ich machs kurz...

                    Was muss ich tun damit ich einfach nur eine echo-Ausgabe bekomme?

                    Ich möchte mal über einige Tage den Tagesgang unseres Stromverbrauches loggen. Sprich den Strombezug/Einspeisung über die einzelnen Phasen.

                    Wenn mir das gelingt und ich mit Cron auch im reinen bin kann ich die Werte in die SQL-DB schicken (zb alle 5 Minuten) und die Werte per JPGraph als HTML ausgeben


                    Huff... soviel zum ersten Eintrag in diesem Forum

                    Grüsse

                    Carsten

                    Kommentar


                      #11
                      Hallo Namensvetter,

                      ich habe mich jetzt mal gefühlte 1000 Stunden Stunden mit Dokus, Links aus diesem und zig anderen Foren und immer wieder mit Deinem Programm beschäftigt. Ganz durchgestiegen bin ich nicht, aber ich habe es am Laufen - zumindest mit dem Teil (Ergebnis) der für mich relevant ist.

                      Da ich nicht nur nehme sondern auch gebe (nur davon leben Foren) stelle ich mein Ergebnis mit dem Grossteil Deiner Arbeit, umgemünzt auf die reine Ausgabe über PHP allen Suchenden zur Verfügung:

                      PHP-Code:

                      <?php
                      // OBIS Parameter, diese werden irgendwie zur Berechnung der Ausgabewerte gebraucht
                         
                      $list_sum = array();
                         
                      $list_sum[ ] = array('OBIS' => "0140",'type'=>'P','search' => "00010400",'len' => 4,'divisor' => 10);
                         
                      $list_sum[ ] = array('OBIS' => "0180",'type'=>'P','search' => "00010800",'len' => 8,'divisor' => 3600000);
                         
                      $list_sum[ ] = array('OBIS' => "0240",'type'=>'P','search' => "00020400",'len' => 4,'divisor' => 10);
                         
                      $list_sum[ ] = array('OBIS' => "0280",'type'=>'P','search' => "00020800",'len' => 8,'divisor' => 3600000);
                         
                      $list_sum[ ] = array('OBIS' => "0340",'type'=>'Q','search' => "00030400",'len' => 4,'divisor' => 10);
                         
                      $list_sum[ ] = array('OBIS' => "0380",'type'=>'Q','search' => "00030800",'len' => 8,'divisor' => 3600000);
                         
                      $list_sum[ ] = array('OBIS' => "0440",'type'=>'Q','search' => "00040400",'len' => 4,'divisor' => 10);
                         
                      $list_sum[ ] = array('OBIS' => "0480",'type'=>'Q','search' => "00040800",'len' => 8,'divisor' => 3600000);
                         
                      $list_sum[ ] = array('OBIS' => "0940",'type'=>'S','search' => "00090400",'len' => 4,'divisor' => 10);
                         
                      $list_sum[ ] = array('OBIS' => "0980",'type'=>'S','search' => "00090800",'len' => 8,'divisor' => 3600000);
                         
                      $list_sum[ ] = array('OBIS' => "1040",'type'=>'S','search' => "000a0400",'len' => 4,'divisor' => 10);
                         
                      $list_sum[ ] = array('OBIS' => "1080",'type'=>'S','search' => "000a0800",'len' => 8,'divisor' => 3600000);
                         
                      $list_sum[ ] = array('OBIS' => "1340",'type'=>'C','search' => "000d0400",'len' => 4,'divisor' => 1000);

                         
                      $list_l = array();
                         
                      $list_l[ ] = array('OBIS' => "2140",'type'=>'P','search' => "00150400",'len' => 4,'divisor' => 10);
                         
                      $list_l[ ] = array('OBIS' => "2180",'type'=>'P','search' => "00150800",'len' => 8,'divisor' => 3600000);
                         
                      $list_l[ ] = array('OBIS' => "2240",'type'=>'P','search' => "00160400",'len' => 4,'divisor' => 10);
                         
                      $list_l[ ] = array('OBIS' => "2280",'type'=>'P','search' => "00160800",'len' => 8,'divisor' => 3600000);
                         
                      $list_l[ ] = array('OBIS' => "2340",'type'=>'Q','search' => "00170400",'len' => 4,'divisor' => 10);
                         
                      $list_l[ ] = array('OBIS' => "2380",'type'=>'Q','search' => "00170800",'len' => 8,'divisor' => 3600000);
                         
                      $list_l[ ] = array('OBIS' => "2440",'type'=>'Q','search' => "00180400",'len' => 4,'divisor' => 10);
                         
                      $list_l[ ] = array('OBIS' => "2480",'type'=>'Q','search' => "00180800",'len' => 8,'divisor' => 3600000);
                         
                      $list_l[ ] = array('OBIS' => "2940",'type'=>'S','search' => "001d0400",'len' => 4,'divisor' => 10);
                         
                      $list_l[ ] = array('OBIS' => "2980",'type'=>'S','search' => "001d0800",'len' => 8,'divisor' => 3600000);
                         
                      $list_l[ ] = array('OBIS' => "3040",'type'=>'S','search' => "001e0400",'len' => 4,'divisor' => 10);
                         
                      $list_l[ ] = array('OBIS' => "3080",'type'=>'S','search' => "001e0800",'len' => 8,'divisor' => 3600000);
                         
                      $list_l[ ] = array('OBIS' => "3140",'type'=>'I','search' => "001f0400",'len' => 4,'divisor' => 1);
                         
                      $list_l[ ] = array('OBIS' => "3240",'type'=>'U','search' => "00200400",'len' => 4,'divisor' => 1000);
                         
                      $list_l[ ] = array('OBIS' => "3340",'type'=>'C','search' => "00210400",'len' => 4,'divisor' => 1000);

                         
                      // Horchen nach 600 Zeichen Multicast
                         
                      $len 600 //Empfang eines Datensatzes mit 600 Byte Länge, Soviel gib SMA EM von sich
                         
                      $flags ;
                         
                      $from "" ;
                         
                      $adress "239.12.255.254"//Das ist die MultiCast IP auf die das SMA EM "sendet"
                         
                      $port 9522 // Port auf dem gelauscht wird
                         
                      $grpparms = array("group"=>$adress,"interface"=>0) ;  // hier werden die relevanten Sockets zusammengestellt
                         
                      $socket socket_create(AF_INETSOCK_DGRAMSOL_UDP); // Einzelerklärungen lassen sich gut im Netz nachlesen
                         
                      socket_bind($socket,"0.0.0.0",$port);
                         
                      socket_set_option($socket,IPPROTO_IP,MCAST_JOIN_GROUP,$grpparms);
                         
                      socket_recvfrom($socket,$raw,$len,$flags,$from,$port); // der empfangene Datensatz wird in Variable $raw geschrieben

                         
                      echo "Der Datenwust kommt von IP : " $from // Ausgabe des Empfangenen Strings. Nur zur Veranschaulichung
                         
                      echo "<br />";
                         echo 
                      "...und sieht nach Zerlegung in 3 Datenteilen zur Berechnung von Header/Gesamt/Einzelphasen so aus : ";
                         echo 
                      "<br />";

                      // Aufbereiten der Daten, von HEX nach Bin, sowie Happenpappen erstellen
                         
                      $hraw bin2hex($raw);  // String von Hex nach Bin umwandeln,
                         
                      $hraw_head substr($hraw,"0","56"); // Aufteilung in Teilstück vom 1. - 56. Zeichen
                         
                      $hraw_sum substr($hraw,"56","256"); // analog wie oben, nur von 56.-256. 
                         
                      $hraw_l substr($hraw,"312");  // hattamascho

                      // Hier erfolgt die Ausgabe der Teilstücke des empfangenen Strings. Diese Stücke werden für die Weiterverarbeitung gebraucht
                      echo "<br />";
                      echo 
                      $hraw_head;
                      echo 
                      "<br />";
                      echo 
                      $hraw_sum;
                      echo 
                      "<br />";
                      echo 
                      $hraw_l;
                      echo 
                      "<br />";
                      echo 
                      "<br />";

                       
                      // Dieses Fragment setzt die Variablen $type und $part auf den Wert PU und SL. Wird hier eigentlich nicht (mehr) benötigt
                         
                      if ($type=="") {
                           
                      $type 'PU';  // P=Wirkleistung,Q=Blindleistung,S=Scheinleistung,I=Strom,U=Spannung,C=cos phi
                         
                      }
                         if (
                      $part=="") {
                           
                      $part 'SL';  // H=Header,S=Summen,L=Phasen,v=verbose=lokale Ausgabe
                         
                      }

                         
                      // Berechnung der Summenwerte L1,L2,L3 unter Anwendung der Liste ganz oben und setzen der Werte in ein Array, gespeichert in $res_sum
                       
                      if (strpos($part,'S')!==false) {
                           
                      $i=0;
                           foreach (
                      $list_sum as &$record) {
                             
                      $i++;
                             
                      $res_sum[$i] = '';
                             if (
                      strpos($type,$record['type'])===false) { continue; }
                             
                      $pos strpos($hraw_sum,$record['search'])+8;
                             if (
                      $pos !== false) { $res_sum[$i] = base_convert(substr($hraw_sum,$pos,$record['len']*2),16,10) / $record['divisor']; }
                           }

                          }


                           
                      // Wie oben nur für die Einzelphansen, setzen der Werte in ein Array, gespeichert in $res_l1/l2/l3
                         
                      if (strpos($part,'L')!==false) {
                           
                      $i=0;
                           foreach (
                      $list_l as &$record) {
                             
                      $i++;
                             
                      $res_l1[$i] = '';
                             
                      $res_l2[$i] = '';
                             
                      $res_l3[$i] = '';
                             if (
                      strpos($type,$record['type'])===false) { continue; }
                             
                      // L1
                             
                      $pos strpos($hraw_l,$record['search'])+8;
                             if (
                      $pos !== false) { $res_l1[$i] = base_convert(substr($hraw_l,$pos,$record['len']*2),16,10) / $record['divisor']; }
                             
                      // L2
                             
                      $tmp str_split($record['search'], 2);
                             
                      $tmp[1] = base_convert(base_convert(substr($record['search'],2,2),16,10)+20,10,16);  // transpose for L2
                             
                      $search implode('',$tmp);
                             
                      $pos strpos($hraw_l,$search)+8;
                             if (
                      $pos !== false) { $res_l2[$i] = base_convert(substr($hraw_l,$pos,$record['len']*2),16,10) / $record['divisor']; }
                             else { 
                      $res_l2[$i] = ''; }
                             
                      // L3
                             
                      $tmp str_split($record['search'], 2);
                             
                      $tmp[1] = base_convert(base_convert(substr($record['search'],2,2),16,10)+40,10,16);  // transpose for L3
                             
                      $search implode('',$tmp);
                             
                      $pos strpos($hraw_l,$search)+8;
                             if (
                      $pos !== false) { $res_l3[$i] = base_convert(substr($hraw_l,$pos,$record['len']*2),16,10) / $record['divisor']; }
                             else { 
                      $res_l3[$i] = ''; }
                          }
                             
                      //Ausgabe der ermittelten Werte. 
                             // Mit "echo implode('---',$res_......;" wird das gesamte AusgabeArray von sum/l1/l2/l3 angezeigt, der 1. Wert im Array ist Bezug, der 3. Wert Einspeisung in Watt. Die anderen Werte konnte cih bisher nicht zuordnen

                             
                      $heute date("Y-m-d H:i:s"); // Setzen des aktuellen Datums mit Uhrzeit (SystemUhrZeit des PHP-Servers) in $heute
                             
                      echo "Empfangen am : " .$heute// Ausgabe dient nur zur Kontrolle
                             
                      echo "<br />";
                             echo 
                      "<br />";
                             echo 
                      "Strombezug (Summe) von L1/L2/L3 : " .$res_sum[1]. " Watt"// Ausgabe der ersten Wertes im Array $res_sum = Bezug aus Netz 
                             
                      echo "<br />";
                             echo 
                      "<br />";
                             echo 
                      "Strombezug von L1 : " .$res_l1[1]. " Watt"// Wie $res_sum nur für Phase 1
                             
                      echo "<br />";
                             echo 
                      "Strombezug von L2 : " .$res_l2[1]. " Watt"// selbsterklärend
                             
                      echo "<br />";
                             echo 
                      "Strombezug von L3 : " .$res_l3[1]. " Watt"//....
                             
                      echo "<br />";
                             echo 
                      "<br />";
                             echo 
                      "<br />";
                             echo 
                      "Einspeisung gesamt : " .$res_sum[3]. " Watt"// Ausgabe der dritten Wertes im Array $res_sum = Einspeisung ins Netz 
                             
                      echo "<br />";
                             echo 
                      "<br />";
                             echo 
                      "Einspeisung L1 : " .$res_l1[3]. " Watt";
                             echo 
                      "<br />";
                             echo 
                      "Einspeisung L2 : " .$res_l2[3]. " Watt";
                             echo 
                      "<br />";
                             echo 
                      "Einspeisung L3 : " .$res_l3[3]. " Watt";
                             echo 
                      "<br />";

                         }
                      ?>
                      Das ist eine gute Basis die man nun mit css und anderem Zauber auf seine eigenen Dinge ummünzen kann. Ich schreibe diese Werte in eine Datenbank die Werte für die grafische Darstellung des Tagesgangs sammelt.

                      An dieser Stelle vielen Dank für die tolle Arbeit.

                      Wenn bei mir mal mehr Hausautomation als Funkdimmer Einzug hält komme ich gerne wieder

                      Grüsse
                      Carsten

                      Kommentar


                        #12
                        Ich habe die anderen Werte auch mal auseinandergedöselt und gebe sie hiermit weiter.

                        Der Code ist etwas aufgeräumter und hoffentlich was verständlicher die einige hinzugekommene Kommentare

                        PHP-Code:
                        <meta http-equiv="content-type" content="text/html; charset=utf-8">
                        <?php

                            
                        // Dieses Fragment setzt die Variablen $type und $part und dient zur Auswahl der anzuzeigenden Parameter,Mehrfachauswahl jeweils möglich
                            //HIER ERFOLGT DIE AUSWAHL DER ANZUZEIGENDEN PARAMETER

                           
                        if ($type=="") {  // Auswahl der Datentypen, MEHRFACHAUSWAHL MÖGLICH
                             
                        $type 'PIU';  // P=Wirkleistung,Q=Blindleistung,S=Scheinleistung,I=Strom,U=Spannung,C=cos phi
                           
                        }
                           if (
                        $part=="") {   // Auswahl ob Header, Summen oder die Phasen angezeigt werden
                             
                        $part 'HSL';  // H=Header,S=Summen,L=Phasen, MEHRFACHAUSWAHL MÖGLICH, BEI NICHTWAHL VON H,S,L WIRD ENTSPRECH DIE AUSGABE ALS ABGEWÄHLT GEKENNZEICHNET
                           
                        }

                                       
                        // OBIS Parameter, diese werden zur Berechnung der Ausgabewerte gebraucht
                                       
                        $list_sum = array();
                                       
                        $list_sum[ ] = array('OBIS' => "0140",'type'=>'P','search' => "00010400",'len' => 4,'divisor' => 10);
                                       
                        $list_sum[ ] = array('OBIS' => "0180",'type'=>'P','search' => "00010800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_sum[ ] = array('OBIS' => "0240",'type'=>'P','search' => "00020400",'len' => 4,'divisor' => 10);
                                       
                        $list_sum[ ] = array('OBIS' => "0280",'type'=>'P','search' => "00020800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_sum[ ] = array('OBIS' => "0340",'type'=>'Q','search' => "00030400",'len' => 4,'divisor' => 10);
                                       
                        $list_sum[ ] = array('OBIS' => "0380",'type'=>'Q','search' => "00030800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_sum[ ] = array('OBIS' => "0440",'type'=>'Q','search' => "00040400",'len' => 4,'divisor' => 10);
                                       
                        $list_sum[ ] = array('OBIS' => "0480",'type'=>'Q','search' => "00040800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_sum[ ] = array('OBIS' => "0940",'type'=>'S','search' => "00090400",'len' => 4,'divisor' => 10);
                                       
                        $list_sum[ ] = array('OBIS' => "0980",'type'=>'S','search' => "00090800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_sum[ ] = array('OBIS' => "1040",'type'=>'S','search' => "000a0400",'len' => 4,'divisor' => 10);
                                       
                        $list_sum[ ] = array('OBIS' => "1080",'type'=>'S','search' => "000a0800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_sum[ ] = array('OBIS' => "1340",'type'=>'C','search' => "000d0400",'len' => 4,'divisor' => 1000);


                                       
                        $list_l = array();
                                       
                        $list_l[ ] = array('OBIS' => "2140",'type'=>'P','search' => "00150400",'len' => 4,'divisor' => 10);
                                       
                        $list_l[ ] = array('OBIS' => "2180",'type'=>'P','search' => "00150800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_l[ ] = array('OBIS' => "2240",'type'=>'P','search' => "00160400",'len' => 4,'divisor' => 10);
                                       
                        $list_l[ ] = array('OBIS' => "2280",'type'=>'P','search' => "00160800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_l[ ] = array('OBIS' => "2340",'type'=>'Q','search' => "00170400",'len' => 4,'divisor' => 10);
                                       
                        $list_l[ ] = array('OBIS' => "2380",'type'=>'Q','search' => "00170800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_l[ ] = array('OBIS' => "2440",'type'=>'Q','search' => "00180400",'len' => 4,'divisor' => 10);
                                       
                        $list_l[ ] = array('OBIS' => "2480",'type'=>'Q','search' => "00180800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_l[ ] = array('OBIS' => "2940",'type'=>'S','search' => "001d0400",'len' => 4,'divisor' => 10);
                                       
                        $list_l[ ] = array('OBIS' => "2980",'type'=>'S','search' => "001d0800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_l[ ] = array('OBIS' => "3040",'type'=>'S','search' => "001e0400",'len' => 4,'divisor' => 10);
                                       
                        $list_l[ ] = array('OBIS' => "3080",'type'=>'S','search' => "001e0800",'len' => 8,'divisor' => 3600000);
                                       
                        $list_l[ ] = array('OBIS' => "3140",'type'=>'I','search' => "001f0400",'len' => 4,'divisor' => 1);
                                       
                        $list_l[ ] = array('OBIS' => "3240",'type'=>'U','search' => "00200400",'len' => 4,'divisor' => 1000);
                                       
                        $list_l[ ] = array('OBIS' => "3340",'type'=>'C','search' => "00210400",'len' => 4,'divisor' => 1000);

                                               
                        // Horchen nach 600 Zeichen Multicast
                                               
                        $len 600 //Empfang eines Datensatzes mit 600 Byte Länge, Soviel gib SMA EM von sich
                                               
                        $flags ;
                                               
                        $from "" ;
                                               
                        $adress "239.12.255.254"//Das ist die MultiCast IP auf die das SMA EM "sendet"
                                               
                        $port 9522 // Port auf dem gelauscht wird
                                               
                        $grpparms = array("group"=>$adress,"interface"=>0) ;  // hier werden die relevanten Sockets zusammengestellt
                                               
                        $socket socket_create(AF_INETSOCK_DGRAMSOL_UDP); // Einzelerklärungen lassen sich gut im Netz nachlesen
                                               
                        socket_bind($socket,"0.0.0.0",$port);
                                               
                        socket_set_option($socket,IPPROTO_IP,MCAST_JOIN_GROUP,$grpparms);
                                               
                        socket_recvfrom($socket,$raw,$len,$flags,$from,$port); // der empfangene Datensatz wird in Variable $raw geschrieben

                                               
                        echo "Der Datenwust kommt von IP : " $from // Ausgabe des Empfangenen Strings. Nur zur Veranschaulichung
                                               
                        echo "<br />";
                                               echo 
                        "...und sieht nach Zerlegung in 3 Datenteilen zur Berechnung von Header/Gesamt/Einzelphasen so aus : ";
                                               echo 
                        "<br />";

                                               
                        // Aufbereiten der Daten, von HEX nach Bin, sowie Happenpappen erstellen
                                               
                        $hraw bin2hex($raw);  // String von Hex nach Bin umwandeln,
                                               
                        $hraw_head substr($hraw,"0","56"); // Aufteilung in Teilstück vom 1. - 56. Zeichen
                                               
                        $hraw_sum substr($hraw,"56","256"); // analog wie oben, nur von 56.-256. 
                                               
                        $hraw_l substr($hraw,"312");  // hattamascho

                                                // Hier erfolgt zunächst mal die Ausgabe der Teilstücke des empfangenen Strings. Diese Stücke werden für die Weiterverarbeitung gebraucht
                                                
                        echo "<br />";
                                                echo 
                        $hraw_head;
                                                echo 
                        "<br />";
                                                echo 
                        $hraw_sum;
                                                echo 
                        "<br />";
                                                echo 
                        $hraw_l;
                                                echo 
                        "<br />";
                                                echo 
                        "<br />";


                         
                        // Header
                        if (strpos($part,'H')!==false) {
                         
                        $res_head[1] = base_convert(substr($hraw_head,40,8),16,10);   // Zähler
                         
                        $res_head[2] = base_convert(substr($hraw_head,48,8),16,10);   // Ticker
                        } else
                        {
                         
                        $res_head[1] = "Header ist nicht ausgewählt";   // Zähler
                         
                        $res_head[2] = " ";   // Ticker
                        }
                               

                                 
                        // Berechnung der Summenwerte L1,L2,L3 unter Anwendung der Liste ganz oben und setzen der Werte in ein Array, gespeichert in $res_sum
                                 
                        if (strpos($part,'S')!==false) {
                                     
                        $i=0;
                                     foreach (
                        $list_sum as &$record) {
                                       
                        $i++;
                                       
                        $res_sum[$i] = '';
                                       if (
                        strpos($type,$record['type'])===false) { continue; }
                                       
                        $pos strpos($hraw_sum,$record['search'])+8;
                                       if (
                        $pos !== false) { $res_sum[$i] = base_convert(substr($hraw_sum,$pos,$record['len']*2),16,10) / $record['divisor']; }
                                     }
                                    }else
                                    {
                                     
                        $res_sum[1] = "Summenwerte sind nicht ausgewählt";  
                                   }
                                     
                        // Wie oben nur für die Einzelphasen, setzen der Werte in ein Array, gespeichert in $res_l1/l2/l3
                                   
                        if (strpos($part,'L')!==false) {
                                     
                        $i=0;
                                     foreach (
                        $list_l as &$record) {
                                       
                        $i++;
                                       
                        $res_l1[$i] = '';
                                       
                        $res_l2[$i] = '';
                                       
                        $res_l3[$i] = '';
                                       if (
                        strpos($type,$record['type'])===false) { continue; }
                                       
                        // L1
                                       
                        $pos strpos($hraw_l,$record['search'])+8;
                                       if (
                        $pos !== false) { $res_l1[$i] = base_convert(substr($hraw_l,$pos,$record['len']*2),16,10) / $record['divisor']; }
                                       
                        // L2
                                       
                        $tmp str_split($record['search'], 2);
                                       
                        $tmp[1] = base_convert(base_convert(substr($record['search'],2,2),16,10)+20,10,16);  // transpose for L2
                                       
                        $search implode('',$tmp);
                                       
                        $pos strpos($hraw_l,$search)+8;
                                       if (
                        $pos !== false) { $res_l2[$i] = base_convert(substr($hraw_l,$pos,$record['len']*2),16,10) / $record['divisor']; }
                                       else { 
                        $res_l2[$i] = ''; }
                                       
                        // L3
                                       
                        $tmp str_split($record['search'], 2);
                                       
                        $tmp[1] = base_convert(base_convert(substr($record['search'],2,2),16,10)+40,10,16);  // transpose for L3
                                       
                        $search implode('',$tmp);
                                       
                        $pos strpos($hraw_l,$search)+8;
                                       if (
                        $pos !== false) { $res_l3[$i] = base_convert(substr($hraw_l,$pos,$record['len']*2),16,10) / $record['divisor']; }
                                       else { 
                        $res_l3[$i] = ''; }
                                    }
                                                 }else
                                    {
                                     
                        $res_l1[2] = "Einzelphasen sind nicht ausgewählt"//Setze Zelle 2 im Array mit Text 
                                     
                        $res_l2[2] = "Einzelphasen sind nicht ausgewählt";
                                     
                        $res_l3[2] = "Einzelphasen sind nicht ausgewählt";
                                   }

                        //BERMERKUNG
                        //Ausgabe der ermittelten Werte. 
                        // Mit "echo implode('---',$res_X);" wird das gesamte AusgabeArray von sum/l1/l2/l3 angezeigt und die Werte mit --- getrennt

                               
                        $heute date("Y-m-d H:i:s"); // Setzen des aktuellen Datums mit Uhrzeit (SystemUhrZeit des PHP-Servers) in $heute
                               
                        echo "Empfangen am : " .$heute// Ausgabe dient nur zur Kontrolle
                               
                        echo "<br />";
                               echo 
                        "<br />";
                               echo 
                        "Spannung L1 : " .$res_l1[14]. " Volt"//Zelle 14 trägt den Wert der Spannung
                               
                        echo "<br />";
                               echo 
                        "Spannung L2 : " .$res_l2[14]. " Volt";
                               echo 
                        "<br />";
                               echo 
                        "Spannung L3 : " .$res_l3[14]. " Volt";
                               echo 
                        "<br />";
                               echo 
                        "<br />";
                               echo 
                        "Strombezug (Summe) von L1/L2/L3 : " .$res_sum[1]. " Watt"// Ausgabe der ersten Wertes im Array $res_sum = Bezug aus Netz 
                               
                        echo "<br />";
                               echo 
                        "<br />";
                               echo 
                        "Strombezug von L1 : " .$res_l1[1]. " Watt"// Wie $res_sum nur für Phase 1
                               
                        echo "<br />";
                               echo 
                        "Strombezug von L2 : " .$res_l2[1]. " Watt"// selbsterklärend
                               
                        echo "<br />";
                               echo 
                        "Strombezug von L3 : " .$res_l3[1]. " Watt"//....
                               
                        echo "<br />";
                               echo 
                        "<br />";
                               echo 
                        "<br />";
                               echo 
                        "Einspeisung gesamt : " .$res_sum[3]. " Watt"// Ausgabe der dritten Wertes im Array $res_sum = Einspeisung ins Netz 
                               
                        echo "<br />";
                               echo 
                        "<br />";
                               echo 
                        "Einspeisung L1 : " .$res_l1[3]. " Watt"//Zelle 3 trägt den Wert der Einspeisung in Watt
                               
                        echo "<br />";
                               echo 
                        "Einspeisung L2 : " .$res_l2[3]. " Watt";
                               echo 
                        "<br />";
                               echo 
                        "Einspeisung L3 : " .$res_l3[3]. " Watt";
                               echo 
                        "<br />";
                               echo 
                        "<br />";
                               echo 
                        "<br />";
                               echo 
                        "Alles Weitere was man dem SMA EM entlocken kann :";
                               echo 
                        "<br />";
                               echo 
                        "<br />";
                               echo 
                        "Header : " .implode(' --- ',$res_head);
                               echo 
                        "<br />";
                               echo 
                        "Summenwerte L1-L3 : " .implode(' --- ',$res_sum);
                               echo 
                        "<br />";
                               echo 
                        "Werte L1 : " .implode(' --- ',$res_l1);
                               echo 
                        "<br />";
                               echo 
                        "Werte L2 : " .implode(' --- ',$res_l2);
                               echo 
                        "<br />";
                               echo 
                        "Werte L3 : " .implode(' --- ',$res_l3);
                               echo 
                        "<br />";
                               echo 
                        "<br />";
                               echo 
                        "Das Array Header besteht aus zwei Zellen"."<br />";
                               echo 
                        "<br />";
                               echo 
                        "Z1 : GeräteID"."<br />";
                               echo 
                        "Z2 : Zähler in ms, alle 115 Tage und 8 Stunden bei Null";
                               echo 
                        "<br />";
                               echo 
                        "<br />";
                               echo 
                        "Das Array Summe besteht aus 13 Zellen"."<br />";
                               echo 
                        "<br />";
                               echo 
                        "Z1 : Wirkleistung Bezug aktuell in W"."<br />";
                               echo 
                        "Z2 : Bezug in kWh"."<br />";
                               echo 
                        "Z3 : Wirkleistung Einspeisung in Watt"."<br />";
                               echo 
                        "Z4 : Einspeisung in kWh"."<br />";
                               echo 
                        "Z5 : Blindleistung Bezug aktuell in var"."<br />";
                               echo 
                        "Z6 : Blindleistung in varh"."<br />";
                               echo 
                        "Z7 : Blindleistung Einspeisung aktuell in var"."<br />";
                               echo 
                        "Z8 : Blindleistung Einspeisung in varh"."<br />";
                               echo 
                        "Z9 : Scheinleistung Bezug aktuell in VA"."<br />";
                               echo 
                        "Z10 : Scheinarbeit Bezug in VAh"."<br />"
                               echo 
                        "Z11 : Scheinleistung Einspeisung"."<br />";
                               echo 
                        "Z12 : Scheinarbeit Einspeisung in VAh"."<br />";
                               echo 
                        "Z13 : aktueller Leistungsfaktor cos phi gesamt"."<br />";
                               echo 
                        "<br />";
                               echo 
                        "<br />";
                               echo 
                        "Das Array für jede Phase besteht aus 15 Zellen"."<br />";
                               echo 
                        "<br />";
                               echo 
                        "Z1 : Wirkleistung Bezug aktuell in W"."<br />";
                               echo 
                        "Z2 : Bezug in kWh"."<br />";
                               echo 
                        "Z3 : Wirkleistung Einspeisung in Watt"."<br />";
                               echo 
                        "Z4 : Einspeisung in kWh"."<br />";
                               echo 
                        "Z5 : Blindleistung Bezug aktuell in var"."<br />";
                               echo 
                        "Z6 : Blindleistung in varh"."<br />";
                               echo 
                        "Z7 : Blindleistung Einspeisung aktuell in var"."<br />";
                               echo 
                        "Z8 : Blindleistung Einspeisung in varh"."<br />";
                               echo 
                        "Z9 : Scheinleistung Bezug aktuell in VA"."<br />";
                               echo 
                        "Z10 : Scheinarbeit Bezug in VAh"."<br />"
                               echo 
                        "Z11 : Scheinleistung Einspeisung"."<br />";
                               echo 
                        "Z12 : Scheinarbeit Einspeisung in VAh"."<br />";
                               echo 
                        "Z13 : Strom in mA (ohne Vorzeichen)"."<br />";
                               echo 
                        "Z14 : Spannung auf Phase"."<br />";
                               echo 
                        "Z15 : aktueller Leistungsfaktor cos phi Phase"."<br />";
                               echo 
                        "<br />";
                               echo 
                        "<br />";

                        ?>

                        Kommentar


                          #13
                          Hi Carsten,

                          sorry, weil Du damals Dir selber eine Antwort gabst, habe ich nicht mehr weiter geschaut. Mit type und part solltest Du das erforderliche richtig esetzen - so stand's ja auch in meiner LBS-Anleitung...

                          Zum Rest kann ich nix sagen; wenn Du es kopiert hast, sollte es das gleiche liefern, wie ich an edomi. Für edomi selber wird es demnächst einen neuen LBS 19001581 geben auf der Basis des alten Scripts...dauert aber noch ein paar Tage

                          VG und viel Spaß mit den Messwerten,
                          Carsten
                          Zuletzt geändert von saegefisch; 22.04.2019, 19:21.

                          Kommentar


                            #14
                            Ich bin da nicht so ein Programmierer wie so manch anderer....

                            Muss mir sowas immer wieder zu Gemüte führen und versteh dann al wieder was mehr als vorher. Daher dauern die Dinge zuweilen etwas

                            Das Script was ich damals veröffentlicht habe ist sei dem bei mir im Einsatz und klappt wunderbar. Ich brauchte nur noch die Netzspannung ( bei mir fällt immer wieder der SunnyIsland wegen Fehler was Spannung Batterie oder Netz angeht immer wieder mal vom Netz)
                            Daher wieder das Interesse an diesem Modul. Im SRC von Sunny Island zeigt es mir etwas arg schwankende Netzspannung an. Diese wandert innerhalb weniger Minuten von 240V bis runter nach 227V. Bei 228V fällt der SI vom Netz. Kommt aber nach 5 Minuten wieder.

                            Seit gerade logge ich minütlich zusätzlich die Spannungen von L1-L3 in die Datenbank. Mal schauen ob ich da was rausfinde

                            Grüsse
                            Carsten

                            Kommentar


                              #15
                              Habt Ihr tatsächlich die diese Schwankungen? Unser SI ist anfangs auch gelegentlich und unvermittelt auf Inselbetrieb gegangen - es stellte sich heraus, dass ein Steuerkabel vom/zum SI ungeschirmt verlegt wurde, dass nach SMA-Vorgabe aber geschirmt hätte sein müssen. Nach Austausch hatten wir vielleicht noch 1 falschen Aussetzer pro Jahr.

                              Kommentar

                              Lädt...
                              X