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

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

Achtung: Dieser Inhalt ist nicht mehr aktuell! Es ist nicht empfohlen nach dieser Anleitung vorzugehen.
FHEM Tutorial-Reihe - Part 15: Anwesenheit mit Bluetooth LE Tag ermitteln
FHEM Tutorial-Reihe - Part 15: Anwesenheit mit Bluetooth LE Tag ermitteln
  • 02.08.2016
  • Veraltet!
  • Hardware
  • Anwesenheit

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

ioBroker-Kurs

Gigaset G-tag Beacon mit Appfunktion - Bluetooth Schlüsselfinder zum einfachen Auffinden von Schlüssel, Taschen, Koffern, Handys - Key Tracker - schwarz **

Gigaset G-tag Beacon im Set mit Appfunktion - Bluetooth Schlüsselfinder zum einfachen Auffinden von Schlüssel, Taschen, Koffern, Handys - Key Tracker – 5 Stück rot, orange, grün, schwarz, weiß **

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.

Du willst mehr?

Smart-Home-Trainings von A-Z

Steig' noch tiefer in die Themen ein und meistere Deine Projekte! Über 14.000 Teilnehmer konnten sich schon von der Qualität der Online-Kurse überzeugen.

ioBroker-Master-Kurs

ioBroker-Master-Kurs

Mehr Infos
Hausbau-Kurs

Hausbau mit KNX

Mehr Infos
Lox-Kurs

Lox-Kurs

Mehr Infos
Node-RED-Master-Kurs

Node-RED-Master-Kurs

Mehr Infos