Vorstellung meiner Anwesenheitserkennung mit Bluetooth

Begonnen von Markus Bloch, 27 Januar 2013, 13:39:33

Vorheriges Thema - Nächstes Thema

Markus Bloch

Hallo zusammen,

schon vor längerer Zeit hatte ich mich auf die Suche begeben, nach einer Anwesenheitserkennungslösung. Sowohl in der alten Mailing-Liste, als auch hier im Forum wurde darüber immer wieder diskutiert. Viele hatten dies mit Hilfe von Ping-Tests via WLAN mit ihren Handys realisiert. Das kam für mich leider nicht in Frage, da jedes iPhone im Standby die WLAN Verbindung beendet und somit nicht mehr erreichbar währe. Android Handys lassen ihr WLAN ja bekanntlicherweise an (wobei sich das wirklich extrem auf den Akku auswirkt).

Ein Arbeitskollege von mir, welcher bei Siemens den Bluetooth-Standard mitentwickelte, brachte mich auf die Idee es doch mit Bluetooth-Paging zu versuchen. Dabei werden öffentliche Informationen von einem Bluetooth-Device abgefragt (Name, Hersteller, Bluetooth-Version, unterstützten Features). Diese Informationen sind für jedes Gerät abfragbar welches Bluetooth aktiviert hat (unabhängig ob sichtbar oder nicht).

Dies kann man unter Linux mittels "hcitool info <bluetooth-addresse>" abfragen. So lässt sich auch herausfinden, ob ein Device in Reichweite ist, oder nicht. Denn wenn der Name ermittelt werden kann, ist ein Device logischerweise in Reichweite. Wenn nicht, dann ist es nicht anwesend.

Aufgrund der Tatsache, dass ich mein Handy stets dabei habe, liese sich so eine einfache Anwesenheitserkennung bauen, ohne manuelle Interaktion.

Daraus sind nun 2 Perl-Programme und 1 FHEM Modul entstanden, was ich euch hier vorstellen möchte.

presenced - Das Herz des ganzen, was ein oder mehrere Devices auf Anwesenheit prüft

Dieser Daemon macht nix anderes, als auf dem Port 5111 TCP zu lauschen und auf Kommandos zu warten. Sobald ein Kommando eintrifft (Bluetooth Addresse und ein Check Interval in Sekunden) beginnt dieser dieses Device zyklisch zu prüfen. Dabei wird einfach der Befehl "hcitool info <Bluetooth-Addresse>" aufgerufen und geschauht, ob der Name ermittelt werden kann.

Wenn der Name ermittelt werden konnte, wird der Status "present" (anwesend) mit dem Namen des Devices zurück an den Client geschickt. Anderenfalls ist der Status "absent" (abwesend).

Es können dabei mehrere Clients gleichzeitig jeweils 1 Gerät überwachen. Dass bedeutet, Client 1 möchte Device1 aller 20 Sekunden überwacht haben, Client 2 möchte Device2 aller 40 Sekunden überwacht haben, usw.

Clients sind hierbei entweder das Modul PRESENCE oder der collector-Daemon.

  • Multithreaded
  • Verwendet ausschließlich Standardmodule
  • saubere Logmeldungen
  • inkl. init-Skript für Raspberry Pi (raspbian wheezy, LSB-konform)
  • benötigt keine Konfigurationsdateien
collectord - Mehrere Räume (presenced-Instanzen) zu einem gesamten Ergebniss zusammenfassen

Nun hat man ja nicht umbedingt nur einen Raum in der Wohnung. Bluetooth-Funk funktioniert üblicherweise nur in einem Raum und geht nicht durch die Zimmerwände. Um aber dennoch die gesamte Wohnung erfassen zu können, kann man mehrere presence-Daemons in jedem Zimmer laufen lassen.

Hierführ bietes sich das Rasbperry Pi mit einem mini-Bluetooth-USB-Stick an (und evtl. einem Mini-WLAN-Stick). In jedem Raum steh ein Raspberry mit Bluetooth und einer presenced-Instanz. Der collectord verbindet sich dabei zu allen konfigurierten presenced-Instanzen und koordiniert die Prüfung eines oder mehreren Devices in der Wohnung. Dabei wird eine Konfigurationsdatei benötigt, welche alle presenced-Instanzen den Räumen zuordnet. Dies sieht dabei so aus.


# room definition
# ===============
#
#[room-name]              # name of the room
#address=192.168.0.10     # ip-address or hostname
#port=5111                # tcp port which should be used (5111 is default)
#presence_timeout=120     # timeout in seconds for each check when devices are present
#absence_timeout=20       # timeout in seconds for each check when devices are absent

[living room]
address=192.168.0.11
port=5111
presence_timeout=180
absence_timeout=20


Es können dabei beliebig viele Räume definiert werden.

Der collectord sammelt dabei die Ergebnisse aller konfigurierten presenced-Instanzen ein und kumuliert diese zu einem Ergebnis (abwesend oder anwesend in Raum XY)

Der collectord lauscht abweichend auf Port 5222 TCP und wird nur durch das PRESENCE Modul angesprochen.

  • Multithreaded
  • Verwendet ausschließlich Standardmodule
  • saubere Logmeldungen
  • inkl. init-Skript für Debian (LSB konform)
73_PRESENCE.pm - FHEM Modul zur Integration der Anwesenheitserkennung in FHEM

Das Modul PRESENCE stellt die Schnittstelle zu presenced/collectord dar. Es kann sowohl direkt mit einem presenced verbunden werden oder mit einem collectord (für die Abfrage mehrere presenced-Instanzen).

Eine Definition sieht wie folgt aus:


define iPhone PRESENCE <IP-Adresse:Port> <Bluetooth-Adresse> [ <Timeout in Sekunden> ]


Das Modul verbindet sich zur angegebenen IP+Port und fordert dort die Überwachung der gegebenen Bluetooth-Adresse an. Optional kann ein Timeout in Sekunden angegeben werden. Dies ist defaultmäßig 30 Sekunden.

Das Timeout hat jenachdem mit was man sich verbindet unterschiedliche Bedeutungen:

  • presenced - Das Check-Intervall in Sekunden wie oft ein Device geprüft werden soll
  • collectord - Es sollen Statusmeldungen frühestens erst nach <Timeout> Sekunden geschickt werden


(siehe Anhang / see attachement)




(siehe Anhang / see attachement)


Ich habe auf diese Weise bereits seit mehreren Monaten eine zuverlässige Anwesenheitserkennung im Einsatz, welche z.B. nach 15 Minuten dauerhafter Abwesenheit sämtliches Licht, Fernsehen und Musik auschaltet und abends, sobald die Jalousien herunterfahren bei Anwesenheit auch direkt das Licht anmachen.

Für Fragen stehe ich gerne zur Verfügung.

Viele Grüße

Markus Bloch
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Icebear

Hallo,

den selben ansatz hatte ich auch :) habs allerdings "einfacher" mit nem shell script geloest.

Ich habe bei der ganzen Sache ein Problem. Das Device muss Sichtbar sein !

Ich moechte das ganze aber auch bei unsichtbaren Devices.

Der versuch das ganze auf gepaireten Devices zu machen schlug leider fehl. Es funktionierte immer eine Zeit lang und danach war essig ...

root@IcebearLinux:~# cat searchhandy
#!/bin/sh
if [ `hcitool name B8:D9:CE:64:A5:07 | grep Icehandy` ]
then
echo "Handy IceHandy gefunden"
else
echo "Handy IceHandy nicht gefunden"
fi

if [ `hcitool name  B8:D9:CE:64:A5:13 | grep Melle` ]
then
echo "Handy Melle gefunden"
else
echo "Handy Melle nicht gefunden"
fi

das ist die Shell Datei.

Danach aus den Codesnippets den Schnipsel der das ganze per Ping macht geaendert und das wars.

Wie gesagt. Wenn du ne idee hast warum das nur ne zeit lang funzte und danach nicht mehr nur raus damit:)

Grüsse aus dem schönen Wesel. Icebear.
Raspberry PI mod B (Wheezy), Fhem 5.4, CUL868, CUL433 , RfxTrx, HM-USB-CFG2, Wlan, HomeEasy, IT, FS20, TFA, HomeMatic, Oregon Scientific, HMLand auf Fritzbox
Raspberry PI mod B (RaspBMC)

Markus Bloch

Hallo Icebear,

ich hab mit meiner Lösung aktuell 2 Handys in der Überwachung. Ein iPhone 4S und ein HTC Desire HD.

Beim iPhone ist es generell so, dass das Handy mit irgendeinem Gerät gekoppelt sein muss (ich habs mit meinem Laptop gekoppelt). Erst dadurch bleibt der Bluetooth-Empfänger dauerhaft an und wartet auf Funk-Kommandos (graues Bluetoothsymbol oben rechts). Das Gerät ist aber nicht sichtbar.

Beim Desire HD muss ich nur das Bluetooth-Device einschalten. Dieses bleibt dauerhaft an und reagiert auf Anfragen, ist allerdings nicht sichtbar.

Vielleicht hilft dir das.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Markus Bloch

desweiteren solltest du sicherstellen, dass unter keinen Umständen 2x ein "hcitool name ....." gleichzeitig läuft. Damit hatte ich am Anfang Probleme, da man ja auf ein serielles Device nicht parrallel zugreifen kann.

Das hatte mein Bluetooth-Device gerne mal zum Absturz gebracht und in diesem Fall den Namen nicht mehr angezeigt.

Alternativ mal mit hcitool info <bt-address> testen, was er sonst noch so zu deinen devices ermitteln kann.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Icebear

Hi,

hmm das gleichzeitige aufrufen könnte es sein da ich minütlich das ganze aufgerufen habe.

Könnte also sein, wenn FHem gerade was anderes zu tun hatte es länger als ne minute gedauert hat und somit das ganze 2 mal lief.

Ich sollte es script mal aendern das doppelte aufrufe nicht funzen (und ein anwesend zurueck geben) damit die huette nicht durch nen fehler kalt wird :)

Desweiteren muss ich das ganze noch anpassen, das geprueft wird das jemand "laenger" nicht da ist. muss mal schauen wie. Sinn des ganzen ist das wenn jemand von uns z.b. das handy neustartet oder sonst was passiert das man kurz nicht "angepingt" werden kann nicht sofort die Wohnung verrueckt spielt :) denke ne schwelle von 10 Minuten nicht erreichbar sollte reichen ..

Vielleicht auch als tip fuer deine anwendung ..
Raspberry PI mod B (Wheezy), Fhem 5.4, CUL868, CUL433 , RfxTrx, HM-USB-CFG2, Wlan, HomeEasy, IT, FS20, TFA, HomeMatic, Oregon Scientific, HMLand auf Fritzbox
Raspberry PI mod B (RaspBMC)

Markus Bloch

Da hast du recht, ich hab bei mir folgendes gemacht und mir in dem Fall einen watchdog definiert, der erst nach 15 Minuten dauerhafter Abwesenheit die Wohnung abschaltet

define watchdog_Anwesenheit watchdog iPhone:absent 00:15 iPhone:present { fhem "set Gesamte_Wohnung off";; fhem "setstate watchdog_Anwesenheit defined";;}
attr watchdog_Anwesenheit regexp1WontReactivate 1


Evtl. kannst du das auch so lösen.
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Markus Bloch

Diese Verzögerung habe ich mit Absicht nicht ins Modul eingebaut, da ich das System später dafür nutzen möchte um beim sofortigen Betreten und verlassen eines Raumes z.B. das Licht auszuschalten usw.

Da währe diese Verzögerung fatal. Ich denke mit dem watchdog kann man da gut leben.
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

MartinMuc

Sehr schön schon mal ein Dank von mir.

 das werd ich doch glatt mal testen :) morgen kommt mein raspy dann gehts los, nachdem meine nslu letztes Jahr den geist aufgegeben hat. Jetzt brauch ich nur noch nen passenen bluetooth stick :)
Cubietruck mit CUL und HM USB

ilmtuelp0815

Hi Markus!
Prima Einsatz! Die Vorstellung des Moduls dürfte aber die Nutzer von FRITZ!Boxen und anderen LINUX-Derivaten als Debian in Probleme bringen wenn sie dieses Modul nutzen wollen oder?
Vielleicht kannst du darauf noch einmal genauer eingehen.
FHEM auf FRITZ!Box 7390, SuSE 12.3 und Cubieboard2
CUL und HM-LAN
FS20: FHT80b, TFK, KSE, FMS, DU-2, ST-4, SM4, S4M, SM8

HM: HM-Sec-SD

Markus Bloch

Hi,

nein, die Sachen laufen auf allen Systemen. Es wird nur eine Standard-Perl-Umgebung voraussgesetzt.

Angehangen habe ich mal die beiden Perl-Skripte, sowie die Beispiel-Konfiguration.

Ruf beide Programme einfach mal mit --help auf, dann kommt die Usage.

Jenachdem müsste man für die entsprechenden Systeme Init- oder Upstart Skripte schreiben.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

punker

Hi Markus,

hab mal versucht das bei mir einzusetzen, funzt auch soweit, dass in Telnet eingegeben
hcitool name 00:24:BA:8F:11:27 einwandfrei funzt!
Es wird der Name des Handys ausgegeben!

Hab deine Dateien in FHEM installiert, aber da steht immer nur DISCONNECTED!
Eingebunden hab ichs so:
define Milestone PRESENCE 00:24:BA:8F:11:27 60

Sollte doch so gehen oder schnall ich was nicht?
LG

Dieter

The truth is out there!

Markus Bloch

Hallo punker,

ich sehe gerade das ich in den Bildern etwas Mist gemalt habe.

Die Definition erfolgt folgendermaßen:

define iPhone PRESENCE <IP-Adresse:Port> <Bluetooth-Adresse> [ <Timeout in Sekunden> ]

Da aus architekturtechnischen Gründen von FHEM das ausführen des hcitool-Befehls nicht direkt aus FHEM heraus erfolgen kann, gibt es einen presence-Daemon. Dieser stellt die Anwesenheitserkennung für FHEM zur Verfügung.

Bitte lade dir den presenced direkt aus meinem letzten Post herunter (am besten nach /usr/sbin/und starte ihn mit

presenced -v


Sobald du diesen Befehl ausführst, kann sich dein PRESENCE Device Milestone zu 127.0.0.1:5111 verbinden. Also am besten in deiner fhem.cfg folgendes angeben:

define Milestone PRESENCE 127.0.0.1:5111 00:24:BA:8F:11:27 60
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

punker

Hi Markus,

Danke für deine Hilfe!

Leider funzt es trotz allem nicht richtig!

Als erstes kommt beim definieren schon diese Fehlermeldung:
wrong syntax: define <name> PRESENCE ip[:port] <bluetooth-address> [ <timeout> ]
nachdem ich die Timeout-Angabe weggelassen hab ließ sich das Gerät definieren! (Halt mit dem 30sek. Standard-Timeout)

Habe jetzt herausgefunden, dass die Änderung des Status offenbar erkannt wird, weil sich unter den Readings die state-Zeit ändert,
wenn ich am Handy Bluetooth ein - oder ausschalte!
Nur steht immer das Wort absent da! Scheint also mehr ein optisches Problem zu sein!
Leider erkennt man das im Floorplan nicht, weil ja immer absent da steht!
LG

Dieter

The truth is out there!

Markus Bloch

Hi,

ja da hattest du recht. Ich benutze das Timeout aktuell nicht ;-)

Anbei die geänderten Versionen für das PRESENCE Modul und den presenced.

Damit sollte es funktionieren.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

punker

Danke für die neuen Versionen!

Aber was ist anders?

FHEM zeigt nach wie vor das Handy als absent, egal ob Bluetooth an oder aus ist!
LG

Dieter

The truth is out there!