Fritz!DECT 200 - Einbindung in IPS

Hey Swifty,

GlasKugel ist erstmal toll :slight_smile:

ich habe deine Scripte übernommen , und die ID´s auch geändert. Das mit dem Aktionsscript hab ich jetzt noch nicht auf dem schirm , aber das wird mit hoffentlich gleich ein Freund erklären.

ich hatte noch einen kleinen Fehler im Status Script , wenn man in der Fritzbox Schaltgruppen hat schlägt es fehl. weil dort eine ID 900 geliefert wird, kannst mal versuchen.

Ich hoffe ich schaffe es :slight_smile:

Die Erweiterung ist richtig gut , denn ich wollte erst alle DECT200 verkaufen, ein Anruf bei IP-Symcon hat dann aber auf deinen Beitrag verwiesen, mit dem Hinweis , das man das eventuell (Glaskugel AN) demnächst integrieren möchte.

Erstmal vielen Dank aus Magdeburg
Marcel

So leute ,

das Script ist supi, ich hab nur ein kleines Problemchen. Ich schaffe es nicht mit deinem Script zu schalten, was muss ich im switch script anpassen ? ich habe dort meine ID der Schalter für das Case festgelegt und die Variable eingetragen die dann schaltet. Schalten tut aber nix :frowning:

Sorry ich bin noch ein Noob, daher die doofe Frage :frowning:


<?
include ("Fritz_function.ips.php");


If ($_IPS['SENDER']== "WebFront")
    {
    Switch ($_IPS['VARIABLE'])
       {
       case 21660:
         $Result=Fritzbox_DECT200_Switch(16, (int)$_IPS['VALUE']);
          If ($Result== "Alles OK")
             {
             SetValue(21660 /*[Licht und Strom\FritzDect\TV-Wohnzimmer ID16\Zustand]*/ ,$_IPS['VALUE']);
             }
            else
             {
             echo "Kommunikationsfehler";
             }
          break;

       case 29288:
         $Result=Fritzbox_DECT200_Switch(17, (int)$_IPS['VALUE']);
          If ($Result== "Alles OK")
             {
             SetValue(29288 /*[Licht und Strom\FritzDect\Router und Server ID17 \Zustand]*/ ,$_IPS['VALUE']);
             }
              else
             {
             echo "Kommunikationsfehler";
             }
           break;
           
       case 36864:
         $Result=Fritzbox_DECT200_Switch(18, (int)$_IPS['VALUE']);
          If ($Result== "Alles OK")
             {
             SetValue(36864 /*[Licht und Strom\FritzDect\ Kühlschrank ID18\Zustand]*/ ,$_IPS['VALUE']);
             }
              else
             {
             echo "Kommunikationsfehler";
             }
           break;

           
        case 48948:
         $Result=Fritzbox_DECT200_Switch(19, (int)$_IPS['VALUE']);
          If ($Result== "Alles OK")
             {
             SetValue(48948 /*[Licht und Strom\FritzDect\ Spühler Herd WaMa ID 19\Zustand]*/ ,$_IPS['VALUE']);
             }
              else
             {
             echo "Kommunikationsfehler";
             }
           break;

		 case 40668:
         $Result=Fritzbox_DECT200_Switch(20, (int)$_IPS['VALUE']);
          If ($Result== "Alles OK")
             {
             SetValue(40668 /*[Licht und Strom\FritzDect\Computer Marcel ID20 \Zustand]*/ ,$_IPS['VALUE']);
             }
              else
             {
             echo "Kommunikationsfehler";
             }
           break;
           
      case 10778:
      
         $Result=Fritzbox_DECT200_Switch(21, (int)$_IPS['VALUE']);
          If ($Result== "Alles OK")
             {
             SetValue(10778 /*[Licht und Strom\FritzDect\Subwoofer und Lampe Wohnzimmer ID 21\Zustand]*/ ,$_IPS['VALUE']);
             }
              else
             {
             echo "Kommunikationsfehler";
             }
           break;
        }

    }


?>

Moin Moin,

Ok das Schalten geht jetzt auch, ich hatte einen kleinen Fehler im Script mit meiner Tastatur eingebaut :slight_smile:

Hat von euch schon einer mal die Temperatur auslesen können die ja ab 6.1 verfügbar ist ?

Die Beschreibung gibt’s HIER unter „1.2.1 XML-Format von getdevicelistinfos Kommando“.

Bin aber noch nicht dazu gekommen das mal einzuflicken, mal davon abgesehen, dass die Temp-Werte weit ab von der Realität sind. Mit Raumtemperatur hat das wenig zu tun, als Innentemp. des Gerätes eher realistisch :rolleyes:

ich habe mein fritz_aha_reader Script mit getdevicelistinfo neu geschrieben (fritz_aha_reader2.php). Bei den Temperaturwerten muss man wirklich grübeln.

Tommi

Hi tommi,

klappt super!

Könnte man auch noch die Spannung und Stromstärke auswerten? (siehe Energieanzeige)

lg

Könnte man auch noch die Spannung und Stromstärke auswerten? (siehe Energieanzeige)

Das geht so ohne weiteres nicht, da diese Information nicht durch die API übertragen wird (siehe Dokumentation). Dafür muss man leider noch die Webseite parsen.

Tommi

Funktioniert super!
Eine Kleinigkeit stört noch etwas: sobald ein „Fritz!DECT Repeater 100“ angemeldet ist, läuft das Skript logischerweise auf Fehler, da bei diesem Gerät „Actual Power“, „Status“ und „Total Energy“ nicht verfügbar sind:

DECT_Repeater.jpg

Könnte man das noch irgendwie abfangen?

Cheers
/Jens

Könnte man das noch irgendwie abfangen?

eigentlich sollte er das erkennen, denn in devicelistinfo steht, was das Gerät können soll. Das ist der Parameter functionbitlist. Das habe ich auch implementiert. Mache doch bitte mal im Script hinter der Zeile 63 mit $xmlstring=… ein „print $xmlstring;“ rein und schicke mir bitte per PM die Ausgabe.

Tommi

die Version 2.1 beseitigt diese Fehlermeldungen.

Tommi

Hallo Tommi,

ich bekomme dein aktuelles Ausslese-Script nicht zum Laufen. (meine Hardware: FritzDect 200 3.36, FritzOS6.20, Fritzbox 7490). Habs nach deiner Anleitung von der homepage gemacht. Er scheint sich nicht einzuloggen. An der Stelle wo er sicht die sid per get_sid holt ist Ende. Eine Fehlermeldung wird nicht erzeugt… host und password sind aber richtig. Wo kann ich noch nach Fehlern suchen?

Gruß
hardlog

Du könntest Dir in die Funktion ein paar prints einbauen, und schauen ob
1.eine Antwort von der Fritzbox kommt (print($http_response); 2x)
2.Ob jeweils gültiges xml dabei ist (2x print_r($xml):wink:
Ob $sid gefüllt ist (1. mal alles 0, das 2. Mal die echte sid)
3. ob die ermittelte sid auch zurückgegeben wird.

Tommi

http_response:

2203141c5af3dbce9241b5d00Phone2NAS2HomeAuto2BoxAdmin2

xml:

SimpleXMLElement Object
(
    [SID] => a78477932d6e6871
    [Challenge] => be9861ca
    [BlockTime] => 0
    [Rights] => SimpleXMLElement Object
        (
            [Name] => Array
                (
                    [0] => Phone
                    [1] => NAS
                    [2] => HomeAuto
                    [3] => BoxAdmin
                )

            [Access] => Array
                (
                    [0] => 2
                    [1] => 2
                    [2] => 2
                    [3] => 2
                )

        )

)

sid

a78477932d6e6871

was nun?

Anmeldung klappt also. Es gibt eine gültige SID.
Als nächstes $xmlstring und $xml wieder mit print_r aus zeile 63 bzw. 66 ausgeben und prüfen. Wenn in $xml was drin steht. aber trotzdem nichts angezeigt wird, bitte mir als PN schicken. Dann schaue ich morgen rein. Ein paar Hinweise/Meldungen sollten eigentlich auch im Messagelog auftauchen.

Tommi

Hallo Tommi,

bis Zeile 63 kommt er erst gar nicht. (Steigt irgendwo ab Zeile 163 in der Funktion get_sid beim ersten Ausführen aus!)
Im Messagelog steht „Login failed“.

Gruß
hardlog

verstehe ich nicht. Das ist der Abschnitt ab Zeile 53

//login to switch
$sid=get_sid($loginurl,$password);
if (!isset($sid)) {
   IPS_LogMessage("FritzAHA Reader", "Login failed");
   return;

}

Du hast geschrieben, das $sid gefüllt ist. Da gibt es keinen Grund mehr mit „Login failed“ auszusteigen :confused::confused::confused:

Tommi

ja, ich auch auch noch nicht ganz.

Die $sid ist wie gesagt gefüllt. Aus der Funktion get_sid meldet sich das script aber mit leerem Inhalt zurück (über „Return null“). Dann meldet er lgosicherweise „login failed“. Durch die funktion get_sid steig ich noch nicht ganz durch.

In folgender Abfrage (aus der get_sid-Funnktion) scheitert der Inhalt der sid (in meinem Fall „a78477932d6e6871“). Verstehen tue ich die Abfrage leider noch nicht: Müßte wenn es bei euch geht am Inhalt der sid liegen…?

if ($sid && (preg_match("/^[0]+$/",$sid)) && $challenge) {

gruß
hardlog

Hallo, ok, dann nehmen wir die Funktion mal auseinander.

Wir wollen uns einloggen und fragen als erstes nach der „Challenge“.


// get challenge string
 $http_response = file_get_contents($loginurl);
 $xml = simplexml_load_string($http_response);
 $challenge=(string)$xml->Challenge;
 $sid=(string)$xml->SID;

Im Feld SID sollen dabei nur „0000000“ stehen, in Challenge ein Hex-String/Zahl
Jetzt prüfen wir

  1. steht in $sid überhaupt was
  2. Der String in $sid besteht von Anfang bis Ende nur aus „0“
  3. Die challenge ist nicht null.
    Um das zu testen, könnte man sich $sid und $challenge vorher mal ausgeben zusammen mit print_r($xml) lassen.

 if ($sid && (preg_match("/^[0]+$/",$sid)) && $challenge) {

korrekter Weise sollte man schreiben

 if (isset($sid) && (strlen($sid)>0) && (preg_match("/^[0]+$/",$sid)) && (isset($challenge)) && (strlen($challenge)>0) && (hexdec($challenge)>0)) {

Dann wird die erhaltene Challenge mit dem Password verknüpft, abgesendet und die Antwort ausgewertet.

     //sid is null, got challenge
    $sid="";
    //build password response
    $pass=$challenge."-".$password;
    //UTF-16LE encoding as required
    $pass=mb_convert_encoding($pass, "UTF-16LE");
    //md5hash on top
    $md5 = md5($pass);
    //final answer string
    $challenge_response = $challenge."-".$md5;
    //send to box
   $url=$loginurl."?response=".$challenge_response;
   $http_response = file_get_contents($url);
   //check answer
   $xml = simplexml_load_string($http_response);
   $sid=(string)$xml->SID;

Das Ergebnis wird gepüft, ob in $sid ein Wert drin steht, der nicht nur Nullen hat. Wenn ja, wird der Wert als Ergebnis der Funktion zurückgegeben, wenn nicht, ist das Funktionsergebniss NULL. Das führt zu der von Dir beobachteten Fehlermeldung.

Zum Testen bitte auch hier mal einen print auf auf $sid vor dem If einbauen +print_r($xml)


if ($sid && !preg_match("/^[0]+$/",$sid)) {
            //is not null, bingo!
            return $sid;
   }

 }
 return null;
}//function

Schicke mir doch mal das Ergebnis der beiden neuen Prints bei If1 und If2.

Tommi

Hallo Tommi

ich hab als Kommentar in den code die werte eingetragen:

// get challenge string
 $http_response = file_get_contents($loginurl); 
    print_r($http_response); // Ergebniss: 40d227337ab6c65cf49ca4ee0Phone2NAS2HomeAuto2BoxAdmin2
 $xml = simplexml_load_string($http_response);
   print_r($xml); // Ergebniss: siehe unten
$challenge=(string)$xml->Challenge;
   print_r($challange); // Ergebniss: c20c512b
 $sid=(string)$xml->SID; 
   print_r($sid); // Ergebniss: f11c4f8fb6164901

Ausgabe von $xml:

SimpleXMLElement Object
(
    [SID] => eacbca905139e8de
    [Challenge] => d46e75f3
    [BlockTime] => 0
    [Rights] => SimpleXMLElement Object
        (
            [Name] => Array
                (
                    [0] => Phone
                    [1] => NAS
                    [2] => HomeAuto
                    [3] => BoxAdmin
                )
 
            [Access] => Array
                (
                    [0] => 2
                    [1] => 2
                    [2] => 2
                    [3] => 2
                )
 
        )
 
)

Die folgende IF-Bedinung wird scheinbar mit zuvor genannten Daten nicht erfüllt:

 if ($sid && (preg_match("/^[0]+$/",$sid)) && $challenge) {  

Da ich diese Zeile nicht ganz verstehe weiß ich nicht woran es liegen kann.

hardlog