Anwesenheitserkennung für Smarthome mit der Fritz!Box via TR-064

Wer sich mit dem Kontext SmartHome beschäftigt, der hat früher oder später immer die Frage: Wie erkenne ich möglichst automatisiert, ob jemand zuhause ist oder nicht? Am einfachsten geht das mit dem Smartphone. Das hat man in der Regel bei sich. Der am häufigsten anzutreffende Ansatz ist dieses in regelmäßigen Abständen anzupingen und auf der Basis den Anwesenheitsstatus zu definieren.

Da ich mein Smartphone aber nicht anpingen kann fällt die Lösung für mich flach. Ich habe aber eine Fritz!Box und mein Handy bezieht darüber per DHCP eine IP-Adresse. In der Fritz!Box ist auch sichtbar, ob das Gerät aktiv oder nicht aktiv ist.

Die Fritz!Box hat eine Schnittstelle für Anwendungen basierend auf TR-064. Der Zugriff darauf muss in dem Webinterface unter

  • Heimnetz ->
  • Heimnetzübersicht ->
  • Netzwerkeinstellungen ->
  • Zugriff für Anwendungen zulassen

freigeschaltet werden. Anschließend kann via SOAP mit der Fritz!Box kommuniziert und unter anderem auch der Status eines angeschlossenen Gerätes ermittelt werden. Dafür muss man nur die MAC-Adresse kennen.

Die Antwort der Fritz!Box sieht dann zum Beispiel so aus:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:GetSpecificHostEntryResponse xmlns:u="urn:dslforum-org:service:Hosts:1">
      <NewIPAddress>11.22.33.44</NewIPAddress>
      <NewAddressSource>DHCP</NewAddressSource>
      <NewLeaseTimeRemaining>0</NewLeaseTimeRemaining>
      <NewInterfaceType>802.11</NewInterfaceType>
      <NewActive>1</NewActive>
      <NewHostName>mySmartphoneDevice</NewHostName>
    </u:GetSpecificHostEntryResponse>
  </s:Body>
</s:Envelope>

Für die Hausautomatisierung setze ich Homematic mit einer CCU2 ein. Dort habe ich eine Systemvariable definiert und über die XML API kann diese auch per GET aktualisiert werden. Dafür muss man nur die sogenannte ise_id der Variable kennen, die findet man unter der folgenden URL: http://ccu2/config/xmlapi/sysvarlist.cgi

Die Anfrage an die Fritz!Box und das anschließende setzen der Systemvariable in der CCU2 habe ich in PHP wie folgt gelöst:

<?php 
 
// Array of MAC addresses and coresponndig ise_id on ccu2
$check[] = array('mac' => 'AA:BB:CC:DD:EE:FF', 'ise_id' => '1234');
$check[] = array('mac' => '11:22:33:44:55:66', 'ise_id' => '4321');
 
 
for ($j = 0; $j < count($check); $j++) {
 
	$soapUrl = "http://fritz.box:49000/upnp/control/hosts";
 
	$xml_post_string = '<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" >
  <s:Body>
    <u:GetSpecificHostEntry xmlns:u="urn:dslforum-org:service:Hosts:1">
      <NewMACAddress>' . $check[$j]['mac'] . '</NewMACAddress>
    </u:GetSpecificHostEntry>
  </s:Body>
</s:Envelope>';
 
	$headers = array(
		"Content-type: text/xml;charset="utf-8"",
		"Accept: text/xml",
		"Cache-Control: no-cache",
		"Pragma: no-cache",
		"SoapAction:urn:dslforum-org:service:Hosts:1#GetSpecificHostEntry",
		"Content-length: ".strlen($xml_post_string),
        ); 
 
 
 
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $soapUrl);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_TIMEOUT, 10);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 
	$response = curl_exec($ch); 
	curl_close($ch);
 
	$parser = simplexml_load_string($response);
	$parser->registerXPathNamespace("a", "urn:dslforum-org:service:Hosts:1");
 
	$NewActive_h = $parser->xpath('//NewActive/text()');
	$NewActive =  $NewActive_h[0]->__toString();
 
	if ($NewActive == 1) {
		$result = file_get_contents("http://ccu2/config/xmlapi/statechange.cgi?ise_id=" . $check[$j]['ise_id'] . "&new_value=true");
	}
	else {
		$result = file_get_contents("http://ccu2/config/xmlapi/statechange.cgi?ise_id=" . $check[$j]['ise_id'] . "&new_value=false");
	}
}
?>

Als Cronjob laufen lassen irgendwo, zum Beispiel auf einem Raspberry Pi, und schon hat man eine korrekte Systemvariable in der CCU2 auf dessen Basis man dann weitere Dinge machen kann.

FRITZ!Box Fon WLAN 7270 – Faxen unter Linux

Die FRITZ!Box Fon WLAN 7270 ist ein echt Klasse Geraet. Fuer Windows gibt es das Programm Fritz!FAX mit dem man aus Windows heraus Faxe versenden kann. Datei -> Drucken -> Empfaengerfaxnummer eingeben und fertig. Aber funktioniert das ganze auch bei VoIP und so einfach unter Linux?

Die Antwort lautet ja! Das Tool der Wahl lautet ffgtk -> FritzFun GTK (deutsche Wiki). Fuer Ubuntu gibt es die PPA von Stevi um es zu installieren:

sudo add-apt-repository ppa:stevi/ppa
sudo aptitude update
sudo aptitude install ffgtk

Anschliessend kann man das Programm ueber Anwendungen -> Internet -> ffgtk Routerverwaltung starten. Bevor irgendetwas mit Faxen funktioniert muss man CapiOverTCP aktivieren, indem man von einem angeschlossenen Telefon #96*3* waehlt. Den CallMonitor aktiviert man uebrigens mit #96*5*.
In den Einstellungen von ffgtk musste ich bei mir unter Fax bei der Faxnummer meine Telefonnummer komplett mit Vorwahl jedoch ohne „0“ am Anfang eingeben. Unter den Plugins war es noch noetig bei Fax CapiFax auszuwaehlen. Bevor man dann das erste Fax versenden kann muss noch der Rechner neugestartet werden.

Meiner Meinung nach ein super cooles Programm und sehr intuituv zu bedienen.