Hallo…
die nachfolgenden Scripte laufen bei mir seit ca. 2 Wochen ohne Probleme:
- Fritz_function.ips.php:
<?
// Beispiel Fritz!DECT200 mit ID'=17 schalten:
//echo Fritzbox_DECT200_Switch(17, 1). "
"; // 17= die FritzBox-interne ID meiner zweiten DECT200; 0=aus 1=ein
// Beispiel Fritz!DECT200 mit ID'=17 Messwerte auslesen:
//$Daten=Fritzbox_DECT200_Energie(16,1); // 16= die FritzBox-interne ID meiner ersten DECT200; 1=Abfrage 10min / 2=Abfrage 24h
//print_r ($Daten);
// Beispiel Fritz!DECT200 Status abfragen
//print_r(Fritzbox_DECT200_Status());
//*********************************
//*********************************
function Fritzbox_DECT200_Status()
{
$SID=FritzBox_login();
If ($SID <> "Fehler: Login fehlgeschlagen")
{
$Result=file("http://fritz.box/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=FritzBox_login();
$Value="-1";
$ValueToSet="0";
If ($SID <> "Fehler: Login fehlgeschlagen")
{
$ch = curl_init('http://fritz.box/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
$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=FritzBox_login();
If ($SID <> "Fehler: Login fehlgeschlagen")
{
Switch($Zeit)
{
case 1: // Abfrage der Messwerte der letzten 10 min
$Daten= file("http://fritz.box/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://fritz.box/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 ????
*/
//============================================================================
function FritzBox_login()
{
$fritzbox_Username = 'xxx';
$fritzbox_Password = 'xxxxx';
$ch = curl_init('http://fritz.box/login_sid.lua');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($login);
if ($session_status_simplexml->SID != '0000000000000000')
{
$SID = $session_status_simplexml->SID;
}
else
{
$challenge = $session_status_simplexml->Challenge;
$response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $fritzbox_Password, "UCS-2LE", "UTF-8"));
curl_setopt($ch, CURLOPT_POSTFIELDS, "response={$response}&page=/login_sid.lua&username={$fritzbox_Username}");
$sendlogin = curl_exec($ch);
$session_status_simplexml = simplexml_load_string($sendlogin);
if ($session_status_simplexml->SID != '0000000000000000')
{
$SID = $session_status_simplexml->SID;
}
else
{
$SID= "Fehler: Login fehlgeschlagen";
}
}
curl_close($ch);
return $SID;
}
?>
- Die Statusabfrage (getiggert alle 30s):
<?
include ("Fritz_function.ips.php");
$FritzDECT_ID[1]=16;
$FritzDECT_ID[2]=17;
$FritzDECTSwitch_IPS_ID[1]=43250 /*[Gewerke\Energie\Fritz-Box-Zwischenstecker\Fritz!DECT200_01_ID16 - Waschnmaschine\Waschmaschine (an/aus)]*/ ;
$FritzDECTSwitch_IPS_ID[2]=50373 /*[Gewerke\Energie\Fritz-Box-Zwischenstecker\Fritz!DECT200_01_ID17 - Trockner\Trockner (an/aus)]*/ ;
$FritzDECTWatt_IPS_ID[1]=29949 /*[Gewerke\Energie\Fritz-Box-Zwischenstecker\Fritz!DECT200_01_ID16 - Waschmaschine\aktuelle Leistung Waschmaschine]*/ ;
$FritzDECTWatt_IPS_ID[2]=32098 /*[Gewerke\Energie\Fritz-Box-Zwischenstecker\Fritz!DECT200_01_ID17 - Trockner\aktuelle Leistung Trockner]*/ ;
$Daten=Fritzbox_DECT200_Status();
Foreach ($FritzDECT_ID as $key=>$ID)
{
If ($Daten[$key][0][1]==$ID)
{
If ($Daten[$key][2][1] != GetValue($FritzDECTSwitch_IPS_ID[$key]))
{
SetValue($FritzDECTSwitch_IPS_ID[$key],$Daten[$key][2][1]);
}
}
}
Foreach ($FritzDECT_ID as $key=>$ID)
{
$Daten=Fritzbox_DECT200_Energie($ID,1);
$aktuelle_Leistung=substr($Daten[2],strripos($Daten[2],'" : "')+5);
SetValue($FritzDECTWatt_IPS_ID[$key],$aktuelle_Leistung/100);
}
?>
- Das Logging Script (getigget alle 5 min)
<?
include ("Fritz_function.ips.php");
$FritzDECT_ID[1]=16;
$FritzDECT_ID[2]=17;
$FritzDECT_IPS_ID[1]=31384 /*[Gewerke\Energie\Fritz-Box-Zwischenstecker\Fritz!DECT200_01_ID16 - Waschmaschine\Verbrauch Waschmaschine (Fritz!DECT 200 - ID 16) gesamt]*/ ;
$FritzDECT_IPS_ID[2]=46262 /*[Gewerke\Energie\Fritz-Box-Zwischenstecker\Fritz!DECT200_01_ID17 - Trockner\Verbrauch Trockner (Fritz!DECT 200 - ID 17) gesamt]*/ ;
Foreach ($FritzDECT_ID as $key=>$ID)
{
$Daten=Fritzbox_DECT200_Energie($ID,1);
// Wann wurde Variable das letzte mal upgedatet ?
// Zeitdifferenz zwischen jetzt und last update in 10s intervallen
$last_update_count= round(((time()-IPS_GetVariable($FritzDECT_IPS_ID[$key])['VariableUpdated'])/10));
If ($last_update_count >60) // Ist update länger als 10min her (60 Intervalle x10s = 10min), dann...
{
$last_update_count = 60;
}
$last_update_count=$last_update_count+1; // Messwerte im Array $Daten beginnen im Key2
If (((int)substr($Daten[0],strripos($Daten[0],'" : "')+5)) != 0) // nur wenn Dose online
{
$Ws=0;
For ($i=2; $i<=$last_update_count; $i++)
{
$Ws=$Ws+(((int)substr($Daten[$i],strripos($Daten[$i],'" : "')+5))/100*10); // /100 da Werte in 0,01 Watt , x10 da Intervall 10s - Ermittlung der Ws (Wattsekunden)
// echo $i." - ". $Daten[$i]. "
";
}
SetValue($FritzDECT_IPS_ID[$key],GetValue($FritzDECT_IPS_ID[$key])+($Ws/3600/1000)); // speichern in kWh
}
}
?>
- Das Aktionsscript für die Schaltervariable (an/aus):
<?
include ("Fritz_function.ips.php");
If ($_IPS['SENDER']== "WebFront")
{
Switch ($_IPS['VARIABLE'])
{
case 43250:
$Result=Fritzbox_DECT200_Switch(16, (int)$_IPS['VALUE']);
If ($Result== "Alles OK")
{
SetValue(43250 /*[Gewerke\Energie\Fritz-Box-Zwischenstecker\Fritz!DECT200_01_ID16 - Waschnmaschine\Waschmaschine (an/aus)]*/,$_IPS['VALUE']);
}
else
{
echo "Kommunikationsfehler";
}
break;
case 50373:
$Result=Fritzbox_DECT200_Switch(17, (int)$_IPS['VALUE']);
If ($Result== "Alles OK")
{
SetValue(50373 /*[Gewerke\Energie\Fritz-Box-Zwischenstecker\Fritz!DECT200_01_ID17 - Trockner\Trockner (an/aus)]*/,$_IPS['VALUE']);
}
else
{
echo "Kommunikationsfehler";
}
break;
}
}
?>
Gruß
Swifty