Raspberry mit CUL-Stick

Projekt Raspberry Pi: Anwesenheit per SNMP ermitteln – Part 8

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.

FHEM iPhone Present


Beitrag veröffentlicht

in

, , , ,

von

Schlagwörter: