Anwesenheitserkennung - Remote Fritzbox

Aus FHEMWiki
Version vom 20. Januar 2014, 17:51 Uhr von Caldir65 (Diskussion | Beiträge) (Ergänzung zweite FB als Repeater)

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.

Diese Lösung basiert (wie auch die PRESENCE fritzbox Funktion) auf dem Fritzbox Befehl ctlmgr_ctl, der jedoch von der "Ferne" ausgelöst werden muß, 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)

Konzept

  • 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.


Installation / Debug

Der code ist als zip-file im thread PRESENCE-RemoteFritzbox abgelegt. Bitte in diesem thread auch Fragen/Feedback/Wünsche posten.

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 muß angepaßt 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

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>")} 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

Debug Tip

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

Den Daemon beenden, falls er im Hintergrund läuft:

sudo killall RFritzBoxScan.pl


have fun erwin