[vz-dev] AVM Steckdose Wattanzeige

Berthold Bredenkamp bb at bre.de
Thu Dec 26 14:17:48 CET 2013


Moin Thomas,

ich verwende zur Zeit das PHP Script, es wird alle 10 Minuten aufgerufen:

--
<?php
        // Beispiel Fritz!DECT200 schalten:
        // 17= die FritzBox-interne ID meiner zweiten DECT200;
        // 0= ausschalten; 1=einschalten
        // Ergebnis: "Alles OK" oder "Schaltbefehl nicht ausgeführt" ...
Rückgabewert nur zur Demo...
        //               kann in der Funktion angepasst werden

    $FritzBox['Host'] = '192.168.10.xxx';
    $FritzBox['Passwort'] = 'xxxx';
    
//	echo "<br>Test 1 </br>";
	// $SID = FritzLogin();
//        $Daten=Fritzbox_DECT200_Status();
//        echo "<br>Result Status Start: </br>";
//        echo "<pre>" , print_r ($Daten) , "</pre>";


         // $Results=Fritzbox_DECT200_Switch(16,1);
         // echo "Result Switch: " . $Results;


        // Beispiel Fritz!DECT200 Messwerte auslesen:
        // 16= die FritzBox-interne ID meiner ersten DECT200
        // 1= Abfrage der Werte der letzten 10min (je 60 Messwerte für W und
V/alle 10s ein Wert)
        // 2=Abfrage der Werte der letzten 24h (96 Messwerte nur für W /
alle 15min ein Wert)

        $Daten=Fritzbox_DECT200_Energie(16,1);
//        echo "<br>Result: </br>";
        // print_r ($Daten);
        // echo "<pre>" , print_r($Daten) , "</pre>";

// Daten pro Miniute zusammenfassen
//        $Wert[0] = -1;
        $intZaehler = 2;
        $intMinute = 0;
        $summe = 0;
        $watt = 0;
        $arrWert = 0;
    	for ($intZaehler; $intZaehler <= 62; $intZaehler++) {
    	    $arrWert = split(': "', $Daten[$intZaehler]);
    	    $summe += $arrWert[1];
//    	    echo "<br>Wert $intZaehler: $arrWert[1] / 100</br>";
    	    switch ($intZaehler) {
    		case 7:
    		    $wert[0] = intval($summe / 600);
    		    $summe = 0;
    		    break;
    		case 13:
    		    $wert[1] = intval($summe / 600);
    		    $summe = 0;
    		    break;
    		case 19:
    		    $wert[2] = intval($summe / 600);
    		    $summe = 0;
    		    break;
    		case 25:
    		    $wert[3] = intval($summe / 600);
    		    $summe = 0;
    		    break;
    		case 31:
    		    $wert[4] = intval($summe / 600);
    		    $summe = 0;
    		    break;
    		case 37:
    		    $wert[5] = intval($summe / 600);
    		    $summe = 0;
    		    break;
    		case 43:
    		    $wert[6] = intval($summe / 600);
    		    $summe = 0;
    		    break;
    		case 49:
    		    $wert[7] = intval($summe / 600);
    		    $summe = 0;
    		    break;
    		case 55:
    		    $wert[8] = intval($summe / 600);
    		    $summe = 0;
    		    break;
    		case 61:
    		    $wert[9] = intval($summe / 600);
    		    $summe = 0;
    		    break;
    	    }
        }
// ermittelte Werte ausgeben        
        // echo "<br>Result: </br>";
        // print_r ($Daten);
        // echo "<pre>" , print_r($wert) , "</pre>";

//
	$i = 0;
        for ($i = 0;$i < 10;$i++) {
    	    // Werte an volkszaehler uebergeben
    	    $intZeit = time();
    	    $intZeit = ($intZeit - 60 * ($i + 1)) * 1000;
    	    
// 	    echo "<br>Zeit : $intZeit </br>";
	    $str = "ts=$intZeit&value=$wert[$i]";
    	    $objCurl = curl_init();
    	    curl_setopt($objCurl, CURLOPT_URL,
'http://192.168.10.xx/volkszaehler.org/htdocs/middleware.php/data/c7abde40-5
549-11e3-82d7-0d499e0cf777.json?' . $str);
    	    curl_setopt($objCurl, CURLOPT_POST, true);
    	    curl_setopt($objCurl, CURLOPT_POSTFIELDS, $str);
    	    curl_exec($objCurl);
    	    curl_close($objCurl);
        }


        // Beispiel Fritz!DECT200 Status abfragen
        // Ergebnis ein Array mit dem aktuellen Status aller vorhandenen
Fritz!DECT200
        // ... einfach mal anschauen ... sollte selbsterklärend sein

//        $Daten=Fritzbox_DECT200_Status();
//        echo "<br>Result Status Ende: </br>";
//        print_r ($Daten);

        //*********************************
        //*********************************

        function Fritzbox_DECT200_Status()
            {

            $SID=FritzLogin();
            If ($SID <> "Fehler: Login fehlgeschlagen")
                {
 
$Result=file("http://192.168.10.xxx/net/home_auto_query.lua?sid=". $SID.
"&command=AllOutletStates&xhr=0");
                $Result=explode('" ,"', $Result[1]);

                $count=substr($Result[0],-1);
              for ($i = 1; $i <= $count; $i++)
                    {
                    $Daten[$i][]=explode('" : "', $Result[(3*$i)-3+1]);
                    $Daten[$i][]=explode('" : "', $Result[(3*$i)-3+2]);
                    $Daten[$i][]=explode('" : "', $Result[(3*$i)-3+3]);
                    }
                }
            return($Daten);

            }

        //******************************************************************

        function Fritzbox_DECT200_Switch($device, $wert)
            {

            $SID=FritzLogin();

            If ($SID <> "Fehler: Login fehlgeschlagen")
                {
                $ch =
curl_init('http://192.168.10.xx/net/home_auto_query.lua');
               curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS,
"sid={$SID}&command=SwitchOnOff&value_to_set=". $wert. "&id=". $device.
"&xhr=1");
                $Result=curl_exec($ch);
                curl_close($ch);

                $Result=explode('" ,"', $Result);
                $ValueToSet=substr($Result[1],-1);

                // Abfrage, ob Schaltbefehl tatsächlich ausgeführt wurde
              $Value="-1";
                $Results=Fritzbox_DECT200_Status();


                Foreach ($Results as $key=>$Result)
                        {
                        //print_r($Result);
                        If ($Result[0][1]==$device)
                           {
                           $Value=$Result[2][1];
                           }
                        }

                If ($Value==$ValueToSet)
                    {
                    return "Alles OK";
                    }
                    else
                    {
                    return "Schaltbefehl nicht ausgeführt";
                    }

                }

            }
 
//*********************************************************************

        function Fritzbox_DECT200_Energie($device, $Zeit)
            {
            $Daten="";
             $SID=FritzLogin();

            If ($SID <> "Fehler: Login fehlgeschlagen")
                {
                Switch($Zeit)
                   {
                   case 1:      // Abfrage der Messwerte der letzten 10 min
                   $Daten=
file("http://192.168.10.254/net/home_auto_query.lua?sid=". $SID.
"&command=EnergyStats_10&id=". $device. "&xhr=1");
                    break;

                    case 2:      // Abfrage der Messwerte der letzten 24h
                    $Daten=
file("http://192.168.10.254/net/home_auto_query.lua?sid=". $SID.
"&command=EnergyStats_24h&id=". $device. "&xhr=1");
                    break;
                    }

                If ($Daten <>"")
                    {
                    $Daten=explode('" , "', $Daten[1]);
                    $x=count($Daten)-1;
                    $temp=explode('" ,"', $Daten[$x]);
                    Foreach ($temp as $tem)
                            {
                            $Daten[$x]=$tem;
                            $x++;
                            }
                    }
                  else
                    {
                    $Daten[0]="Keine Werte vorhanden";
                    }
                return ($Daten);
                }
            }
        /*
                Ergebnis bei EnergyStats_10:

                Array[0] = Anzahl der Leistungsmessungen (hier 60)
                Array[1] = Timer der Leistungsmessung (hier 10= alle 10s)
                Array[2]-Array[61] = Messwerte
                Array[62] = minimaler Messwert in Zeitspanne (60x10s = 10
min)
                Array[63] = maximaler Messwert in Zeitspanne (60x10s = 10
min)
                Array[64] = Durchschnitts Messwert in Zeitspanne
                Array[65] = Anzahl der Spannungsmessungen
                Array[66] = Timer der Spannungsmessung (hier 10 = alle 10s)
                Array[67]-Array[126] = Messwerte
                Array[127] = Status (an / aus)
                Array[128] = ID
                Array[129] = Verbinddungsstatus (hier 2= OK)
                Array [130]  RequestResult ????


                Ergebninis bei EnergyStats_24h:

                Array[0] = Anzahl der Leistungsmessungen (hier 96 = alle 15
min = 4*15*24)
                Array[1] = Timer der Leistungsmessung (hier 900= alle 900s =
15min)
                Array[2]-Array[97] = Messwerte
                Array[98] = minimaler Messwert in Zeitspanne (60x10s = 10
min)
                Array[99] = maximaler Messwert in Zeitspanne (60x10s = 10
min)
                Array[100 = Durchschnitts Messwert in Zeitspanne
                Array[101] = Status (an / aus)
                Array[102] = ID
                Array[103] = Verbinddungsstatus (hier 2= OK)
                Arry [104]  RequestResult ????

                */



 
//==========================================================================
==
//An der Fritrz Box anmelden, liefert eine Session ID oder false
    function FritzLogin()
    {
       global $FritzBox;
       $fritzpage      ='http://'.$FritzBox['Host'].'/login_sid.lua';
       $xml          = new SimpleXMLElement(file_get_contents($fritzpage));
       $challange       = $xml->Challenge; //Wert von Challenge abrufen
       $response       =
file_get_contents($fritzpage.'?username=&response='.$challange . '-' . md5(
iconv('ISO8859-1', 'UTF-16LE', $challange . '-' . $FritzBox['Passwort']) ));
//Login
       $xml          = new SimpleXMLElement($response);
       $sid          = $xml->SID; //SID abrufen die für alle weiteren
Aktionen gebraucht wird
       if ($sid=='0000000000000000')
       {
          echo 'Keine gültige SSID - sind die Login
(Passwort:"'.$FritzBox['Passwort'].'") und Hostdaten
("'.$FritzBox['Host'].'") richtig?';
          return false;
       }
       unset($xml);
       // echo "<br>SID: $sid</br>";
       return $sid;
    }
    

__

Für das Wiki fand ich es noch nicht fertig, aber vielleicht hilft es erst
einmal. Ich habe in dem Script zwei Beispiele aus dem Netz zusammengeführt.

Gruß

Berthold


-----Ursprüngliche Nachricht-----
Von: volkszaehler-dev-bounces at lists.volkszaehler.org
[mailto:volkszaehler-dev-bounces at lists.volkszaehler.org] Im Auftrag von
Thomas Gauweiler
Gesendet: Donnerstag, 26. Dezember 2013 13:16
An: volkszaehler.org
Betreff: Re: [vz-dev] AVM Steckdose Wattanzeige

Luacgi not readable filename=//webservices/homeautoswitch.lua
real_filename=/usr/www/1und1///webservices/homeautoswitch.lua

erhalte ich als Antwort.



More information about the volkszaehler-dev mailing list