Anwesenheitserkennung - Remote Fritzbox

Aus FHEMWiki

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.

update Version 1.3 Anpassung an die Änderungen im PRESENCE Modul, nun wahlweise die Angabe von Device-Namen oder MAC-Adresse möglich!

update Version 1.7 RemoteFritzBoxWeb speichert nun ebenfalls die Session-ID, damit weniger logins notwendig. Unterstützung für Repeater 1750E eingebaut, Abfragen werden serialisiert.

update Version 1.9 RemoteFritzBoxWeb: startup verbessert, verwendet telnetforBlocking zur Rückmeldung an fhem, OSX compatibility: keine Verwendung von pidof

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).
  • Ab der Version 1.7 werden die Logindaten (Sid) zwischengespeichert (ca. 3 Minuten), das bringt wesentliche Performance-Vorteile.
  • Zusätzlich werden die Webanfragen serialisiert, d.h. nur eine Abfrage gleichzeitig, damit sollten die select/timeout errors weg sein.
  • Feature: Diese Version bietet die Möglichkeit, eine zweite Fritzbox (oder einen Repeater) per Web abzufragen.
  • Derzeit getestet sind FB 7270,7390,7490 und der Repeater 1750E.

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/FB-MAC-Adress>

sollte folgendes Ergebnis liefern:

RFritzBox: <FBdevicename/FB-MAC-Adress> y z

wobei für <FBdevicename/FB-MAC-Adress> der Name bzw. die MAC-Adresse 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/Modell anpassen):

# PRESENCE credentials (only required for function RemoteFritzBoxWeb)
$credentials{RemoteFritzBox}{ipadress} = '192.168.1.254'; 	# FB LAN Adress
$credentials{RemoteFritzBox}{username} = 'FritzBoxusername';
$credentials{RemoteFritzBox}{password} = 'FritzboxPasswort';
$credentials{RemoteFritzBox}{model}    = 'FB';                 	# optional FB-model: FB, FBLAN (for 7270,7390,7490), 1750E
#								# model FB specifies the WLAN page, FBLAN the LAN page on Fritzbox-Web
# only required for a 2nd FB or repeater to be monitored by RemoteFritzBoxWeb - see below
$credentials{RemoteFritzBox1}{ipadress} = '192.168.1.253'; 	# 2nd FB LAN Adress
$credentials{RemoteFritzBox1}{username} = 'FritzBoxusername';	# optional, else 1st entry will be used
$credentials{RemoteFritzBox1}{password} = 'FritzboxPasswort';	# optional, else 1st entry will be used
$credentials{RemoteFritzBox1}{model}    = '1750E';              # optional FB-model: FB, FBLAN (for 7270,7390,7490), 1750E

Das Format dieser cfg-file entspricht dem im Modul Webcam.
Unterstütze Modelle:

  FB      holt und parsed die WLAN-Seite der Fritzbox, z.b: Fritzbox WLAN
  FBLAN   holt und parsed die LAN-Seite der Fritzbox, z.b: Fritzbox LAN
  1750E   holt und parsed die WLAN-Seite des Repeaters, z.b: Repeater WLAN

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 Definitionen:

define RemoteFritzBoxWeb dummy                     # muss RemoteFritzBoxWeb heissen, in diesem dummy wird 
                                                        # das Web-login zwischengespeichert!
attr RemoteFritzBoxWeb event-on-update-reading none	# verhindert unnötige notify's
attr RemoteFritzBoxWeb verbose (1-5)			# optional: debugging on level 4-5
define <myName> PRESENCE function {RemoteFritzBoxWeb("<FBdevicename/FB.MAC-Adress>")} 120 120

damit wird in 120 sec Abständen der Status abgefragt.

Optional: Zweite Fritzbox/Repeater definieren:

define <my2ndFritzbox> PRESENCE function{RemoteFritzBoxWeb("<FBdevicename/FB.MAC-Adress>", 1)} 120 120 

Die 1 im Funktionsaufruf ist wichtig!

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