ble2mqtt - Bluetooth Anwesenheitserkennung

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

Vorheriges Thema - Nächstes Thema

gestein

Hallo Patrick,

Habe gerade erst den Nachtrag geladen.
Danke. Schon mal installiert.

Vielleicht eine blöde Frage, aber was macht man denn nun konkret und richtigerweise damit?
Oft steht nur: $DEVICETOPIC/LWT:.* LWT

Letzter Wunsch an den Weihnachtsmann:
Wäre es denn auch noch möglich, den Batterie-Status abzufragen?

lg, Gerhard


PatrickR

Hi!

Zitat von: gestein am 05 November 2022, 13:56:36
Vielleicht eine blöde Frage, aber was macht man denn nun konkret und richtigerweise damit?
Oft steht nur: $DEVICETOPIC/LWT:.* LWT
z. B.:

$DEVICETOPIC/state:.* status

Dann steht in status entweder connected (=ble2mqtt ist mit dem Broker verbunden) oder disconnected (=nicht verbunden, entweder weil sauber disconnected oder weil explodiert (LWT)).

Zitat von: gestein am 05 November 2022, 13:56:36
Letzter Wunsch an den Weihnachtsmann:
Wäre es denn auch noch möglich, den Batterie-Status abzufragen?
Sehe ich mir bei Gelegenheit an.

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

gestein

Guten Morgen,

Danke für die Erklärung.
Habe die neue Version gestern installiert, aber bis dato wurde noch kein Reading angelegt.
Mit meinem derzeitigen Code müsste doch das Reading ,,LWT" angelegt werden. Oder?
$DEVICETOPIC/LWT:.* LWT
Wird das zyklisch geschickt?
Das muss ich mir heute genauer anschauen.

Danke auch schon mal auch wegen dem Batterie-Status.

Lg, Gerhard

PatrickR

#63
Hi!
Zitat von: gestein am 06 November 2022, 07:19:24
Mit meinem derzeitigen Code müsste doch das Reading ,,LWT" angelegt werden. Oder?
$DEVICETOPIC/LWT:.* LWT
Selbst wenn es angelegt wird, wird es nicht gefüllt. Es gibt dieses Topic nämlich schlichtweg nicht. Bitte nimm stattdessen

$DEVICETOPIC/state:.* status

Dann steht im neuen Reading "status" entweder connected oder disconnected.

Zitat von: gestein am 06 November 2022, 07:19:24
Wird das zyklisch geschickt?
Nein, aber es wird retained, d. h. der Broker speichert den letzten Wert ab. D. h. der Broker kennt immer den aktuellen Wert und übermittelt ihn wenn man danach fragt. Das ist vor allem deshalb wichtig, weil ein toter ble2mqttd nicht periodisch senden kann. Beim Verbinden mit dem Broker wird es als 'connected' gesendet.

Probiere es doch einfach mal aus und schieße dann mit kill ble2mqttd ab.

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

LutzG

Ich übe schon eine Weile mit ein Paar ESP32 auf denen OpenMQTTGateway läuft und Mi-Bändern, dass hier:
https://forum.fhem.de/index.php/topic,127173.msg1236718.html#msg1236718

Mir sind da 2 Sachen aufgefallen 1.:
Zitat von: Beta-User am 27 September 2022, 10:19:14
attr OMG_FFFFC424A12B maxReadingsAge 100000
Wenn ich den Raum verlasse, und der ESP nichts mehr sendet, wird das Reading mehr als 1 Tag weiter berücksichtigt. Teste gerade mit "1800" (30 Minuten).

Das 2., meine ESP heißen "OMG_SZ", "OMG_Bad", ... damit:
Zitat von: Beta-User am 27 September 2022, 10:19:14

  sub identifyMyBestGW {
  [ ... ]
  $bestGW =~ s/_.*//g;
}
bekomme ich als Reading nur: "OMG". Ich habe jetzt eine Weile gelesen / geübt, bis ich verstanden habe, dass $bestGW =~ s/_.*//g; alles löscht, was nach dem "_" kommt -> für (vielleicht nicht nur) mich ungünstig. Ich hab es geändert, in: $bestGW =~ s/_rssi//g;

Im Moment logge ich die RSSI Werte, um vielleicht dahinter zu kommen, ob ich eine "Raumerkennung" hin bekomme. Dabei hab ich festgestellt, das entferntere ESP manchmal besseren Empfang haben, als die gleich neben mir... Ich hänge Mal einen Graphen an.
DMZ: J5040 mit OpenMediaVault, in Docker: Portainer, Fhem, MariaDB, zigbee2mqtt, esphome, NextCloudPi, Jellyfin, Grocy.
Intranet: J5005 mit OpenMediaVault, in Docker: Portainer, Fhem-minimal, urbackup - läuft nur, wenn Rechner laufen.

PatrickR

#65
Mahlzeit!

Neue Version 0.07 mit Batterie (wird alle 6 Stunden abgefragt).

Neue Topics:
battery
batterytime

Patrick

/Edit: Anhang entfernt. Neue Version weiter 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

gestein

Hallo Patrick,

Super. Das werde ich morgen gleich testen.

Zitat von: PatrickR am 06 November 2022, 16:33:13
Probiere es doch einfach mal aus und schieße dann mit kill ble2mqttd ab.

Habe nun auf allen 3 Rechnern die Version mit Status/LWT installiert und folgendes als ReadingList eingetragen:
$DEVICETOPIC/state:.* {my $roomAct=(split m{[/]}x,$TOPIC)[1]; {"status_$roomAct"=>$EVENT}
Wenn ich bei einem Rechner den Prozess abschieße, sollte doch ein Reading ,,status_Vorzimmer" angelegt werden. Oder?
Aber es passiert nichts.
Auch nicht nach einer Stunde, oder wenn ich einen Prozess wieder starte.
Und auch nicht mit ,,$DEVICETOPIC/state:.* status"

Lg, Gerhard


PatrickR

Zitat von: gestein am 07 November 2022, 22:18:53
$DEVICETOPIC/state:.* {my $roomAct=(split m{[/]}x,$TOPIC)[1]; {"status_$roomAct"=>$EVENT}
Das Topic wird direkt nach dem Start geschickt, also wenn es nicht direkt kommt, passt was nicht.
Auf was ist denn devicetopic gesetzt?

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

gestein

Hallo Patrick,

ich wollte nur kurz die neue Version wegen der Battery-Funktion installieren und habe dazu alle Rechner neu gestartet.

Nun erscheint in meinem MQTT-Server das folgende Reading:
RETAIN {"ble2mqttd/Kinderzimmer/state":"connected","ble2mqttd/Vorzimmer/state":"connected"} 2022-11-08 08:05:20

Es gibt aber kein MQTT-Device mit "Kinderzimmer" oder "Vorzimmer", nur die MAC-Adressen der Tags z.B.:
devicetopic ble2mqttd/.*/58_9E_C6_0E_EC_AD

lg, Gerhard

PatrickR

Hallo Gerhard,
Zitat von: gestein am 08 November 2022, 08:10:57
Nun erscheint in meinem MQTT-Server das folgende Reading:
RETAIN {"ble2mqttd/Kinderzimmer/state":"connected","ble2mqttd/Vorzimmer/state":"connected"} 2022-11-08 08:05:20
Sehr gut.

Zitat von: gestein am 08 November 2022, 08:10:57
Es gibt aber kein MQTT-Device mit "Kinderzimmer" oder "Vorzimmer", nur die MAC-Adressen der Tags z.B.:
devicetopic ble2mqttd/.*/58_9E_C6_0E_EC_AD
Das ist doch ein Problem, das man angehen kann. Die Frage ist halt, wo Du die Status der ble2mqttds (also das, was Du mit LWT bezweckst) gerne hättest. Du könntest z. B. ein neues MQTT2_DEVICE pro ble2mqttd (also pro Raum) anlegen oder ein gemeinsames und Dir dann jeweils nur die passenden state-Topics abholen, z. B.:


ble2mqttd/Kinderzimmer/state status_kinderzimmer

Das könntest Du sogar in Deine vorhandenen Devices dazupacken, da Dich niemand zwingt, $DEVICETOPIC zu verwenden. Das wäre aber eigentlich der falsche Ort.

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

gestein

Hallo Patrick,

das mit der Abfrage der Batterie scheint zu klappen.
Momentan gebe ich die Werte noch auf nach Zimmern getrennte Readings, damit ich kontrollieren kann, ob immer die gleichen Werte geschickt werden.

Zumindest bei einem MQTT-Device steht:
battery_Kinderzimmer unknown 2022-11-08 14:07:28
battery_Vorzimmer 94 2022-11-08 14:15:27
batterytime_Kinderzimmer 1667912848 2022-11-08 14:07:28
batterytime_Vorzimmer 1667911664 2022-11-08 14:15:27


Wie kann das mit "unknown" sein?
Was sagen eigentlich die Readings "batterytime" aus?

Danke, lg, Gerhard

Stelaku

#71
Hallo Patrick

Vielen dnak für Deine Bemühungen jetzt auch noch den Batterie Status mit in das Program zu nehmen. Habe es gerade getestet und funktioniert prima.

@gestein Ich glaube das Reading batterytime gibt an wann der Status der Batterie abgefragt wurde. Es gibt aber auch noch ein topic in den der Batterie Stand in prozent angegeben wird.
ble2mqttd_FlurSchrank:ble2mqtt/7C_2F_80_B2_2F_8E/battery:.* battery

Viele Grüsse

Stephan

gestein

#72
Hallo Stephan,

dann wäre eigentlich der Wert, den "batterytime" hat, und der Zeitstempel, den das Reading battery trägt, gleich. Oder?

lg, Gerhard

PatrickR

Guten Abend!

Zitat von: gestein am 08 November 2022, 16:37:05
battery_Kinderzimmer unknown 2022-11-08 14:07:28
Wie kann das mit "unknown" sein?
Unknown heißt, es ist schief gegangen. Interessanterweise gibt es zwei Spezialfälle von unknown, nämlich "unknown (unsupported)" und "unknown (timeout)". Unknown ohne Anhängsel ist der Standardfall, wenn irgendwas sonst schiefgeht. Das ist spannend. Genaueres erfahren wir nur mit einem DEBUG-Log, aber das ist für die SD-Karte des Pi nicht so  schön.

Zitat von: gestein am 08 November 2022, 17:08:51
dann wäre eigentlich der Wert, den "batterytime" hat, und der Zeitstempel, den das Reading battery trägt, gleich. Oder?
Wenn man von Details wie nicht synchronisierten Uhren usw. mal absieht vermutlich ja.

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

decaflo

Hallo zusammen,

danke für das Script! Ich bin hier gelandet, weil mein fhem unter Archlinux läuft, bei dem hcitool und gatttool schon länger deprecated sind und nicht mehr verfügbar sind.
ble2mqttd bricht jetzt bei mir mit "gatttool not found" ab.

$ perl ble2mqttd --mqttserver localhost:1883 --mqtttopic ble2mqtt/entrance --debug 5
main::sanity_check: md5 digest of 'ble2mqttd' is: '...'.
main::sanity_check: bluetoothctl found at '/usr/bin/bluetoothctl'.
main::sanity_check: ERROR: gatttool not found!
main::error_exit: ERROR: Exiting due to missing binaries.


War es nicht das Ziel, gatttool überflüssig zu machen? Läuft das Script auch ohne?

Danke und schöne Grüße, Florian!