SmartHome Meets Fritz-Box (TR-064) für z.B. Anwesenheitsmeldung, neuer Anruf, Gäste WLAN an/aus

  • Hallo zusammen,

    ich versuche mich mal an einem How-To in dem ich euch zeigen möchte wie man beispielsweise eine Anwesenheitsmeldung realisieren kann. Andere Anwendungen mit TR-064 wären z.B. ein Blinken einer Lampe wenn das Telefon klingelt, oder das Gäste WLAN ein/ausschalten Möglichkeiten gibt es denke ich einige! Hier noch die Dokumentation von AVM zu TR-064

    Dazu benötigt man folgendes:

    • FritzBox (ich habe eine 7560 und gestest habe ich mit Firmware 7.01 und 7.10)
    • einen Webserver (ich nutze den auf meiner Synology NAS es reicht aber z.B. auch ein alter PI)
    • das HTTP-Request Modul
    • Und natürlich eure SmartHome Zentrale

    Vorbereitende Arbeiten: Da die TR-064 Standard mäßig ausgeschaltet ist bei der FritzBox müssen wir diese erstmal freischalten dazu bitte unter
    Heimnetz >> Netzwerk >> Netzwerkeinstellungen
    Die Checkbox „Zugriff für Anwendungen zulassen“ aktivieren. Für manchen Sachen die man mit TR-064 machen kann benötigt man einen User-Namen und Passwort Dazu am besten einen neuen Account unter "System >> FritzBox-Benutzer" anlegen. Das war es eigentlich auch schon auf der FritzBox

    In der SHC2 habe ich mir dann zunächst einmal einen Zustand "jede 15min" angelegt mit folgendem dazugehörigem Szenario

    Dann einen Zustand "Jemand Zuhause" mit folgendem Szenario:

    Das dazugehörige php Skript noch auf den Webserver kopieren:

    PHP
        <?php    @@@WCF_PRE_LINEBREAK@@@$fritzbox_ip = "fritz.box"; @@@WCF_PRE_LINEBREAK@@@$tr64_port = "49000";   @@@WCF_PRE_LINEBREAK@@@$Host1 = 'Hostname1'; //Dies muss der exakte Hostname sein, der in der FritzBox aufgef rt wird. Alternativ kann man auch IP oder MAC Adresse nutzen. Dazu muss jedoch die SOAP Abfrage ge dert werden.  @@@WCF_PRE_LINEBREAK@@@$Host2 = 'Hostname2';   @@@WCF_PRE_LINEBREAK@@@// Getestet mit FritzOS 6.60    @@@WCF_PRE_LINEBREAK@@@// SOAP Abfrage:    @@@WCF_PRE_LINEBREAK@@@$client = new SoapClient(null,array( 'location' => "http://" . $fritzbox_ip . ":" . $tr64_port . "/upnp/control/hosts", 'uri' => "urn:dslforum-org:service:Hosts:1", 'soapaction' => "urn:dslforum-org:service:Hosts:1#GetSpecificHostEntry", 'noroot' => False )); @@@WCF_PRE_LINEBREAK@@@$NumberOfHosts = $client->GetHostNumberOfEntries();  @@@WCF_PRE_LINEBREAK@@@// Abfrage welcher Host online ist: @@@WCF_PRE_LINEBREAK@@@if (!(issoapfault($NumberOfHosts))) { for ($i=0;$i<$NumberOfHosts;$i++)  @@@WCF_PRE_LINEBREAK@@@{ $Host = $client->GetGenericHostEntry(new SoapParam($i,'NewIndex')); if ($Host['NewHostName'] == $Host1) { if(($Host['NewActive'] == 1)) { $Host1anwesend = 1; } } } }  @@@WCF_PRE_LINEBREAK@@@if (!(issoapfault($NumberOfHosts))) { for ($i=0;$i<$NumberOfHosts;$i++)  @@@WCF_PRE_LINEBREAK@@@{ $Host = $client->GetGenericHostEntry(new SoapParam($i,'NewIndex')); if ($Host['NewHostName'] == $Host2) { if(($Host['NewActive'] == 1)) { $Host2anwesend = 1; } } }    @@@WCF_PRE_LINEBREAK@@@}   @@@WCF_PRE_LINEBREAK@@@// Definition der Variable ob Host 1 anwesend ist:  @@@WCF_PRE_LINEBREAK@@@if ($Host1anwesend == 1) { $handy1 = '<font color="7eff00"><b>Angemeldet</b></font>'; } else { $handy1 = '<font color="254c4a"><b>Abgemeldet</b></font>'; } @@@WCF_PRE_LINEBREAK@@@// Definition der Variable ob Host 2 anwesend ist:  @@@WCF_PRE_LINEBREAK@@@if ($Host2anwesend == 1) { $handy2 = '<font color="7eff00"><b>Angemeldet</b></font>'; } else { $handy2 = '<font color="254c4a"><b>Abgemeldet</b></font>'; } @@@WCF_PRE_LINEBREAK@@@// Oft reicht es f die Voraussetzung einer Folgeaktion, dass mindestens einer der Smartphones online ist. Dies wird hier gepr t und ausgegeben  @@@WCF_PRE_LINEBREAK@@@if ($Host1anwesend == 1 OR $Host2anwesend == 1) { $beidezuhause = '<font color="7eff00"><b>Jemand ist zu Hause</b></font>'; } else { httpresponsecode(404); @@@WCF_PRE_LINEBREAK@@@die();  @@@WCF_PRE_LINEBREAK@@@}   @@@WCF_PRE_LINEBREAK@@@?>@@@WCF_PRE_LINEBREAK@@@

    Das original Script ist hier zu finden und es stammt nicht von mir Schlaue Hütte

    An dem einen oder anderen Punkt wird es mit Sicherheit noch Verbesserungsmöglichkeiten geben und ich würde mich über Vorschläge freuen, aber bisher funktioniert das ganze sehr gut

  • Hi, ich versuche das gerade bei mir umzusetzen, jedoch will das Skript auf meinem Webserver nicht so recht laufen. Eine Idee? Bekomme wenn ich die Seite so ansteuere nur ein graues Fenster. Auch wenn kein Handy angemeldet ist kommt das, statt dem 404.
    Viele Grüße

    EDIT: Habs gefunden. Die Variable bei PHP lautet http_response_code, nicht httpresponsecode :D

  • Also ich habe es jetzt am laufen, jedoch etwas abgewandelt. Um die vielen Nachrichten, dass es fehlgeschlagen ist zu umgehen, rufe ich das Skript alle 2 Minuten auf dem Server auf und stelle den Zustand per Webhook in IFTTT um. Das sieht dann im letzten Teil vom Skript so aus:

    if ($Host1anwesend == 1 OR $Host2anwesend == 1)
    {
    header("Location:http://maker.ifttt.com/trigger/daheim/with/key/XXXXXX&quot;);
    }
    else
    {
    header("Location:http://maker.ifttt.com/trigger…aheim/with/key/XXXXX&quot;);
    }

    Funktioniert super und ich kann meine Szenarien nur auf den Zustand steuern, ohne den HTTP-Request nutzen und auf einen Fehler laufen lassen zu müssen.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!