FHEM Tutorial-Reihe - Part 15: Anwesenheit mit Bluetooth LE Tag ermitteln

Mit ** gekennzeichne Links auf dieser Seite sind Affiliatelinks.

Hiermit erscheint für mich ein lang ersehntes Video, in welchem ich euch endlich zeigen kann, wie ich meine Anwesenheitserkennung realisiert habe. Dazu kam ein Bluetooth LE-Tag des Herstellers Gigaset zum Einsatz, welcher von meinem Raspberry Pi der dritten Generation (Bluetooth an Board) erkannt wird. Bin ich zu Hause, wechselt ein Gerät nach wenigen Sekunden auf "anwesend" und ich kann entsprechende Aktionen ausführen.

Video

FHEM-Kurs

Befehle

Optional: Pakete auf den aktuellsten Stand bringen

sudo apt-get update
sudo apt-get upgrade

Optional: Firmware-Update

cd
sudo wget https://raw.github.com/Hexxeh/rpi-update/master/rpi-update -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update
sudo rpi-update
sudo reboot

Notwendige Pakete installieren

sudo apt-get install bluetooth bluez-hcidump bluez blueman
sudo reboot
hcitool dev
sudo service bluetooth status
hcitool scan
Scanning ...
    E0:C7:67:DA:CC:DA    klein0rs-iPhone
sudo hcitool lescan
-> Adresse aufschreiben. z.B. 7C:2F:80:AB:F8:D6
sudo vi /opt/fhem/lescan.sh
#!/bin/bash
filename=/tmp/bluetooth_devices.$$
hcitool lescan > $filename & sleep 10
pkill --signal SIGINT hcitool
sleep 1
searchresult=$(grep -c $1 $filename)
if [ $searchresult -gt 0 ]; then
        echo 1
else
        echo 0
fi
rm $filename
sudo chown fhem:dialout /opt/fhem/lescan.sh
sudo chmod +x /opt/fhem/lescan.sh
sudo su - fhem
sudo bash /opt/fhem/lescan.sh 7C:2F:80:AB:F8:D6
-> Fehler, da keine Berechtigung

Unter Raspbian Stretch macht macht das nicht mehr mit visudo! Bitte Update weiter unten beachten

sudo visudo
fhem ALL=(ALL) NOPASSWD: /opt/fhem/lescan.sh
sudo su - fhem
sudo /opt/fhem/lescan.sh 7C:2F:80:AB:F8:D6
-> Klappt, weil jetzt die Berechtigungen vorliegen
define BluetoothAnwesend PRESENCE function {`sudo /opt/fhem/lescan.sh 7C:2F:80:AB:F8:D6`}

Beispiel-Notify:

BluetoothAnwesend:presence.* {
    if ($EVTPART1 eq "present") {
        fhem("set WEB_Pushover msg 'Anwesenheit' 'anwesend'");
    } elsif ($EVTPART1 eq "absent") {
        fhem("set WEB_Pushover msg 'Anwesenheit' 'abwesend'");
    }
}

Neuere Debian-Distributionen

Seit Raspbian Stretch trägt man die Rechte für einzelne Benutzer nicht mehr direkt per visudo in die Datei ein. Vielmehr erstellt man (wie so oft) eine neue Datei für jeden Benutzer in einem bestimmten Verzeichnis. All diese Dateien werden dann automatisch geladen und entsprechend interpretiert. So hat man eine etwas sauberere Struktur geschaffen.

Die Datei könnte also wie folgt heißen:

sudo vi /etc/sudoers.d/020_fhem-nopasswd

Diese bekommt dann den Inhalt:

fhem ALL=(ALL) NOPASSWD: /opt/fhem/lescan.sh

Der Rest verhält sich genauso.

Umgang mit mehreren G-Tags

Ich habe diesen Beitrag geschrieben, als ich nur einen einzelnen Tag im Einsatz hatte. Das funktioniert auch wunderbar. Leider können gleichzeitig nicht von mehreren Presence-Devices die Scans angestoßen werden. Würde auch nicht so viel Sinn machen, da das ja viel zu viel Performance brauchen würde.

Daher muss man die Logik etwas umbauen. Ich habe es in zwei Schritte unterteilt:

  1. Ein Cronjob läuft jede Minute und scannt nach Geräten in der Umgebung. Genau wie vorher, nur dass das Ergebnis in eine Datei geschrieben wird.
  2. Alle Presence-Geräte schauen dann einfach in der Datei nach, ob das gesuchte Gerät darin enthalten ist. Dadurch läuft die Funktion auch wesentlich schneller durch, da ja nur ein grep ausgeführt werden muss.
sudo vi /opt/fhem/lecron.sh

Inhalt der Datei ist folgender:

#!/bin/bash

tmpfilename=/opt/fhem/log/bluetooth_devices.$$
filename=/opt/fhem/log/bluetooth_devices

hcitool lescan > $tmpfilename & sleep 10
pkill --signal SIGINT hcitool

rm $filename
mv $tmpfilename $filename

chmod o+r $filename

Diesen Cronjob muss man dann natürlich entweder als root ausführen lassen (/etc/crontab). Dann gehört die Zieldatei natürlich root und man muss weiterhin den Teil mit den sudoers (siehe oben) erledigen. Ansonsten bekommt man Zugriffsprobleme. Außer, man sorgt dafür, dass die Datei "bluetooth_devices" dem fhem-user gehört oder alle im System diese lesen dürfen. Dann kommt man auch ohne sudo aus (was sicherlich der schönere Weg wäre).

sudo vi /etc/crontab

* * * * * root bash /opt/fhem/lecron.sh

Durch diese Methode ist ebenfalls vorgesehen, dass die Datei zu keinem Zeitpunkt leer ist. Es wird also erst gescannt und dann die Datei ausgetauscht, in welcher die nachfolgenden Presence-Geräte nachschauen.

sudo vi /opt/fhem/lescan.sh
#!/bin/bash

filename=/opt/fhem/log/bluetooth_devices
searchresult=$(grep -c $1 $filename)
if [ $searchresult -gt 0 ]; then
    echo 1
else
    echo 0
fi

Hier wird nun geschaut, ob das Gerät auch gefunden wird und eine 1 zurückgegeben, wenn das Ergebnis größer als 0 ist. Das geht bestimmt auch wesentlich kürzer, aber ich bin nicht der Beste in Bash-Scripts. Der Rest funktioniert in FHEM dann ganz genauso, da einfach der Parameter genommen wird wie bisher.


Newsletter

Trage Dich jetzt in den Newsletter ein und genieße dadurch viele Vorteile:

  • 5€-Gutschein als Dankeschön
  • Zugang zu exklusiven Inhalten
  • Rabattaktionen für Kurse
  • Angebote für Produkte

* Durch Angabe meiner E-Mail-Adresse erkläre ich mich damit einverstanden, dass mir regelmäßig Informationen und Produktempfehlungen aus dem Fachgebiet Smart Home zugesendet werden. Mit dem Eintrag akzeptieren Sie unsere Datenschutzbestimmungen. Meine Einwilligung kann ich jederzeit widerrufen.

Matthias Kleine

Matthias Kleine

Großer Fan und Anhänger von OpenSource-Projekten und erweiterbaren Haus-Automatisierungskomponenten. Je offener und flexibler das System, desto besser. Ich lege mich ungern auf einzelne Protokolle oder Standards fest, sondern probiere aus allen Welten das Beste zu verheiraten. Unterwegs als Softwareentwickler, Trainer und Blogger im Bereich Smart Home.

Auf YouTube und hier im Blog gibt es bereits unzählige kostenlose Videos, Informationen und Tutorials. Wenn Dir das noch nicht reicht, ist ein Training genau das richtige für Dich! Die folgenden Trainings haben den Vorteil, dass immer von Anfang an gestartet wird und Du ohne Vorwissen teilnehmen kannst.