Lokale Präsenzerkennung mit Bluetooth für Apple Watch, iPhone und iPad

Begonnen von DigiH, 17 Januar 2024, 22:35:51

Vorheriges Thema - Nächstes Thema

DigiH

Hallo zusamen,

ich dachte ich melde mich mal wieder hier um euch über unsere neue Version 1.3.0 von Theengs Gateway (Linux/RPi und Windows) zu informieren, unsere Schwester-Applikation von OpenMQTTGateway.

https://gateway.theengs.io/

In der neuen Version haben wir die lokale Präsenzerkennung von Apple Watch, iPhone und iPad implementiert - und für alle anderen Geräten mit random changing Bluetooth MAC-Adressen, für die ein Identity Resolving Key bekannt ist.

Zusätzlich haben wir eine boolean unlocked Eigenschaft hinzugefügt, um sicherheitsrelevante Automationen nur starten zu können, wenn die Apple Geräte auch von einen autorisierten Benutzer entsperrt sind.

Da ich nicht weiß, ob FHEM auto-discovery unterstützt, hier Beispiel MQTT Nachrichten

{"id": "AA:BB:CC:DD:EE:FF", "rssi": -64, "brand": "Apple", "model": "Apple iPhone/iPad", "model_id": "APPLEDEVICE", "type": "TRACK", "unlocked": false}
{"id": "FF:EE:DD:CC:BB:AA", "rssi": -63, "brand": "Apple", "model": "Apple Watch", "model_id": "APPLEWATCH", "type": "BODY", "unlocked": true}

die mit der dann statischen MAC Addresse/id zu tracken sind.

Vielleicht ist das hier für einige von euch interessant.

Schöne Grüße vom Theengs/OpenMQTTGateway Team.

DasQ

Liest sich sehr interessant.

Allerdings sieht das für mich sehr overpowert aus.
Ich mach anwesenheitserkennung mit esp32 und tasmota über BLE an Mii Band 6.
iPad und Handys nutz ich zwar auch, sind mir aber viel zu ungenau.

Mit den esps (die in all mein rolladen verbaut sind), kann ich relativ genau tracken wer wo im Haus ist.
Die systemlast ist auf viel esps verteilt und fällt somit kaum auf.


BTW. Ich glaub du bist im falschen Forums Teil. Mit mqtt hat das ja nur sekundär zu tun.
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

DigiH

Ich glaube du vermischst da ein bisschen generelle Präsenzerkennung (Anwesenheitserkennung) und präzise Raum-Lokalisierung; letzteres würde ich auch mit ESP32s in jedem Raum machen, dann aber mit Radarsensoren an den ESPs, was genauer als jede Bluetooth Lösung ist.

AFAIK ist es mit dem Mi Band 6 ja auch so, dass es eine statische, immer gleichbleibende Bluetooth MAC Adresse hat, welche schon in genug Geschäften fürs Kundentracking verwendet wird und auch jedem interessierten Nachbarn, oder wem auch immer,  die Anwesen- oder Abwesenheit ankündigt.

Ohne einen zusätzlichen Unlocked Sicherheitsstatus würde ich auch kein Gerät dafür verwenden, dass sich zum Beispiel meine Alarmanlage ausschaltet sobald ich mich der Haustür nähre ;)

Da Theengs Gateway alle Daten über MQTT sendet, sowie auch zusätzlich über 90 Sensoren erkennt, dekodiert und auch über MQTT bereit stellt, und OpenMQTTGateway - auf einem oder auch mehreren ESP32s - auch als Satelliten-Proxy über MQTT für die Präsenzerkennung und Sensorerkennung von Theengs Gateway eingesetzt werden kann, damit auch sehr große Gebäude abgedeckt werden können, dachte ich schon, dass die MQTT Sektion am besten passt.

binford6000

#3
Hallo DigiH,
ich habe das mal bei mir auf einem Raspi0 eingerichtet und recht schnell brauchbare Ergebnisse erhalten:
Internals:
  CFGFN     
  CID        fhem1
  DEF        fhem1
  FUUID      65aab9c4-f33f-0fc1-aff9-0acd682517d96ea7
  IODev      mqtt2_client
  LASTInputDev mqtt2_client
  MSGCNT    90
  NAME      apple_watch.pre
  NR        158
  STATE     ???
  TYPE      MQTT2_DEVICE
  eventCount 104
  mqtt2_client_MSGCNT 90
  mqtt2_client_TIME 2024-01-19 19:10:29
  OLDREADINGS:
  READINGS:
     2024-01-19 19:08:52   IODev           mqtt2_client
     2024-01-19 19:24:10   brand           Apple
     2024-01-19 19:26:05   distance        6.447880072893823
     2024-01-19 19:24:10   id              AC:88:FD:A4:8C:A4
     2024-01-19 19:24:09   major           5
     2024-01-19 19:25:13   manufacturerdata 4c0010050e982933a4
     2024-01-19 19:14:09   mfid            4c00
     2024-01-19 19:14:09   minor           0
     2024-01-19 19:24:10   model           Apple Watch
     2024-01-19 19:24:10   model_id        APPLEWATCH
     2024-01-19 19:26:05   rssi            -76
     2024-01-19 19:25:13   track           true
     2024-01-19 19:24:10   type            BODY
     2024-01-19 19:08:41   unlocked        true
     2024-01-19 19:14:09   uuid            1ca92e23f0874df7b9a2fd4b716a4bf6
     2024-01-19 19:14:09   volt            0.3

Attributes:
  autocreate 0
  devicetopic home/TheengsGateway/presence
  event-on-change-reading .*
  readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
  room      MQTT2_DEVICE
  timestamp-on-change-reading .*

Der Einfachheit halber habe ich direkt das topic presence angesprochen.
Was ich nun erwarten würde wäre ein presence Reading. Presence ist laut python -m TheengsGateway.diagnose eingeschaltet:
{
    "adapter": "",
    "bindkeys": {},
    "ble": 1,
    "ble_scan_time": 5,
    "ble_time_between_scans": 5,
    "discovery": 1,
    "discovery_device_name": "TheengsGateway",
    "discovery_filter": [
        "IBEACON"
    ],
    "discovery_topic": "homeassistant",
    "enable_tls": 0,
    "enable_websocket": 0,
    "hass_discovery": 1,
    "host": "10.3.3.4",
    "identities": {
        "AC:88:FD:XX:XX:XX": "***"
    },
    "log_level": "INFO",
    "lwt_topic": "home/TheengsGateway/LWT",
    "pass": "***",
    "port": 1883,
    "presence": 1,
    "presence_topic": "home/TheengsGateway/presence",
    "publish_advdata": 1,
    "publish_all": 1,
    "publish_topic": "home/TheengsGateway/BTtoMQTT",
    "scan_duration": 10,
    "scanning_mode": "active",
    "subscribe_topic": "home/+/BTtoMQTT/undecoded",
    "time_format": 0,
    "time_sync": [],
    "tracker_timeout": 120,
    "user": "***"
}

Wie komme ich also an ein presence Reading?

VG Sebastian

DigiH

Hallo Sebastian,
ZitatWie komme ich also an ein presence Reading?
Hier muss ich leider zugeben, dass ich mit FHEM nicht so vertraut bin, dass ich jetzt genau verstehe was du meinst ;)

Die Presence Nachrichten, die unter dem
"presence_topic": "home/TheengsGateway/presence",bei aktiviertem
"presence": 1,gesendet werden, werden meist nur für Raum-Lokalisierung verwendet, da die MQTT Nachrichten dann auch eine RSSI-abhängige distance Eigenthscaft beinhalten.

Als generelle Präzenserkennung nehme ich bei meinem Controller die laufend ankommenden MQTT Nachrichten bei anwesendem Gerät unter publish_topic + "/AC88FDXXXXXX" (in deinem Fall)
home/TheengsGateway/BTtoMQTT/AC88FDXXXXXXund nachdem diese beim Verlassen des Hauses (oder Ausschalten der Apple Watch zum Testen) nicht mehr ankommen, da ja Theengs Gateway dann auch keine BLE Broadcasts mehr empfängt, wird nach
"tracker_timeout": 120,eine Offline/Away Nachricht mit
{"id": "AC:88:FD:XX:XX:XX", "state": "offline"}auf dem gleichen Topic gesendet.

Für Controller, die Auto-Discovery unterstützen, werden die Apple Geräte als device_tracker class entdeckt, die als value template
{% if value_json.get('rssi') -%}home{%- else -%}not_home{%- endif %}definiert.
Nach dem Motto: Beinhaltet die letzte MQTT Nachricht die Eigenschaft 'rssi', dann ist das Gerät Zuhause, falls nicht, wie bei der letzten "state": "offline" Nachricht nach dem tracker_timeout, dann Abwesend.

Falls oben genannten Vorgehensweisen für FHEM weniger intuitiv sind, würden wir gerne wissen was die gängige FHEM-Präsenz Home/Away Erkennung ist, um dies vielleicht dann auch angepasster in einer zukünftigen Version einzubauen.

Gruß




binford6000

Hallo,
das mit
state offline 2024-01-20 08:24:13
habe ich hinbekommen. Allerdings bleibt der state auf offline selbst wenn die Watch wieder in Reichweite ist
und rssi und distance wieder aktualisiert werden.

Allerdings bin ich auch über Starting on RPi Zero W ends up in an error every time gestolpert.
Damit ist das leider für mich so nicht zu gebrauchen.

VG Sebastian 

DigiH

ZitatAllerdings bin ich auch über Starting on RPi Zero W ends up in an error every time gestolpert.
Damit ist das leider für mich so nicht zu gebrauchen.

Alles klar, obwohl ich jetzt nicht verstanden habe, ob du dieses Problem selbst hattest obwohl du ja "brauchbare Ergebnisse erhalten" hast, oder nur den alten Bug auf dem fremden Docker Repo, welches nicht von uns ist, gesehen hast. Soweit ich weiß, ist der nicht mehr aktuell.

Zitathabe ich hinbekommen. Allerdings bleibt der state auf offline selbst wenn die Watch wieder in Reichweite ist
und rssi und distance wieder aktualisiert werden.

Dazu kann ich leider wirklich wenig sagen mit meinem fehlenden FHEM Wissen, aber schade, dass es bei FMHEM so schwer zu sein scheint, diesen Home/Away Status einfach hinzubekommen. Liegt vielleicht auch an der generellen MQTT Erkennung, die in deinem oben genannten Beispiel die Apple Watch Nachricht auch fälschlicher Weise als iBeacon Format mit uuid, major, minor und volt zu erkennen scheint!?!

Zitat"identities": {
        "AC:88:FD:XX:XX:XX": "***"
    },

Eindeutige MAC Adressen zu anonymisieren ist immer eine gute Idee, mach das auch mal in dem READINGS: Output, oder lösche ihn. Muss nicht jeder deine eindeutige Apple Watch Bluetooth MAC wissen ;)

Gruß


DasQ

Zitat von: DigiH am 20 Januar 2024, 02:04:49Falls oben genannten Vorgehensweisen für FHEM weniger intuitiv sind, würden wir gerne wissen was die gängige FHEM-Präsenz Home/Away Erkennung ist, um dies vielleicht dann auch angepasster in einer zukünftigen Version einzubauen.

Die gängigen Parameter für Anwesenheit und nicht da sind
present
o.
absent

Aber im Grunde ist es Fhem absolut schnuppe wie du das nennst, das lässt sich alles übersetzten.

P.s. Hab ich dich oben schon richtig verstanden. Nur hatte ich gleich noch den Bogen weiter gespannt zur genauen Lokalisierung.
Mac Adressen oder ip (iPhone/ipad) haben nur einen Riesen Nachteil... du musst die Abwesenheit per timeout ermitteln.
Ich seh an Hand von triangulation wer das Haus betritt oder verlässt. Auf ca.1m genau.
Dazu kommt das meine Haustür mit etlichen Sensoren gespickt is. Ich check noch zusätzlich Gewicht und Körpergröße ab und kann so auch Leute erfassen die garkeine miiuhr anhaben.

Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

Jamo

Hallo DigiH,
kann man nicht einmalig eine Online/present Nachricht mit
{"id": "AC:88:FD:XX:XX:XX", "state": "present"}senden, sobald das Apple Device erkannt wird, und dann einmalig eine Offline/absent Nachricht mit
{"id": "AC:88:FD:XX:XX:XX", "state": "absent"}sobald keine Topics beim Verlassen des Hauses (oder Ausschalten der Apple Watch zum Testen) nicht mehr ankommen?

Das würde helfen.

Beste Grüsse
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

DigiH

ZitatDie gängigen Parameter für Anwesenheit und nicht da sind
present
o.
absent
Zitatkann man nicht einmalig eine Online/present Nachricht mit

Das war ja meine Frage oben, wie ihr es sonst so bei FHEM macht. Wir versuchen schon alle gängigen Controller so gut wie möglich zu unterstützen, aber da ca. 75% der Open Source Controller heutzutage Auto-Discovery unterstützen haben wir natürlich das erstmal so gemacht, ohne bis jetzt ein present/absent zu benötigen, oder dass danach bis jetzt gefragt wurde.

ZitatMac Adressen oder ip (iPhone/ipad) haben nur einen Riesen Nachteil... du musst die Abwesenheit per timeout ermitteln.
Ich seh an Hand von triangulation wer das Haus betritt oder verlässt. Auf ca.1m genau.

Dann würde ich aber gerne mal wissen, wie du ohne timeout erkennst/definierst, dass ein Gerät abwesend ist. Auch absent kann ja eigentlich erst gesendet werden, wenn eine bestimme definierte Zeit lang das Gerät nicht mehr empfangen wurde, oder bei einer Triangulation auch erst nach einer bestimmen timeout Zeit oder wie lange nach einem timout nachdem der letzte ESP32 einen Empfang bestätigt hat.

ZitatAber im Grunde ist es Fhem absolut schnuppe wie du das nennst, das lässt sich alles übersetzten.

Das dachte ich ja auch, dass eine eindeutige "state": "offline" Nachricht leicht für FHEM als absent zu interpretieren ist, und wieder neu reinkommende Nachrichten, auch ganz egal mit welchen Inhalten, als present. Da scheine ich mich aber getäuscht zu haben, oder ihr seid einfach an ein present/absent gewöhnt :)

Nichtsdestotrotz denke ich aber auch, dass die falsche zusätzliche iBeacon Erkennung irgendwie dazwischen funkt, da wohl die letzte "state": "offline" auch wieder weitere falsche iBeacon Eigenschaften beinhaltet und dieser Fehler vielleicht auch weiterhin fehlerhafte iBeacon Nachrichten sendet - vielleicht auch von einem internen BT Adapter - obwohl das keinen Sinn macht bei der Identity MAC Adresse??

Von dem Beispiel oben sieht es ganz danach aus, dass FHEM alle BLE manufacturerdata, die mit "4c00..." anfangen wahllos als iBeaon Format abstempelt.

Wie gesagt, present/absent ist kein großes Problem einzufügen, dann mit einem Argument, dass für FHEM Benutzter zu aktivieren ist - für andere Controller wären diese zusätzlichen Nachrichten nur verwirrend. Ich werde das die Tage mit den anderen aus dem Team besprechen. Sind dann ein paar von euch auch bereit und hätten die Möglichkeit Testbuilds zu installieren und zu testen?

Bei der offline/absent Nachricht müsste dann für FHEM wohl auch unlocked:false mitgeschickt werden, damit auch hier gleich ein automatisches sinnvolles 'verriegelt' bei Abwesenheit eingetragen wird.

Gruß


Jamo

Hallo DigiH,
bei mir siehts so aus wie unten im List von meinem device. Meine Watch wird aber nicht als iBeacon erkannt, wie Du geschrieben hast. Present/absent hatte ich mir über ein eigenes userreading 'status' erzeugt. Zusätzlich merke ich mir noch die beiden Zeitstempel, wann die Uhr present und absent war.

ZitatSind dann ein paar von euch auch bereit und hätten die Möglichkeit Testbuilds zu installieren und zu testen?
Ja, gerne.

ZitatBei der offline/absent Nachricht müsste dann für FHEM wohl auch unlocked:false mitgeschickt werden, damit auch hier gleich ein automatisches sinnvolles 'verriegelt' bei Abwesenheit eingetragen wird.
Das habe ich auch genau so über ein seperates notify gelöst, wenn Du das unlocked:false bei Abwesenheit mit einbauen kannst, das wäre prima.

List von meinem Device:
  CID        IOMQTT
  IOMQTT_MSGCNT 5456
  IOMQTT_TIME 2024-01-20 22:38:25
  DEF        IOMQTT
  IODev      IOMQTT
  LASTInputDev IOMQTT
  MSGCNT    5456
  NAME      myWatch
  NR        3071
  STATE      Status: present &nbsp &nbsp &nbsp &nbsp Unlocked: true<br>Last: 2024-01-20 22:38:25 &nbsp Rssi: -72
  TYPE      MQTT2_DEVICE
  eventCount 218
  OLDREADINGS:
  READINGS:
    2024-01-19 09:06:46  IODev          IOMQTT
    2024-01-20 12:28:32  TimeOffline    2024-01-20 12:28:32
    2024-01-20 16:38:54  TimeOnline      2024-01-20 16:38:54
    2024-01-20 22:38:25  brand          Apple
    2024-01-20 22:38:25  id              11:22:33:44:55:66
    2024-01-20 22:38:25  lastSeen        2024-01-20 22:38:25
    2024-01-20 22:38:25  lastSeenOld    2024-01-20 22:38:24
    2024-01-20 22:38:25  model          Apple Watch
    2024-01-20 22:38:25  model_id        APPLEWATCH
    2024-01-20 22:38:25  rssi            -72
    2024-01-20 12:28:32  state          offline
    2024-01-20 22:38:25  status          present
    2024-01-20 22:38:25  type            BODY
    2024-01-20 22:38:25  unlocked        true
  hmccu:
Attributes:
IODev      IOMQTT
event-on-change-reading unlocked,status
event-on-update-reading state
group PRESENCE
readingList home/TheengsGateway/BTtoMQTT/112233445566:.* { json2nameValue($EVENT) }
room Favourites
stateFormat Status: status &nbsp &nbsp &nbsp &nbsp Unlocked: unlocked<br>Last: lastSeen &nbsp Rssi: rssi
userReadings status        {ReadingsAge($name,'rssi',999) < 35?'present':'absent';;},
lastSeenOld                {ReadingsVal($name,'lastSeen','nA')},
lastSeen                   {ReadingsTimestamp($name,'rssi','nA')},
TimeOnline:status:.present {ReadingsTimestamp($name,'status','nA')},
TimeOffline:offline        {ReadingsTimestamp($name,'state','nA')}
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

DasQ

War eigentlich der Meinung ich hätte das erklärt, aber gern nochmal,

Ich hab eine ,,homebase" die die aussenkontur des Haus ,,darstellt".
Verlässt du die, sag ich du bist nicht da.

Ich muß gestehen, das ich presence nur sehr stiefmütterlich nutze. Ich hab das mal vor Jahren wie hier im Wiki beschrieben mit den bereits vorhandenen Modul begonnen und war sehr unzufrieden mit der Genauigkeit und eben den ständig hängenden oder verschwundenen devices.
Dann hatte ich geofancy entdeckt, bin aber kein Freund von google/Apple oder whatever externen gps ortungsdiensten.

Aber die Idee dahinter gefiel mir. Nur eben ohne bigbrother.
Sei's wies ist, etwas C (#) und Fhem hat mir gezeigt das es geht und machbar ist. leider kommt aber der Faktor Mensch dazu, und hat mein Wunsch des definierten Zustand (ich komm ausm sondermaschinenbau und da gibts eigentlich kein undefinierten Zustand). Zunichte gemacht.

Mal ist der Akku leer, oder man trägt seine Uhr nicht. So das ich's wie gesagt schleifen lassen hab.
Auf gut deutsch es ging als machbarkeitsstudie in die Schublade zurück.
Läuft hier zwar nach wie vor im Hintergrund, wird aber nicht genutzt.

Drum hab ich ja den Firlefanz mit Waage und ,,lichtgitter" an der Haustür installiert. Aber rate mal, wer auch das, recht schnell ausgetrickst hat. :))

Mensch is halt einfach super kompliziert. So richtig eineindeutig bekommt man den nur mit Kameras erfasst.



Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

DigiH

ZitatMeine Watch wird aber nicht als iBeacon erkannt, wie Du geschrieben hast.

Nur wie ich oben im List von Sebastian gesehen habe, da da zusätzliche Einträge mit mfid, uuid, major, minor und volt sind, was ich sehr verwirrend fand. So wie bei dir ist es, wie ich es erwarte und es eigentlich sein soll.

ZitatDas habe ich auch genau so über ein seperates notify gelöst, wenn Du das unlocked:false bei Abwesenheit mit einbauen kannst, das wäre prima.

Da es bei Discovery auch so gleichzeitig gelöst ist, wäre es für eine FHEM Lösung auch sinnvoll so zu imoplementierren, ohne dass jeder separat ein notify einbauen muss ;)

ZitatWar eigentlich der Meinung ich hätte das erklärt, aber gern nochmal,

Ich hab eine ,,homebase" die die aussenkontur des Haus ,,darstellt".
Verlässt du die, sag ich du bist nicht da.

Trotzdem wird es bei Gateway, oder anderen BLE Lösungen, ohne ein timeout nicht gehen, welcher ja auch von ble_scan_time und ble_time_between_scans abhängig ist.

Die Einstellungen, die Sebastian oben mit 'python -m TheengsGateway.diagnose' bekommen hat, sind auch in der theengsgw.conf Datei im Home-Verzeichnis. Dort können alle Einstellungen editiert werden, um danach ein einfaches Starten mit python -m TheengsGateway zu erlauben.

Stellt da am besten "discovery": auf 0, damit ihr in eurem MQTT Broker keine retained Discovery Messages mehr bekommt.

Habt ihr eigentlich alle MQTT Explorer? Damit am besten mal gleich das ganze homeassistant Topic löschen, um die für euch nicht brauchbaren retained Discovery Einträge zu löschen.

Mir war zwar persönlich sehr wichtig für die Apple Geräte die zusätzliche unlocked Eigenschaft einzubauen, aber alle anderen Devices, die hier auch als Presence Tracker markiert sind, werden von Theengs Gateway als solche erkannt und veröffentlicht. Mit einer present/absent Änderung also auch für diese Geräte. Ich habe zwar selbst keinen, aber viele User haben den BM2 Battery Monitor, um auch ihre Fahrzeug-Präsenz im Carport oder der Garage zu erkennen ;)

https://decoder.theengs.io/devices/devices.html

Ich gebe Bescheid, sobald es etwas neues zum Testen gibt.

Gruß

DigiH

ZitatIch nutze keine scan bei BLE und auch kein timeout

Ich weiß, dass du irgendeine ",,homebase" die die aussenkontur des Haus ,,darstellt"" hast, und das ist schön so, aber bei BLE Geräteerkennung, um die es hier geht, wirklich nicht relevant.

Dein oben genanntes Mi Band 6 wird aber auch nicht anders als mit BLE Scan erkannt ;)

DasQ

Wenn du scannst, empfängst du alles.

Ich scanne nicht, ich lass senden ... so alle 10sekunden.
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org