PRESENCE: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
 
(30 dazwischenliegende Versionen von 15 Benutzern werden nicht angezeigt)
Zeile 2: Zeile 2:
|ModPurpose=Anwesenheitserkennung
|ModPurpose=Anwesenheitserkennung
|ModType=h
|ModType=h
<!-- |ModCmdRef= -->
|ModForumArea=Unterstützende Dienste
|ModTechName=73_PRESENCE.pm
|ModTechName=73_PRESENCE.pm
|ModOwner=markusbloch
|ModOwner=Jörg/JoWiemann ({{Link2FU|94|Forum}} / [[Benutzer Diskussion:JoWiemann|Wiki]])
}}
}}


Zeile 10: Zeile 10:


* '''lan-ping''' - Das Überwachen via PING Checks, die durch den FHEM Server versandt werden.
* '''lan-ping''' - Das Überwachen via PING Checks, die durch den FHEM Server versandt werden.
* '''fritzbox''' - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich)
* '''fritzbox''' - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich) '''Abgekündigt'''
* ''' Bluetooth'''
* ''' Bluetooth'''
:- '''local-bluetooth''' - Das Überwachen via Bluetooth Checks, die vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)
:- '''local-bluetooth''' - Das Überwachen via Bluetooth Checks, die vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)
Zeile 135: Zeile 135:
<code>define <NAME> PRESENCE event UniFi:NamedDevice:.disconnected UniFi:NamedDevice:.connected</code>
<code>define <NAME> PRESENCE event UniFi:NamedDevice:.disconnected UniFi:NamedDevice:.connected</code>


Dabei wird <UniFi> mit dem Namen des Unifi-Devices in FHEM ersetzt, <NamedDevice> mit dem Namen des zu überwachenden Devices im Unifi-Controller ersetzt.


= Überwachen mittels Bluetooth =
= Überwachen mittels Bluetooth =
Zeile 141: Zeile 142:
* '''Raspbian System''' - wheezy, Jessie (interner BT-Controller)
* '''Raspbian System''' - wheezy, Jessie (interner BT-Controller)
* '''BT-Dongle''' - CSL NET BT USB2.0 Stick, Bluetooth V4.0, Nano <br />'''Achtung''': Es muss ein BT V4.0 oder höher verwendet werden. Nur dieser unterstützt ''LowEnergy''
* '''BT-Dongle''' - CSL NET BT USB2.0 Stick, Bluetooth V4.0, Nano <br />'''Achtung''': Es muss ein BT V4.0 oder höher verwendet werden. Nur dieser unterstützt ''LowEnergy''
* '''BT-TAG''' - Gtag von Gigaset, TrackR, UDOO Neo, PebbleBee, iTag von Unitec, X4-LIFE Multifunkti BL-Anhänger, iTag Wireless Anti, Trackr bravo
* '''BT-TAG''' - Gtag von Gigaset, TrackR, UDOO Neo, PebbleBee, iTag von Unitec, X4-LIFE Multifunkti BL-Anhänger, iTag Wireless Anti, Trackr bravo, GhostyuBeacon iBc41


=== BT Dongel am PI installieren ===
=== BT-Dongle am RaspberryPI installieren ===
Um den BT Dongle ''(hier: CSL NET BT USB2.0)'' am PI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debain nachinstalliert werden.
Um den BT-Dongle ''(hier: CSL NET BT USB2.0)'' am RaspberryPI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debian nachinstalliert werden.
Wer bereits ein BT-Dongle installiert hat, kann diesen Schritt überspringen.
Wer bereits ein BT-Dongle installiert hat, kann diesen Schritt überspringen.
<pre>
<pre>
Zeile 154: Zeile 155:
</pre>
</pre>


Nach dem erfolgten Reboot bitte das Log des Raspberry auf folgende Einträge prüfen:
Nach dem erfolgten Reboot bitte das Log des RaspberryPI auf folgende Einträge prüfen:
<pre>
<pre>
Feb 12 19:52:55 fhem kernel: [    4.773600] Bluetooth: Core ver 2.20
Feb 12 19:52:55 fhem kernel: [    4.773600] Bluetooth: Core ver 2.20
Zeile 167: Zeile 168:


=== BT-Tags aktivieren ===
=== BT-Tags aktivieren ===
Jetzt kann der BT-Tag aktiviert werden. Bei einigen Tags muss dafür die '''Batteriesicherung''' gezogen werden.
Jetzt kann der BT-Tag aktiviert werden. Bei einigen BT-Tags muss dafür die '''Batteriesicherung''' gezogen werden.


Einen Tag wird mit folgendem Befehl auf der Konsole gesucht:
Ein BT-Tag wird mit folgendem Befehl auf der Konsole gesucht:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
sudo hcitool lescan
sudo hcitool lescan
Zeile 224: Zeile 225:
</pre>
</pre>


Falls beim SCAN kein Tag gefunden wird, sollte das BT Interface neu gestartet werden. Dazu ist kein Reboot des PI notwendig.
Falls beim SCAN kein BT-Tag gefunden wird, sollte das BT Interface neu gestartet werden. Dazu ist kein Reboot des RaspBerryPI notwendig.
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
sudo hciconfig hci0 down
sudo hciconfig hci0 down
Zeile 242: Zeile 243:
:<code>define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX</code>
:<code>define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX</code>


== Überwachung durch verteilte Agenten in der Wohnung (presenced/lepresenced/collectord) ==
== Überwachung durch verteilte Agenten in der Wohnung (presenced/lepresenced/collectord/ble2mqtt) ==
[[Datei:Raspberry-Pi-mit-WLAN-und-Bluetooth-Stick.jpg|thumb|left|Raspberry Pi mit Bluetooth- und WLAN-USB-Stick]]
[[Datei:Raspberry-Pi-mit-WLAN-und-Bluetooth-Stick.jpg|thumb|left|Raspberry Pi mit Bluetooth- und WLAN-USB-Stick]]
Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich, mehrere Bluetooth-Empfänger zu verwenden, die auf mehrere oder alle Räume verteilt sind.
Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich, mehrere Bluetooth-Empfänger zu verwenden, die auf mehrere oder alle Räume verteilt sind.
Zeile 248: Zeile 249:
Hierfür bietet sich zum Beispiel ein [[Raspberry Pi]] mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.
Hierfür bietet sich zum Beispiel ein [[Raspberry Pi]] mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.


Dieses Netz aus Raspberrys wird mit dem presenced / lepresenced Progamm ausgestattet. Beide Programme sind Perl-Skripte, die als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation mit Standardmodulen benötigt.
Dieses Netz aus Raspberrys wird mit dem presenced / lepresenced Programm ausgestattet. Beide Programme sind Perl-Skripte, die als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation mit Standardmodulen benötigt.
 
=== Unterschied presenced / lepresenced / collectored ===
presenced und lepresenced sind Programme, welche in regelmäßigen Abständen nach Bluetooth-Geräten suchen. Sobald ein Gerät, welches vorab definiert wurde, gefunden wird, wechselt der Status des Geräts in FHEM auf Anwesend. Der Unterschied zwischen presenced und lepresenced ist, dass lepresenced insbesondere für [https://de.wikipedia.org/wiki/Bluetooth_Low_Energy|Bluetooth-LE-Device] ist und presenced für "normale" Bluetooth-Geräte.
 
collectored wiederum ist ein Programm, welches mehrere Pis verbindet und auf allen den aktuellen Status von presenced/lepresenced abfragt. Ist das gesuchte Bluetooth-Gerät auf einem der Pi anwesend, so wird es auch in der definierten Hauptinstanz auf anwesend gesetzt. Zusätzlich wird der Pi auf dem das Gerät gefunden wurde als Reading angegeben.
 


=== Unterschied presenced / lepresenced / collectord / ble2mqtt===
presenced, lepresenced und ble2mqtt sind Programme, welche in regelmäßigen Abständen nach Bluetooth-Geräten suchen. Sobald ein Gerät, welches vorab definiert wurde, gefunden wird, wechselt der Status des Geräts in FHEM auf Anwesend. Der Unterschied zwischen presenced, lepresenced und ble2mqtt ist, dass lepresenced und ble2mqtt insbesondere für [https://de.wikipedia.org/wiki/Bluetooth_Low_Energy Bluetooth-LE-Devices] sind und presenced für "normale" Bluetooth-Geräte.


collectord wiederum ist ein Programm, welches mehrere Pis verbindet und auf allen den aktuellen Status von presenced/lepresenced abfragt. Ist das gesuchte Bluetooth-Gerät auf einem der Pi anwesend, so wird es auch in der definierten Hauptinstanz auf anwesend gesetzt. Zusätzlich wird der Pi auf dem das Gerät gefunden wurde als Reading angegeben. Sofern alle Räume einen Empfangspegel (RSSI) ermitteln können, wird bei mehreren anwesenden Räumen der Raum mit dem besten Empfangspegel selektiert (siehe {{Link2Forum|Topic=54482}}).


=== Installation von (le)presenced ===
=== Installation von (le)presenced ===
Diese Anleitung ist sowohl für presenced, als auch für lepresenced gültig. Einfachheitshalber wird nur lepresenced erwähnt, sämtliche Schritt gehen jedoch auf mit presenced, wobei einfach die genannten Daten durch presenced ersetzt werden müssen.
Diese Anleitung ist sowohl für presenced, als auch für lepresenced gültig. Einfachheitshalber wird nur lepresenced erwähnt, sämtliche Schritte gehen jedoch auch mit presenced, wobei einfach die genannten Daten durch presenced ersetzt werden müssen.


Die Software lepresenced kann aktuell über drei Varianten installiert werden. Dabei ist die bevorzugte Variante (Variante 1) die Installation über das bereitgestellte .deb-Paket.
Die Software lepresenced kann aktuell über drei Varianten installiert werden. Dabei ist die bevorzugte Variante (Variante 1) die Installation über das bereitgestellte .deb-Paket.
Die Variante 2 setzt voraus, dass im FHEM contrib Verzeichnis (/opt/fhem/contrib) die aktuelle Version des .deb-Pakets liegt. Die Variante 3 ist dafür gedacht, wenn man keine .deb-Pakete installieren kann/will oder es aus anderen Gründen nicht funktioniert. Es wird davon abgeraten die Variante 3 zu verwenden. Vollständigkeithalber wird sie aber aufgeführt.
Die Variante 2 setzt voraus, dass im FHEM contrib Verzeichnis (/opt/fhem/contrib) die aktuelle Version des .deb-Pakets liegt. Die Variante 3 ist dafür gedacht, wenn man keine .deb-Pakete installieren kann/will oder es aus anderen Gründen nicht funktioniert. Es wird davon abgeraten die Variante 3 zu verwenden. Vollständigkeitshalber wird sie aber aufgeführt.


===== Installation per .deb-Paket =====
===== Installation per .deb-Paket =====
Zeile 272: Zeile 270:


'''1.Variante:'''
'''1.Variante:'''
Herunterladen der aktuellen lepresenced-0.82-1.deb (Stand August 2017) Datei über den Webbrowser  
Herunterladen der aktuellen lepresenced-0.83-3.deb (Stand August 2017) Datei über den Webbrowser  
[https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/ SVN-Repository]. Im SVN die passende Datei auswählen und in der folgende Webseite den Link unter:
[https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/ SVN-Repository]. Im SVN die passende Datei auswählen und in der folgende Webseite den Link unter:
<pre>
<pre>
Zeile 282: Zeile 280:


Alternativ per wget Befehl direkt auf den RPi (aktuelle Versionsnummer beachten)
Alternativ per wget Befehl direkt auf den RPi (aktuelle Versionsnummer beachten)
  https://svn.fhem.de/trac/export/13992/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.82-1.deb
  https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.83-3.deb


'''2.Variante:''' (zu Verwenden, wenn es Probleme bei Variante 1 gibt)
'''2.Variante:''' (zu Verwenden, wenn es Probleme bei Variante 1 gibt)
Zeile 299: Zeile 297:
''' Installation der Variante 1 oder 2 '''
''' Installation der Variante 1 oder 2 '''


Egal welche Variante gewählt wurde, kann nun mit folgenden Befehlen das Paket installiert werden. Bitte Pfade ggf. anpassen.
Egal welche Variante gewählt wurde, nun kann mit folgenden Befehlen das Paket installiert werden. Bitte Pfade ggf. anpassen.


'''Wichtig''': Das '''Paket''' hat eine ca. Größe von '''6,5Kb'''. Ab und an gibt es wohl Probleme mit der Installation, wodurch die Datei 11,5kb groß wird.
'''Wichtig''': Das '''Paket''' hat eine ca. Größe von '''6,5Kb'''. Ab und an gibt es wohl Probleme mit der Installation, wodurch die Datei 11,5kb groß wird.
Diese Datei lässt sich nicht Installieren. In diesem Fall das Paket bitte mit der Variante 1 und dem Bereich "Download in other formats" herunterladen.
Diese Datei lässt sich nicht Installieren. In diesem Fall das Paket bitte mit der Variante 1 und dem Bereich "Download in other formats" herunterladen.


  sudo dpkg -i lepresenced-0.82-1.deb
  sudo dpkg -i lepresenced-0.83-3.deb


  sudo apt-get -f install
  sudo apt-get -f install
Zeile 385: Zeile 383:


=== Alle Räume gemeinsam ansprechen mittels collectord ===
=== Alle Räume gemeinsam ansprechen mittels collectord ===
Um zwei Presence.- oder lepresenced Installationen zu verbinden wird der collectored Daemon von Markus Bloch benötigt. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status einschließlich der Angabe des Raumes, in dem das Gerät erkannt wurde.
Um zwei presenced- oder lepresenced Installationen zu verbinden wird der collectord Daemon von Markus Bloch benötigt. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status einschließlich der Angabe des Raumes, in dem das Gerät erkannt wurde.




Zeile 393: Zeile 391:
mehrere lepresenced Instanzen der collectord verwendet.<p></p>
mehrere lepresenced Instanzen der collectord verwendet.<p></p>
Diese Skizze dient als Basis für alle genannten Konfigurationen innerhalb dieses Artikels.
Diese Skizze dient als Basis für alle genannten Konfigurationen innerhalb dieses Artikels.
 
{{NeuerTextBlock}}
 
 
 
 
 
 


==== Aufbau ====
==== Aufbau ====
; RPi1 (Hautpinstanz):  
; RPi1 (Hauptinstanz):  
: FHEM Installation
: FHEM Installation
: presence/lepresenced Installation  
: presence/lepresenced Installation  
Zeile 415: Zeile 407:
==== Installation per .deb-Paket ====
==== Installation per .deb-Paket ====
collectord wird heruntergeladen und installiert:
collectord wird heruntergeladen und installiert:
https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/collectord-1.7.deb (Stand Januar 2017)
https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/collectord-1.8.deb (Stand Januar 2018)
<pre>
<pre>
sudo dpkg -i collectord-1.7.deb
sudo dpkg -i collectord-1.8.deb
</pre>
</pre>


Nach der Installation befindet sich im Verzeichnis: /etc/collectord.conf die Konfigurationsdatei für das collectord.
Nach der Installation befindet sich im Verzeichnis: /etc/collectord.conf die Konfigurationsdatei für das collectord. Weitere Einstellungen können unter /etc/default/collectord vorgenommen werden.


==== Konfiguration auf Shellebene ====  
==== Konfiguration auf Shellebene ====  
Zeile 434: Zeile 426:
#port=5111                # tcp port which should be used (5111 is default)
#port=5111                # tcp port which should be used (5111 is default)
#presence_timeout=120    # timeout in seconds for each check when devices are present
#presence_timeout=120    # timeout in seconds for each check when devices are present
#absence_timeout=20      # timeout in secondsfor each check when devices are absent
#absence_timeout=20      # timeout in seconds for each check when devices are absent


[RPi1]           # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze
[RPi1]           # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze
address=127.0.0.1           # Lokale Adresse RPi1 , da hier das Collectord später laufen soll!
address=127.0.0.1           # Lokale Adresse RPi1 , da hier das Collectord später laufen soll!
port=5333           # Port der Presence Installation  
port=5333           # Port der Presence Installation  
presence_timeout=60   # Selbstgewaelte Pruefintervalle
presence_timeout=60   # Selbstgewaehlte Pruefintervalle
absence_timeout=60   # Selbstgewaelte Pruefintervalle
absence_timeout=60   # Selbstgewaehlte Pruefintervalle


[RPi2]            # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze
[RPi2]            # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze
address=192.168.178.127           # IP-Adresse der Instanz, wo nur das Presence laueft, also RPi2
address=192.168.178.127           # IP-Adresse der Instanz, wo nur das Presence laueft, also RPi2
port=5333           # Port der Presence Installation  
port=5333           # Port der Presence Installation  
presence_timeout=60   # Selbstgewaelte Pruefintervalle
presence_timeout=60   # Selbstgewaehlte Pruefintervalle
absence_timeout=60   # Selbstgewaelte Pruefintervalle
absence_timeout=60   # Selbstgewaehlte Pruefintervalle
</pre>
</pre>


Zeile 452: Zeile 444:
* Es dürfen keine [Namen] mit Leerzeichen verwendet werden
* Es dürfen keine [Namen] mit Leerzeichen verwendet werden
* Der angegebene Port richtet sich danach, ob auf dem Pi presenced (Port 5111) oder lepresenced (Port 5333) nach dem Bluetooth-Gerät sucht
* Der angegebene Port richtet sich danach, ob auf dem Pi presenced (Port 5111) oder lepresenced (Port 5333) nach dem Bluetooth-Gerät sucht


==== Konfiguration in FHEM ====  
==== Konfiguration in FHEM ====  
;RPi1
;RPi1
:define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222 60 Hinweis: (Der Port ist der, des Collectord!! Standard 5222)
define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222 60           ''Hinweis: (Der Port ist der, des collectord!! Standard 5222)''
;RPi2
;RPi2
:define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.127:5222 60 Hinweis: (Der Port ist der, des Collectord!! Standard 5222 - die IP-Adresse von die von RPi1)
define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.127:5222 60     ''Hinweis: (Der Port ist der, des collectord!! Standard 5222 - die IP-Adresse von die von RPi1)''




Zeile 465: Zeile 456:
an FHEM und teilt den Raum mit in dem es erkannt worden ist. Diese Information wird im Reading "rooms" des jeweiligen BT-Gerätes dargestellt.
an FHEM und teilt den Raum mit in dem es erkannt worden ist. Diese Information wird im Reading "rooms" des jeweiligen BT-Gerätes dargestellt.


Zum testen sollte collectored einmalig manuell gestartet werden. Dies hat den Vorteil, dass man nochmal den Port des collectored prüfen kann, dieser steht in der Zeile <pre>created socket on 0.0.0.0 with port 5333</pre> und man sehen kann, ob der collectored richtig startet, oder Fehler auswirft. Gestartet wird mit folgendem Kommando:
Zum testen sollte collectord einmalig manuell gestartet werden. Dies hat den Vorteil, dass man nochmal den Port des collectord prüfen kann, dieser steht in der Zeile <pre>created socket on 0.0.0.0 with port 5222</pre> und man sehen kann, ob der collectord richtig startet, oder Fehler auswirft. Gestartet wird mit folgendem Kommando:
<pre>
<pre>
sudo /usr/bin/perl /usr/sbin/collectord -vv -c /etc/collectord.conf
sudo collectord -vv -c /etc/collectord.conf
</pre>
</pre>
Die Ausgabe sieht wie folgt aus:
Die Ausgabe sieht wie folgt aus:
Zeile 475: Zeile 466:
2017-04-02 17:52:55 - reading configuration file
2017-04-02 17:52:55 - reading configuration file
2017-04-02 17:52:55 - no config errors found
2017-04-02 17:52:55 - no config errors found
2017-04-02 17:52:55 - forked with PID 15556
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5222
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5333
2017-04-02 17:53:20 - new connection from 127.0.0.1:48656
2017-04-02 17:53:20 - new connection from 127.0.0.1:48656
2017-04-02 17:53:20 - created thread 1 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)
2017-04-02 17:53:20 - created thread 1 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)
Zeile 497: Zeile 487:
</pre>
</pre>


Wenn das Log wie oben abgebildet aussieht wurde alles richtig gemacht und unter dem Device in FHEM erscheint ein neues Reading "rooms" mit dem Wert der Erkannten PRESENCE Installation.
Wenn das Log wie oben abgebildet aussieht wurde alles richtig gemacht und unter dem Device in FHEM erscheint ein neues Reading "rooms" mit dem Wert der erkannten PRESENCE-Installation.


'''Verhalten presence timeout im zusammenhang mit dem Attribut "absenceThreshold" der PRESENCE Konfiguration in FHEM'''
'''Verhalten presence timeout im zusammenhang mit dem Attribut "absenceThreshold" der PRESENCE Konfiguration in FHEM'''
<br>
<br>
In der collectord.conf sind presence_timeout und absence_timeout für den jeweiligen Raum konfiguriert.
In der collectord.conf sind <code>presence_timeout</code> und <code>absence_timeout</code> für den jeweiligen Raum konfiguriert.
Das bedeutet, sobald irgendein Gerät in diesem jeweiligen Raum anwesend/abwesend ist, wird das jeweilige Timeout an den verbundenen presenced/lepresenced geschickt um damit das Check-Interval entsprechend zu ändern.
Das bedeutet, sobald irgendein Gerät in diesem jeweiligen Raum anwesend/abwesend ist, wird das jeweilige Timeout an den verbundenen presenced/lepresenced geschickt um damit das Check-Interval entsprechend zu ändern.


In der PRESENCE-Definition kann man ebenfalls ein absence_timeout/presence_timeout setzen. Sobald sich der Zustand ändert,
In der PRESENCE-Definition kann man ebenfalls ein <code>absence_timeout</code>/<code>presence_timeout</code> setzen. Sobald sich der Zustand ändert, wird auch das jeweilige Timeout an den collectord gesandt. Dies hat aber auf die Checks in den jeweiligen Räumen und damit der collectord.conf keinen Einfluss. Der collectord schickt ein Statusupdate an PRESENCE nur, wenn das vorgegebene Timeout (von PRESENCE) erreicht ist und keine Statusänderung stattfand. Sobald eine Änderung des Status erfolgt wird natürlich sofort der Status an PRESENCE geschickt.
wird auch das jeweilige Timeout an den collectord gesandt. Dies hat aber auf die Checks in den jeweiligen Räumen und damit der collectord.conf keinen Einfluss.
Der collectord schickt ein Statusupdate an PRESENCE nur, wenn das vorgegebene Timeout (von PRESENCE) erreicht ist und keine Statusänderung stattfand.
Sobald eine Änderung des Status erfolgt wird natürlich sofort der Status an PRESENCE geschickt.


Das Attribut absenceThreshold/presenceThreshold funktioniert nachwievor. Hier ist nur wichtig wie man die Timeouts sowohl in PRESENCE als auch collectord.conf setzt.
Das Attribut absenceThreshold/presenceThreshold funktioniert nachwievor. Hier ist nur wichtig wie man die Timeouts sowohl in PRESENCE als auch collectord.conf setzt.
Zeile 513: Zeile 500:
'''Das Reading "room" bei einer PRESENCE Definition und der Zusammenhang zu collectord'''
'''Das Reading "room" bei einer PRESENCE Definition und der Zusammenhang zu collectord'''
<br>
<br>
Wenn ein BT LE Empfänger in mehr als einem Raum detektiert wird, führt der aktuellste collectord (aus dem SVN) eine RSSI-Erkennung durch. Sofern alle Räume den Empfangspegel (RSSI) ermitteln können, wird der Raum mit dem besten Empfangspegel als Raum für das "room"-Reading ausgewählt. Der lepresenced in aktueller Version von PatrickR gibt immer den Empfangspegel aus.
Wenn ein BT LE Empfänger in mehr als einem Raum detektiert wird, führt der collectord (ab Version 1.8) eine RSSI-Erkennung durch. Sofern alle Räume den Empfangspegel (RSSI) ermitteln können, wird der Raum mit dem besten Empfangspegel als Raum für das "room"-Reading ausgewählt. Der lepresenced in aktueller Version von PatrickR gibt immer den Empfangspegel aus.


====  Automatischer Start ====
====  Automatischer Start ====
Wenn das Collectord per .deb Paket installiert wurde, startet es automatisch bei einem Reboot mit.
Wenn der collectord per .deb Paket installiert wurde, startet er automatisch bei einem Reboot mit (via systemd/init-Skript).
Manuell Starten als Daemon mit:
<br>
 
Der Collectord wird standardmäßig mit dem Port 5222 gestartet. Um diese anzupassen sind zwei Schritte notwendig:<br>
'''1.)''' Anpassen der /usr/bin/collectord
    Hier bitte den Parameter my $opt_p von 5222 auf 5XXX abändern.
 
Da der collectord mittlerweile per systemd beim reboot des RPi gestarte wird muss auch diese Konfiguration auf den neuen Port angepasst werden.<br>
'''2.)''' Anpassen der /etc/default/collectord
<pre>
# collectord startup defaults:
# The TCP port collectord will listen for incoming connections (default: 5222)
PORT=5111
# The location of the configuration file (default: /etc/collectord.conf
CFGFILE=/etc/collectord.conf
</pre>
 
Manuell starten als Daemon (Parameter <code>-d</code>) mit:
<pre>
<pre>
sudo /usr/bin/perl /usr/sbin/collectord -c /etc/collectord.conf -d -v -l /var/log/collectord.log
sudo collectord -c /etc/collectord.conf -d -v -l /var/log/collectord.log
</pre>
</pre>
=== ble2mqtt ===
presenced und lepresence verwenden zur Erkennung von BT-Geräte Tools, die leider nicht mehr aktiv gewartet werden bzw. deprecated sind. Deswegen wurde ble2mqtt entwickelt. Dieses Tool hat den Vorteil, dass die gesammelten Informationen an einen MQTT-Broker gesendet werden und dadurch in FHEM leicht und flexibel zu verarbeiten sind. Genaue Informationen zu ble2mqtt finden sich auf der Wiki-Seite [[ble2mqtt]].


== Batterieüberwachung ==
== Batterieüberwachung ==
Zeile 533: Zeile 539:
|ModOwner=mumpitzstuff
|ModOwner=mumpitzstuff
}}
}}
Mit dem Modul BleTagBattery - können die Batteriestati aller BT-LE Devices gelesen werden.
Mit dem Modul BleTagBattery - kann der Batteriestatus aller BT-LE Devices gelesen werden.
Es wird das batteryLevel und battery angelegt welches als BT-LE Tags an einer PRESENCE-Installation registriert wurden.
Es werden die Readings batteryLevel und battery angelegt für diejenigen BT-LE Tags, die an einer PRESENCE-Installation registriert wurden.


Vorraussetzung und Installation:
Vorraussetzung und Installation:
Zeile 825: Zeile 831:
Der Alarm dummy hat den Zustand on:off.  Die Bezeichnungen und Namen müssen 1:1 übernommen werden damit das Script funktioniert.
Der Alarm dummy hat den Zustand on:off.  Die Bezeichnungen und Namen müssen 1:1 übernommen werden damit das Script funktioniert.
Andernfalls müssen die Bezeichnungen für z.B. absent:unterwegs und present:anwesend - angepasst werden.
Andernfalls müssen die Bezeichnungen für z.B. absent:unterwegs und present:anwesend - angepasst werden.
Die Benachrichtigung kann aktuell per ''Telegram'' sowie ''Pushover'' ('''Achtung mit zweiterem sind Abokosten verbunden!''') realisiert werden.
Die Benachrichtigung kann aktuell per ''[[TelegramBot|Telegram]]'' sowie ''Pushover'' ('''Achtung mit zweiterem sind Abokosten verbunden!''') realisiert werden.
Diskussion zum Thema im Forum unter: {{Link2Forum|Topic=64080}}
Diskussion zum Thema im Forum unter: {{Link2Forum|Topic=64080}}
<br>
<br>


= Problemlösungen =
'''Absent - Grundlos / Zufällig''' 2022
Zufällige oder Grundlose absent-Meldungen einzelner G-Tags können mit einem FIX behoben werden. Dazu ist es notwendig die BT-Firmware downzugraden.
Auf GIT das .deb Paket herunterladen und auf das jeweiligen System kopieren
wget <nowiki>https://github.com/winterheart/broadcom-bt-firmware/releases/download/v12.0.1.1105_p3/broadcom-bt-firmware-10.1.0.1115.deb</nowiki>
Anschliessend installieren und das System neu starten.
sudo dpkg -i broadcom-bt-firmware-10.1.0.1115.deb
{{Randnotiz|RNText= Dieser FIX scheint nicht bei jedem zu funktionieren! Es gibt auch System die Problemlos ohne FIX arbeiten. Bei einem Update/Upgrade des RPI muss der FIX - wenn notwendig - wieder erneut installiert werden.}}
Danach sollten die Tags wieder Problemlos erkannt werden und nicht nach wenigen Tagen wieder auf "absent" stehen.


= Problemlösungen =
Falls es '''Probleme beim Starten des Skripts''' gibt bzw. man das Skript ohne Reboot des Systems neustarten möchte, kann man dies per kill Befehl erledigen.
Falls es '''Probleme beim Starten des Skripts''' gibt bzw. man das Skript ohne Reboot des Systems neustarten möchte, kann man dies per kill Befehl erledigen.
Das Thema wurde u.a in [https://forum.fhem.de/index.php?topic=75559.new;topicseen#new diesem] Beitrag beschrieben.
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
ps -ef | grep lepresenced
ps -ef | grep lepresenced
Zeile 840: Zeile 863:
{{Randnotiz|RNText=Um Debug-Meldungen zu bekommen (Vorsicht bei SD-Karten-Systemen wie dem RPi) - Hierbei werden die Schreibzyklen auf die SD-Karte erhöht.}}
{{Randnotiz|RNText=Um Debug-Meldungen zu bekommen (Vorsicht bei SD-Karten-Systemen wie dem RPi) - Hierbei werden die Schreibzyklen auf die SD-Karte erhöht.}}


Der Log Level muss im lepresenced-Skript selbst verändert werden. Um den Log-Level auf INFO/WARNING/DEBUG zu setzen, dass Skript lepresenced mit einem Editor öffnen und die Stellen, wo LOG_WARNING zu finden sind durch den nötigen LOG-Eintrag ersetzen.
Der Log Level muss im lepresenced-Skript selbst verändert werden. Um den Log-Level auf INFO/WARNING/DEBUG zu setzen, das Skript lepresenced mit einem Editor öffnen und die Stellen, wo LOG_WARNING zu finden ist, durch den nötigen LOG-Eintrag ersetzen.


<pre>
<pre>
Zeile 854: Zeile 877:
</pre>
</pre>


Bei '''Problemen mit der Batterieüberwachung''' der Tags kann die Pi Firmeware mit folgenden Befehl auf eine ältere Version zurückgesetzt werden.
Bei '''Problemen mit der Batterieüberwachung''' der Tags kann die Pi Firmware mit folgenden Befehl auf eine ältere Version zurückgesetzt werden.
Fehlermeldung beim Aufruf des lebattery oder anderen Batterietestskripten:
Fehlermeldung beim Aufruf des lebattery oder anderen Batterietestskripten:
<pre>connect: Connection refused (111)</pre>
<pre>connect: Connection refused (111)</pre>
Zeile 866: Zeile 889:


'''Das BT-Device ist ständig "absent"'''<br>
'''Das BT-Device ist ständig "absent"'''<br>
Eine Mögliche Lösung kann sein, dass Paket bluez-hcidump zu installieren. Das Werkzeug hcidump erlaubt die Beobachtung von Bluetooth-Aktivität.
Eine Mögliche Lösung kann sein, das Paket bluez-hcidump zu installieren. Das Werkzeug hcidump erlaubt die Beobachtung von Bluetooth-Aktivitäten.
Dies ist nicht notwendig, wenn bereits bluez installiert ist, da dies Teil des bluez Paketes ist
Dies ist nicht notwendig, wenn bereits bluez installiert ist, da dies Teil des bluez Paketes ist
<pre>
<pre>
Zeile 880: Zeile 903:




Die Ursache des Problems ist noch nicht ergründet, allerdings betrifft dies aktuell nur den RPi3. Die Fehlermeldungen werden in verschiedene log's geschrieben. Darunter maßgeblich "syslog" und "kern.log".  
Die Ursache des Problems ist noch nicht ergründet, allerdings betrifft dies aktuell nur den RPi3. Die Fehlermeldungen werden in verschiedene Logs geschrieben. Darunter maßgeblich "syslog" und "kern.log".  


Lösung (vorübergehend)
Lösung (vorübergehend):
Unterbinden der Einträge durch Anlage eines blocklist Eintrag:
Unterbinden der Einträge durch Anlage eines blocklist Eintrag:


  1. Unter "/etc/rsyslog.d" eine Datei erzeugen mit dem Namen "01-blocklist.conf"
  1. Unter "/etc/rsyslog.d" eine Datei erzeugen mit dem Namen "01-blocklist.conf"
  2. Inhalt: (Die Ausdrücke in den "" sind diejenigen, die aus dem log verschwinden sollen. - bei mir waren es die unten stehenden")
  2. Inhalt: (Die Ausdrücke in den "" sind diejenigen, die aus dem log verschwinden sollen. - bei mir waren es die untenstehenden")
     :msg,contains,"Bluetooth: hci0 advertising data length corrected" stop
     :msg,contains,"Bluetooth: hci0 advertising data length corrected" stop
     :msg,contains,"bt_err_ratelimited:" stop
     :msg,contains,"bt_err_ratelimited:" stop
Zeile 898: Zeile 921:
  Sep 06 16:13:46 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: hcitool exited, retrying...
  Sep 06 16:13:46 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: hcitool exited, retrying...


Diese Meldungen können ignoriert werden. Abhilfe schafft sich lepresenced selbst indem es sich resettet.
Diese Meldungen können ignoriert werden. Abhilfe schafft sich lepresenced selbst, indem es sich resettet.
 
'''Moderne iPhones und Android Geräte wechseln in den Schlaf-Modus''', um Energie zu sparen. Somit sind die Geräte zur Anwesenheitserkennung nicht per Ping zu erreichen.
Durch das Programm hping3, lassen sich zyklisch Pakete an die Geräte senden, um sie wieder "aufzuwecken".
 
Mehr im Forum [https://forum.fhem.de/index.php/topic,76342.0.html]


= Versionsänderungen lepresenced =
= Versionsänderungen lepresenced =
Zeile 916: Zeile 944:
# {{Link2FU|5068|PatrikR}} (Patrick) für lepresenced  
# {{Link2FU|5068|PatrikR}} (Patrick) für lepresenced  
# [[Benutzer Diskussion:Devender|Devender]] ({{Link2FU|20043|Dirk}}) für Wiki und Doku
# [[Benutzer Diskussion:Devender|Devender]] ({{Link2FU|20043|Dirk}}) für Wiki und Doku
[[Kategorie:Anwesenheitserkennung]]

Aktuelle Version vom 23. Januar 2024, 15:33 Uhr

PRESENCE
Zweck / Funktion
Anwesenheitserkennung
Allgemein
Typ Hilfsmodul
Details
Dokumentation EN / DE
Support (Forum) Unterstützende Dienste
Modulname 73_PRESENCE.pm
Ersteller Jörg/JoWiemann (Forum / Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Das PRESENCE Modul bietet für die Anwesenheitserkennung mehrere Varianten an:

  • lan-ping - Das Überwachen via PING Checks, die durch den FHEM Server versandt werden.
  • fritzbox - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich) Abgekündigt
  • Bluetooth
- local-bluetooth - Das Überwachen via Bluetooth Checks, die vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)
- lan-bluetooth - Das Überwachen von Bluetoothgeräten, über Netzwerk. Auf einer oder mehreren Maschinen im Netzwerk (z.B. Raspberry Pi) läuft ein Presence-Daemon, der nach Bluetooth-Geräten sucht. Um mehrere Presence-Daemon mit FHEM zu verbinden, gibt es den Collector-Daemon, der sich zu allen Presence-Damons im Netzwerk verbindet und das Ergebnis von allen zusammenfasst.
  • function - Das Überwachen mithilfe einer selbst geschrieben Perl-Funktion, die den Anwesenheitsstatus zurückgibt (0 oder 1)
  • shell-script - Das Überwachen mithilfe eines selbst geschriebenen Shell-Programms/Skript, das eine 0 oder 1 ausgibt, um den Anwesenheitsstatus mitzuteilen.


Überwachen mittels Ping im WLAN/LAN

Info green.pngUm diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel FritzBox: fhem unter root starten beachten.

Um ein Gerät via Ping zu überwachen, muss folgende Definition durchgeführt werden:

define Handy PRESENCE lan-ping 192.168.0.30

Dadurch wird die IP-Addresse 192.168.0.30 alle 30 Sekunden geprüft, ob sie erreichbar ist. Wenn sie erreichbar ist, ist der Status "present" (anwesend), ansonsten "absent" (abwesend).

Der Timeout kann verändert werden, indem ein Wert (in Sekunden) an das Define anhängt wird:

define Handy PRESENCE lan-ping 192.168.0.30 60

Nun würde das Handy alle 60 Sekunden geprüft werden.

Nur wenn bei einem iPhone/iPad die Funktion "über WLAN synchronisieren" aktiviert ist, ist es auch im Standby zuverlässig pingbar. Standardmäßig deaktivieren Apple-Geräte ihr WLAN im Standby-Betrieb um die Akkulaufzeit zu verlängern.

Sollte die Fehlermeldung

PRESENCE (Handy) - ping command returned with output: ping: icmp open socket: Operation not permitted

im Log auftauchen und lan-ping dadurch nicht funktionieren, liegt ein Berechtigungsproblem vor. Kein Grund den User fhem zu root zu machen! Prüfe zu erst als User root ob die Capabilities gesetzt sind.

getcap /bin/ping

Sollte folgendes Ergeben zu Tage fördern.

/bin/ping = cap_net_raw+ep

Ist dem nicht so, setzen wir die benötigten Capabilities

setcap cap_net_raw+ep /bin/ping

Mehr Informationen zum Thema Capabilities [1].


FritzBox: direktes Abfragen der Aktivität via ctlmgr_ctl

Info green.pngUm diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel FritzBox: fhem unter root starten beachten.

Eine sehr häufige und auch zuverlässige Methode ist auf einer FritzBox die Abfrage mittels ctlmgr_ctl Befehl. Über diesen lassen sich alle Geräte abfragen ob sie aktiv sind. Ist ein Gerät aktiv, so gilt es als anwesend.

Dieser Modus kann allerdings nur in FHEM Installationen direkt auf einer FritzBox verwendet werden. Des weiteren muss FHEM unter dem User root laufen. Um ein Gerät zu überwachen, wird lediglich der Gerätename benötigt, so wie er unter dem Menüpunkt "Heimnetz" auftaucht.

Die erforderliche Definition:

define Handy PRESENCE fritzbox iPhone-4S


Überwachung mittels Perl-Code

Es ist möglich zum Überwachen von Geräten eine eigene Perl-Funktion zu verwenden die dann vom PRESENCE Modul im Hintergrund aufgerufen wird.

define <name> PRESENCE function {...} [ <check-interval> [ <present-check-interval> ] ]

Sobald die Funktion den Rückgabewert 1 hat, ist das Gerät anwesend, bei 0 abwesend.

Beispiel DHCP Überwachung auf Airport Basestation

Die hier vorgestellte Überwachung der DHCP Lease auf Airport Basestations per SNMP ist absolut robust gegenüber dem Ruhezustand von iOS und setzt keine weitere Konfiguration auf dem iPhone voraus. Das Abmelden beim Verlassen des Empfangsbereiches der Basestation geschieht mit etwa 5-10 Minuten Verzögerung und ist somit auch vor kurzzeitigen Empfangsproblemen sicher. Das nebenstehende Bild (???) verdeutlicht noch mal die Unterschiede zwischen einer IP-Basierten Ping-Überwachung und der Überwachung auf Ebene der Basestation oder FritzBox.

Bevor der folgende Code verwendet werden kann ist das Perl Modul Net:SNMP zu installieren (z. B. mit: cpan install use Net::SNMP).

Zuerst ist folgender Code in 99_myUtils.pm einzufügen, sollte diese noch nicht vorhanden sein muss diese aus dem Template welches unter Edit Files zu finden ist erzeugt werden. Achtung, das ist nicht der komplette Inhalt der 99_myUtils! Das ist nur die einzelne Routine

use Net::SNMP;
sub
snmpCheck($$)
{
  my ($airport,$client)= @_;

  my $community = "public";
  my $host = $airport;
  my $oid = ".1.3.6.1.2.1.3.1.1.2";
  #my $oid = ".1.3.6.1.2.1.3.1.1.2.25.1.10.0.1";

  my ( $session, $error ) = Net::SNMP->session(
    -hostname => $host,
    -community => $community,
    -port => 161,
    -version => 1
  );

  if( !defined($session) ) {
    return 0;
    return "Can't connect to host $host.";
  }

  my @snmpoids = ();

  my $response = $session->get_next_request($oid);
  my @nextid = keys %$response;
  while ( @nextid && $nextid[0] && $nextid[0] =~ m/^$oid/ ) {
    push( @snmpoids, $nextid[0] );

    $response = $session->get_next_request( $nextid[0] );
    @nextid = keys %$response;
  }

  if( !defined($response = $session->get_request( @snmpoids ) ) ) {
    return 0;
  }

  foreach my $value (values %$response) {
    return 1 if( $value eq $client )
  }

  return 0;
}

Danach lässt sich das Mobilgerät so überwachen:

define iPhone PRESENCE function {snmpCheck("10.0.1.1","0x44d77429f35c")} 30 30

wobei 10.0.1.1 durch die IP-Adresse der Basestation und 0x44d77429f35c durch die MAC Adresse des Geräts als HEX-Zahl ersetzt werden muss.

Beispiel Anwesenheitserkennung mittels UniFi Controller

Die Anwesenheitserkennung bei Geräten in Verbindung mit UniFi-Produkten funktioniert selbst dann, wenn sich die Geräte im PowerSave-Modus befinden.

Beachte: Die Geräte werden erst ungefähr nach 5 Minuten, nachdem das Gerät das WLAN verlassen hat als disconnected angezeigt.

define <NAME> PRESENCE function {ReadingsVal("<UniFi>","<NamedDevice>","") eq "connected" ? 1:0}


Überwachen mittels Events

Der Vorteil gegenüber der Function-Variante ist, dass diese Variante ohne Blocking.pm-Overhead direkt ausgeführt werden kann und in "Echtzeit" abläuft (siehe Beitrag).

define <NAME> PRESENCE event UniFi:NamedDevice:.disconnected UniFi:NamedDevice:.connected

Dabei wird <UniFi> mit dem Namen des Unifi-Devices in FHEM ersetzt, <NamedDevice> mit dem Namen des zu überwachenden Devices im Unifi-Controller ersetzt.

Überwachen mittels Bluetooth

Vorbereitung und Informationen

Getestete Hardware/Software

  • Raspbian System - wheezy, Jessie (interner BT-Controller)
  • BT-Dongle - CSL NET BT USB2.0 Stick, Bluetooth V4.0, Nano
    Achtung: Es muss ein BT V4.0 oder höher verwendet werden. Nur dieser unterstützt LowEnergy
  • BT-TAG - Gtag von Gigaset, TrackR, UDOO Neo, PebbleBee, iTag von Unitec, X4-LIFE Multifunkti BL-Anhänger, iTag Wireless Anti, Trackr bravo, GhostyuBeacon iBc41

BT-Dongle am RaspberryPI installieren

Um den BT-Dongle (hier: CSL NET BT USB2.0) am RaspberryPI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debian nachinstalliert werden. Wer bereits ein BT-Dongle installiert hat, kann diesen Schritt überspringen.

apt-get install bluetooth

Nach erfolgreicher Installation der Pakete sollte der RaspberryPI neu gestartet werden.

sudo reboot

Nach dem erfolgten Reboot bitte das Log des RaspberryPI auf folgende Einträge prüfen:

Feb 12 19:52:55 fhem kernel: [    4.773600] Bluetooth: Core ver 2.20
Feb 12 19:52:55 fhem kernel: [    4.773748] NET: Registered protocol family 31
Feb 12 19:52:55 fhem kernel: [    4.773765] Bluetooth: HCI device and connection manager initialized
Feb 12 19:52:55 fhem kernel: [    4.773797] Bluetooth: HCI socket layer initialized
Feb 12 19:52:55 fhem kernel: [    4.773821] Bluetooth: L2CAP socket layer initialized
Feb 12 19:52:55 fhem kernel: [    4.773890] Bluetooth: SCO socket layer initialized
Feb 12 19:52:55 fhem kernel: [    4.797531] usbcore: registered new interface driver btusb

Sobald der BT-Dongle erkannt wurde leuchtet (wenn vorhanden) auch die blaue/gelbe LED am Dongle auf.

BT-Tags aktivieren

Jetzt kann der BT-Tag aktiviert werden. Bei einigen BT-Tags muss dafür die Batteriesicherung gezogen werden.

Ein BT-Tag wird mit folgendem Befehl auf der Konsole gesucht:

sudo hcitool lescan

Ausgabe z.B.:
LE Scan ...
7C:2F:80:A1:XA:XD (unknown)
7C:2F:80:A1:XA:XD Gigaset G-tag
7C:2F:80:A1:X4:X1 (unknown)

Eine Übersicht über die möglichen Befehle von hcitool gibt es mit der Eingabe von:

sudo hcitool

Ausgabe z.B.:
hcitool - HCI Tool ver 5.23
Usage:
        hcitool [options] <command> [command parameters]
Options:
        --help  Display help
        -i dev  HCI device
Commands:
        dev     Display local devices
        inq     Inquire remote devices
        scan    Scan for remote devices
        name    Get name from remote device
        info    Get information from remote device
        spinq   Start periodic inquiry
        epinq   Exit periodic inquiry
        cmd     Submit arbitrary HCI commands
        con     Display active connections
        cc      Create connection to remote device
        dc      Disconnect from remote device
        sr      Switch master/slave role
        cpt     Change connection packet type
        rssi    Display connection RSSI
        lq      Display link quality
        tpl     Display transmit power level
        afh     Display AFH channel map
        lp      Set/display link policy settings
        lst     Set/display link supervision timeout
        auth    Request authentication
        enc     Set connection encryption
        key     Change connection link key
        clkoff  Read clock offset
        clock   Read local or remote clock
        lescan  Start LE scan
        lewladd Add device to LE White List
        lewlrm  Remove device from LE White List
        lewlsz  Read size of LE White List
        lewlclr Clear LE White list
        lecc    Create a LE Connection
        ledc    Disconnect a LE Connection
        lecup   LE Connection Update 

Falls beim SCAN kein BT-Tag gefunden wird, sollte das BT Interface neu gestartet werden. Dazu ist kein Reboot des RaspBerryPI notwendig.

sudo hciconfig hci0 down
sudo hciconfig hci0 up
sudo hcitool dev

Überwachung durch den FHEM Server direkt

Bluetooth-Adresse eines iPhones

Jenach Aufstellungsort des FHEM Servers kann es sinnvoll sein, eine Bluetooth-Überwachung direkt durch den FHEM Server durchzuführen. Hierbei gilt allerdings zu beachten, dass Bluetooth nicht für große Reichweiten gedacht ist und in den meisten Fällen keine Wände überwinden kann. Das heisst, dass in den meisten Fällen damit nur ein Raum überwacht werden kann.

Je nach Einsatzzweck kann das auch so gewollt sein. Bluetooth USB Sticks, die bereits Bluetooth 4.0 unterstützen, können höhere Reichweiten über Zimmerwände hinaus erreichen. Vorausgesetzt, das Mobilgerät unterstützt Bluetooth 4.0.

Um eine Überwachung per Bluetooth durchführen zu können, benötigt man die Bluetooth-Adresse eines Gerätes. Diese ähnelt vom Aufbau einer MAC-Adresse. Generell wird die Adresse in den Telefon-Informationen bei Smartphones angezeigt.

Um eine Anwesenheitserkennung via Bluetooth durchzuführen, wird folgende Definition in der Konfiguration benötigt:

define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX

Überwachung durch verteilte Agenten in der Wohnung (presenced/lepresenced/collectord/ble2mqtt)

Raspberry Pi mit Bluetooth- und WLAN-USB-Stick

Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich, mehrere Bluetooth-Empfänger zu verwenden, die auf mehrere oder alle Räume verteilt sind.

Hierfür bietet sich zum Beispiel ein Raspberry Pi mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.

Dieses Netz aus Raspberrys wird mit dem presenced / lepresenced Programm ausgestattet. Beide Programme sind Perl-Skripte, die als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation mit Standardmodulen benötigt.

Unterschied presenced / lepresenced / collectord / ble2mqtt

presenced, lepresenced und ble2mqtt sind Programme, welche in regelmäßigen Abständen nach Bluetooth-Geräten suchen. Sobald ein Gerät, welches vorab definiert wurde, gefunden wird, wechselt der Status des Geräts in FHEM auf Anwesend. Der Unterschied zwischen presenced, lepresenced und ble2mqtt ist, dass lepresenced und ble2mqtt insbesondere für Bluetooth-LE-Devices sind und presenced für "normale" Bluetooth-Geräte.

collectord wiederum ist ein Programm, welches mehrere Pis verbindet und auf allen den aktuellen Status von presenced/lepresenced abfragt. Ist das gesuchte Bluetooth-Gerät auf einem der Pi anwesend, so wird es auch in der definierten Hauptinstanz auf anwesend gesetzt. Zusätzlich wird der Pi auf dem das Gerät gefunden wurde als Reading angegeben. Sofern alle Räume einen Empfangspegel (RSSI) ermitteln können, wird bei mehreren anwesenden Räumen der Raum mit dem besten Empfangspegel selektiert (siehe Thema).

Installation von (le)presenced

Diese Anleitung ist sowohl für presenced, als auch für lepresenced gültig. Einfachheitshalber wird nur lepresenced erwähnt, sämtliche Schritte gehen jedoch auch mit presenced, wobei einfach die genannten Daten durch presenced ersetzt werden müssen.

Die Software lepresenced kann aktuell über drei Varianten installiert werden. Dabei ist die bevorzugte Variante (Variante 1) die Installation über das bereitgestellte .deb-Paket. Die Variante 2 setzt voraus, dass im FHEM contrib Verzeichnis (/opt/fhem/contrib) die aktuelle Version des .deb-Pakets liegt. Die Variante 3 ist dafür gedacht, wenn man keine .deb-Pakete installieren kann/will oder es aus anderen Gründen nicht funktioniert. Es wird davon abgeraten die Variante 3 zu verwenden. Vollständigkeitshalber wird sie aber aufgeführt.

Installation per .deb-Paket

Die bevorzugte Variante ist die Installation von lepresenced durch die passenden .deb Pakete.

Info green.pngBei einem Upgrade einer älteren Version reicht es, das neue .deb Paket mit
sudo dpkg -i lepresenced-X.XX-X.deb
zu aktualisieren


1.Variante: Herunterladen der aktuellen lepresenced-0.83-3.deb (Stand August 2017) Datei über den Webbrowser SVN-Repository. Im SVN die passende Datei auswählen und in der folgende Webseite den Link unter:

Download in other formats:
    Original Format 

anklicken und die Datei herunterladen. Die Datei kann jetzt auf den RPi kopiert und mit folgenden Befehlen ausgeführt werden (ggf. Berechtigungen anpassen).

Alternativ per wget Befehl direkt auf den RPi (aktuelle Versionsnummer beachten)

https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/lepresenced-0.83-3.deb

2.Variante: (zu Verwenden, wenn es Probleme bei Variante 1 gibt) Herunterladen aus dem fhem contrib Verzeichnis: Hierzu muss das contrib auf dem aktuellen Stand sein. Dazu wird die Installation von subversion (normal bereits vorhanden) benötigt.

sudo apt-get install subversion

Danach kann per

sudo svn checkout https://svn.fhem.de/fhem/trunk/fhem/contrib svnrepo

Das aktuelle Repository auf den Pi heruntergeladen werden. Danach sollte im gewählten Verzeichnis die eingecheckten Dateien verfügbar sein.

/opt/fhem/svnrepo/PRESENCE/deb  


Installation der Variante 1 oder 2

Egal welche Variante gewählt wurde, nun kann mit folgenden Befehlen das Paket installiert werden. Bitte Pfade ggf. anpassen.

Wichtig: Das Paket hat eine ca. Größe von 6,5Kb. Ab und an gibt es wohl Probleme mit der Installation, wodurch die Datei 11,5kb groß wird. Diese Datei lässt sich nicht Installieren. In diesem Fall das Paket bitte mit der Variante 1 und dem Bereich "Download in other formats" herunterladen.

sudo dpkg -i lepresenced-0.83-3.deb
sudo apt-get -f install

Die Ausgabe der Installation sollte am Ende ein [ ok ] Starting lepresenced (via systemctl): lepresenced.service. ausgeben.

Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.       
Statusinformationen werden eingelesen.... Fertig
Abhängigkeiten werden korrigiert ... Fertig
Die folgenden zusätzlichen Pakete werden installiert:
  bluez-hcidump
Die folgenden NEUEN Pakete werden installiert:
  bluez-hcidump
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
1 nicht vollständig installiert oder entfernt.
Es müssen 157 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 490 kB Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren? [J/n]
Holen: 1 http://archive.raspberrypi.org/debian/ jessie/main bluez-hcidump armhf 5.23-2+rpi2 [157 kB]
Es wurden 157 kB in 0 s geholt (921 kB/s).
Vormals nicht ausgewähltes Paket bluez-hcidump wird gewählt.
(Lese Datenbank ... 42033 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../bluez-hcidump_5.23-2+rpi2_armhf.deb ...
Entpacken von bluez-hcidump (5.23-2+rpi2) ...
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...
bluez-hcidump (5.23-2+rpi2) wird eingerichtet ...
lepresenced (0.82-1) wird eingerichtet ...
[ ok ] Starting lepresenced (via systemctl): lepresenced.service.


3.Variante:

Bei dieser Variante wird das aktuellste lepresenced Skript aus github heruntergeladen. Das bedeutet, dass jegliche Konfiguration wie automatischer Start, Berechtigungen etc. manuell konfiguriert werden muss. Diese Variante eignet sich nur für diejenigen, die keine .deb-Pakete installieren wollen/können oder die genau Wissen, was sie tun!

https://github.com/mhop/fhem-mirror/blob/master/fhem/contrib/PRESENCE/lepresenced

Zur "Installation" des Skripts folgendermaßen vorgehen: Unter /fhem manuell den Ordner „script“ anlegen:

mkdir script

Datei lepresenced reinkopieren und ausführbar machen:

sudo chmod +x /opt/fhem/script/lepresenced
sudo chgrp -cR dialout lepresenced

Skript erstmalig starten:

sudo ./lepresenced --loglevel LOG_EMERG -d

Kommt beim Starten des Skript eine Fehlermeldung, müssen die Abhängigkeiten aufgelöst werden.

Can't locate Net/Server/Daemonize.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 / usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /opt/fhem/lepresenced line 17.
BEGIN failed--compilation aborted at /opt/fhem/lepresenced line 17.

Um die Abhängigkeiten aufzulösen muss folgendes nachinstalliert werden und anschließend ein Reboot durchgeführt werden.

sudo apt-get install libnet-server-*
Einrichtung eines Bluetooth-Geräts über FHEM

Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration eines BT-Geräts in FHEM abgeschlossen worden. Jetzt kann der zum Beispiel ein G-Tag dem FHEM-Server bekannt gemacht werden:

   --   Name       Modul    Modus         MAC vom Gtag  IP vom PI Port    Abfragezeit in Sekunden
define MeinGtAG PRESENCE lan-bluetooth xx:xx:xx:xx:xx:xx 127.0.0.1:5333    120

Wichtig ist den angegeben Port zu unterscheiden. Für presenced muss der Port 5111 genommen werden, für lepresenced der Port 5333. Den absent und present Mode kann man einfach testen, in dem man den Gtag mit Alufolie einwickelt.

Diese Variante sollte eingesetzt werden, wenn nur ein Pi nach Bluetooth-Geräten sucht. Möchte man mehr als ein Gerät nutzen um zum Beispiel eine größere Fläche abzudecken so muss mit collectored gearbeitet werden.


Alle Räume gemeinsam ansprechen mittels collectord

Um zwei presenced- oder lepresenced Installationen zu verbinden wird der collectord Daemon von Markus Bloch benötigt. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status einschließlich der Angabe des Raumes, in dem das Gerät erkannt wurde.


Schematische Darstellung Presence und Collectord, Danke an dtavb

Auf Basis folgender Skizze wird die Einrichtung und der Betrieb der Anwesenheitserkennung und Überwachung

mit dem PRESENCE-Modul sowie dem Skript (.deb-Paket) lepresenced beschrieben. Zusätzlich wird für die Verbindung

mehrere lepresenced Instanzen der collectord verwendet.

Diese Skizze dient als Basis für alle genannten Konfigurationen innerhalb dieses Artikels.

Aufbau

RPi1 (Hauptinstanz)
FHEM Installation
presence/lepresenced Installation
collectord installation
Sämtliche Bluetooth-Geräte in FHEM definiert
RPi2 (Zweitsystem)
FHEM installation
presence/lepresenced Installation
Sämtliche Bluetooth-Geräte in FHEM definiert


Installation per .deb-Paket

collectord wird heruntergeladen und installiert: https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE/deb/collectord-1.8.deb (Stand Januar 2018)

sudo dpkg -i collectord-1.8.deb

Nach der Installation befindet sich im Verzeichnis: /etc/collectord.conf die Konfigurationsdatei für das collectord. Weitere Einstellungen können unter /etc/default/collectord vorgenommen werden.

Konfiguration auf Shellebene

sudo vi /etc/collectord.conf

Diese Datei muss jetzt nach folgender Vorlage angepasst werden.

# room definition
#[room-name]              # name of the room
#address=192.168.0.10     # ip-address or hostname
#port=5111                # tcp port which should be used (5111 is default)
#presence_timeout=120     # timeout in seconds for each check when devices are present
#absence_timeout=20       # timeout in seconds for each check when devices are absent

[RPi1] 			          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze
address=127.0.0.1 	          # Lokale Adresse RPi1 , da hier das Collectord später laufen soll!
port=5333		          # Port der Presence Installation 
presence_timeout=60		  # Selbstgewaehlte Pruefintervalle
absence_timeout=60		  # Selbstgewaehlte Pruefintervalle

[RPi2]  		          # Name (wird als Reading room bei den BT-Tags angezeigt) der presence Instanze
address=192.168.178.127	          # IP-Adresse der Instanz, wo nur das Presence laueft, also RPi2
port=5333		          # Port der Presence Installation 
presence_timeout=60		  # Selbstgewaehlte Pruefintervalle
absence_timeout=60		  # Selbstgewaehlte Pruefintervalle

Hinweis:

  • Es dürfen keine [Namen] mit Leerzeichen verwendet werden
  • Der angegebene Port richtet sich danach, ob auf dem Pi presenced (Port 5111) oder lepresenced (Port 5333) nach dem Bluetooth-Gerät sucht

Konfiguration in FHEM

RPi1
define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222 60           Hinweis: (Der Port ist der, des collectord!! Standard 5222)
RPi2
define Gtag PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.178.127:5222 60     Hinweis: (Der Port ist der, des collectord!! Standard 5222 - die IP-Adresse von die von RPi1)


Nach der Konfiguration kann der Daemon gestartet werden. Sobald das Bluetoothgerät irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort an FHEM und teilt den Raum mit in dem es erkannt worden ist. Diese Information wird im Reading "rooms" des jeweiligen BT-Gerätes dargestellt.

Zum testen sollte collectord einmalig manuell gestartet werden. Dies hat den Vorteil, dass man nochmal den Port des collectord prüfen kann, dieser steht in der Zeile

created socket on 0.0.0.0 with port 5222

und man sehen kann, ob der collectord richtig startet, oder Fehler auswirft. Gestartet wird mit folgendem Kommando:

sudo collectord -vv -c /etc/collectord.conf

Die Ausgabe sieht wie folgt aus:

2017-04-02 17:52:55 - =================================================
2017-04-02 17:52:55 - started with PID 15554
2017-04-02 17:52:55 - reading configuration file
2017-04-02 17:52:55 - no config errors found
2017-04-02 17:52:56 - created socket on 0.0.0.0 with port 5222
2017-04-02 17:53:20 - new connection from 127.0.0.1:48656
2017-04-02 17:53:20 - created thread 1 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)
2017-04-02 17:53:20 - created thread 2 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 127.0.0.1 (UUID: d0beb79dd4771532eb5e207c7bf31788)
2017-04-02 17:53:20 - new connection from 127.0.0.1:48662
2017-04-02 17:53:20 - new connection from 127.0.0.1:48664
2017-04-02 17:53:20 - created thread 3 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)
2017-04-02 17:53:20 - created thread 4 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 127.0.0.1 (UUID: 7495a112063d5db45e6335d3fe305e36)
2017-04-02 17:53:20 - created thread 5 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)
2017-04-02 17:53:20 - created thread 6 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 127.0.0.1 (UUID: c228f8d4d33b06787f995c7903c02760)
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51638
2017-04-02 17:53:22 - created thread 7 for processing device 7C:2F:80:E1:14:31 in room RPi2 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)
2017-04-02 17:53:22 - created thread 8 for processing device 7C:2F:80:E1:14:31 in room RPi1 for peer 192.168.xxx.xxx (UUID: 5db7012e709d6dc2fcd8159fc0344e40)
2017-04-02 17:53:22 - new connection from 192.168.xxx.xxx:51640
2017-04-02 17:53:22 - created thread 9 for processing device 7C:2F:80:ED:BC:F7 in room RPi2 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)
2017-04-02 17:53:23 - created thread 10 for processing device 7C:2F:80:ED:BC:F7 in room RPi1 for peer 192.168.xxx.xxx (UUID: c4b4d7c654132cf88e8c1fec3a956d3d)
2017-04-02 17:53:29 - new connection from 192.168.xxx.xxx:51642
2017-04-02 17:53:29 - created thread 11 for processing device 7C:2F:80:E1:2A:4D in room RPi2 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)
2017-04-02 17:53:29 - created thread 12 for processing device 7C:2F:80:E1:2A:4D in room RPi1 for peer 192.168.xxx.xxx (UUID: ecd7081e5ae3a0d8e735c8750cb116a1)

Wenn das Log wie oben abgebildet aussieht wurde alles richtig gemacht und unter dem Device in FHEM erscheint ein neues Reading "rooms" mit dem Wert der erkannten PRESENCE-Installation.

Verhalten presence timeout im zusammenhang mit dem Attribut "absenceThreshold" der PRESENCE Konfiguration in FHEM
In der collectord.conf sind presence_timeout und absence_timeout für den jeweiligen Raum konfiguriert. Das bedeutet, sobald irgendein Gerät in diesem jeweiligen Raum anwesend/abwesend ist, wird das jeweilige Timeout an den verbundenen presenced/lepresenced geschickt um damit das Check-Interval entsprechend zu ändern.

In der PRESENCE-Definition kann man ebenfalls ein absence_timeout/presence_timeout setzen. Sobald sich der Zustand ändert, wird auch das jeweilige Timeout an den collectord gesandt. Dies hat aber auf die Checks in den jeweiligen Räumen und damit der collectord.conf keinen Einfluss. Der collectord schickt ein Statusupdate an PRESENCE nur, wenn das vorgegebene Timeout (von PRESENCE) erreicht ist und keine Statusänderung stattfand. Sobald eine Änderung des Status erfolgt wird natürlich sofort der Status an PRESENCE geschickt.

Das Attribut absenceThreshold/presenceThreshold funktioniert nachwievor. Hier ist nur wichtig wie man die Timeouts sowohl in PRESENCE als auch collectord.conf setzt.

Das Reading "room" bei einer PRESENCE Definition und der Zusammenhang zu collectord
Wenn ein BT LE Empfänger in mehr als einem Raum detektiert wird, führt der collectord (ab Version 1.8) eine RSSI-Erkennung durch. Sofern alle Räume den Empfangspegel (RSSI) ermitteln können, wird der Raum mit dem besten Empfangspegel als Raum für das "room"-Reading ausgewählt. Der lepresenced in aktueller Version von PatrickR gibt immer den Empfangspegel aus.

Automatischer Start

Wenn der collectord per .deb Paket installiert wurde, startet er automatisch bei einem Reboot mit (via systemd/init-Skript).

Der Collectord wird standardmäßig mit dem Port 5222 gestartet. Um diese anzupassen sind zwei Schritte notwendig:
1.) Anpassen der /usr/bin/collectord

   Hier bitte den Parameter my $opt_p von 5222 auf 5XXX abändern.

Da der collectord mittlerweile per systemd beim reboot des RPi gestarte wird muss auch diese Konfiguration auf den neuen Port angepasst werden.
2.) Anpassen der /etc/default/collectord

# collectord startup defaults:
# The TCP port collectord will listen for incoming connections (default: 5222)
PORT=5111
# The location of the configuration file (default: /etc/collectord.conf
CFGFILE=/etc/collectord.conf

Manuell starten als Daemon (Parameter -d) mit:

sudo collectord -c /etc/collectord.conf -d -v -l /var/log/collectord.log

ble2mqtt

presenced und lepresence verwenden zur Erkennung von BT-Geräte Tools, die leider nicht mehr aktiv gewartet werden bzw. deprecated sind. Deswegen wurde ble2mqtt entwickelt. Dieses Tool hat den Vorteil, dass die gesammelten Informationen an einen MQTT-Broker gesendet werden und dadurch in FHEM leicht und flexibel zu verarbeiten sind. Genaue Informationen zu ble2mqtt finden sich auf der Wiki-Seite ble2mqtt.

Batterieüberwachung

Batterieüberwachung mit dem Modul BleTagBattery

PRESENCE
Zweck / Funktion
Anwesenheitserkennung
Allgemein
Typ Hilfsmodul
Details
Dokumentation EN / DE
Modulname 74_BleTagBattery
Ersteller mumpitzstuff
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!

Mit dem Modul BleTagBattery - kann der Batteriestatus aller BT-LE Devices gelesen werden. Es werden die Readings batteryLevel und battery angelegt für diejenigen BT-LE Tags, die an einer PRESENCE-Installation registriert wurden.

Vorraussetzung und Installation:

Bluez und Gattool

sudo apt-get install bluez

Das Gattool ist in den Installationen von Bluez inbegriffen.


Hinzufügen des githup für das Modul

update add http://raw.githubusercontent.com/mumpitzstuff/fhem-BleTagBattery/master/controls_bletagbattery.txt
update all
restart fhem: shutdown restart
BT-LE tags muss an einer PRESENCE-Installation des type "lan-bluetooth" registriert sein.


Nach dem Neustart von FHEM kann das Modul definiert werden:

define a new device: define <name of device> BleTagBattery

Das Modul versucht in der Standardkonfiguration alle 6 Stunden die BT-LE Devices zu erreichen und das Reading batteryLevel und battery zu aktualisieren. Das Update kann auch manuell mit dem folgenden Befehl erzwungen werden

set <name of device> statusRequest.

Weiter Informationen und Disskussionen können dem eigentlichen Forumsbeitrag entnommen werden,

Batterieüberwachung (aktuell nur G-Tags)

Leider überträgt der G-Tag nach der Einrichtung als Device in FHEM kein Reading mit seinem aktuellen Batteriestatus. Dem wurde mit Hilfe des Forum Abhilfe geschaffen. Im Folgenden wird erläutert wie die Batterieüberwachung eingerichtet werden kann.

Voraussetzung:

bc - Basiscalculator Bc-Paket

 sudo apt-get install bc 

Anlegen eines Shellskript auf dem Raspberry System. Die Parameter <<MAC-Adresse>> und <<TagName>> müssen durch die Werte des auszulesenden G-Tags ersetzt werden.

#!/bin/bash
stringZ=$(sudo gatttool -b 5C:2B:80:C1:14:41 --char-read --handle=0x001b)
stringZ=${stringZ:33:2}
stringZ=$(echo "$stringZ" | tr a-f A-F)
decimal=$(echo "ibase=16; $stringZ" | bc)
perl /opt/fhem/fhem.pl 7072 "setreading MeinGtag Batterie $decimal"

Dem Device in FHEM (hier MeinGtag) ein userReading mit dem Namen Batterie hinzufügen. Das Shellskript mit folgendem Befehl starten:

./GtagBatterie.sh

Wichtig ist hierbei, dass Skript mit "./" und nicht mit "sh" aufzurufen. Beim Aufruf mit "sh GtagBatterie.sh" produziert es einen Fehler

GtagBatterie.sh: 3: GtagBatterie.sh: Bad substitution 

Das Reading wird auf den ausgelesenen Wert der Batterie gesetzt.

Hinweis: Es sollte für jeden G-Tag ein eigenes Skript abgelegt werden. Das Skript kann per crontab oder fhem Kommando (system) regelmäßig aufgerufen werden.

Batterieüberwachung (alle Devices vom Typ "MODE=lan-bluetooth")

Es gibt eine weitere Möglichkeit um den Batteriestatus von LE Devices abzurufen und in FHEM als Reading darzustellen. Dabei wird der Batteriezustand für alle LE Devices, die bereits in FHEM konfiguriert sind und per lepresenced überwacht werden, automatisch in einem shell-Script ermittelt. Näheres dazu im Forumartikel Erweiterung: Anwesenheitserkennung/Batterieüberwachung.

Vorteile:

  • Automatische Ermittlung aller in FHEM konfigurierten LE Devices
  • Möglichkeit, diese Devices alternativ manuell im Script einzutragen
  • Es werden nur Devices abgefragt, die im Status "present" sind, also mit ziemlicher Sicherheit auch verfügbar sind
  • Ein eventuell auf dem FHEM telnet-Port gesetztes Passwort kann im Script hinterlegt werden

Voraussetzung:

Funktionierendes lepresenced - siehe Anleitung für ein LE Device (z.B. Gtags,Pebbles etc.)

socat - TCP port forwarder

sudo apt-get update && sudo apt-get install socat


gawk - Zum extrahieren der Daten

sudo apt-get update && sudo apt-get install gawk

gatttool - Bestandteil von bluez

gatttool ist auf den meisten Distributionen im bluez-Paket, allerdings nicht bei Opensuse. Dort muss man das Sourcepaket von bluez installieren und selbst kompilieren. gatttool sollte dann nach /usr/bin oder /usr/local/bin kopiert werden,


Zusätzlich zu den notwendigen Erweiterungen werden für die Ausführung von gatttool Root-Rechte benötigt!

Das Script selbst gibt es hier: lebattery

Am Besten unter /opt/fhem/script/lebattery speichern und ausführbar machen:

sudo su -
mkdir /opt/fhem/script
cd /opt/fhem/script
wget https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery
chmod 755 lebattery

Je nach Bedarf können im Script noch die folgenden 3 Parameter angepasst werden:

# If allowed_telnetPort is protected by a password, add the password here
TELNETPASSWORD=""
# Attribute for batterylevel in FHEM
ATTRIBUT="batterylevel"
# Use this, if you dont want the script to determine the tags on its own
LETAGS=""

Das Skript wird dann unter root folgendermaßen gestartet:

/opt/fhem/script/lebattery -v

Ausgabe des Skripts, wenn es mit dem Verbose Parameter -v gestartet wird.

Beide Devices sind vom Typ NUT mini, das Device mit dem FHEM-Namen nut_Micky ist im Status absent. Das zweite Device ist im Status present.

Determining address for nut_Micky ...
nut_Micky is in state absent, no further action required

Determining address for nut_Test ...
Fetching batterylevel for nut_Test (F3:44:04:81:54:89) ...
Setting batterylevel for nut_Test to 100%

Mein crontab-Eintrag (User root) sieht so aus:

3 3  * * * /opt/fhem/script/lebattery -v >/opt/fhem/script/lebattery.log 2>&1

Damit wird jeden Morgen um 3 Minuten nach 3 Uhr der Zustand der Batterien aller Devices ermittelt und in FHEM abgespeichert.
Bevor man das mit crontab macht, sollte man allerdings zunächst sicher stellen, dass es auch ohne crontab funktioniert....

Bei Problemen kann man auch erstmal schauen, ob das mit dem gattool überhaupt funktioniert:

gatttool -t <Typ> -b <MAC-Adresse> --char-read --uuid 0x2a19

handle: 0x0017 	 value: 64

In diesem Fall hat die Batterie noch 100% (hex 64).
Der Typ ist abhängig vom Hersteller und kann public (G-Tags) bzw. random (Nut) sein. Im Zweifelsfall beides ausprobieren.

Beispiele

Anwesenheitserkennung / Anwesenheitsbenachrichtigung mit G-Tags

Ein Skript zur Nutzung der Gigaset G-TAGs zur Alarmierung bei öffnen und schließen von Türen und zur Anwesenheitserkennung, um die Alarmierung zu aktivieren bzw. deaktivieren. Es kann verwendet werden um die Anwesenheit von mehrern Personen im Haushalt zu erkennen. Dabei wird eingeschränkt, dass nur bestimmte Personen die Alarmierung aktivieren können ( Eltern/Kind -Beziehung ). Des Weiteren werden im Beispiel die Eltern benachrichtigt wenn eins der Kinder das Haus verlässt und die Eltern nicht anwesend sind.

Info green.pngNamen der G-Tags in den Skripten bitte anpassen!


Für die Notify und die RESIDENTS-Erweiterung wird ein Dummy benötigt.

define Alarm dummy
attr Alarm devStateIcon aktiv:secur_locked@red inaktiv:secur_open@lightgreen
attr Alarm eventMap on:aktiv off:inaktiv
attr Alarm setList on off
attr Alarm webCmd aktiv:inaktiv
attr Alarm room Alarm


Mit Notify

gtag.*.presence:.* {Anwesenheit_check("$EVTPART1", "$NAME")}

Code für die 99_myUtils.pm

### GTAG ANWESENHEITS CHECK
sub Anwesenheit_check($$) {
my ($EVENT, $NAME) = @_;

# gtag_rot	-	Alias Marco
# gtag_schwarz	-	Alias Ulli
# gtag_gruen	-	Alias Frida
# gtag_orange	-	Alias Hannah

my $RESIDENT = "rr_"; # Alle GTAGs sind Standardmäßig Residents Roommate
# $RESIDENT = "rg_" if (($NAME eq "gtag_orange") xor ($NAME eq "gtag_weis")); # Hier nur Gäste (Roomguest) Auskommentiert, da ich es so nicht brauche
my $ROOMMATE = ("$RESIDENT" . "$NAME"); # Residentsname zusammenbauen
my $ALIASNAME = AttrVal($ROOMMATE,'alias',$ROOMMATE); # ALIAS des Roommates auslesen

my $GTAG1 = Value('gtag_rot'); # ELTERN
my $GTAG2 = Value('gtag_schwarz'); # ELTERN

my $STATUS = "wahrscheinlich gerade los";
$STATUS = "anwesend" if ($EVENT eq "present"); # Status: anwesend
$STATUS = "unterwegs" if ($EVENT eq "absent"); # Status: unterwegs

Log 1, "$ALIASNAME ist $STATUS."; # LOG Eintrag erzeugen

if (($EVENT eq "present" && Value("Alarm") eq "aktiv") && ($NAME eq "gtag_gruen" xor $NAME eq "gtag_orange")) {
 fhem("set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME ist da..."); # Telegram
# fhem("set Infopush msg 'ALARMIERUNG BLEIBT AKTIV' '$ALIASNAME ist da...'"); # Pushover
 }
 elsif (($EVENT eq "present" && Value("Alarm") eq "aktiv") && ($NAME eq "gtag_rot" xor $NAME eq "gtag_schwarz")) {
 fhem("set teleBot send ALARMIERUNG INAKTIV: $ALIASNAME ist da...; set Alarm inaktiv"); # Telegram
# fhem("set Infopush msg 'ALARMIERUNG INAKTIV' '$ALIASNAME ist da...'; set Alarm inaktiv"); # Pushover
 }
 elsif (($EVENT eq "absent" && Value("Alarm") eq "aktiv") && ($NAME eq "gtag_gruen" xor $NAME eq "gtag_orange")) {
 fhem("set teleBot send ALARMIERUNG BLEIBT AKTIV: $ALIASNAME hat das Haus verlassen."); # Telegram
# fhem("set Infopush msg 'ALARMIERUNG BLEIBT AKTIV' '$ALIASNAME hat das Haus verlassen.'"); # Pushover
 } 		
 elsif (($EVENT eq "absent" && Value("Alarm") eq "inaktiv") && ($GTAG1 eq "absent" && $GTAG2 eq "absent")) {
 fhem("set Alarm aktiv; set teleBot send ALARMIERUNG AKTIV: $ALIASNAME hat das Haus verlassen."); # Telegram
# fhem("set Alarm aktiv; set Infopush msg 'ALARMIERUNG AKTIV' '$ALIASNAME hat das Haus verlassen.' '' 0 ''"); # Pushover
 }
}


Mit Notify und Integration des RESIDENTS-MODUL

Der hier beschriebene Code erweitert die Funktionen unter dem Punkt 5.93. Das Notify muss daher mit der folgenden Zeile erweitert werden.

define Alarm_AnwesenheitCheck notify gtag.*.presence:.* { Anwesenheit_check("$EVTPART1", "$NAME"), Anwesenheit_check_resi("$NAME") }

Zusätzlicher Code für die 99_myUtils.pm um die RESIDENTS Funktion nutzen zu können:

### RESIDENTS
sub Anwesenheit_check_resi($) {
my ($NAME) = @_;
my $ALIASNAME = AttrVal($NAME,'alias',$NAME); # ALIASNAME des GTAGs auslesen

my $RESIDENT = "rr_"; # Als Standard sind alle GTAGs Roommates
$RESIDENT = "rg_" if (($NAME eq "gtag_orange") xor ($NAME eq "gtag_weis")); # Hier nur GTAG Namen der Gäste (Roomguest)
my $ROOMMATE = ("$RESIDENT" . "$ALIASNAME"); # Residentsname zusammenbauen

if (ReadingsVal($NAME,'presence',$NAME) eq "absent") {
 fhem("set $ROOMMATE absent"); # Resisents Status von Roommates setzen
 }
 elsif(ReadingsVal($NAME,'presence',$NAME) eq "present") {
 fhem("set $ROOMMATE home"); # Resisents Status von Roommates setzen
 }
}


Mit Notify und Fenster/Tür. -Kontakt Überwachung

Erweiterung für die Überwachung von Fenster/Tür. -Kontakten. Dazu sind zwei weitere Notifys notwendig die auf die Trigger der Kontakte regagieren und so eine weitere Funktion in der 99_myUtils.pm ansprechen. Die Notifys triggern auf Kontakte die mit dem Namen Kontakt* beginnen. Sollten die eigenen Fenster/Tür. -Kontakt anderen Namen besitzen, müssen die Skripte dementsprechend angepasst werden.

define Alarm_Kontaktmeldung notify Kontakt.*:contact:.* {Kontakt_Meldung("$EVTPART1", "$NAME")}
define Alarm_Sabotagealarm notify Kontakt.*.sabotageError:.on {Kontakt_Sabotage("$EVTPART1", "$NAME")}

Zusätzlicher Code für die 99_myUtils.pm um die TÜRKONTAKTE-Meldung nutzen zu können:

### TÜRKONTAKTE-Meldung/Zustand
sub Kontakt_Meldung($$) {
my ($EVENT, $NAME) = @_;
my $ALIASNAME = AttrVal($NAME,'alias',$NAME);
Log 1, "$ALIASNAME wurde $EVENT";
if (ReadingsVal("Alarm", "state", "on") eq "on") {
fhem("set teleBot send $ALIASNAME wurde $EVENT"); # Nachricht über Telegram
# fhem("set Infopush msg '$ALIASNAME' '$ALIASNAME wurde $EVENT'"); # Nachricht über Pushover
	}
}

### TÜRKONTAKTE-Sabotagealarm

sub Kontakt_Sabotage($$) {
my ($EVENT, $NAME) = @_;
my $ALIASNAME = AttrVal($NAME,'alias',$NAME);
Log 1, "$ALIASNAME meldet Sabotagealarm";
fhem("set teleBot send Alarm: $ALIASNAME meldet Sabotagealarm"); # Nachricht über Telegram
# fhem("set Infopush msg 'Alarmanlage' '$ALIASNAME meldet Sabotagealarm' '' 2 ' ' 60 600 "); # Nachricht über Pushover
}


Hinweis zur Benutzung / Fehlerhandling

Der Alarm dummy hat den Zustand on:off. Die Bezeichnungen und Namen müssen 1:1 übernommen werden damit das Script funktioniert. Andernfalls müssen die Bezeichnungen für z.B. absent:unterwegs und present:anwesend - angepasst werden. Die Benachrichtigung kann aktuell per Telegram sowie Pushover (Achtung mit zweiterem sind Abokosten verbunden!) realisiert werden. Diskussion zum Thema im Forum unter: Thema

Problemlösungen

Absent - Grundlos / Zufällig 2022

Zufällige oder Grundlose absent-Meldungen einzelner G-Tags können mit einem FIX behoben werden. Dazu ist es notwendig die BT-Firmware downzugraden.

Auf GIT das .deb Paket herunterladen und auf das jeweiligen System kopieren

wget https://github.com/winterheart/broadcom-bt-firmware/releases/download/v12.0.1.1105_p3/broadcom-bt-firmware-10.1.0.1115.deb

Anschliessend installieren und das System neu starten.

sudo dpkg -i broadcom-bt-firmware-10.1.0.1115.deb
Info green.pngDieser FIX scheint nicht bei jedem zu funktionieren! Es gibt auch System die Problemlos ohne FIX arbeiten. Bei einem Update/Upgrade des RPI muss der FIX - wenn notwendig - wieder erneut installiert werden.


Danach sollten die Tags wieder Problemlos erkannt werden und nicht nach wenigen Tagen wieder auf "absent" stehen.

Falls es Probleme beim Starten des Skripts gibt bzw. man das Skript ohne Reboot des Systems neustarten möchte, kann man dies per kill Befehl erledigen.

Das Thema wurde u.a in diesem Beitrag beschrieben.

ps -ef | grep lepresenced
sudo kill <pid>

Debuglevel lepresenced setzen:

Info green.pngUm Debug-Meldungen zu bekommen (Vorsicht bei SD-Karten-Systemen wie dem RPi) - Hierbei werden die Schreibzyklen auf die SD-Karte erhöht.


Der Log Level muss im lepresenced-Skript selbst verändert werden. Um den Log-Level auf INFO/WARNING/DEBUG zu setzen, das Skript lepresenced mit einem Editor öffnen und die Stellen, wo LOG_WARNING zu finden ist, durch den nötigen LOG-Eintrag ersetzen.

lepresenced --loglevel LOG_DEBUG

Nur das wichtigste Loggen:

lepresenced --loglevel LOG_WARNING

Keinerlei LOG-Einträge

lepresenced --loglevel LOG_EMERG

Bei Problemen mit der Batterieüberwachung der Tags kann die Pi Firmware mit folgenden Befehl auf eine ältere Version zurückgesetzt werden. Fehlermeldung beim Aufruf des lebattery oder anderen Batterietestskripten:

connect: Connection refused (111)

Lösung (vorübergehend)

sudo rpi-update 8521fd34c8f66b6d109acce943f6e25ec93ec005

Mehr dazu unter: Beitrag

Das BT-Device ist ständig "absent"
Eine Mögliche Lösung kann sein, das Paket bluez-hcidump zu installieren. Das Werkzeug hcidump erlaubt die Beobachtung von Bluetooth-Aktivitäten. Dies ist nicht notwendig, wenn bereits bluez installiert ist, da dies Teil des bluez Paketes ist

sudo apt-get install bluez-hcidump

Fehler in Logdateien /var/log/syslog und /var/log/kernel

Jul 29 15:08:11 raspberrypi kernel: [ 4905.634211] bt_err_ratelimited: 1 callbacks suppressed
Jul 29 15:08:11 raspberrypi kernel: [ 4905.634231] Bluetooth: hci0 advertising data length corrected
Jul 29 15:08:12 raspberrypi kernel: [ 4906.647350] Bluetooth: hci0 advertising data length corrected
Jul 29 15:08:13 raspberrypi kernel: [ 4907.532081] Bluetooth: hci0 advertising data length corrected
Jul 29 15:08:13 raspberrypi kernel: [ 4907.655564] Bluetooth: hci0 advertising data length corrected


Die Ursache des Problems ist noch nicht ergründet, allerdings betrifft dies aktuell nur den RPi3. Die Fehlermeldungen werden in verschiedene Logs geschrieben. Darunter maßgeblich "syslog" und "kern.log".

Lösung (vorübergehend): Unterbinden der Einträge durch Anlage eines blocklist Eintrag:

1. Unter "/etc/rsyslog.d" eine Datei erzeugen mit dem Namen "01-blocklist.conf"
2. Inhalt: (Die Ausdrücke in den "" sind diejenigen, die aus dem log verschwinden sollen. - bei mir waren es die untenstehenden")
   :msg,contains,"Bluetooth: hci0 advertising data length corrected" stop
   :msg,contains,"bt_err_ratelimited:" stop
3. Dienst neu starten "sudo service rsyslog restart"

Weiter Infos werden im offiziellen Thema hier diskutiert.

Seit Version 0.82 kann es beim Start zu folgenden Meldungen im Log kommen.

Sep 06 16:13:45 raspberrypi systemd[1]: Started lepresenced.
Sep 06 16:13:45 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: Received 'Set scan parameters failed: Input/output error', ...tting...
Sep 06 16:13:46 raspberrypi lepresenced[16010]: [tid:1] main::bluetooth_scan_thread: hcitool exited, retrying...

Diese Meldungen können ignoriert werden. Abhilfe schafft sich lepresenced selbst, indem es sich resettet.

Moderne iPhones und Android Geräte wechseln in den Schlaf-Modus, um Energie zu sparen. Somit sind die Geräte zur Anwesenheitserkennung nicht per Ping zu erreichen. Durch das Programm hping3, lassen sich zyklisch Pakete an die Geräte senden, um sie wieder "aufzuwecken".

Mehr im Forum [2]

Versionsänderungen lepresenced

--Version 0.81 (BasisVersion)
--Version 0.82 (stable  08/2017)
  -Neue Kommandozeilenoption "--debug": Startet lepresenced im Vordergrund und gibt ausführliche Debug-Informationen auf STDOUT aus.
  -Sanity Check: lepresenced prüft beim Starten die Verfügbarkeit von hciconfig, hcitool und hcidump.
  -Model: lepresenced übermittelt das Reading model nun als lan-lepresenced. Das erlaubt die Erkennung von lepresenced in der FHEM-Statistik (sofern aktiviert).
--Version 0.83 (stable  09/2017)
  - Behebung von Systemstart Fehlern
  - Weitere Debug-Möglichkeiten. U. a. wird nun mitgezählt, ob hcitool lescan ("legacy") und hcidump eine identische Zahl an Beacons empfangen

Ansprechpartner

  1. markusbloch (Markus) für das PRESENCE-Modul und collectord
  2. PatrikR (Patrick) für lepresenced
  3. Devender (Dirk ) für Wiki und Doku