
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 @@@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