Fritz!DECT 200 - Einbindung in IPS

Hallo…

nach langer Wartezeit (Bestellung noch vor Weihnachten) habe gestern zwei von diesen Steckdosen geliefert bekommen. Die Instalation verlief spielend leicht:
In die Steckdose stecken, DECT-Knopf an der FritzDose und an der Fritz!Box drücken, automatisches Firmware-Update abwarten und schon kann man im SmartHome Menü der Fritz!Box auf Entdeckungsreise gehen … :D.

Die Bedienung über das Fritz!Box-Menü geht zwar recht gut, ich will die Teile jedoch in IPS einbinden. :loveips:
Nach meinen ersten Gehversuchen mit Firebug habe ich nun einen Weg gefunden, zumindest die Messwerte in IPS einzulesen. Leider bin ich kein großer PHP-Könner, dennoch möchte ich Euch meinen ersten Versuch mal nicht vorenthalten:

<edit> … ich habe den Code hier gelöscht … siehe jetzt #23 </edit>

Ich müsste die Messwerte jetzt noch irgendwie sinnvoll aufbereiten.

Gruß

Swifty

PS: Hat jemand die Fritz!DECT schon mal mittels IPS ein /aus geschaltet … ?

Ja, hier mein Script (Login ist in eine Funktion ausgelagert (Danke Swifty, für die Inspiration)



<?
include ('fritz.box/funktion.login.ips.php');

$fritzbox_Adresse = 'fritz.box';
$fritzbox_Password = 'xxxxxxx';

$device=16;  // Fritzbox ID der DECT-Steckdose (herausgefunden mit Firebug)
$SID=FritzBox_login_std($fritzbox_Adresse, $fritzbox_Password);


if($_IPS['VALUE'])
	{$wert=1;}
		else
	{$wert=0;}

$ch = curl_init('http://fritz.box/net/home_auto_query.lua');
curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&command=SwitchOnOff&value_to_set=". $wert. "&id=". $device. "&xhr=1");
curl_exec($ch);
curl_close($ch);
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
?>

Wenn ich im Webfront clicke, bekomme ich allerdings noch eine Fehlermeldung trotz erfolgreicher Aktion, Kann mir jemand sagen, wie ich die weg bekommen! Sonst funktionierts wunderbar.

DECT.PNG

Hallo Zusammen,
Die Fehlermeldung (Ausgabe) hab ich jetz unterdrückt!
Ist das denn der richtige Ansatz, oder denke ich total falsch?


<?
include ('fritz.box/funktion.login.ips.php');
ob_start();
{
$fritzbox_Adresse = 'fritz.box';
$fritzbox_Password = '#####';
#####
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
return;
}
ob_end_clean();
?>


Die Zeilen ob_start();, ob_end_clean(); tun genau das!

Hallo…

ich habe mal den Ansatz von stuzi01 übernommen und noch eine Abfrage eingefügt, ob denn der Schaltbefehl auch tatsächlich ausgeführt wurde:

<edit> … ich habe den Code hier gelöscht … siehe jetzt #23 </edit>

Gruß

Swifty

hi,
wie finde ich den die ID raus, ist das die Zahl hinter dem # Zeichen beim Namen Fritz!Dect 200
Ist bis jetzt die #1 ist auch mein einziges Dect Gerät.
mit freundlichen Grüßen

Hallo,
Ich habe auch nur ein Gerät und es ist die 16!(Name ist aber auch die …1)
Rausfinden zum Bsp mit httpwatch oder firebug!
Probier aber einfach mal die 16 …

Hi, habs mal ausprobiert aber ich hab da schon eine andere Fehlermeldung.

kann mal einer über das script schaun.
das klappt bei mir nicht es spuckt immer die Fehlermeldungen wie im Bild über diesem Beitrag aus.
Muss ich da noch Instanzen im IPS anlegen oder wie läuft das ?

<?
// 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

$Result=Fritzbox_DECT200_Switch(16,1);
echo $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);
print_r ($Daten);


// 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();
print_r ($Daten);
//*********************************
//*********************************

function Fritzbox_DECT200_Status()
    {

    $SID=FritzBox_login();
    If ($SID <> "Fehler: Login fehlgeschlagen")
        {
        $Result=file("http://192.168.0.1/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();

    If ($SID <> "Fehler: Login fehlgeschlagen")
        {
        $ch = curl_init('http://192.168.0.1/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=FritzBox_login();

    If ($SID <> "Fehler: Login fehlgeschlagen")
        {
        Switch($Zeit)
           {
           case 1:      // Abfrage der Messwerte der letzten 10 min
           $Daten= file("http://192.168.0.1/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.0.1/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 = 'xxxx';
    $fritzbox_Password = 'xxxxx';

    $ch = curl_init('http://192.168.0.1/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}");
       //$login = curl_exec($ch);

		 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		 $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;

    }

Schau dir mal deine Login function an!

   $challenge = $session_status_simplexml-&gt;Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $fritzbox_Password, "UCS-2LE", "UTF-8"));
   [b]curl_setopt($ch, CURLOPT_POSTFIELDS, "response={$response}&page=/login_sid.lua");[/b]
   $sendlogin = curl_exec($ch);
   $session_status_simplexml = simplexml_load_string($sendlogin);

Ich verwende auch die funktion ohne Benutzername und nur mit Passwort! Bei mir klappts dann mit deinem Script! Brauchst in IPS keine Instanze, etc anlegen!
Nur die Results aus zeile 9 klappt nun noch nicht. Aber schalten geht schonmal!

ah gigantisch es klappt mit dem an und aus schalten super, werd mir mal die Energie Werte jetzt vornehmen.
Danke Danke, die dect 200er sind ne top alternative zu den HM Dosen, zumindest mit mehr funktionen.
Grüße

also der Energie Array spuckt jetzt auch die Energiewerte aus, wie oft läst du das script den zum Schalt Status chechen und Energiewerte auslesen triggern ?

wenn s nur so einfach wäre einen array in eine Variable auszugeben, wie machst du das ?

Ha und so sieht die Array abfrage aus.

Nur wird schwer, und das bekomm ich leider nicht hin die Leistungs- und Spannungswerte mit timestamp in eine Variable zu übermitteln.

Für alle Anfänger die Werte z.B. in der ersten Zeile 22,23 beschneiden den Array wert um in diesem fall die ersten 22 Stellen und die 23 den rest dahinter soweit ich das erkannt habe.

$schaltstatus = substr(trim($Daten[127]), 22,23);
$dectstatus = substr(trim($Daten[129]), 23,24);
$Wmax = substr(trim($Daten[63]), 22,27);
$Wmin = substr(trim($Daten[62]), 22,27); 
$Wmi  = substr(trim($Daten[64]), 26,31); 
SetValue(21026 /*[Test Area\Fritzbox\Fritz!Dect 200 #1  ID 16\Energie\10min\Energie min ]*/ , $Wmin);
SetValue(14272 /*[Test Area\Fritzbox\Fritz!Dect 200 #1  ID 16\Energie\10min\Energie max ]*/ , $Wmax);
SetValue(16992 /*[Test Area\Fritzbox\Fritz!Dect 200 #1  ID 16\Energie\10min\Energie Mittelwert ]*/, $Wmi);

//SetValue(53582 /*[Objekt #53582 existiert nicht]*/,$dects);

if ($schaltstatus === "1")
{
SetValue(38288 /*[Test Area\Fritzbox\Fritz!Dect 200 #1  ID 16\Schalter\Fritz!Dect 200]*/, true);
}
else
{
SetValue(38288 /*[Test Area\Fritzbox\Fritz!Dect 200 #1  ID 16\Schalter\Fritz!Dect 200]*/, false);
}
if ($dectstatus === "2")
{
SetValue(29111 /*[Test Area\Fritzbox\Fritz!Dect 200 #1  ID 16\Verbindung Dect  Status\Dect Verbingungsstatus]*/, true);
}
else
{
SetValue(29111 /*[Test Area\Fritzbox\Fritz!Dect 200 #1  ID 16\Verbindung Dect  Status\Dect Verbingungsstatus]*/, false);
}

um die dauerhafte Rückmeldung des Aktors zubekommen z.B. wenn man am Gerät selbst schaltet(drückt) hab ich das script auf 3sec getriggert.
Hat einer von euch Erfahrung ob das zu Problem mit der Fritzbox führen könnte, wenn man die Werte so oft abfrägt ???
Aber anders bekommt man ja auch nicht die halbwegs zeitnahen Schaltzustandswerte vom manuell gedrückten Aktor mit oder ?

Also ich komm garnicht drauf klar!

Habe jetzt schon alles getestet und nix tut sich.

Nur fehler meldungen.

Kann villeicht einer ne kleine anleitung posten?

Danke

Hallo madplayer,

Wo sind denn die Probs?
Schalten, Daten Auslesen, , …
Kannst ja. Mal dein Script Posten!

Stutzi

Also,

 <?
// 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

$Result=Fritzbox_DECT200_Switch(16,1);
echo $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);
print_r ($Daten);


// 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();
print_r ($Daten);
//*********************************
//*********************************

function Fritzbox_DECT200_Status()
    {

    $SID=FritzBox_login();
    If ($SID <> "Fehler: Login fehlgeschlagen")
        {
        $Result=file("http://192.168.178.3/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();

    If ($SID <> "Fehler: Login fehlgeschlagen")
        {
        $ch = curl_init('http://192.168.178.3/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=FritzBox_login();

    If ($SID <> "Fehler: Login fehlgeschlagen")
        {
        Switch($Zeit)
           {
           case 1:      // Abfrage der Messwerte der letzten 10 min
           $Daten= file("http://192.168.178.3/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.178.3/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 = 'xxxx';
    $fritzbox_Password = 'xxxxx';

    $ch = curl_init('http://192.168.178.3/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}");
       //$login = curl_exec($ch);

         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
         $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;

    }

?>

wenn ich das skript starte schaltet es ein aber nicht mehr aus.

Wie kann ich das denn über webfront schalten?
Boolen variable?

Leg mal eine boolvariable an und verknüpf das Script! $wert kannst dann von ips_value holen!

Hi
habe ich gerade gemacht!
Aber mit den wert holen verstehe ich nicht so ganz.

Einschalten geht aber Ausschalten nicht und im webfront ändert sich auch nix an dem schaltzusand!

Wie weit bist du denn mit deiner einbindung?

Hast du ein paar screenshots von deinen variablen?

Jep, Bitteschön!


stehlamp.PNG
Und hier noch ein Teils meines Haupt-Script (mitterweile viel in Funktionen und eigene Scripte ausgelagert)


<?
# Funktionen eibinden
include ('funktion.login.ips.php');
include ('dect_funct.ips.php');
## Variablen vorbereiten
$device=16;  // Fritzbox ID der DECT-Steckdose (herausgefunden mit Firebug)
{
# WEenn Kommando aus Webfront kommt
if ($IPS_SENDER == "WebFront")
{
	if($_IPS['VALUE'])
	{$wert=1;}
		else
	{$wert=0;}
}
else #Wenn von Event oder Script
{
	$wert_vor=getValue(57043 /*[Hardware\IT\FritzBox 7390 (neu)\DECT Steckdose (Stehlampe)]*/);
	if ($wert_vor)
	{$wert=0;}
	   else
	{$wert=1;}
}

#Funktion ausführen

$Result=Fritzbox_DECT200_Switch($device,$wert);
echo $Result;
SetValue(57043 /*[Hardware\IT\FritzBox 7390 (neu)\DECT Steckdose (Stehlampe)]*/, $wert);
}
?>