[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