ble2mqtt - Bluetooth Anwesenheitserkennung

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

Vorheriges Thema - Nächstes Thema

PatrickR

Hi!

Zitat von: Jamo am 25 September 2022, 09:13:41
wenn ich das richtig verstehe: "collectord" funktioniert mit dem MQTT Ansatz nicht mehr, oder?
Prinzipiell konnte man aus meiner Sicht collectord schon immer mit FHEM-Bordmitteln ersetzen.

Zitat von: Jamo am 25 September 2022, 09:13:41
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.
So könnte man es tun, aber Du brauchst vermutlich zusätzlich noch eine Lösung, um die Status der verschiedenen Instanzen zusammenzuführen. Wenn es Dir nur um an- oder abwesend geht könntest Du das schnell und einfach über eine Structure lösen. Wenn Du mehr möchtest, also z. B. eine Info, in welchem Raum Du am wahrscheinlichsten bist, vielleicht mit einem Notify/DOIF.

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,

ich wollte mich damit mal ein bisschen spielen.
Nach der Installation des Tools und eines MQTT2-Servers bekomme ich nun ein MQTT2-Device und dort werden alle Bluetooth-Devices im Attribut readingList gespeichert:
ble2mqttd_Sepia_Client_:ble2mqtt/heartbeat:.* heartbeat
ble2mqttd_Sepia_Client_:ble2mqtt/5A_DF_B5_71_7E_5B/lastseen:.* lastseen
ble2mqttd_Sepia_Client_:ble2mqtt/5A_DF_B5_71_7E_5B/present:.* present
ble2mqttd_Sepia_Client_:ble2mqtt/F3_33_4E_A2_A7_EC/lastseen:.* lastseen
ble2mqttd_Sepia_Client_:ble2mqtt/F3_33_4E_A2_A7_EC/present:.* present
ble2mqttd_Sepia_Client_:ble2mqtt/EA_EA_66_97_10_F3/lastseen:.* lastseen
ble2mqttd_Sepia_Client_:ble2mqtt/EA_EA_66_97_10_F3/present:.* present
ble2mqttd_Sepia_Client_:ble2mqtt/59_50_EB_AA_53_98/lastseen:.* lastseen
ble2mqttd_Sepia_Client_:ble2mqtt/59_50_EB_AA_53_98/present:.* present
ble2mqttd_Sepia_Client_:ble2mqtt/F3_F4_96_4D_1C_C6/lastseen:.* lastseen
ble2mqttd_Sepia_Client_:ble2mqtt/F3_F4_96_4D_1C_C6/present:.* present
ble2mqttd_Sepia_Client_:ble2mqtt/58_9E_C6_0E_EC_AD/lastseen:.* lastseen
ble2mqttd_Sepia_Client_:ble2mqtt/58_9E_C6_0E_EC_AD/present:.* present
ble2mqttd_Sepia_Client_:ble2mqtt/79_49_3C_4B_9D_33/lastseen:.* lastseen
ble2mqttd_Sepia_Client_:ble2mqtt/79_49_3C_4B_9D_33/present:.* present
und etliche mehr


Ist das so gedacht?
D.h. ich muss nun manuell die MQTT2-Devices wie von drhirn anlegen?
https://forum.fhem.de/index.php/topic,127173.msg1226199.html#msg1226199

Danke im Voraus
lg, Gerhard

PatrickR

Hi!

Zitat von: gestein am 25 September 2022, 18:01:25
Hallo,

ich wollte mich damit mal ein bisschen spielen.
Nach der Installation des Tools und eines MQTT2-Servers bekomme ich nun ein MQTT2-Device und dort werden alle Bluetooth-Devices im Attribut readingList gespeichert:

Ist das so gedacht?
Jein. Es ist so von MQTT2_SERVER gedacht. Der versucht zu raten, wie Du Deine Geräte gerne hättest. Ob Dir das was bringt, ist eine andere Frage.

Zitat von: gestein am 25 September 2022, 18:01:25
D.h. ich muss nun manuell die MQTT2-Devices wie von drhirn anlegen?
Wenn Du es sauber und geordnet haben willst mit einem FHEM-Device pro MAC-Adresse ja.

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

gestein

Verstehe. Danke.
Kann man das abstellen?

Meine Gtags laufen probeweise seit ein paar Stunden.
Mal sehen, wie sich das bewährt. Schaut gut aus :)

Ganz verstehe ich noch nicht, wie man nun collectord ersetzen kann.
Ich habe 3 Rechner, die einige Zimmer abdecken.
Dann müsste ich pro Rechner einen MQTT2-Server mit anderem Port anlegen und jeweils ein MQTT2-Device.
Oder?

Ist dann irgendwann geplant, den Rechnernamen oder eine andere Kennung mitzuschicken, damit man das unterscheiden kann?
Wäre auch der Batterielevel geplant?  ;)

Danke, lg, Gerhard

PatrickR

Hi!
Zitat von: gestein am 25 September 2022, 22:16:08
Kann man das abstellen?
Uff, nutze das Modul nicht. Aber gehe davon aus, dass Du in der Commandref von MQTT2_SERVER etwas zu autocreate findest.

Zitat von: gestein am 25 September 2022, 22:16:08
Meine Gtags laufen probeweise seit ein paar Stunden.
Mal sehen, wie sich das bewährt. Schaut gut aus :)
ble2mqttd nutzt gattool, was nach meiner Wahrnehmung um Welten stabiler ist.

Zitat von: gestein am 25 September 2022, 22:16:08
Ganz verstehe ich noch nicht, wie man nun collectord ersetzen kann.
Ich habe 3 Rechner, die einige Zimmer abdecken.
Dann müsste ich pro Rechner einen MQTT2-Server mit anderem Port anlegen und jeweils ein MQTT2-Device.
Oder?

Ist dann irgendwann geplant, den Rechnernamen oder eine andere Kennung mitzuschicken, damit man das unterscheiden kann?
Ein MQTT2_SERVER reicht. Du musst nur bei jedem ble2mqttd ein anderes topic setzen und dann nach der "drhirn-Methode" für jede MAC-Adress-Raum-Kombination ein Device in FHEM, z. B.

Gerhard_Wohnzimmer
Gerhard_Flur
Gerlinde_Wohnzimmer
Gerlinde_Flur

Und dann fasst Du die Gerhards in einer structure zusammen und die Gerlindes in einer anderen. Damit bekommst Du dann einen hausweiten Gerhard-Status. Das jetzt erstmal ins Unreine gedacht. Habe das selbst noch nicht gemacht.

Etwas anspruchsvoller wird dann die Auswertung, in welchem Raum Du mit größter Wahrscheinlichkeit bist (-> rssi-Werte).

Zitat von: gestein am 25 September 2022, 22:16:08
Wäre auch der Batterielevel geplant?  ;)
Das würde sich anbieten. Aber mir fehlt momentan zugegebenermaßen die Zeit, da weiter dran zu werkeln. Eigentlich hatte ich schon für ble2mqttd keine :)

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,

Danke.
Mit ,,autocreate no" ist hier wieder Ruhe.

In der Hilfe von ble2mqttd kann ich zum Thema topic nichts finden.
Habe ich da vielleicht eine alte Version?

Mit etwas Warten kann ich natürlich leben  ;)
Danke, lg, Gerhard

PatrickR

#36
Hi!

Zitat von: gestein am 25 September 2022, 23:44:18
In der Hilfe von ble2mqttd kann ich zum Thema topic nichts finden.
Habe ich da vielleicht eine alte Version?
Nö, nur hat "irgendwer" vergessen, das in die Usage reinzupacken ;)

Einfach ble2mqttd zusätzlich mit

--mqtttopic ble2mqtt/flur

aufrufen.

Dann für jede Instanz in der drhirn-Definition

attr mqttTest devicetopic ble2mqtt/7C_2F_80_AF_1A_F8

durch

attr mqttTest devicetopic ble2mqtt/flur/7C_2F_80_AF_1A_F8

ersetzen.

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

#37
Neue Version 0.05 mit angepasster Hilfe, keine funktionalen Änderungen.

/Edit: Anhang entfernt. Aktuelle Version in #59
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,

ich habe mich an der neuen Version versucht.
Damit hätte man schon mal die Werte pro Raum:
devicetopic ble2mqttd/.*/58_9E_C6_0E_EC_AD
$DEVICETOPIC/rssi:.* {my $room=(split /\//,$TOPIC)[1]; {"rssi_$room"=>$EVENT}}
$DEVICETOPIC/lastseen:.* {my $room=(split /\//,$TOPIC)[1]; {"lastseen_$room"=>strftime "%Y-%m-%d %H:%M:%S", localtime($EVENT)}}
$DEVICETOPIC/present:.* {my $room=(split /\//,$TOPIC)[1]; $EVENT ? {state=>'present'} : {state=>'absent'} }
$DEVICETOPIC/present:.* {my $room=(split /\//,$TOPIC)[1]; $EVENT ? {"presence_$room"=>'present'} : {"presence_$room"=>'absent'} }
$DEVICETOPIC/LWT:.* LWT


Nun muss ich mir noch überlegen, wie ich die present-Werte aus den bekannten Räumen zusammenführe und richtig auswerte.
Und das mit dem LWT stimmt auch noch nicht  ;)

lg, Gerhard

PatrickR

#39
Hi!

Zitat von: gestein am 26 September 2022, 13:28:41
Damit hätte man schon mal die Werte pro Raum:
devicetopic ble2mqttd/.*/58_9E_C6_0E_EC_AD
$DEVICETOPIC/rssi:.* {my $room=(split /\//,$TOPIC)[1]; {"rssi_$room"=>$EVENT}}
$DEVICETOPIC/lastseen:.* {my $room=(split /\//,$TOPIC)[1]; {"lastseen_$room"=>strftime "%Y-%m-%d %H:%M:%S", localtime($EVENT)}}
$DEVICETOPIC/present:.* {my $room=(split /\//,$TOPIC)[1]; $EVENT ? {state=>'present'} : {state=>'absent'} }
$DEVICETOPIC/present:.* {my $room=(split /\//,$TOPIC)[1]; $EVENT ? {"presence_$room"=>'present'} : {"presence_$room"=>'absent'} }
$DEVICETOPIC/LWT:.* LWT

Ah, Du packst alle Infos zu einer Person in ein Gerät. Ggf. kann man in diesem Fall sogar die Auswertung mit einem (etwas größeren) Userreading lösen. Das könnte man dann sogar in 99_MyUtils auslagern und für alle Bewohner-Devices nutzen.

Zitat von: gestein am 26 September 2022, 13:28:41
Und das mit dem LWT stimmt auch noch nicht  ;)
Ja, vor allem auch, weil ble2mqttd das Topic garnicht setzt. Bislang gibt es als schlechte Alternative das instanzweite Heartbeat-Topic.

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,

ja, das war meine Idee. Irgendwie habe ich gerne alles in einem Gerät, wenn es sinnvoll zusammengehört.
Prinzipiell klappt das mit dem userreading presence schon (ist aber relativ aufwändig und als Einzeiler unübersichtlich).
$DEVICETOPIC/present:.* {my $room=(split /\//,$TOPIC)[1]; my $presence="absent";foreach my $readingname (keys %{$defs{"$NAME"}->{READINGS}}) {if($readingname =~ "presence_" && ReadingsVal("$NAME","$readingname","absent") eq "present") {$presence="present";last}}; if($EVENT) {$presence="present"}; fhem "setreading $NAME state $presence";fhem "setreading $NAME presence $presence"; $EVENT ? {"presence_$room"=>'present'} : {"presence_$room"=>'absent'}}

Wenn man auch den Raum und die RSSI als userreading haben will, wird es noch etwas aufwändiger.
Damit hätte man dann 2 Funktionen in 99_myUtils.

Ich teste den Code mal mit 2 oder 3 Nebenstellen, bevor ich mehr dazu poste.

lg, Gerhard

drhirn

Ich wollte nur kurz anmerken, bevor du dir zu viel Arbeit antust: Das PRESENCE Modul kann auch auf Events hören. Löst nicht die Sache mit dem Raum, könnte aber sonst ein paar Dinge einfacher machen.

Beta-User

Vielleicht hilft es weiter - hatte mal was ähnliches angefangen für OpenMQTTGateway:

Es wird alles in ein MQTT2_DEVICE gepiped, das von den unterschiedlichen ESP's für einen BT-Tag empfangen wird:
define OMG_FFFFC424A12B MQTT2_DEVICE FFFFC424A12B
attr OMG_FFFFC424A12B userattr maxPresenceAge maxReadingsAge
attr OMG_FFFFC424A12B IODev MQTT2_FHEM_Server
attr OMG_FFFFC424A12B autocreate 0
attr OMG_FFFFC424A12B icon rfid_tag
attr OMG_FFFFC424A12B maxPresenceAge 1200
attr OMG_FFFFC424A12B maxReadingsAge 100000
attr OMG_FFFFC424A12B model OpenMQTTGateway_BT_gtag
attr OMG_FFFFC424A12B readingList home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT/FFFFC424A12B:.* { $TOPIC =~ m,home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT,;; json2nameValue($EVENT, "${1}_") }\
  home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT/FFFFC424A12B:.* { $TOPIC =~ m,home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT,;; {"last_IO"=>"$1"}}
attr OMG_FFFFC424A12B room Steuerung->Interfaces
attr OMG_FFFFC424A12B stateFormat Last IO: last_IO
attr OMG_FFFFC424A12B userReadings bestRecentGW:.*_rssi.* {identifyMyBestGW($name)}


PRESENCE auch via function:
define FFFFC424A12B_presence PRESENCE function { my $maxage = AttrVal("OMG_FFFFC424A12B","maxPresenceAge","300");;;; ReadingsAge("OMG_FFFFC424A12B","Last_IO","100000") < $maxage ? 1 : 0 }

Und hier noch die myUtils für das Ermitteln des "besten IO's":

sub identifyMyBestGW {
  my $name = shift;
  my $maxReadingsAge = shift // AttrVal($name,"maxReadingsAge",600);
 
  my $hash = $defs{$name};
  my @rssis = grep { $_ =~ /.*_rssi/ } sort keys %{ $hash->{READINGS} };
  my $bestGW = "unknown";
  my $bestGWold = ReadingsVal($name,"bestRecentGW","unknownGW");
  my $bestRSSI = -1000;
  my $currentRSSI = 0;
  for (@rssis) {
    if (ReadingsAge($name,$_,100) < $maxReadingsAge) {
      $currentRSSI = ReadingsVal($name,$_,-1100);
      if ($currentRSSI > $bestRSSI) {
        $bestRSSI = $currentRSSI ;
        $bestGW = $_;
      }
     
    }
  }
  $bestGW =~ s/_.*//g;
  return $bestGW ne $bestGWold ? $bestGW : undef;
}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

gestein

Zitat von: drhirn am 27 September 2022, 10:06:33
Ich wollte nur kurz anmerken, bevor du dir zu viel Arbeit antust: Das PRESENCE Modul kann auch auf Events hören. Löst nicht die Sache mit dem Raum, könnte aber sonst ein paar Dinge einfacher machen.
Bis dato hatte ich für meine GTags je ein PRESENCE-Device mit lepresenced/collectord.
Das wurde dann im ROOMMATE ausgewertet.
Nun hatte ich versuchsweise das PRESENCE-Device durch das MQTT2-Device ersetzt.
Hatte im ersten Schritt mal funktioniert.
Werde mir aber gerne anschauen, ob diese Kette besser ist: MQTT2-Device (mit ble2mqttd) -> PRESENCE-Device -> ROOMMATE

@Beta-User: Vielen Dank. Sehr interessant. Das schaue ich mir auch gerne an.

lg, Gerhard

Beta-User

Nachtrag noch...

Habe gesehen, dass das betr. attrTemplate auch noch ein update erfahren hat, damit nur noch ein Event-Stapel ausgelöst wird. Könnte man hier genauso machen, z.B. so (eleganter wäre es, den Reading-Wert vorab zu ermitteln):
$DEVICETOPIC/present:.* {my $room=(split /\//,$TOPIC)[1]; $EVENT ? {"presence_$room"=>'present', state=>'present' } : {"presence_$room"=>'absent', state=>'absent'} }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files