FHEM Tutorial-Reihe - Part 15: Anwesenheit mit Bluetooth LE Tag ermitteln
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
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:
- 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.
- 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.