ble2mqtt - Bluetooth Anwesenheitserkennung

Begonnen von drhirn, 07 April 2022, 13:45:09

Vorheriges Thema - Nächstes Thema

PatrickR

Hi!
Zitat von: isy am 26 Januar 2023, 16:39:04
Spannende Entwicklung mit mqtt.
MQTT ist allgemein hochspannend. Universell und durch seine Effizienz komplett aus der Zeit gefallen. Bei aktuellen Protokollen wird leider sehr häufig alles in monströses XML oder JSON verpackt.

Patrick
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

Prof. Dr. Peter Henning

ZitatUniversell und durch seine Effizienz komplett aus der Zeit gefallen.
Das verleitet aber zum Missbrauch - etwa, wie im Rhasspy-Projekt, zum Versand von Audiodaten via MQTT.

So, jetzt bin ich auch im Verteiler ;-)

LG

pah

Lehmi54

Hi!
...und herzlichen Dank für die Version 0.10. Bei den 3 Raspberrys eingespielt. Bei den 2 mit Dongeln (raspi4 und raspi 2) mit batteryforce ja, ab und zu (siehe Bild), der raspi zero mit internem Bluetooth macht den batterylevel zwar nicht regelmäßig, aber mindestens 2x am Tag. Das ist für mich so ok! Danke!
Habe verschiedene Versuche mit Bluetooth De- und Neuinstallation und mit dem gatttool gestartet, wenig Erfolg. Mit sehr hoher Sicherheit findet er den batterylevel, wenn man das gatttool mehrfach hintereinander ausführt. Die Zeit vom Start des gatttools bis zur Ermittlung des batterylevels bzw. eines Fehlers liegt zwischen 1s bis 15s  (beim raspi zero) . Allerdings weiss ich nicht, ob das die G-Tag Baterien viel schneller entleert. Einen großen Wunsch an Dich, Patrick hätte ich bitte noch, könnte man das batterylevel auslesen konfigurierbar (abschaltbar) machen? Bei 3x Raspberry mit ble2mqttd und drei G-Tags erhalte ich 9 Batterywerte mehrmals täglich, bei batteryforce sogar noch mehr.
Die Presence mit allen drei Dongels und den drei raspis funktioniert unabhängig von den battry Problen tadellos und zuverlässig.
Ich bin echt begeistert!
Viele Grüße
Uwe
2x Raspberry 4 und 3 - FHEM 6.2
z-wave Netzwerk, SIGNALduino

PatrickR

#108
Hallo Uwe,

Zitat von: Lehmi54 am 29 Januar 2023, 16:47:40
Einen großen Wunsch an Dich, Patrick hätte ich bitte noch, könnte man das batterylevel auslesen konfigurierbar (abschaltbar) machen?

na gut.

Neue Version 0.11:

  • Neuer Parameter: --batterymaxage <Zahl> - Maximale Zeit in Stunden, nach der ein Batterywert als zu alt angesehen und eine Aktualisierung probiert wird. Setzt man den Wert 0 werden Batterychecks vollständig abgeschaltet.
  • Etwas aufgeräumt

Patrick

/Edit: Anhang entfernt. Neue Version unten.
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

Lehmi54

Hallo Patrick,
Zitatna gut.
Chapeau! ... und vielen Dank für die 0.11!
Beim Testen habe ich festgestellt, alle battery level der 0.11 er Version stehen bei 56%.
Mit gatttool allerdings nur der AE

pi@RaspiZ139:~ $ gatttool -b 7C:2F:80:XX:XX:09 -t public --char-read --uuid=0x2a19
handle: 0x001b   value: 2f
pi@RaspiZ139:~ $ gatttool -b 7C:2F:80:XX:XX:CF -t public --char-read --uuid=0x2a19
handle: 0x001b   value: 2f
pi@RaspiZ139:~ $ gatttool -b 7C:2F:80:XX:XX:AE -t public --char-read --uuid=0x2a19
handle: 0x001b   value: 38


Danke
Uwe
2x Raspberry 4 und 3 - FHEM 6.2
z-wave Netzwerk, SIGNALduino

PatrickR

Hi!

Zitat von: Lehmi54 am 31 Januar 2023, 20:24:29
Beim Testen habe ich festgestellt, alle battery level der 0.11 er Version stehen bei 56%.
Mit gatttool allerdings nur der AE

An der Auswertung habe ich nichts geändert...

Patrick
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

drhirn

Hat jemand von euch eine Idee, wie ich Net::MQTT::Simple auf einem PiZero2 installiert bekomme? Mit CPAN wird das nichts, das überfordert ihn total.

drhirn

Zitat von: drhirn am 03 Februar 2023, 11:53:46
Hat jemand von euch eine Idee, wie ich Net::MQTT::Simple auf einem PiZero2 installiert bekomme? Mit CPAN wird das nichts, das überfordert ihn total.

So:

git clone https://github.com/Juerd/Net-MQTT-Simple.git
cd Net-MQTT-Simple
perl Makefile.PL
make
make test
sudo make install

decaflo

Zitat von: PatrickR am 31 Januar 2023, 16:17:31
Neue Version 0.11:

  • Neuer Parameter: --batterymaxage <Zahl> - Maximale Zeit in Stunden, nach der ein Batterywert als zu alt angesehen und eine Aktualisierung probiert wird. Setzt man den Wert 0 werden Batterychecks vollständig abgeschaltet.
  • Etwas aufgeräumt

Patrick

Super, danke, in Setups mit mehr als einem BLE-Host macht es total Sinn, nicht von jedem Hosts aus die Battery-Level abzufragen.

Ich vermute sogar, dass die regelmässigen Checks (bei 3 Hosts alle 6h passiert das ja 12x am Tag) die Akkulaufzeit signifikant verkürzen. Das ist ja nicht im Sinne des Erfinders :) Deswegen würde ich noch vorschlagen, DEFAULT_BATTERY_MAX_AGE deutlich zu erhöhen, z.B. auf 1 Woche. Die Batterien halten ja mehrere Jahre, und selbst wenn der Level low wird, hat man noch mehrere Wochen Zeit um das Ding auszutauschen. Da kommt es nicht auf Stunden an.

Hier noch ein Patch, der bei deaktiviertem Battery-Check die Prüfung auf gatttool überspringt, das dann ja nicht notwendig ist. Wie oben schon erwähnt ist gatttool ebenfalls deprecated und z.B. bei mir unter Archlinux gar nicht mehr verfügbar.

Schöne Grüße!

PatrickR

#114
Hi!

Zitat von: decaflo am 03 März 2023, 11:17:31
Ich vermute sogar, dass die regelmässigen Checks (bei 3 Hosts alle 6h passiert das ja 12x am Tag) die Akkulaufzeit signifikant verkürzen. Das ist ja nicht im Sinne des Erfinders :) Deswegen würde ich noch vorschlagen, DEFAULT_BATTERY_MAX_AGE deutlich zu erhöhen, z.B. auf 1 Woche. Die Batterien halten ja mehrere Jahre, und selbst wenn der Level low wird, hat man noch mehrere Wochen Zeit um das Ding auszutauschen. Da kommt es nicht auf Stunden an.
Genau aus dem Grund habe ich mich lange Zeit dagegen gewehrt, überhaupt einen Batteriecheck einzubauen - zu dem Zeitpunkt noch in lepresenced. Da aber die Nutzer teilweise dazu übergegangen sind, selbstgebastelte Batterieskripte zu nutzen und damit lepresenced aus dem Tritt zu bringen, habe ich es eingebaut. Die Idee des "kurzen" Intervalls war, dass die Tags ggf. nicht immer erreichbar sind und ich sicherstellen wollte, dass der Wert ab und zu mal erfolgreich geholt wird. Zwischenzeitlich habe ich aber die Abfrage so optimiert, dass sie bei Nichterreichbarkeit wiederholt wird. Insofern hast Du voll und ganz Recht. Werde den Defaultwert erst einmal auf 48h erhöhen. Dabei müssen wir akzeptieren, dass scheinbar viele Nutzer den Batteriewert wichtiger finden als den Anwesenheitswert, ob das nun nachvollziehbar ist oder nicht. Habe teilweise Forenbeiträge gesehen, wo mehrfach am Tag die Box mit Schrödingers Katze aufgemacht wird.

Zitat von: decaflo am 03 März 2023, 11:17:31
Hier noch ein Patch, der bei deaktiviertem Battery-Check die Prüfung auf gatttool überspringt, das dann ja nicht notwendig ist. Wie oben schon erwähnt ist gatttool ebenfalls deprecated und z.B. bei mir unter Archlinux gar nicht mehr verfügbar.
Guter Hinweis. Das muss man auch nicht wirklich begründen, weil es keinen Sinn ergibt, so wie es jetzt ist.

Patrick
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

PatrickR

#115
Hi!

Neue Version 0.12:
  • Standardintervall für Batteriecheck ist jetzt 48 Stunden.
  • Das Vorhandensein von Gatttool wird nun nicht mehr geprüft, wenn der Batteriecheck deaktiviert ist.
Danke, decaflo!

Patrick

/Edit: Anhang entfernt. Neue Version unten.
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

hkspks

Für alle, die das tool als .service laufen lassen wollen: bei meinem pi3b+ musste ich das "-daemonize" Attribut weglassen, bei meinem pi1w nicht.

Hier mal eine Beispieldefinition:
[Unit]
Description=ble2mqttd
After=bluetooth.target sys-subsystem-bluetooth-devices-hci0.device
[Service]
ExecStartPre=/bin/sleep 10
ExecStart=/usr/local/bin/ble2mqttd --mqttserver 127.0.0.1:1883 --mqtttopic ble2mqtt/wohnzimmer --mac '(XXX|YYY)' --absentinterval 600
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target

hkspks

#117
Gerade noch festgestellt, dass mir das Tool über dbus das syslog etwas vollmüllt - jemand eine Idee zur Lösung? Limits hochsetzen oder ggf. noch etwas an dem Skript zu tweaken?

tail /var/log/syslog
Mar 17 11:56:39 raspberrypi dbus-daemon[338]: [system] Connection ":1.689" is not allowed to add more match rules (increase limits in configuration file if required; max_match_rules_per_connection=512)
Mar 17 11:56:45 raspberrypi dbus-daemon[338]: [system] Connection ":1.689" is not allowed to add more match rules (increase limits in configuration file if required; max_match_rules_per_connection=512)
Mar 17 11:56:47 raspberrypi dbus-daemon[338]: [system] Connection ":1.689" is not allowed to add more match rules (increase limits in configuration file if required; max_match_rules_per_connection=512)
Mar 17 11:57:17 raspberrypi dbus-daemon[338]: [system] Connection ":1.689" is not allowed to add more match rules (increase limits in configuration file if required; max_match_rules_per_connection=512)
Mar 17 11:57:34 raspberrypi dbus-daemon[338]: [system] Connection ":1.689" is not allowed to add more match rules (increase limits in configuration file if required; max_match_rules_per_connection=512)
Mar 17 11:58:40 raspberrypi dbus-daemon[338]: [system] Connection ":1.689" is not allowed to add more match rules (increase limits in configuration file if required; max_match_rules_per_connection=512)
Mar 17 11:59:04 raspberrypi ble2mqttd: main::cleanup_task: Cleanup finished, deleted 0 devices in 0 seconds.
Mar 17 12:00:24 raspberrypi dbus-daemon[338]: [system] Connection ":1.689" is not allowed to add more match rules (increase limits in configuration file if required; max_match_rules_per_connection=512)
Mar 17 12:00:26 raspberrypi dbus-daemon[338]: [system] Connection ":1.689" is not allowed to add more match rules (increase limits in configuration file if required; max_match_rules_per_connection=512)
Mar 17 12:01:00 raspberrypi dbus-daemon[338]: [system] Connection ":1.689" is not allowed to add more match rules (increase limits in configuration file if required; max_match_rules_per_connection=512)


sudo dbus-monitor --system
method call time=1679047054.377341 sender=:1.689 -> destination=org.freedesktop.DBus serial=3213 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
   string "type='signal',sender='org.bluez',path='/org/bluez/hci0/dev_XXX',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',arg0='org.bluez.Device1'"
error time=1679047054.377752 sender=org.freedesktop.DBus -> destination=:1.689 error_name=org.freedesktop.DBus.Error.LimitsExceeded reply_serial=3213
   string "Connection ":1.689" is not allowed to add more match rules (increase limits in configuration file if required; max_match_rules_per_connection=512)"
signal time=1679047054.463953 sender=:1.16 -> destination=(null destination) serial=1752462 path=/org/bluez/hci0/dev_XXX; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
   string "org.bluez.Device1"
   array [
      dict entry(
         string "RSSI"
         variant             int16 -93
      )
   ]
   array [
   ]

decaflo

#118
Bei mir wurde ble2mqttd zwar manuell gestartet (mit --daemon), aber ich erhalte keine solchen Einträge im Log.

hkspks

Zitat von: decaflo am 17 März 2023, 23:00:07Bei mir wurde ble2mqttd zwar manuell gestartet (mit --daemon), aber ich erhalte keine solchen Einträge im Log.

Gefährliches Halbwissen: kommt wohl über die Zeit, wenn es immer mehr Match-rules werden. 512 sollten grundsätzlich ausreichen. Evtl. kann man da am Skript noch was optimieren?