[Testversion] npresenced für Anwesenheitserkennung

Begonnen von pldemon, 18 Februar 2021, 13:52:34

Vorheriges Thema - Nächstes Thema

pldemon

Hallo,

anbei wollte ich euch ein System vorstellen, dass ich für die Erkennung der Anwesenheit von Bluetooth-Geräten nutze. Wie schon presenced, nutzt auch das neue Tool hcitool (oder bluetoothctl bei Bedarf) für die Abfrage. Als Unterbau habe ich lepresenced genommen, weshalb die Parametrisierung zwischen den beiden Tools weitgehend gleichgeblieben ist.

Idee

Der Grund für eine Implementierung ist die Arbeitsweise von presenced, wo aktiv nach definierten Geräten nach dem Round-robin-Prinzip nachgefragt wird. Das führt dazu, dass bei einer größeren Zahl an Geräten die Erkennung von Anwesenheit teils erheblich verzögert wird, was bei Trigger-Indizierten Aktionen recht störend ist.

Funktionsweise

Npresenced folgt einem anderen Prinzip und implementiert einen einfachen Scheduler, der die folgenden Annahmen trifft:

                a) Bei freien Ressourcen wird automatisch nach Geräten gefragt, die als Abwesend markiert wurden – unabhängig des Intervalls (ohne aber dass die Abfragen der anderen Geräte verzögert/gestört werden)

                b) Geräte, die einen kürzeren Intervall in FHEM eingetragen haben, werden priorisiert abgefragt

                c) Wird die Anwesenheit eines Geräts erkannt, wird FHEM sofort über den Zustand informiert

                d) Bei Anwesenheit, wird das Gerät nur noch in dem in FHEM eingestellten Intervall überprüft. Dadurch sollen dem System mehr Ressourcen für die Abfragen der abwesenden Geräte verschafft werden

                e) Wird der in FHEM eingestellte Intervall überschritten und ist das Gerät nicht erreichbar, wird es als Abwesend an FHEM gemeldet

Diese Annahmen führen dazu, dass die Erkennung der Anwesenheit bei der Nutzung einer größeren Zahl an Geräten erheblich beschleunigt wird. In meinem Fall fiel der Zeitraum von teils einer Minute bis hin zu wenigen Sekunden.

Verfügbarkeit

Die Quellen von nprecenced finden sich auf GitHub. Neben dem Tool liegen da auch presenced und lepresenced, da ich das komplette Verzeichnis geklont habe und ursprünglich alles in lepresenced eingebaut habe. Der Übersicht wegen habe ich es aber wieder verworfen. Aus diesem Grund finden sich auch in lepresenced kleinere Anpassungen. Diese werde ich aber direkt an den Autor senden.

Projekt
https://github.com/pldemone/fhem-presenced.git


Nutzung

Start des Tools:

# git clone https://github.com/pldemone/fhem-presenced.git
# cd fhem-presenced/
# ./src/npresenced -l LOG_INFO -t stdout --fast


Definition in FHEM:

define iPhone PRESENCE lan-bluetooth 11:22:33:44:55:66 192.168.0.2:5333 60


Das System findet sich bei mir in einem produktiven Einsatz. Ich überprüfe damit die Anwesenheit diverser Iphone- und Garmin-Geräte, um Aktionen unmittelbar bei einer Ankunft auszulösen. Das hat recht gut funktioniert, weshalb ich euch diese Lösung ebenfalls vorstellen mag.

Im Anhang noch ein kleiner Screenshot, das demonstriert, wie die Präsenz zweier Smartwatches für die Anwesenheit genutzt wird. Man kann hier ziemlich genau erkennen, wie die Watches von verschiedenen Routern erkannt werden, während sich die Bewohner im Haus bewegt haben.



Gruß,
Mirko

Update: Beschreibung verbessert; Server als nicht privilegierten Nutzer starten; Erkennung geringfügig optimiert
Update (2022-07-27): Erkennung der Anwesenheit optimiert; Ressourceverbrauch gesenkt

Jamo

Hallo Mirko,
das hört sich prima an. Kann ich den npresenced auch mit dem collectord zusammen benutzen?
Ich nehme an, ich muss dann auf allen verteilten RaspberryPi lepresenced stoppen, npresenced auf den verteilten RaspberryPi installieren und starten, und dann sollte das wie vorher funktionieren, oder?
Lepresenced muss gestoppt werden, sonst ist der port 5333 schon belegt und es kann keine TCP verbindung aufgebaut werden.

Ist das soweit korrekt?
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

pldemon

#2
Hallo Jamo,

Zitat von: Jamo am 19 Februar 2021, 08:58:53
Kann ich den npresenced auch mit dem collectord zusammen benutzen?

Ja, habe es zwar nicht exzessiv getestet, aber ein kurzer Test funktioniert. Sofern ich es aber korrekt überblicke, arbeitet collectord Intervall-basiert, was die Reaktion verzögern wird.

Zitat von: Jamo am 19 Februar 2021, 08:58:53
Ich nehme an, ich muss dann auf allen verteilten RaspberryPi lepresenced stoppen, npresenced auf den verteilten RaspberryPi installieren und starten, und dann sollte das wie vorher funktionieren, oder?  Lepresenced muss gestoppt werden, sonst ist der port 5333 schon belegt und es kann keine TCP verbindung aufgebaut werden.

Theoretisch ja. Du kannst auch beide Systeme gleichzeitig laufen lassen und die Ports ändern - sie sind nicht fest verdrahtet. Bitte beachte aber, dass jedes Mal, wenn npresenced eine Abfrage sendet, der Scan von lepresenced angehalten wird.

Zum Verständnis, welches System man nutzen sollte, eine Erklärung was lepresenced und npresenced unterschieided. Man sollte wissen, wie die Systeme arbeiten und das passende Konzept wählen, bevor man sie einsetzt :)

lepresenced ist technisch gesehen ein Sniffer/Scanner, der fortwährend mittels »hcidump -i DEV« alle am Gerät ankommende Traffic aufzeichnet. Definiert man in FHEM ein Device, überprüft lepresenced, ob es in seinem Scan in dem definierten Zeitraum etwas von diesem Gerät empfangen hat. Sendet ein Device allerdings keine Nachrichten (oder nur sehr sporadisch), wird es von hcidump/lepresenced nicht erkannt oder irrtümlich als inaktiv markiert. Das passiert vor allem bei Smartphones und Smartwatches.

npresenced/presenced geht einen anderen Weg, denn es fragt aktiv nach Geräten nach. Definiert man in FHEM ein Device, fragt npresenced/presenced in dem eingestellten Zeitraum mittels »hcitool i name DEV« nach dem Namen. Meldet es sich, wissen npresenced/presenced, dass das Device existiert. Das Problem ist aber, dass jede Abfrage eine gewisse Zeit dauert, in der das Bluetooth-Subsystem blockiert ist. Npresence optimiert diesen Zugriff und stellt sicher, dass die wichtigen Anfragen priorisiert werden und man beispielsweise die Anwesenheit schneller erkennt.

Solltest du also Telefone oder Watches überwachen wollen, wirst du wahrscheinlich zu npresenced/presenced greifen müssen, denn sie werden nicht mit lepresenced zuverlässig erkannt. Hast du dagegen BLE-Geräte, wie beispielsweise G-tag Beacons, die automatisch einen Advertising Request senden, wirst du mit lepresenced besser fahren können. Wie bereits schon oben geschrieben, kann man aber auch beide Ansätze gleichzeitig nutzen.

Noch ein Hinweis zur Erkennung: Raspberry-Nutzer sollten sich einen günstigen USB-BT-Dongle holen (Kostenpunkt ca. 10euro). Sie haben eine erheblich größere Reichweite im Vergleich zum internen BT-Receiver. Ich für meinen Fall habe mittlerweile nur noch ein Gerät zentral im Einsatz und überwache damit ein komplettes Einfamilienhaus (samt Garage und Keller).

Gruß,
Mirko

Jamo

#3
Hallo Mirko,
ZitatZum Verständnis, welches System man nutzen sollte
Wow, danke, die Erklärung war mal richtig hilfreich, das hatte ich hier so im Forum noch nicht gefunden.
Das npresenced aktiv die Geräte anfragt, kam aus deinem ersten Beitrag erstmal nicht so raus, Ich hatte angenommen der Haupunterschied sei das scheduling (lepresenced = feste periode, npresenced = sobald eine freie resource verfügbar ist).
Dann bleibe ich für meine GTags bei lepresenced, aber werde deinen npresenced für mein iPhone an den Start bringen.
Danke nochmal!!!
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

pldemon

Kurzes Update:

Das Script wurde weiter entschlackt, sodass es auch auf Embedded-Geräten, wie beispielsweise einem OpenWRT-Router ohne Systemd gestartet werden kann. Die CPU-Auslastung des Routers wird dabei kaum beeinflusst. Bei einem TP-Link Archer C7 (v2) liegt sie beispielsweise bei ca. 3%.

Gruß,
Mirko

pldemon

#5
Kurzes Update:

Habe nun mein Routersetup im Haus ein wenig optimiert und das Script deshalb darauf angepasst. Aktuell läuft es bei mir seit einem Monat parallel auf 2 TP-Link Archer C7 (v5) und einem TP-Link Archer C7 (v2), was die Erkennung noch viel genauer und Schneller macht (Siehe Screenshot im ersten Beitrag). Das hat mich dazu bewogen, auf das GPS-Tracking für die Erkennung der Ankunft im Haus komplett zu verzichten.

Gruß,
Mirko

DetlefR

Macht fürs erste einen guten Eindruck.

Ich habe für "Aussen" eingerichtet. Mal sehen, ob das Licht jetzt früher angeht. :)


MadMax-FHEM

Uiuiui, habe es auch schon lange laufen und bin begeistert! :)

Habe lange mit WLAN und Handy rungetan: immer irgendwie "Murks" (verschiedene Dinge inkl. hping3 und Unifi)

Aber seit ich npresenced nutze funktioniert das wunderbar...

Danke, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

binford6000

Zitat von: pldemon am 18 Februar 2021, 13:52:34
Das System findet sich bei mir in einem produktiven Einsatz. Ich überprüfe damit die Anwesenheit diverser Iphone, Apple Watch und Garmin-Geräte, um Aktionen unmittelbar bei einer Ankunft auszulösen. Das hat recht gut funktioniert, weshalb ich euch diese Lösung ebenfalls vorstellen mag.

Hallo pldemon,
du schreibst du würdest mit npresenced u.a. auch eine Apple Watch sehen.
Soweit ich informiert bin kommuniziert die Apple Watch nur mit ihrem verbundenen iPhone über BT. Ansonsten ist sie maximal nur sporadisch
zu sehen. Wie hast du das hinbekommen?

VG Sebastian

DetlefR

Zu Apple kann ich nichts sagen, aber meine Galaxy Watch antwortet auf Bluetooth. Aber nur, wenn sie keine Verbindung zum Telefon hat.


binford6000


DetlefR


binford6000

Daher ja die Frage an den TE wie er seine Apple Watch damit erkennt...  ;)

pldemon

Zitat von: binford6000 am 01 August 2022, 19:21:58
Daher ja die Frage an den TE wie er seine Apple Watch damit erkennt...  ;)

Hi,

Sorry, hat leider ein wenig länger gedauert, da ich im Urlaub bin.

Die Beschreibung entspricht leider nicht mehr der Realität und ich habe die Stelle mit der Watch entfernt.

Hier eine kurze Erklärung: Die Watch musste nicht sichtbar sein, sondern nur auf die Anfrage antworten. Bei der ersten Generation hat es wunderbar funktioniert. Leider ist mir die Uhr kaputtgegangen und ich habe sie durch eine neue Generation ersetzt. Diese hat zwar auch geantwortet, aber wie du schon geschrieben hast sehr unzuverlässig, weshalb sie nicht für die Erkennung der Präsenz verwenden werden kann.

Gruß,
Mirko