ble2mqtt - Bluetooth Anwesenheitserkennung

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

Vorheriges Thema - Nächstes Thema

PatrickR

#15
Hi!

Zitat von: drhirn am 27 Juni 2022, 14:16:48
Verwende ich auch (image: eclipse-mosquitto:latest). Das macht's aber nur noch merkwürdiger.
Ok, der Punkt ist wohl, dass Net::MQTT::Simple kein Auth unterstützt und Net::MQTT::Simple::Auth kein SSL, aber Net::MQTT::Simple::SSL wiederum (natürlich) SSL erfordert, was bei Dir nicht der Fall ist. D. h. Du und ich verwenden andere Pakete, von denen >=1 im Eimer ist. Was für ein Murks.

Zitat von: drhirn am 27 Juni 2022, 14:16:48
**edit**
Bringt nichts, da kommt dann gleich der nächste Fehler ;)
Wenn man's richtig ändert, funktioniert das
Das Patchen der Auth.pm? Das ist aber leider keine Lösung für ein Tool, das irgendwann lepresenced ablösen soll.

Leider fehlt mir die Zeit, das MQTT per Hand nachzubauen. Meine letzte Hoffnung, wäre dass das SSL-Modul auch eine Klartextverbindung toleriert. Das werde ich mal testen.

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

Zitat von: PatrickR am 27 Juni 2022, 14:46:07
Das Patchen der Auth.pm? Das ist aber leider keine Lösung für ein Tool, das irgendwann lepresenced ablösen soll.

Ja, nein, eh nicht. Ich wollte nur wissen, ob's funktioniert. Hätte gesucht, ob man irgendwo einen Patch für die Library einbringen könnte. Aber auf die Schnelle nichts gefunden. Das wär nämlich die beste Lösung.

drhirn


  if (!defined($mqttfingerprint)) {
    if ($mqttuser && $mqttpass) {
      $ENV{MQTT_SIMPLE_ALLOW_INSECURE_LOGIN} = 1;
      $mqtt = Net::MQTT::Simple->new($mqttserver);
      $mqtt->login($mqttuser,$mqttpass);
    } else {
      $mqtt = Net::MQTT::Simple->new($mqttserver);
    }
  } else {
    $mqtt = Net::MQTT::Simple::SSL->new($mqttserver, {SSL_fingerprint => $mqttfingerprint});
    if ($mqttuser && $mqttpass) {
      $mqtt->login($mqttuser, $mqttpass);
    }
  }


Geht. Net::MQTT::Simple kann eh Login. Man muss es nur - wenn ohne SSL - explizit erlauben.

PatrickR

Zitat von: drhirn am 27 Juni 2022, 15:22:26

  if (!defined($mqttfingerprint)) {
    if ($mqttuser && $mqttpass) {
      $ENV{MQTT_SIMPLE_ALLOW_INSECURE_LOGIN} = 1;
      $mqtt = Net::MQTT::Simple->new($mqttserver);
      $mqtt->login($mqttuser,$mqttpass);
    } else {
      $mqtt = Net::MQTT::Simple->new($mqttserver);
    }
  } else {
    $mqtt = Net::MQTT::Simple::SSL->new($mqttserver, {SSL_fingerprint => $mqttfingerprint});
    if ($mqttuser && $mqttpass) {
      $mqtt->login($mqttuser, $mqttpass);
    }
  }


Geht. Net::MQTT::Simple kann eh Login. Man muss es nur - wenn ohne SSL - explizit erlauben.
Sehr cool! Ich habe zwar das Gefühl, dass das tote Pferd damit nur noch länger defibrilliert wird, aber das ist schonmal ein Lichtblick.

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

Zitat von: PatrickR am 27 Juni 2022, 15:43:12
Sehr cool! Ich habe zwar das Gefühl, dass das tote Pferd damit nur noch länger defibrilliert wird, aber das ist schonmal ein Lichtblick.

Hihi. Aber wenigstens brauchen wir so das toteste Pferd nicht mehr ;D

drhirn

#20
Blöde Frage: Wie bekomme ich aus dem Lastseen eine ordentlich Uhrzeit raus?

So:
$DEVICETOPIC/lastseen:.* {"lastseen"=>strftime "%Y-%m-%d %H:%M:%S", localtime($EVENT)}

drhirn

#21
Hier mal als Beispiel mein FHEM-Device:

defmod mqttTest MQTT2_DEVICE
attr mqttTest IODev Mosquitto
attr mqttTest devicetopic ble2mqtt/7C_2F_80_AF_1A_F8
attr mqttTest event-on-change-reading .*
attr mqttTest readingList $DEVICETOPIC/rssi:.* rssi\
$DEVICETOPIC/lastseen:.* {"lastseen"=>strftime "%Y-%m-%d %H:%M:%S", localtime($EVENT)}\
$DEVICETOPIC/present:.* { $EVENT ? {state=>'present'} : {state=>'absent'} }


Hab aber noch ein paar Fragen:
1. Wie stoppe ich das Tool wieder, wenn ich's als Daemon gestartet habe?
2. --absentinterval geht (noch) nicht, oder?
3. Warum minimal 30s absentinterval?
4. Ist noch ein dritter Status "away" nach x Stunden absent geplant? Der wäre für mich wichtig.

PatrickR

Hi!

Danke für Deine Tests, den Patch und Konfigurationsbeispiele.

Zitat von: drhirn am 27 Juni 2022, 18:17:30
1. Wie stoppe ich das Tool wieder, wenn ich's als Daemon gestartet habe?
Zunächst mal durch kill/killall. Eine PID-Datei wird auch unter /var/run angelegt, so dass Du es auch sauber über kill $PID beenden könntest. Prinzipiell kannst Du Dir damit einen Systemd-Service bauen.
Das ginge alles natürlich noch schöner und automatisch mit einem DEB-Paket. Leider verwendet ble2mqttd CPAN-Module, für die es keine Debian-Pakete gibt, daher verfolge ich das aktuell nicht.

Zitat von: drhirn am 27 Juni 2022, 18:17:30
2. --absentinterval geht (noch) nicht, oder?
Gerade mal den Code überflogen. Müsste eigentlich berücksichtigt werden. Wo geht es denn bei Dir schief?

Zitat von: drhirn am 27 Juni 2022, 18:17:30
3. Warum minimal 30s absentinterval?
Das ist ein Versuch, den User vor fehlerträchtigen Einstellungen zu schützen. Das Problem ist hier, dass bluetoothctl bei meinen Tests keine Duplicates anzeigt, auch wenn ich sie explizit angefordert habe. Im Ergebnis sieht ble2mqttd weniger Beacons als es tatsächlich gibt. Setzt man nun absentinterval zu niedrig, führen diese übersehenen Beacons zu (falschen) absents. Wenn Du damit experimentieren möchtest, kannst Du einfach den Check in Zeile 190 auskommentieren. Die 30s sind aber nicht in Stein gemeißelt, also gerne Feedback, was bei Dir funktioniert.

Zitat von: drhirn am 27 Juni 2022, 18:17:30
4. Ist noch ein dritter Status "away" nach x Stunden absent geplant? Der wäre für mich wichtig.
Nein. Ich möchte offen gestanden auch nicht zu viel Logik in ble2mqttd auslagern, das eigentlich nur nackte Informationen an FHEM weitergeben soll. Streng genommen ist das present-topic eigentlich auch schon zuviel, da man in FHEM über lastseen die Anwesenheit auswerten und beliebig personalisieren kann.

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

Stelaku

Hallo Patrick

Ich finde Deinen Ansatz sehr spannend und habe Ihn bei mir mal getestet. Läuft auch ohne Große Probleme.
Mich stört nur ein wenig das sich bei jeden Neustart des pi auf dem ich mqtt2ble laufen habe sich der ID-Name des MQTT2DEVICE in Fhem ändert und bei
Autocreate dadurch immer wieder ein neues Device angelegt wird. Plus Log file. Kann man das so im Skript ändern, das immer derselbe ID-Name gesendet wird?

Dann habe ich beobachtet das schon sehr viel vom Skript mqtt2ble gesendet wird. Ich wusste nicht das so viele Geräte bei uns im Haus ble Mac Adressen senden.
Mehr als 20 was natürlich ein paar topic s sind.
Ich habe bei mir nur zwei G-Tags, die ich überwachen möchte. Ist es da möglich im Skript die mqtt Nachrichten, die an FHEM rausgehen nur auf voreingestellt MAC-Adressen zu reduzieren?

Ich habe mich schon vergeblich daran versucht alle Topics in FHEM per ignoreRegexp im MQTT2_SERVER zu ignorieren die nicht den beiden MAC-Adressen endsprechen.
REGEX ist nicht mein Freund.

Viele Grüsse

Stephan


PatrickR

Hallo Stephan,

Zitat von: Stelaku am 15 September 2022, 21:39:44
Mich stört nur ein wenig das sich bei jeden Neustart des pi auf dem ich mqtt2ble laufen habe sich der ID-Name des MQTT2DEVICE in Fhem ändert und bei
Autocreate dadurch immer wieder ein neues Device angelegt wird. Plus Log file. Kann man das so im Skript ändern, das immer derselbe ID-Name gesendet wird?
Da ich den internen MQTT2_SERVER nicht verwende: Kannst Du mir mal ein list des MQTT2_DEVICE senden, in dem man diese ID sieht?

Zitat von: Stelaku am 15 September 2022, 21:39:44
Ich habe bei mir nur zwei G-Tags, die ich überwachen möchte. Ist es da möglich im Skript die mqtt Nachrichten, die an FHEM rausgehen nur auf voreingestellt MAC-Adressen zu reduzieren?
Das ist natürlich möglich. Aber eine der Grundideen von Publisher/Subscriber-Ansätzen wie MQTT ist, dass man sich nur exakt auf die Topics subscribed, die einen interessieren. Ich habe die Topic-Struktur auch (hoffentlich) so gewählt, dass alle Informationen unterhalb der MAC-Adresse des Geräts hängen, so dass das sehr einfach geht.
D. h. das wäre in FHEM zu lösen, wofür ich aber ein schlechter Ansprechpartner bin, da ich mit einem externen Broker arbeite. Aber vielleicht kann Dir im MQTT-Forenbereich jemand helfen.

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

rudolfkoenig

ZitatAber eine der Grundideen von Publisher/Subscriber-Ansätzen wie MQTT ist, dass man sich nur exakt auf die Topics subscribed, die einen interessieren.
Das ist prinzipiell richtig, allerdings mit zwei Haken: man hat nicht immer eine Doku, und "heutige" Benutzer erwarten, dass die Einbindung mit minimalen Aufwand funktioniert.

Deswegen legt FHEM mit MQTT2_SERVER in der Voreinstellung fuer jede ClientID ein MQTT2_DEVICE an, und ordnet anhand dieses IDs alle Topics zu. Natuerlich kann man das abschalten, und alles manuell konfigurieren, aber wenn man die funktionierende Alternative gesehen hat, dann faellt einem das schwer.

PatrickR

#26
Hi!

So, habe mal die ClientID-Geschichte eingebaut, auch wenn ich kein Freund von der Idee bin, die clientID als Heuristik zweckzuentfremden.

Grüße
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

Stelaku

Hallo Patrick

Vielen dank für Deine Bemühungen
Habs gleich mal getestet.
Funktioniert prima.
Jetzt wird nur noch einmal ein logfile und eine MQTT2_DEVICE angelegt egal wie oft das skript gestartet wird.
Ich bekomme jetzt aber immer eine Meldung in der ssh Konsole. das Skript läuft aber trotzdem ohne sichtbare Probleme.

stephan@test:~ $ sudo ./ble2mqtt1 --mqttserver 192.168.178.31:1883 &
[1] 772
stephan@test:~ $ Ambiguous use of *{Net::MQTT::Simple::_client_identifier} resolved to *Net::MQTT::Simple::_client_identifier at ./ble2mqtt1 line 86.
Subroutine Net::MQTT::Simple::_client_identifier redefined at ./ble2mqtt1 line 90.

stephan@test:~ $



Viele grüsse

Stephan

PatrickR

#28
Hi!

Zitat von: Stelaku am 17 September 2022, 12:22:44
Ich bekomme jetzt aber immer eine Meldung in der ssh Konsole. das Skript läuft aber trotzdem ohne sichtbare Probleme.

Warning ist auch raus.

Patrick

/Edit: Anhang entfernt, da neue Version weiter unten angehängt.
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

Jamo

Hallo Patrick,
wenn ich das richtig verstehe: "collectord" funktioniert mit dem MQTT Ansatz nicht mehr, oder?

Oder braucht man den dann gar nicht mehr? Dann läuft auf allen verteilten (RPi) clients das script, auf der fhem Haupinstanz kommt dann alles unter einem MQTT_Device zusammen.

Ist das so?

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