Nabend zusammen,
ich bin während ich mit dem Netzwerk-Plugin und meinem Android-Phone rumprobiert habe um über ne App ("Trigger") beim Einloggen ins WLAN den Alarm auszuschalten auf die Idee gekommen das ganze über die FritzBox zu lösen.
Vorteil dabei ist, dass ich der werten Dame im Haus nicht erklären muss wie Sie welche App zu konfigurieren hat, sondern ich einfach ihr Handy in die Prüfung einbeziehe ;-)
Grundlage dafür war ist ein Fundstück vom FHEM-Wiki:
Anwesenheitserkennung - Remote Fritzbox ? FHEMWiki
Einige Schritte aus dieser Anleitung müssen auch für die Smarthome Integration ausgeführt werden:
1. Telnet auf der FritzBox aktivieren.
2. perl NET::Telnet Modul auf dem Host installieren. Beim Raspberry-PI geht das so:
3. kopieren von Rpresence.sh in die Fritzbox z.B. mittels FTP in folgendes Verzeichnis:
Ab hier variiert die Anleitung dann:
4. RFritzBoxScan.pl + configuration in ein Verzeichnis kopieren. (z.B. "/usr/local/remoteFritzBox/", ggf. User und Berechtigungen anpassen)
5. RFritzBoxScan.pl ausführbar machen
6. credentials.cfg erstellen / anpassen (Quelle: s.o.)
7. Logic-Script im Smarthome Verzeichnis anlegen
Folgende Teile müssen an Eure Gegebenheiten angepasst werden:
- Pfade zur Binary & Config [Zeile 8 & 9]
- Zu prüfende Gerätenamen (WICHTIG: Das sind die Namen der Geräte die man im FB-Interface findet) [Zeile 12]
- ggf. Socket / Port aus der "configuration" [Zeile 26]
- Den Item-Teil ab Zeile 38.
8. Datei ausführbar machen und in "smarthome/etc/logic.conf" anlegen. (z.B. cycle = 300)
Das ganze ist so ohne große Python-Kentniss (außer Google und ein paar Blicke in SH.py) entstanden, daher versuche ich bei Fragen so gut es geht zu helfen und Verbesserungsvorschläge werden gerne angenommen.
PS: der Socket wird für jedes Gerät neu aufgebaut, da der "FritzBoxRemote-Server" die Verbindung nach einem "send" wieder schließt. Ich vermute das hat n Grund, daher habe ich das Perl-Script (das kann ich noch weniger als Python
) nicht angepasst und mach einfach mehrmals die Socket-Read-Close Schleife. :-)
Grüße,
Lars
PS: den Download der benötigten Datein gibt es auch hier:
PRESENCE-RemoteFritzbox
ich bin während ich mit dem Netzwerk-Plugin und meinem Android-Phone rumprobiert habe um über ne App ("Trigger") beim Einloggen ins WLAN den Alarm auszuschalten auf die Idee gekommen das ganze über die FritzBox zu lösen.
Vorteil dabei ist, dass ich der werten Dame im Haus nicht erklären muss wie Sie welche App zu konfigurieren hat, sondern ich einfach ihr Handy in die Prüfung einbeziehe ;-)
Grundlage dafür war ist ein Fundstück vom FHEM-Wiki:
Anwesenheitserkennung - Remote Fritzbox ? FHEMWiki
Einige Schritte aus dieser Anleitung müssen auch für die Smarthome Integration ausgeführt werden:
1. Telnet auf der FritzBox aktivieren.
2. perl NET::Telnet Modul auf dem Host installieren. Beim Raspberry-PI geht das so:
Code:
sudo apt-get install libnet-telnet-perl
Code:
/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.
Ab hier variiert die Anleitung dann:
4. RFritzBoxScan.pl + configuration in ein Verzeichnis kopieren. (z.B. "/usr/local/remoteFritzBox/", ggf. User und Berechtigungen anpassen)
5. RFritzBoxScan.pl ausführbar machen
Code:
chmod +x RFritzBoxScan.pl
Code:
# 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
7. Logic-Script im Smarthome Verzeichnis anlegen
Code:
#!/usr/bin/env python import socket import subprocess import time # define binary and config file fritzboxScanBin = "/usr/local/remoteFritzBox/RFritzBoxScan.pl" fritzboxScanCfg = "/usr/local/remoteFritzBox/credentials.cfg" # define devices to scan for devices = ["Lars-Handy", "Sarah-Handy"] # ensure that RFritzBoxScan is running if subprocess.check_output("ps -e | grep RFritzBoxScan | grep -v grep | wc -l", shell = True) == b'0\n': logger.info("Startig RFritzBoxScan...") subprocess.Popen(fritzboxScanBin + " " + fritzboxScanCfg + " 1>/dev/null", shell = True) time.sleep(1) presence = False # check if at least one of the devices is currently logged in for deviceName in devices: # open socket # change ip and / or port if it differs from fritzboxScanCfg sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("127.0.0.1", 7777)) sock.send(bytes(deviceName, "UTF-8")) data = sock.recv(1024) if data == b'1': presence = True break; # close socket sock.close() # do some logic with presence information (or set an item value) if presence == True: # alarm off logger.info("Alarm ausgeschaltet") sh.zentral.alarm.gesamt(0) elif sh.eg.fenster.gesamt() == 0 and sh.og.fenster.gesamt() == 0 and sh.kg.fenster.gesamt() == 0: logger.info("Alarm eingeschaltet") # alarm on, if windows are closed sh.zentral.alarm.gesamt(1) else: # notify me about absence with open windows. Maybe it's okay, but otherwise we could close windows sh.nma("Warnung", "Abwesenheit festgestellt, Fenster noch offen. Alarm wurde nicht aktiviert.")
- Pfade zur Binary & Config [Zeile 8 & 9]
- Zu prüfende Gerätenamen (WICHTIG: Das sind die Namen der Geräte die man im FB-Interface findet) [Zeile 12]
- ggf. Socket / Port aus der "configuration" [Zeile 26]
- Den Item-Teil ab Zeile 38.
8. Datei ausführbar machen und in "smarthome/etc/logic.conf" anlegen. (z.B. cycle = 300)
Das ganze ist so ohne große Python-Kentniss (außer Google und ein paar Blicke in SH.py) entstanden, daher versuche ich bei Fragen so gut es geht zu helfen und Verbesserungsvorschläge werden gerne angenommen.
PS: der Socket wird für jedes Gerät neu aufgebaut, da der "FritzBoxRemote-Server" die Verbindung nach einem "send" wieder schließt. Ich vermute das hat n Grund, daher habe ich das Perl-Script (das kann ich noch weniger als Python

Grüße,
Lars
PS: den Download der benötigten Datein gibt es auch hier:
PRESENCE-RemoteFritzbox
Kommentar