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:

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.

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:

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:

Leider funktioniert die Installation bei mir nicht, und bricht mit folgender Meldung ab:

Daher versuchte ich mein Glück mit cpanminus:

Nach zirka 15 Minuten war die Installation erfolgreich:

Schritt 4: FHEM konfigurieren

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.

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

Über

Jahrgang 87, gelernter Softwareentwickler und fast ein Jahrzehnt Erfahrung im Bereich Web-Entwicklung mit PHP und Web-Design. Diese Eigenschaften machen mich zu einem geeigneten und geschätzten Ansprechpartner für die Umsetzung Ihres Projektes. Weiterhin bin ich seit Ende 2013 Magento Certified Developer.

10 Kommentare


  • Genial, haben sowas ähnliches für unsere WG vor. Mit Begrüßung etc. Müssen wir mal schauen wie sich das ganze umsetzen lässt und vorallem wieviele PIs und deren Rechenpower wir tatsächlich dafür brauchen aber ich kann mich jetzt schon einmal für das Tutorial bedanken!

    • Viel Rechenleistung braucht die Anwesenheitskontrolle bestimmt nicht. Die Frage ist eher, was damit alles gesteuert werden soll. Ich komme mit dem einen Gerät noch sehr gut hin – und da läuft immerhin noch XBMC parallel drauf. 🙂

  • Sehr gute Idee! Nach dem mein PI nun doch nicht mehr ins Auto eingebaut wird (grottenschlechte Video-IN Qualität in meinem Peugeot ;(, werde ich jetzt versuchen die Anwesenheit in unserem neuen Büro zu überwachen und die Kollegen automatisch für die Annahme der eingehenden Anrufe im Asterisk anzumelden. Im Moment wird immer wieder vergessen die Anmeldetaste auf dem Telefon zu betätigen. Danke für Tutorial.

  • Pingback: My Homepage

  • Hi,
    ich habe eine FritzBox und über dlan sind 2 Wifi Adater angeschlossen.
    Nun möchte ich mit meinem Pi, der sich in der Garage befindet, feststellen
    ob mein Smartphone sich dort befindet. Also nur im Teilnetz (wlan0), nicht
    im gesamten Netz.
    Habe dort mit dem Pi eine Steuerung installiert, die unter anderem auch selbsttätig das Garagentor öffnen könnte, wenn mein Smartphone anrückt.
    Gruß

    • Das ist mit der hier gezeigten Lösung natürlich nicht möglich, da ich nur prüfe, ob das Smartphone überhaupt eine IP bekommen hat. In dem Fall würde ich eher eine Bluetooth-Lösung probieren.

  • Walter Dick

    Hallo
    Vielen Dank für die Beschreibung. Deine Seite ist klasse und ich lese sie gern. Leider habe ich ein kleines Verständnisproblem. Ich verwende einen Raspberry Pi und FHEM muss ich das da installieren oder muss ich das auf der FritzBox installieren? Letzteres ungern!
    Danke schon mal für die Antwort
    Walter

    • Hi Walter,

      das ist relativ schnell erklärt: Der Raspberry stellt regelmäßig Anfragen per SNMP (Wikipedia erklärt sicher gerne mehr) an den Router. Dieser muss dazu natürlich SNMP unterstützen. Da die FritzBox das können sollte (denke ich zumindest – sind ja gute Geräte), musst Du es dort maximal aktivieren. Installieren muss man dafür i.d.R. nichts.

      Was Du installieren musst, ist das entsprechende Paket auf dem Raspberry, damit der überhaupt SNMP versteht.

      Grüße,

      Matthias

  • Ich habe mir auch eine Anwesenheitserkennung für mein iPhone gebaut. Nicht per SNMP sondern per SSH und remote commands. Grund ist das das MAC adress aging zu lange braucht um zu erkennen, das ein Device nicht mehr da ist.
    Aber weder deine noch meine dürfte zuverlässig funktionieren. Der Grund: Das iPhone schaltet im sleep mode (also wenn man nix tut, was ja die meine Zeit sein dürfte) das WLAN ab.
    Ich habe rumgegooglet, aber offensichtlich lässt sich das nicht ändern. Damit meldet der FHEM absent auch wenn man zu Hause ist. Doof.

    • Ja, ich habe meine Lösung auch schon wieder offline genommen. Die einzig zuverlässige Variante wird ein Bluetooth-Dongle sein, mit welchen sich das Phone automatisch verbindet wenn man zu Hause ist. Das wird der Grund sein, warum es die meisten anderen auch so machen…

Kommentar verfassen