Die Fritzbox-API
Was viele nicht wissen: Die Fritzbox-Modelle von AVM (mein aktuelles Modell) unterstützen fast alle eine relativ offene API die vom Heimnetzwerk aus angesprochen werden kann. Diese API basiert auf den Standard TR-64, der für das Steuern von Geräten im Heimnetzwerk, wie z.B. Home Gateways, gedacht ist. Dieser Standard verwendet SOAP Requests und ist dadurch relativ altmodisch und komplex. Auf einzelne Kommandos will ich hier nicht eingehen. AVM hat die Grundlagen recht gut beschrieben in dem folgenden Entwicklerportal. Zur Abfrage der Informationen zu den verbundenen Hosts muss man folgendermaßen vorgehen:
- Abfrage der Anzahl der verbundenen Hosts (Kommando GetHostNumberOfEntries). Zurückgeliefert wird eine normale Integer-Zahl. Wichtig: Dieser Wert schwankt kontinuierlich, weil Geräte sich im Netzwerk ständig anmelden, neu anmelden oder von der Fritzbox ausgeblendet werden ohne dass wir das selbst bemerken. Deshalb muss man bei jedem Update diese Zahl neu laden.
- Als nächstes muss man eine Schleife programmieren, die jeden einzelnen der Hosts anhand seiner laufenden Nummer anfragt um Details zu diesem herauszufinden (Kommando GetGenericHostEntry). Zurückgeliefert wird die MAC-Adresse, die IP-Adresse, der Name wie er im Web-Frontend der Fitzbox angezeigt wird und zuletzt der Zustand (active / not active).
- Möchte man nun den Zustand eines einzelnen Hosts ermitteln, dann gibt es das zusätzliche Kommando GetSpecificHostEntry. Dabei wird der Host nicht durch seine laufende Nummer identifiziert, sondern über seine MAC-Adresse. Diese wiederum erfährt man aber nur über Schritt 2.
Die Fritzbox API hat noch viele weitere Funktionen zur Konfiguration des WLANs, des Internet-Zugangs und weiteres. Dies wird hier nicht beschrieben. Es ist zu beachten, dass einige der zusätzlichen Requests nur nach einer Authentifizierung möglich sind. Das ist bei TR64/SOAP mittels Digest-Authentifizierung gelöst. Es wird also bei jeder Anfrage ein Einmal-Key mit versendet und man bekommt mit der Antwort den Key für die nächste Anfrage. Die Implementierung bei ansonsten asynchronen Requests ist dadurch besonders aufwändig, weil man die zeitlich entkoppelten asynchronen Anfragen künstlich wieder in eine Reihenfolge bringen muss.
Desweiteren muss man hinzufügen, dass es keine Event-API gibt. Möchte man also kontinuierlich über den Zustand von Hosts informiert werden, dann muss man in regelmäßigen Abständen die oben angegebenen Schritte durchlaufen. Damit das zeitlich einigermaßen aktuell ist, starte ich den Durchlauf alle 30 Sekunden. Das Interface ist recht langsam und die SOAP Bearbeitung rechenintensiv. Deshalb gerät meine girder-Installation auf dem Wohnzimmer-PC durchaus regelmäßig unter Last.
Integration in meinen item Manager von girder
Zur Integration in girder schreibe ich wieder ein item Manager Module. Bei dem Modul wird für jede Fritzbox ein Module Objekt angelegt. Man kann also mehrere Fritzboxen gleichzeitig abfragen. Ich nutze das dafür, dass ich mehrere Heimnetzwerke mit Fritzboxen an unterschiedlichen DSL-Anschlüssen per VPN miteinander vernetze; z.B. mehrere Wohnungen.
Als items registriere ich jeweils ein Objekt für jeden erkannten Host. Dadurch erkenne ich nicht nur die persönlichen Geräte wie Smartphones und ihren Verbindungsstatus, sondern kann ggf. auch andere Netzwerkgeräte verfolgen und deren Events nutzen. Jede Änderung gegenüber dem bisherigen Zustand erzeugt das für das Item einen Event der innerhalb der LUA Script Engine als Auslöser für Aktionen genutzt werden kann.
Ich finde es übrigens ganz interessant, was der Verfolgen der Hosts im Heimnetzwerk alles so preisgibt. Man sieht ständig die Geräte auftauchen und wieder verschwinden und kann sich vorübergehende Verbindungsprobleme die man im Alltag so erlebt durchaus nachvollziehen.
Wer das mal nachbauen möchte, kann sich gerne mit mir in Verbindung setzen. Ich darf aber jetzt schon andeuten, dass das Arbeiten mit TR-64 und SOAP kein Zuckerschlecken ist. Auch die Präzision der Anwesenheitserkennung aufgrund der Host-Status ist meiner Ansicht nach noch nicht gut und ich muss hier noch weiter experimentieren. Ich werde ggf. berichten!