Anwesenheitserkennung - Remote Fritzbox
In Erweiterung des Beitrages Anwesenheitserkennung wird eine Beispiel-Lösung für folgendes Szenario vorgestellt:
- Eine (nicht modifizierte) Fritzbox wird als WLAN Access Point und Router genutzt, jedoch läuft auf dieser Box kein FHEM oder Perl.
- Ein Linux Rechner (in diesem Beispiel ein RPI) wird als FHEM host verwendet.
- Device Erkennung mittels PRESENCE - ident mit PRESENCE fritzbox
Die Lösung basiert auf dem PRESENCE Modul und nutzt die Funktion PRESENCE function { }.
Auch bei einem Repeater-Einsatz im WLan (zweite Fritzbox) kann diese Lösung eingesetzt werden - es ist nur eine Installation auf der Haupt-Fritzbox notwendig, nicht auf dem Repeater.
Background / Motivation
Ich hatte während der letzten 12 Monate ein modifiziertes PRESENCE Modul im Einsatz, das jedoch immer wieder ein Hängen oder Reboots der Fritzbox verursacht hatte (speziell bei 7270), daher hatte ich es nicht veröffentlicht. Die Vermutung liegt nahe, dass das ständige Telnet ein/aus-loggen die Hänger/Reboots verursacht hat.
Konzept
Variante 1
- Diese Lösung basiert (wie auch die PRESENCE fritzbox Funktion) auf dem Fritzbox Befehl ctlmgr_ctl, der jedoch von der "Ferne" ausgelöst werden muss, da FHEM ja nicht auf der Fritzbox läuft. Weiters wurden Ideen/Konzepte des presenced/collectord verwendet.
- Die Lösung läuft bei mir seit Anfang Dez. 2013 stabil mit 12 abgefragten Devices / 120 Sekunden Intervall. (Env: FHEM auf RPI, Fritzbox 7390)
- Auf der Fritzbox wird ein shellscript installiert, dass von remote gestartet wird, Kommandos lokal ausführt und das Ergebniss zurückschickt.
- Am FHEM host läuft ein perl basierender daemon der Kommandos von FHEM empfängt, aufbereitet und das shellscript auf der Fritzbox (mit parameter) startet. Dieser Daemon hält auch die Telnet Verbindung zur Fritzbox permanent aufrecht. Gestartet wird dieser Daemon automatisch beim ersten Aufruf durch FHEM.
- ein Modul 99_RFritzBox.pm ist die Schnittstelle zwischen FHEM und dem daemon.
Variante 2
- Die WEB Oberfläche der Fritzbox wird über http abgefragt.
- Es ist kein code und kein Telnet auf der Fritzbox selbst notwendig, ein Nachteil könnte jedoch die Performance der Abfrage sein.
- Diese Variante ist vor allem für jene FB-Benutzer interessant, die kein Telnet auf der FB aktivieren können (oder wollen).
Code (beide Varianten)
Der code ist als zip-file im thread PRESENCE-RemoteFritzbox abgelegt. Bitte in diesem thread auch Fragen/Feedback/Wünsche posten.
Installation & Debug Variante 1
Voraussetzungen
- Telnet auf der Fritzbox aktiviert
- perl NET::Telnet Modul auf dem Host wo FHEM läuft installiert. Beim Raspberry-PI geht das so:
sudo apt-get install libnet-telnet-perl
Folgende Reihenfolge ist empfehlenswert:
Kopieren von Rpresence.sh in die Fritzbox
z.B. mittels FTP in folgendes Verzeichnis:
/var/media/ftp/FRITZ/bin # Der Verzeichnispfad muss angepasst werden! In diesem Beispiel ist das eine FB7390 im Internen Speicher. chmod +x Rpresence.sh # shell script ausführbar machen.
Ein erster Test von der Telnet Konsole der Fritzbox:
./Rpresence.sh <FBdevicename>
sollte folgendes Ergebnis liefern:
RFritzBox: <FBdevicename> y z
wobei für <FBdevicename> der Name eines Gerätes, so wie in der Fritzbox Weboberfläche definert einzusetzen ist. y ist die Fritzbox interne Devicenummer dieses Gerätes (es sollte jedenfalls nicht 999 hier stehen, in diesem Fall hat die FB den Namen nicht gefunden. z ist der Status (0==abwesend/1==anwesend).
Falls bis hierher alles geklappt hat, ist die Einrichtung auf der Fritzbox fertig.
Installation & konfig & test Daemon am FHEM host
kopieren von RFritzBoxScan.pl ins FHEM Verzeichnis (dort wo alle Module 00_xxx.pm - 99_yyy.pm sind)
sudo chmod +x RFritzBoxScan.pl # ausführbar machen sudo chown fhem:root RFritzBoxScan.pl #for user fhem
Erstellen eines config- files für den daemon: im root FHEM-Verzeichnis ( dort wo üblicherweise auch die fhem.pl zu finden ist ) ein file: credentials.cfg mit folgendem Inhalt erstellen (Adressen/User/Passwort/pfad anpassen):
# PRESENCE credentials (only required for function RemoteFritzBox) $credentials{RemoteFritzBox}{ipadress} = '192.168.1.254'; # FB LAN Adress $credentials{RemoteFritzBox}{username} = 'FritzBoxusername'; $credentials{RemoteFritzBox}{password} = 'FritzboxPasswort'; $credentials{RemoteFritzBox}{shellcmd} = '/var/media/ftp/FRITZ/bin/Rpresence.sh'; # pfad anpassen! $credentials{RemoteFritzBox}{serverhost} = 'localhost'; # RFritzBoxScan.pl provides this service $credentials{RemoteFritzBox}{serverport} = 7777; $credentials{RemoteFritzBox}{serverbin} = 'RFritzBoxScan.pl'; # Fritzbox daemon $credentials{RemoteFritzBox}{speedmatching} = "active"; # optional valid: <active|speed>
Das Format dieser cfg-file entspricht dem im Modul Webcam. Ein erster Test:
./RFritzBoxScan.pl <fullpath and name> # of credentials.cfg eg: /opt/fhem/credentials.cfg
Damit wir der Daemon von Hand gestartet und alle debug-Meldungen kommen auf diese Konsole. Beim Start sollte der Output so aussehen:
RFritzBoxScan: server waiting for client connection on port 7777 RFritzBoxScan: Fritzbox login ok ### die folgenden Zeilen kommen erst ab dem nächsten Schritt ! ### und zwar jedesmal wenn ein request von FHEM an den daemon kommt... RFritzBoxScan: connection from 127.0.0.1:57595 RFritzBoxScan: ..from FHEM received data: Nokia-N810 RFritzBoxScan: ..sending to Fritzbox: Nokia-N810 17 RFritzBoxScan: ..cmdresult: RFritzBox: Nokia-N810 17 1 RFritzBoxScan: ..result to fhem: 1
Installation und Konfiguration FHEM-Module
kopieren von 99_RFritzBox.pm ins FHEM Verzeichnis
sudo chown fhem:root 99_RFritzBox.pm # for user fhem
Im FHEM command-feld:
reload 99_RFritzBox.pm
eintippen (oder FHEM neu starten)
Die FHEM-PRESENCE Definition:
define <myName> PRESENCE function {RemoteFritzBox("<FBdevicename/FB.MAC-Adress>")} 120 120
damit wird in 120 sec Abständen der Status abgefragt. im Telnet Fenster sollten jetzt die requests / response - Meldungen kommen.
Zum Abschluß:
<Strg-C>
im telnet Fenster eingeben, der Daemon wird dadurch gestoppt. Auf den nächsten Aufruf durch FHEM warten, der Daemon wird automatisch (im Hintergrund) gestartet. Überprüfen durch Eingabe von
ps -e | grep RFritzBoxScan
Installation & Debug Variante 2
Voraussetzungen
- fhem auf raspberry o.ä.
installation & konfig & test am FHEM host
Erstellen eines config- files im root FHEM-Verzeichnis ( dort wo üblicherweise auch die fhem.pl zu finden ist ) ein file: credentials.cfg mit folgendem Inhalt erstellen (Adressen/User/Passwort/pfad anpassen):
# PRESENCE credentials (only required for function RemoteFritzBox) $credentials{RemoteFritzBox}{ipadress} = '192.168.1.254'; # FB LAN Adress $credentials{RemoteFritzBox}{username} = 'FritzBoxusername'; $credentials{RemoteFritzBox}{password} = 'FritzboxPasswort';
Das Format dieser cfg-file entspricht dem im Modul Webcam.
Installation und Konfiguration FHEM-Module
kopieren von 99_RFritzBox.pm ins FHEM Verzeichnis
sudo chown fhem:root 99_RFritzBox.pm # for user fhem
Im FHEM command-feld:
reload 99_RFritzBox.pm
eintippen (oder FHEM neu starten)
Die FHEM-PRESENCE Definition:
define <myName> PRESENCE function {RemoteFritzBoxWeb("<FBdevicename/FB.MAC-Adress>")} 120 120
damit wird in 120 sec Abständen der Status abgefragt.
Debug Tip (beide Varianten)
Log Meldungen vom Daemon bekommt man im FHEM Log durch Anlegen eines dummy devices mit dem Namen RemoteFritzBox :
define RemoteFritzBox dummy attr RemoteFritzBox verbose 5 bzw: define RemoteFritzBoxWeb dummy attr RemoteFritzBoxWeb verbose 5
Den Daemon beenden, falls er im Hintergrund läuft (nur Variante 1):
sudo killall RFritzBoxScan.pl
have fun