openHAB :: Präsenzerkennung via Bluetooth und Ping

34In vielen denkbaren Szenarien macht es Sinn, dass unsere openHAB-Instanz weiß, dass jemand zuhause ist und vielleicht auch wer im Einzelnen. Denkbar wäre das Einschalten von bestimmten Geräten nach einer Heimkehr eines Bewohners. Zudem können nicht benötigte Geräte ausgeschaltet werden, wenn niemand anwesend ist und diese somit nicht unnötig Strom verbrauchen. In diesem Artikel zeigen wir, wie wir die Präsenz eines Bewohners mittels WLAN und Bluetooth ermitteln und situationsabhängig Schaltungen durchführen können.

 

Verfügbare Artikel zu openHAB

little_blue_dot Einleitunglittle_blue_dot Einbinden der Internetgeschwindigkeitlittle_blue_dot RFID-Lesegerät einbinden
little_blue_dot Installationlittle_blue_dot Präsenzerkennung via Bluetooth und Pinglittle_blue_dot Einbinden von DS18B20-Sensoren
little_blue_dot Konfigurationlittle_blue_dot Kleines Netzwerkmonitoringlittle_blue_dot ical-Abfallkalender einbinden
little_blue_dot Reverse-Proxy für OpenHABlittle_blue_dot Einbinden von LG-Fernsehern [Update]little_blue_dot openHAB als Wecker
little_blue_dot Datenspeicherung und Statistikenlittle_blue_dot Einbinden Schaltern und Kontaktenlittle_blue_dot Einbinden von Bewegungssensoren
little_blue_dot Regeln planen und konfigurierenlittle_blue_dot Einbinden von Funksteckdosen (433 MHz)little_blue_dot Einbinden einer FritzBox
little_blue_dot Einbinden von USB-Steckdosenleisten (SIS-PMS)little_blue_dot Infrarotgesteuerte Geräte einbindenlittle_blue_dot Sprachausgabe auf einem Raspberry
little_blue_dot Einbinden von Temperatursensorenlittle_blue_dot Steuerung mit NFC-Tagslittle_blue_dot Schaltbare Steckdosenleiste mit Relais
little_blue_dot Externer Zugriff mit my.openhab

 

 

 

Präsenzerkennung mittels Bluetooth

Einrichtung auf dem Raspberry Pi

Auf unserem Raspberry Pi, welcher mit der IP-Adresse „192.168.23.235“ konfiguriert wurde, haben wir zunächst alle Schritte aus dieser Anleitung ausgeführt und sind in der Lage, lokal vom Raspberry Pi aus Bluetooth Endgeräte mittels L2-Ping zu erreichen. Alternativ kann der Bluetooth-Stick auch am openHAB-Server selbst betrieben werden, wenn bei diesem ein Anschließen von USB-Geräten möglich ist.

Ist der Betrieb des Bluetooth-Adapters sichergestellt, erstellen wir nun auf dem Raspberry ein Bash-Script mit folgendem Inhalt:

#!/bin/bash

#1=Daniel, 2=Tina
case $1 in
   1) MAC="33:44:55:66:77:88" ;;
   2) MAC="11:22:33:44:55:66" ;;
esac

if /usr/bin/l2ping -c 1 $MAC &> /dev/null
   then
      echo "ON"
   else
      echo "OFF"
fi

Das Script könnte nun bereits auf dem Raspberry per Hand gestartet werden. Dazu müssen lediglich zuvor alle notwendigen Bluetooth-MAC-Adressen im Script hinterlegt und die zu prüfende Nummer als Parameter beim Starten des Scripts übergeben werden. Als Beispiel möchte ich die Präsenz von Tinas Mobilfunktelefon feststellen:

/scripts/bt.sh 2

 

48

 

Hier scheint wohl entweder:

  • Tina nicht zuhause zu sein
  • Auf Tinas Mobilfunktelefon ist Bluetooth nicht aktiviert
  • Beim Einrichten gemäß dieser Anleitung ist etwas schief gelaufen

 

Einrichtung auf dem openHAB-Server

Wie auch bei vielen anderen hier zu findenden openHAB-Anleitungen benötigen wir hierbei jeweils ein Script auf dem Raspberry sowie auch auf dem openHAB-Server. Das erstere wurde an diesem Punkt der Anleitung bereits umgesetzt, widmen wir uns also dem Bash-Script auf dem Server. Dies gestaltet sich etwas weniger umfangreich mit folgenden Zeilen des neuen Scripts „/scripts/bt.sh„:

#!/bin/bash
/usr/bin/ssh -i /scripts/.ssh/id_rsa root@192.168.23.235 "/scripts/bt.sh $1"

 

Wir erlauben die Ausführung des Scripts durch

chmod +x /scripts/bt.sh

und übertragen den Besitz an „openhab“ durch

chown openhab: /scripts/bt.sh

 

Dieses Script bewirkt nur, dass das Script auf der Himbeere remote via SSH ausgeführt wird. Ein Test vom openHAB-Server aus sollte das gleiche Ergebnis wie auf dem Raspberry selbst liefern:

/scripts/bt.sh 2

 

 

49

 

 

Das Item definieren

Nun erstellen wir für die beiden Smartphones unseres Beispielszenarios zwei entsprechende Item-Definitionen in der passenden Konfigurationsdatei von openHAB:

//Mobilfunktelefone
Switch MOB188_BT "Handy Daniel" (grp_PRAESENZ) { exec="<[/scripts/bt.sh 1:60000:REGEX((.*?))]" }
Switch MOB137_BT "Handy Tina" (grp_PRAESENZ) { exec="<[/scripts/bt.sh 2:60000:REGEX((.*?))]" }

 

Auch in diesem Fall nutzen wir erneut das Addon „exec„, welches wir mittels

apt-get install openhab-addon-binding-exec

installieren.

 

Integration in die Sitemap

Anschließend können diese Items bereits in die Sitemap eingefügt werden:

Frame label="Mobilfunktelefone" icon="network" {
   Text item=MOB188_BT label="Handy Daniel [MAP(praesenz.map):%s]" icon="present"
   Text item=MOB137_BT label="Handy Tina [MAP(praesenz.map):%s]" icon="present"
}

 

Das hier konfigurierten Symbole „present“ und „network“ müssen ebenfalls zuvor bereitgestellt werden, indem sie in den Ordner „/usr/share/openhab/webapps/images/“ kopiert werden. Die Einbindung an dieser Stelle macht jedoch noch wenig Sinn, am Ende des Artikels wird die Einbindung einer Präsenzerkennung gezeigt, die jedes Gerät auf mehrfache Arten auf eine Anwesenheit prüft.

 

Ausgabe übersetzen

Die dazugehörige Übersetzungsdatei „praesenz.map“ umfasst folgenden Inhalt:

ON=Anwesend
OFF=Abwesend
undefined=unbekannt
-=unbekannt

 

 

Präsenzerkennung mittels WLAN

Die Network-Health Items definieren

Update
Leider gibt es zur Zeit Probleme bei der Art und Weise, wie Java als nicht priviligierter Benutzer die Erreichbarkeit via TCP/IP prüft.
Daher nutzen wir in dieser Anleitung nicht das Addon „network-health„, was naheliegend wäre, sondern erstellen ein eigenes Script.

 

Für die Prüfung der Erreichbarkeit eines Netzwerkteilnehmers erstellen wir uns ein neues, kleines Bash-Script: „/scripts/ping.sh

#!/bin/bash
if [ -z "$1" ] ;then
    echo "So geht das nicht"
    exit 1;
fi

ping -c1 $1 > /dev/null

if [ $? -ne 0 ]; then
        echo "OFF"
else
        echo "ON"
fi

 

Wir erlauben die Ausführung des Scripts durch

chmod +x /scripts/ping.sh

und übertragen den Besitz an „openhab“ durch

chown openhab: /scripts/ping.sh

 

Nun definieren wir die entsprechenden Items wie folgt:

Switch MOB188_WLAN "Handy Daniel" (grpAW_PRAESENZ) { exec="<[/scripts/ping.sh 192.168.1.188:60000:REGEX((.*?))]" }
Switch MOB137_WLAN "Handy Tina" (grpAW_PRAESENZ) { exec="<[/scripts/ping.sh 192.168.1.137:60000:REGEX((.*?))]" }

 

Kombinierte Präsenzerkennung

Nun sind wir an einem Punkt angelangt, an dem wir feststellen können, ob ein Smartphone via Bluetooth oder WLAN erreichbar ist. Jetzt wäre es aber sinnvoll, diese beiden Informationen für jedes Gerät zu kombinieren, um mit zwei Methoden die Präsenz eines Geräts festzustellen. Dazu führen wir die beiden Werte in ein neues Item zusammen.

 

Dummy-Item definieren

Dazu benötigen wir zunächst ein sogenanntes Dummy-Item, das nur innerhalb von openHAB existiert und von außen weder geschaltet noch dessen Wert verändert wird:

//Mobilfunktelefone
Switch MOB188 "Handy Daniel"
Switch MOB137 "Handy Tina"

Doch wenn nicht durch eine Änderung eines externen Zustandes, wie kann dieses Item nun „geschaltet“ werden?

 

Zusammenführende Regeln erstellen

Dazu erstellen wir uns Regeln, die beispielsweise das Item „MOB188“ auf „ON“ setzen, wenn entweder das Item „MOB188_WLAN“ oder „MOB188_BT“ aktiv ist. Anders ausgedrückt reicht es, wenn das Smartphone entweder per WLAN oder Bluetooth erreichbar ist. Dann wird das Dummy-Item „MOB188“ ebenfalls auf „ON“ gesetzt. Andersherum wird das Item „MOB188“ auf „OFF“ gesetzt wenn das Smartphone weder per WLAN noch via Bluetooth erreicht werden konnte.

rule "Daniel ist Zuhause"
   when
      Item MOB188_WLAN changed to ON or
      Item MOB188_BT changed to ON
   then
      postUpdate(MOB188, ON)
end

rule "Daniel ist nicht mehr Zuhause"
   when
      Item MOB188_WLAN changed to OFF or
      Item MOB188_BT changed to OFF
   then
      if(MOB188_WLAN.state == OFF && MOB188_BT.state == OFF) {
         postUpdate(MOB188, OFF)
      }
end

 

Noch mehr kombinieren

Dieser Schritt lässt sich natürlich wiederholen und es sind Verschachtelungen in unendlicher Tiefe möglich, zumindest so tief, wie man es selbst noch überblicken kann:

rule "Irgendjemand ist zuhause"
   when
      Item MOB188 changed to ON or
      Item MOB137 changed to ON
   then
      postUpdate(PRAESENZ, ON)
      sendCommand(SPRINGBRUNNEN, ON)
end

rule "Niemand ist mehr zuhause"
   when
      Item MOB188 changed to OFF or
      Item MOB137 changed to OFF
   then
      if(MOB188.state == OFF && MOB137.state == OFF) {
      postUpdate(PRAESENZ, OFF)
      sendCommand(SPRINGBRUNNEN, OFF)
      }
end

In diesem Beispiel wurde zuvor ein weiteres Dummy-Item definiert:

Switch PRAESENZ

 

Diese beiden Regeln aktualisieren das Item „PRAESENZ“ je nach dem, ob eins der beiden vorhandenen Mobilfunktelefone anwesend ist oder nicht. Zudem wird bei einer festgestellten Präsenz einer der beiden beispielhaften Personen der Springbrunnen ein- und bei Abwesenheit aller Personen wieder ausgeschaltet.

 

Darstellung in der Sitemap

Die beiden Mobilfunktelefone dieser Anleitung binden wir nun in Form der kombinierten Präsenzermittlung wie folgt in die Sitemap ein:

Frame label="Mobilfunktelefone" icon="network" {
   Text item=MOB188 label="Handy Daniel [MAP(praesenz.map):%s]" icon="present"
   Text item=MOB137 label="Handy Tina [MAP(praesenz.map):%s]" icon="present"
}

 

Dies wird nun so oder so ähnlich dargestellt:

 

50