lepresenced und G-Tags - nach einiger Zeit nur noch absent/unreachable

Begonnen von stiefl, 18 August 2017, 13:00:51

Vorheriges Thema - Nächstes Thema

drhirn

Ich kann dir hier kurz meine Doku zu ble2mqtt zusammenschreiben. So mach ich das bei allen meinen Rapsberrys. Sag nicht, dass das die optimale Lösung ist, aber bei mir funktioniert's.

Zuerst mal ble2mqtt aus dem Thread runterladen und auf den RPi kopieren.

Dann nach /usr/local/bin kopieren und ausführbar machen.
sudo cp -a ble2mqttd /usr/local/bin/
sudo chmod +x /usr/local/bin/ble2mqttd

Ein paar benötigte Pakete installieren:
sudo apt install -y libssl-dev libio-socket-ssl-perl libreadonly-perl libtest-expect-perl libnet-ssleay-perl libnet-server-perl

Net::MQTT::Simple gibt's leider noch nicht als Debian Paket. Deswegen mit cpan installieren.
sudo cpan CPAN::DistnameInfo
sudo cpan Net::MQTT::Simple

Dann startest du ble2mqtt mal um zu schauen, ob alles benötigte da ist:
/usr/local/bin/ble2mqttd
Dann ein Systemd-Service erstellen, damit ble2mqtt beim Systemstart gestartet wird:
sudo nano /etc/systemd/system/ble2mqttd.service

[Unit]
Description=ble2mqttd
After=bluetooth.target

[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/ble2mqttd --mqttserver mqtt.example.com:1883 --mqtttopic ble2mqtt/wohnzimmer --mac '(11:22:33:44:55:66|77:88:99:00:AA:BB)' --absentinterval 30 --mqttuser <username> --mqttpass <password>

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl enable ble2mqttd.service
sudo systemctl start ble2mqttd.service

Dann kannst du nachsehen, ob's rennt mit:
sudo systemctl status ble2mqttd.service

Das FHEM-Device ist work-in-progress. Sieht bei mir derzeit so aus. Das "presence"-Reading ist nicht optimal. Deswegen spiele ich gerade mit "presence2". Und das funktioniert eigentlich gut.

define ble2mqttGTag MQTT2_DEVICE FHEM
attr ble2mqttGTag comment https://forum.fhem.de/index.php/topic,127173.msg1226199.html#msg1226199
attr ble2mqttGTag devicetopic ble2mqtt/.*/11_2F_80_AB_1A_F9
attr ble2mqttGTag event-on-change-reading .*
attr ble2mqttGTag group Presence Devices
attr ble2mqttGTag icon mqtt
attr ble2mqttGTag readingList ble2mqtt/.*/heartbeat:.* heartbeat\
$DEVICETOPIC/rssi:.* {my $room=(split m{[/]}x,$TOPIC)[1];;;; my $roomMax=$room;;;; my $rssiMax=$EVENT;;;; my @readings = grep { $_ =~ m{\Arssi_(?!$room).*}x } keys %{$defs{"$NAME"}->{READINGS}};;;; for (@readings) {my $rssiTmp=ReadingsVal($NAME,$_,'-100');;;; my $roomTmp=(split m{[_]}x,$_)[1];;;; if(($rssiMax gt $rssiTmp)&&(ReadingsVal($NAME,"presence_".$roomTmp,'absent') eq 'present')) {$rssiMax=$rssiTmp;;;;$roomMax=$roomTmp}};;;; {rssi=>$rssiMax,room=>$roomMax,"rssi_$room"=>$EVENT}}\
$DEVICETOPIC/lastseen:.* {lastseen=>strftime "%Y-%m-%d %H:%M:%S", localtime($EVENT)}\
$DEVICETOPIC/present:.* {my $roomAct=(split m{[/]}x,$TOPIC)[1];;;; my $rssi=ReadingsVal($NAME,"rssi_".$roomAct,'-100');;;;;;;;my $presenceAct=$EVENT?'present':'absent';;;; my $presenceTotal=$presenceAct;;;; my $room=$EVENT ? $roomAct:'';;;; my @readings = grep { $_ =~ m{\Apresence_(?!$roomAct).*}x } keys %{$defs{$NAME}->{READINGS}};;;; for (@readings) {if(ReadingsVal($NAME,$_,'absent') eq 'present') {my $roomTmp=(split m{[_]}x,$_)[1];;;; my $rssiTmp=ReadingsVal($NAME,"rssi_".$roomTmp,'-100');;;;if($rssi gt $rssiTmp){$room=$roomTmp;;;;$presenceTotal='present';;;; $rssi=$rssiTmp}}};;;; {"presence_$roomAct"=>$presenceAct, room=>$room, presence=>$presenceTotal}}\
ble2mqtt/.*/state:.* state\
$DEVICETOPIC/battery:.* batteryLevel
attr ble2mqttGTag room MQTT2_DEVICE,Residents
attr ble2mqttGTag userReadings presence2 {if (ReadingsAge($NAME,"lastseen",0)>60) {return "absent";;}else{return "present";;}}

Das "devicetopic" ist so gestaltet, dass es gleich mehrere mögliche ble2mqtt-Instanzen abfängt. Deswegen sind dann "rssi" und "present" Readings so kompliziert, weil das wieder in einzelne ble2mqtt-Instanzen aufgeteilt werden muss.

LG
Stefan

Wernieman

ZitatNet::MQTT::Simple gibt's leider noch nicht als Debian Paket. Deswegen mit cpan installieren.
Ist das nicht libnet-mqtt-simple-perl ???
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

drhirn


Wernieman

O.K. ... hatte nicht auf die Version geachtet .. sollte eigentlich seit 21 zur Verfügung stehen ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Gasmast3r

#259
Hy so ble2mqtt scheint schonmal zu laufen
defmod MQTT2_ble2mqttd_FTUI3 MQTT2_DEVICE ble2mqttd_FTUI3
attr MQTT2_ble2mqttd_FTUI3 readingList ble2mqttd_FTUI3:ble2mqtt/Tab/heartbeat:.* heartbeat\
ble2mqttd_FTUI3:ble2mqtt/Tab/state:.* state
attr MQTT2_ble2mqttd_FTUI3 room MQTT2_DEVICE

setstate MQTT2_ble2mqttd_FTUI3 connected
setstate MQTT2_ble2mqttd_FTUI3 2023-11-05 09:47:27 IODev MQTT2_FHEM_Server
setstate MQTT2_ble2mqttd_FTUI3 2023-11-05 09:54:27 heartbeat 1699174467
setstate MQTT2_ble2mqttd_FTUI3 2023-11-05 09:47:27 state connected


● ble2mqttd.service - ble2mqttd
    Loaded: loaded (/etc/systemd/system/ble2mqttd.service; enabled; vendor preset: enabled)
    Active: active (running) since Sun 2023-11-05 09:46:24 CET; 11min ago
  Main PID: 315 (ble2mqttd)
      Tasks: 2 (limit: 868)
        CPU: 8.175s
    CGroup: /system.slice/ble2mqttd.service
            ├─ 315 /usr/bin/perl /usr/local/bin/ble2mqttd --mqttserver 192.168.178.110:1883 --mqtttopic ble2mqtt/Tab --mac (11:22:33:44:55>
            └─1053 bluetoothctl

Nov 05 09:46:27 FTUI3 ble2mqttd[315]: main::sanity_check: md5 digest of '/usr/local/bin/ble2mqttd' is: '1146c98e6c1ab082c580f89eb5bdbaa5'.
Nov 05 09:46:27 FTUI3 ble2mqttd[315]: main::sanity_check: bluetoothctl found at '/usr/bin/bluetoothctl'.
Nov 05 09:46:27 FTUI3 ble2mqttd[315]: main::sanity_check: gatttool found at '/usr/bin/gatttool'.
Nov 05 09:46:27 FTUI3 ble2mqttd[315]: main::mqtt_check_reconnect: (Re-)connect detected, handling...
Nov 05 09:46:27 FTUI3 ble2mqttd[315]: /usr/local/bin/ble2mqttd: connect: Network is unreachable
Nov 05 09:46:27 FTUI3 ble2mqttd[315]: main: Scan started.
Nov 05 09:46:27 FTUI3 ble2mqttd[315]: main::__ANON__: Found bluetoothctl version 5.55.
Nov 05 09:47:27 FTUI3 ble2mqttd[315]: main::mqtt_check_reconnect: (Re-)connect detected, handling...
Nov 05 09:48:27 FTUI3 ble2mqttd[315]: main: Scan started.
Nov 05 09:48:27 FTUI3 ble2mqttd[315]: main::__ANON__: Found bluetoothctl version 5.55.
lines 1-20/20 (END)


dann habe ich das Device angelegt wie von dir vorgegeben/vorgeschlagen

define ble2mqttGTag MQTT2_DEVICE FHEM
attr ble2mqttGTag comment https://forum.fhem.de/index.php/topic,127173.msg1226199.html#msg1226199
attr ble2mqttGTag devicetopic ble2mqtt/.*/11_2F_80_AB_1A_F9
attr ble2mqttGTag event-on-change-reading .*
attr ble2mqttGTag group Presence Devices
attr ble2mqttGTag icon mqtt
attr ble2mqttGTag readingList ble2mqtt/.*/heartbeat:.* heartbeat\
$DEVICETOPIC/rssi:.* {my $room=(split m{[/]}x,$TOPIC)[1];;;; my $roomMax=$room;;;; my $rssiMax=$EVENT;;;; my @readings = grep { $_ =~ m{\Arssi_(?!$room).*}x } keys %{$defs{"$NAME"}->{READINGS}};;;; for (@readings) {my $rssiTmp=ReadingsVal($NAME,$_,'-100');;;; my $roomTmp=(split m{[_]}x,$_)[1];;;; if(($rssiMax gt $rssiTmp)&&(ReadingsVal($NAME,"presence_".$roomTmp,'absent') eq 'present')) {$rssiMax=$rssiTmp;;;;$roomMax=$roomTmp}};;;; {rssi=>$rssiMax,room=>$roomMax,"rssi_$room"=>$EVENT}}\
$DEVICETOPIC/lastseen:.* {lastseen=>strftime "%Y-%m-%d %H:%M:%S", localtime($EVENT)}\
$DEVICETOPIC/present:.* {my $roomAct=(split m{[/]}x,$TOPIC)[1];;;; my $rssi=ReadingsVal($NAME,"rssi_".$roomAct,'-100');;;;;;;;my $presenceAct=$EVENT?'present':'absent';;;; my $presenceTotal=$presenceAct;;;; my $room=$EVENT ? $roomAct:'';;;; my @readings = grep { $_ =~ m{\Apresence_(?!$roomAct).*}x } keys %{$defs{$NAME}->{READINGS}};;;; for (@readings) {if(ReadingsVal($NAME,$_,'absent') eq 'present') {my $roomTmp=(split m{[_]}x,$_)[1];;;; my $rssiTmp=ReadingsVal($NAME,"rssi_".$roomTmp,'-100');;;;if($rssi gt $rssiTmp){$room=$roomTmp;;;;$presenceTotal='present';;;; $rssi=$rssiTmp}}};;;; {"presence_$roomAct"=>$presenceAct, room=>$room, presence=>$presenceTotal}}\
ble2mqtt/.*/state:.* state\
$DEVICETOPIC/battery:.* batteryLevel
attr ble2mqttGTag room MQTT2_DEVICE,Residents
attr ble2mqttGTag userReadings presence2 {if (ReadingsAge($NAME,"lastseen",0)>60) {return "absent";;}else{return "present";;}}

bei attr ble2mqttGTag readingList schreibt er mit immer to long

wenn ich die sache nun richtig verstehe lege ich das device mit der mac an und darauf triggert er oder verstehe ich das falsch?

EDIT: ok sehe das er irgendwie Probleme mit Bluetooth hat er finden kein TAG´S denke habe die falschen Bluetooth Programme drauf.

drhirn

Zitat von: Gasmast3r am 05 November 2023, 09:57:47wenn ich die sache nun richtig verstehe lege ich das device mit der mac an und darauf triggert er oder verstehe ich das falsch?

Ja, genau. Ich hab z.B. unter dem Haupt-Topic ble2mqtt vier Untertopics flur, wohnzimmer, bad und kueche. Und darunter jeweils zwei Topics mit den MAC-Adressen der G-Tags. Das Devicetopic nimmt sich jetzt das Haupt-Topic ble2mqtt, alle Topics direkt darunter und dann das mit der jeweiligen MAC-Adresse.

Eventuell ist beim hin- und herkopieren was schief gegangen. Ändere die readingList mal so:

Zitatble2mqtt/.*/heartbeat:.* heartbeat
$DEVICETOPIC/rssi:.* {my $room=(split m{[/]}x,$TOPIC)[1]; my $roomMax=$room; my $rssiMax=$EVENT; my @readings = grep { $_ =~ m{\Arssi_(?!$room).*}x } keys %{$defs{"$NAME"}->{READINGS}}; for (@readings) {my $rssiTmp=ReadingsVal($NAME,$_,'-100'); my $roomTmp=(split m{[_]}x,$_)[1]; if(($rssiMax gt $rssiTmp)&&(ReadingsVal($NAME,"presence_".$roomTmp,'absent') eq 'present')) {$rssiMax=$rssiTmp;$roomMax=$roomTmp}}; {rssi=>$rssiMax,room=>$roomMax,"rssi_$room"=>$EVENT}}
$DEVICETOPIC/lastseen:.* {lastseen=>strftime "%Y-%m-%d %H:%M:%S", localtime($EVENT)}
$DEVICETOPIC/present:.* {my $roomAct=(split m{[/]}x,$TOPIC)[1]; my $rssi=ReadingsVal($NAME,"rssi_".$roomAct,'-100'); my $presenceAct=$EVENT?'present':'absent'; my $presenceTotal=$presenceAct; my $room=$EVENT ? $roomAct:''; my @readings = grep { $_ =~ m{\Apresence_(?!$roomAct).*}x } keys %{$defs{$NAME}->{READINGS}}; for (@readings) {if(ReadingsVal($NAME,$_,'absent') eq 'present') {my $roomTmp=(split m{[_]}x,$_)[1]; my $rssiTmp=ReadingsVal($NAME,"rssi_".$roomTmp,'-100'); if($rssi gt $rssiTmp){$room=$roomTmp; $presenceTotal='present'; $rssi=$rssiTmp}}}; {"presence_$roomAct"=>$presenceAct, room=>$room, presence=>$presenceTotal}}
ble2mqtt/.*/state:.* state
$DEVICETOPIC/battery:.* batteryLevel

Jens_B

Hallo zusammen,
Vielleicht mal als Tipp (ich hoffe es passt so einigermassen in diesen Thread)
da bei uns lepresence und auch das Wlan presence in Verbindung mit den IPhone bei nicht mehr zuverlässig funktioniert, habe ich folgende Lösung erdacht:
Ich habe mir dummies erstellt, welche den Presence Status enthalten: (absent/present) die dummies sind per Homebridge mit dem Homekit von Apple verbunden.
In Homekit habe ich eine Automation erstellt, welche diese dummies ein/ausschaltet. ,Wenn xxx das haus verlässte deaktivre ,xxx anwesenheit''
,Wenn xxx zu Hause ankommt aktiviere ...'

Das funktioniert einwandfrei. Und ich brauche mich nicht mehr mit bluetooth oder wlan Problemen an den Raspberries rumärgern ;-).

Gruss
Jens
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

RockThisParty

Hallo!
Ich kann mich Jens_B nur anschließen, habe seit rund zwei Jahren genau dieselbe Lösung laufen und Bluetooth inzwischen aus der Anwesenheitserkennung rausgenommen. Ergänzend zu HomeKit habe ich noch die WLAN-Erkennung in der Fritz!Box laufen. Die ist zwar sehr viel Träger aber immer noch ein gutes Backup, wenn Apple doch mal nicht will.