Anwesenheitserkennung
Viele User führen bereits eine eigene Anwesenheitserkennung durch. Diese basiert in den meisten Fällen auf Ping Checks oder bei FritzBoxen über den Befehl ctlmgr_ctl. Diese Lösungen können aber je nach Aufbau und Funktion FHEM massiv beeinträchtigen. Aufgrund des Aufbaus vom FHEM kann dieses dadurch für mehrere Sekunden zum völligen Stillstand gebracht werden.
Daher gibt es nun ein Modul, welches eine zuverlässige Anwesenheitserkennung bietet, ohne dabei FHEM bei der Ausführung zu beeinträchtigen.
Vorüberlegungen
Generell gibt es mehrere Ansätze um Anwesenheitserkennung mit Handys/Smartphones durchzuführen.
- via PING Checks im gesamten WLAN
- Aktivitätsprüfung auf einer FritzBox
- Bluetooth Checks in der gesamten Wohnung
- via überwachung der per DHCP vergebenen Adresse auf einer Airport Basestation per snmp
Dabei gilt bei der Auswahl der Art darauf zu achten wie sich das jeweilige Device im Bereich WLAN/Bluetooth verhält.
Es gibt Geräte, welche ihr WLAN/Bluetooth auch im Standby ständig an haben und auf Anfragen antworten können (fast alle Android-Geräte). Gerade bei Tests über WLAN kann sich das aber signifikant auf die Akku Leistung auswirken.
Andere Geräte wiederum schalten WLAN im Standby Betrieb aus um Akku zu sparen. Bluetooth hingegen bleibt weiterhin aktiviert und kann auf Anfragen reagieren. (iPhone)
Wenn man bei einem iPhone die Funktion "über WLAN synchronisieren" aktiviert hat, so ist dies auch im Standby jederzeit pingbar wenn der Recher auf dem iTunes zum synchroniseren läuft auch an ist. Ansonsten ist bei iPhone Geräten nur die Aktivitätsprüfung mit einer FritzBox oder das überwachen der DHCP lease auf einer Airport Basestation wirklich zuverlässig.
Auch wenn man Bluetooth aktiviert hat, so bleiben einige Handys erst dann empfangsbereit, wenn sie bereits zu irgend einem Bluetoothgerät gekoppelt wurden. Sind diese Geräte noch nie gekoppelt worden, so deaktivieren diese ihren Bluetooth Empfänger beim verlassen des Bluetooth-Menüs im Gerät (iPhone).
Hier gilt es vor allem auszuprobieren wie stark der Akku durch eine Anwesenheitserkennung beeinträchtigt wird. Entscheidend ist hier in welchem Abstand man eine Anwesenheitserkennung durchführt. Viele Abfragen wirken sich stärker auf den Akku aus als wenige. Wenige Abfragen bieten aber keine zuverlässige und zeitnahe Erkennung.
Da sich jedes Gerät hierbei anders verhält, kann man hier pauschal keine allgemeine Vorgehensweise empfehlen.
Das PRESENCE Modul
Das PRESENCE Modul bietet für die Anwesenheitserkennung mehrere Varianten an. Diese sind aktuell folgende:
- lan-ping - Das überwachen via PING Checks, welche durch den FHEM Server versandt werden.
- fritzbox - Das überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich)
- local-bluetooth - Das überwachen via Bluetooth Checks, welche vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)
- lan-bluetooth - Das überwachen von Bluetoothgeräte, über Netzwerk. Auf einer oder mehreren Maschinen im Netzwerk (z.B. Raspberry Pi) läuft eine Presence-Daemon, welcher nach Bluetooth-Geräten sucht. Um mehrere Presence-Daemon mit FHEM zu verbinden, gibt es den Collector-Daemon, welche sich zu allen Presence-Damons im Netzwerk verbindet und das Ergebnis von allen zusammenfasst.
Ping-Überwachung von Geräten im WLAN/LAN
Um ein Gerät via Ping zu überwachen definiert man folgendes in der fhem.cfg:
define Handy PRESENCE lan-ping 192.168.0.30
Dadurch wird die IP-Addresse 192.168.0.30 aller 30 Sekunden geprüft, ob sie erreichbar ist. Wenn sie erreichbar ist, ist der Status "present" (anwesend), ansonsten "absent" (abwesend)
Mann kann das Timeout verändern indem man es als zusätzlichen Wert hinten anhängt:
define Handy PRESENCE lan-ping 192.168.0.30 60
Nun würde das Handy aller 60 Sekunden geprüft werden.
Nur wenn man bei einem iPhone/iPad die Funktion "über WLAN synchronisieren" aktiviert hat, so ist dies auch im Standby zuverlässig pingbar. Standardmäßig deaktivieren Apple-Geräte ihr WLAN im Standby-Betrieb um Akku zu sparen.
FritzBox: direktes Abfragen der Aktivität via ctlmgr_ctl
Eine sehr häufige und auch zuverlässige Methode ist auf einer FritzBox die Abfrage mittels ctlmgr_ctl Befehl. Über diesen lassen sich alle Geräte abfragen ob sie aktiv sind. Ist ein Gerät aktiv, so gilt es als anwesend.
Dieser Modus kann allerdings nur in FHEM Installationen direkt auf einer FritzBox verwendet werden. Desweiteren muss FHEM unter dem User root laufen. Um ein Gerät zu überwachen wird lediglich der Gerätename benötigt, so wie er unter dem Menüpunkt "Heimnetz" auftaucht. In der fhem.cfg sieht dies folgendermaßen aus.
define Handy PRESENCE fritzbox iPhone-4S
FHEM Ausführung von User boxusr99/fhem zu root ändern
Eine detaillierte Beschreibung um FHEM wieder unter root auf der FritzBox zu starten findet ihr in dem Artikel FritzBox: fhem unter root starten
Bluetooth-Überwachung von Geräten durch den FHEM Server
Jenach Aufstellungsort des FHEM Servers kann es sinnvoll sein, eine Bluetooth-Überwachung direkt durch den FHEM Server durchzuführen. Hierbei gilt allerdings zu beachten, das Bluetooth nicht für große Reichweiten gedacht ist und in den meisten Fällen keine Wände überwinden können. Das heist, dass man in den meisten Fällen damit nur einen Raum überwachen kann.
Je nach Einsatzzweck kann das auch so gewollt sein. Bluetooth USB Sticks welche bereits Bluetooth 4.0 unterstützen können höhere Reichweiten über Zimmerwände hinaus erreichen. Voraussgesetzt das Handy unterstützt Bluetooth 4.0.
Um eine Überwachung per Bluetooth durchführen zu können benötigt man die Bluetooth-Adresse eines Gerätes. Diese ähnelt sich vom Aufbau einer MAC-Adresse. Generell wird die Adresse in den Telefon-Informationen bei Smartphones angezeigt.
Um eine Anwesenheitserkennung via Bluetooth durchzuführen wird folgende Zeile in der fhem.cfg benötigt:
define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX
Bluetooth-Überwachung von Geräten durch verteilte Agenten in der Wohnung (presencd/collectord)
Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich mehrere Bluetooth-Empfänger zu verwenden, welche auf mehrere oder alle Räume verteilt sind.
Hierführ bietet sich zum Beispiel ein Raspberry Pi mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.
Dieses Netz aus Raspberrys wird mit dem presenced (Download-Link ist in der Commandref zum Modul enthalten) ausgestattet. Es stehen bereits entsprechende Pakete für das Raspberry zur Verfügung.
Beide Programme (presenced/collectord) sind Perl-Skripte welche als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation benötigt mit Standardmodulen. Nach Installation der *.deb Paket sollten diese noch angewiesen werden, automatisch beim Rechner-Neustart gestartet zu werden:
sudo update-rc.d presenced defaults sudo update-rc.d collectord defaults
Eine detaillierte Benutzung von presenced findet man in der Commandref zum PRESENCE Modul.
Jeden Raum einzeln ansprechen (presenced)
Nun kann man zuallererst jeden Raum einzeln ansprechen. Dabei ist zu beachten, dass pro Definition in der FHEM.cfg nur ein Gerät in einem Raum spezifisch überwacht werden kann.
Eine Definition sieht dabei wie folgend aus:
define Handy_Wohnzimmer PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.0.10:5111
Damit wird nun das Handy nur im Wohnzimmer (Raspberry mit IP 192.168.0.10) überwacht.
Alle Räume gemeinsam ansprechen (collectord)
Um jedoch alle Räume gemeinsam zu verwenden gibt es den Collector-Daemon. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status inkl. der Angabe des Raumes, in welchem das Gerät erkannt wurde.
Um alle Räume zu kennen, müssen diese mit einem Config-File dem collectord mitgeteilt werden. Dieses sieht folgendermaßen aus:
[Schlafzimmer] # Name des Raumes (wird in FHEM als Reading angezeigt) address=192.168.179.31 # IP-Adresse oder Hostname des presenced port=5111 # TCP Port welcher verwendet werden soll (standardmäßig Port 5111) presence_timeout=120 # Prüfinterval welches verwendet werden soll, wenn ein Gerät anwesend ist absence_timeout=20 # Prüfinterval welches verwendet werden soll, wenn ein Gerät abwesend ist [Wohnzimmer] address=192.168.179.34 port=5111 presence_timeout=180 absence_timeout=20
Mit dieser Konfiguration kann der Collectord gestartet werden. Es empfiehlt sich diesen mit auf dem FHEM Server zu betreiben. Nun kann man in der fhem.cfg folgenden Eintrag hinzufügen.
define Handy PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222
Sobald das Handy irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort an FHEM und teilt den Raum mit.
Eine detaillierte Benutzung von collectord findet man in der Commandref zum PRESENCE Modul.
Überwachung von Geräten mit Perl-Code
Es ist möglich zum Überwachen von Geräten eine eigene Perl-Funktion zu verwenden die dann vom PRESENCE Modul im Hintergrund aufgerufen wird.
define <name> PRESENCE function {...} [ <check-interval> [ <present-check-interval> ] ]
Sobald die Funktion den Rückgabewert 1 hat, ist das Gerät anwesend, bei 0 abwesend.
Beispiel DHCP überwachung auf Airport Basestation
Die hier vorgestellte Überwachung der DHCP Lease auf Airport Basestations per SNMP ist absolut robust gegenüber dem Ruhezustand von iOS und setzt keine weitere Konfiguration auf dem iPhone voraus.. Das abmelden beim verlassen des Empfangsbereiches der Basestation geschieht mit etwa 5-10 Minuten Verzögerung und ist somit auch vor kurzzeitigen Empfangsproblemen sicher. Das nebenstehende Bild verdeutlicht noch mal die unterschiede zwischen einer IP-Basierten Ping-Überwachung und der Überwachung auf Ebene der Basestation oder FritzBox.
Bevor der folgende Code verwendet werden kann ist das Perl Modul Net:SNMP zu installieren. das geht z.b. mit: cpan install use Net::SNMP.
Zuerst ist folgender Code in 99_myUtils.pl einzufügen:
use Net::SNMP; sub snmpCheck($$) { my ($airport,$client)= @_; my $community = "public"; my $host = $airport; my $oid = ".1.3.6.1.2.1.3.1.1.2"; #my $oid = ".1.3.6.1.2.1.3.1.1.2.25.1.10.0.1"; my ( $session, $error ) = Net::SNMP->session( -hostname => $host, -community => $community, -port => 161, -version => 1 ); if( !defined($session) ) { return 0; return "Can't connect to host $host."; } my @snmpoids = (); my $response = $session->get_next_request($oid); my @nextid = keys %$response; while ( $nextid[0] =~ m/^$oid/ ) { push( @snmpoids, $nextid[0] ); $response = $session->get_next_request( $nextid[0] ); @nextid = keys %$response; } if( !defined($response = $session->get_request( @snmpoids ) ) ) { return 0; } foreach my $value (values %$response) { return 1 if( $value eq $client ) } return 0; }
Danach lässt sich das Mobilgerät so überwachen:
define iPhone PRESENCE function {snmpCheck("10.0.1.1","0x44d77429f35c")} 30 30
wobei 10.0.1.1 durch die IP-Adresse der Basestation und 0x44d77429f35c durch die MAC adresse des Geräts als HEX-Zahl ersetzt werden muss.
Beispiele für die Nutzung der Anwesenheitserkennung
Hier sollen Beispiele für die Nutzung von PRESENCE aufgezeigt werden.
Abschalten aller Verbraucher (Licht, Musikanlage) beim Verlassen der Wohnung
Typisches Szenario: Man geht ausser Haus, aber hat vergessen im Bad das Licht aus zu machen. Allerdings geht man heutzutage fast garnicht mehr ohne Handy aus dem Haus.
Nun soll FHEM in der gesamten Wohnung das Licht, sowie sonstige Verbraucher ausschalten, wenn ich länger als 15 Minuten ausser Haus bin. Dazu benötigt man zuerst eine structure, welche alle Verbraucher und sonstige Devices, welche das betrifft zusammenfasst.
define Gesamte_Wohnung structure Gesamtes_Licht Licht_Wohnzimmer Licht_Kueche LED_Kueche Licht_Bad Licht_Schlafzimmer AV_Receiver TV_Steckdose attr Gesamte_Wohnung room Wohnung
Nun kann man mittels eines watchdogs eine Überwachung für sein Handy anlegen:
# Überwachen der gesamten Wohnung mittels collectord sowie presenced in jedem Raum define Handy PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222 # Nach 15 Minuten Abwesenheit (Handy im Status "absent") soll die gesamte Wohnung ausgeschaltet werden. define watchdog_Anwesenheit watchdog Handy:absent 00:15 Handy:present set Gesamte_Wohnung off ; setstate watchdog_Anwesenheit defined attr watchdog_Anwesenheit regexp1WontReactivate 1