Ich habe schon öfter davon gelesen, dass manche ihre Anwesenheit per Bluetooth-Dongle am Raspberry Pi überwachen. Das funktioniert bestimmt auch gut – aber warum sollte man noch ein USB-Port mehr belegen und noch Geld für einen USB-Dongle ausgeben, wenn es noch viel einfacher geht – und zwar mit den Mitteln, die man schon zu Hause im Einsatz hat. Alles was man dazu benötigt, ist ein SNMP-fähiger Router und ein Smartphone mit WiFi-Zugang.
Der Plan sieht folgendermaßen aus: Sobald ich zu Hause bin, verbindet sich mein iPhone automatisch mit meinem WLAN. Natürlich bekommt es dann eine vom DHCP eine IP-Adresse zugewiesen. Anhand der registrieren Mac-Adresse können wir also überprüfen, ob ich zu Hause bin. Natürlich könnte man das Ganze auch mit einem einfachen Ping lösen (das geht sogar von Haus aus), aber leider geht das iPhone nach einer Zeit in den Standby-Modus und beantwortet keinen Ping mehr – das ist also sehr unzuverlässig. Der Plan ist also, den Router nach der Anwesenheit des iPhones zu fragen.
Schritt 1: Statische IP für das iPhone
Damit man das iPhone eindeutig identifizieren kann, muss man dafür sorgen, dass kein anderes Gerät im Netz irgendwann mal die entsprechende IP bekommt. Der Einfachheit halber, lösen wir das über den DHCP. Per Mac-Adresse vergeben wir also immer die selbe IP an das Smartphone. Auf dem iPhone bekommen wir Mac-Adresse über folgenden Menupunkt heraus: Settings / General / About / Wi-Fi Address (bzw. Einstellungen / Allgemein / Info / WLAN-Adresse). In meinem Fall bekommt es (weiterhin) die 106 im Netz.
Dieser Schritt ist zwar nicht unbedingt notwendig, da wir mit Mac-Adressen arbeiten werden, aber es hilft doch eindeutig die Übersicht zu behalten.
Schritt 2: SNMP-Variable ermitteln
Nun ist das SNMP leider nicht das einfachste Protokoll und ich stehe noch ganz am Anfang das Ganze zu verstehen. Unter SNMP gibt es den sogenannten Object-Tree. Um eine Konfigurationsvariable auszulesen, braucht man also den entsprechenden Pfad im Baum – klar soweit. Aber welche Variable kommt in Frage, um die Anwesenheit zu kontrollieren?
Erstmal schauen wir mit snmpwalk, was es denn alles auf dem Gerät zu der iPhone-IP alles gibt:
snmpwalk -v 2c -c public -O e 192.168.2.1 | grep 106
Leider ändert sich keines der gelisteten Ergebnisse, wenn man die WLAN-Verbindung am iPhone kappt.
Variablen
Die Variable ipNetToMediaPhysAddress (hier dokumentiert), wandelt eine IP-Adresse in eine physische Adresse (Mac-Adresse). Die Idee: Wenn das iPhone nicht mehr im Netz ist, kann man die physikalische Adresse auch nicht mehr ermitteln.
snmpget -v 1 -c public 192.168.2.1 1.3.6.1.2.1.4.22.1.2.20.192.168.2.106 > IP-MIB::ipNetToMediaPhysAddress.20.192.168.2.106 = STRING: f5:f1:5a:32:77:da
Funktioniert aber leider nicht. Mit einem Watch habe ich probiert, was passiert wenn ich das WLAN am iPhone ausschalte: Nach 5 Minuten habe ich immer noch die selbe Antwort erhalten. Nicht gut also.
Im offiziellen Wiki ist beschrieben, wie man eine Lösung mit SNMP realisiert. Leider ist das dort genutzte Objekt atPhysAddress (hier dokumentiert) als deprecated angegeben:
snmpwalk -c public -v 1 192.168.2.1 .1.3.6.1.2.1.3.1.1.2 SNMPv2-SMI::mib-2.3.1.1.2.2.1.109.91.20.1 = Hex-STRING: 00 26 CB D5 B0 D9 SNMPv2-SMI::mib-2.3.1.1.2.20.1.192.168.2.102 = Hex-STRING: E4 8B 7F 9D CD 71 SNMPv2-SMI::mib-2.3.1.1.2.20.1.192.168.2.103 = Hex-STRING: 70 73 CB D9 D1 9A SNMPv2-SMI::mib-2.3.1.1.2.20.1.192.168.2.104 = Hex-STRING: F0 D1 A9 7B 28 90 SNMPv2-SMI::mib-2.3.1.1.2.20.1.192.168.2.105 = Hex-STRING: F8 1E DF DC FF B5 SNMPv2-SMI::mib-2.3.1.1.2.20.1.192.168.2.106 = STRING: "??Z2w?" SNMPv2-SMI::mib-2.3.1.1.2.20.1.192.168.2.107 = Hex-STRING: 60 C5 47 89 93 84 SNMPv2-SMI::mib-2.3.1.1.2.20.1.192.168.2.113 = Hex-STRING: B8 27 EB F4 86 66
Wie wir uns gemerkt haben, sollte das iPhone die 106 bekommen. Ausgerechnet dieser Eintrag verhält sich anders und liefert ein Ergebnis, welches nicht gerade nach einer Mac-Adresse aussieht. Wenn man etwas genauer hinsieht, wird aber aus irgend einem Grund nur versucht die Mac-Adresse in einen String zu wandeln. Seltsam. Ein HEX-to-String-Converter bringt hier Licht ins Dunkle. Auf jeden Fall ist es aber das richtige Gerät.
Nachdem ich das WLAN am iPhone für ungefähr 15-20 Minuten deaktiviert hatte, ist der Eintrag aus der Liste dann auch verschwunden. Funktioniert also. Weiter im Text.
Schritt 3: Installation nötiger Software
Damit SNMP unter Perl verfügbar ist, müssen wir uns erst einmal das entsprechende Paket per cpan installieren:
cpan install use Net::SNMP
Leider funktioniert die Installation bei mir nicht, und bricht mit folgender Meldung ab:
Going to read '/home/pi/.cpan/Metadata' Database was generated on Sun, 29 Dec 2013 00:07:29 GMT Fetching with LWP: http://www.planet-elektronik.de/CPAN/authors/01mailrc.txt.gz Going to read '/home/pi/.cpan/sources/authors/01mailrc.txt.gz' ............................................................................DONE Fetching with LWP: http://www.planet-elektronik.de/CPAN/modules/02packages.details.txt.gz Going to read '/home/pi/.cpan/sources/modules/02packages.details.txt.gz' Database was generated on Mon, 27 Jan 2014 23:41:02 GMT .............. New CPAN.pm version (v2.00) available. [Currently running version is v1.960001] You might want to try install CPAN reload cpan to both upgrade CPAN.pm and run the new version without leaving the current session. ..............................................................DONE Fetching with LWP: http://www.planet-elektronik.de/CPAN/modules/03modlist.data.gz Going to read '/home/pi/.cpan/sources/modules/03modlist.data.gz' ............................................................................DONE Going to write /home/pi/.cpan/Metadata Running install for module 'use' Running make for A/AU/AUDREYT/use-0.05.tar.gz Checksum for /home/pi/.cpan/sources/authors/id/A/AU/AUDREYT/use-0.05.tar.gz ok Uncompressed /home/pi/.cpan/sources/authors/id/A/AU/AUDREYT/use-0.05.tar.gz successfully Using Tar:/bin/tar xf "use-0.05.tar": Couldn't untar use-0.05.tar Package seems to come without Makefile.PL. (The test -f "/home/pi/.cpan/build/AUDREYT-3Zx1SX/Makefile.PL" returned false.) Writing one on our own (setting NAME to use) Had problems unarchiving. Please build manually Running make test Make had some problems, won't test Running make install Make had some problems, won't install Running install for module 'Net::SNMP' Running make for D/DT/DTOWN/Net-SNMP-v6.0.1.tar.gz Checksum for /home/pi/.cpan/sources/authors/id/D/DT/DTOWN/Net-SNMP-v6.0.1.tar.gz ok Uncompressed /home/pi/.cpan/sources/authors/id/D/DT/DTOWN/Net-SNMP-v6.0.1.tar.gz successfully Using Tar:/bin/tar xf "Net-SNMP-v6.0.1.tar": Couldn't untar Net-SNMP-v6.0.1.tar Package seems to come without Makefile.PL. (The test -f "/home/pi/.cpan/build/DTOWN-4QHBBb/Makefile.PL" returned false.) Writing one on our own (setting NAME to NetSNMP) Had problems unarchiving. Please build manually Running make test Make had some problems, won't test Running make install Make had some problems, won't install
Daher versuchte ich mein Glück mit cpanminus:
sudo curl -L http://cpanmin.us | perl - --sudo App::cpanminus sudo apt-get install gcc-4.7 sudo cpanm use Net::SNMP
Nach zirka 15 Minuten war die Installation erfolgreich:
--> Working on use Fetching http://www.cpan.org/authors/id/A/AU/AUDREYT/use-0.05.tar.gz ... OK ==> Found dependencies: ExtUtils::MakeMaker --> Working on ExtUtils::MakeMaker Fetching http://www.cpan.org/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-6.86.tar.gz ... OK Configuring ExtUtils-MakeMaker-6.86 ... OK Building and testing ExtUtils-MakeMaker-6.86 ... OK Successfully installed ExtUtils-MakeMaker-6.86 (upgraded from 6.57_05) Configuring use-0.05 ... OK ==> Found dependencies: Hook::LexWrap --> Working on Hook::LexWrap Fetching http://www.cpan.org/authors/id/C/CH/CHORNY/Hook-LexWrap-0.24.tar.gz ... OK Configuring Hook-LexWrap-0.24 ... OK Building and testing Hook-LexWrap-0.24 ... OK Successfully installed Hook-LexWrap-0.24 Building and testing use-0.05 ... OK Successfully installed use-0.05 --> Working on Net::SNMP Fetching http://www.cpan.org/authors/id/D/DT/DTOWN/Net-SNMP-v6.0.1.tar.gz ... OK Configuring Net-SNMP-v6.0.1 ... OK Building and testing Net-SNMP-v6.0.1 ... OK Successfully installed Net-SNMP-v6.0.1 4 distributions installed
Schritt 4: FHEM konfigurieren
cd /opt/fhem/FHEM/ sudo touch 99_myUtils.pm sudo chown fhem 99_myUtils.pm
Den Inhalt der Datei könnt ihr von hier kopieren.
Was nun noch fehlt, ist die Konfiguration des neuen Gerätes. Dafür arbeiten wir mit PRESENCE. Was dieser „Gerätetyp“ alles kann, steht sehr gut beschrieben in der Dokumentation von FHEM.
define iPhone PRESENCE function {snmpCheck("192.168.2.1","0xf4f15a3257dc")} 15 15 attr iPhone event-on-change-reading state define watchdog_Anwesenheit watchdog iPhone:absent 00:15 iPhone:present set WohnzimmerAlles off ; setstate watchdog_Anwesenheit defined attr watchdog_Anwesenheit regexp1WontReactivate 1
Weiterhin habe ich konfiguriert, dass nach 15 Minuten Abwesenheit des iPhones, alles im Wohnzimmer abgeschaltet werden soll (wobei WohnzimmerAlles ein Struct ist, welches alle Lampen enthält).
Nach einem Neustart von FHEM sollte man dann folgendes in der Weboberfläche erkennen.