Möglichkeiten  zur Anwesenheitserkennung gibt in openHab viele. Ich habe es mit dem Network Binding und über Geolocation mit IFTTT versucht. Beide Varianten waren leider nicht so zuverlässig wie ich mir das gewünscht habe. Eine neue Lösung musste her. In meinem Fall bin ich immer dann anwesend, wenn mein Auto in der Garage steht und umgekehrt. Da liegt es nahe die Anwesenheit in Abhängigkeit vom Auto in der Garage zu schalten.

Ein Ultraschallsensor bietet die perfekte Lösung. An der Wand der Garage installiert, misst der Sensor den Abstand zum nächsten Hindernis. Steht das Auto in der Garage ist der Abstand sehr gering. Für den Sensor kommt ein NodeMCU (ESP8266) und der Ultraschallsensor RCW-0001 zum Einsatz. Die Artikelliste:

 

Ultraschallsensor RCW-0001, 3,3Volt

 

 

 

Vorbereitung für Anwesenheitserkennung

Zunächst einmal muss der NodeMCU per USB mit dem Computer verbunden und für die Programmierung vorbereitete werden. Wie das im einzelnen funktioniert werde ich an dieser Stelle ausklammern und verweise auf eine super Anleitung von OpenDataLab, die auch mir sehr geholfen hat. Sobald das erledigt ist, kann der Sensor an das Board angeschlossen werden. Um einen ersten schnellen (fliegenden) Aufbau zu bewerkstelligen, kann entweder eine Steckplatine genutzt werden, oder Female Jumper Kabel. Beides ist in der Artikelliste oben aufgeführt. Die Pins werden folgendermaßen miteinander verbunden:

Pin Belegung NodeMCU Ultraschall Sensor

Pin Belegung NodeMCU Ultraschall Sensor

Programmierung NodeMCU

Um die Daten vom Sensor auslesen und an openHAB übertragen zu können, muss der NodeMCU entsprechend programmiert werden. Zur Übertragung an openHAB nutzen wir das MQTT Protokoll. Für openHAB gibt es ein passendes MQTT Binding. Als Broker kann ein openMQTT Dienst wie http://broker.mqtt-dashboard.com genutzt werden.

Benötigte Bibliotheken

Für dieses Projekt benötigen wir folgende Bibliotheken einige Bibliotheken, die, sofern noch nicht geschehen, installiert werden müssen. Das wird im Menü Sketch – Bibilothek einbinden – Bibliotheken verwalten. Es öffnet sich der Bibliotheksverwalter. Hier über die Suche die folgenden Bibliotheken suchen und installieren:

  • ESP8266WiFi
  • PubSubClient

Der Abstandssensor hat folgenden Code:

Die Werte für SSID und Password müssen durch die eigenen Netzwerkdaten ersetzt werden. Sollte ein eigener MQTT Broker im Einsatz sein, ist auch die entsprechende Adresse bei mqtt_server einzutragen. Solange keine sensiblen Daten übertragen werden, kann auch durchaus auf einen openMQTT Service zurückgegriffen werden. In diesem Fall muss nichts geändert werden. Wichtig: Der NodeMCU unterstützt nur das 2,4 GHz Band.

Noch einmal alle anpassbaren Parameter zusammengefasst:

const char* ssid = „XXXXXXXXXX“; //Eigenen Netzwerknamen eintragen
const char* password = „XXXXXXXX“; //Passwort Netzwerk eingeben
const char* mqtt_server = „broker.hivemq.com“; //MQTT Broker eintragen, bzw. hivemq nutzen.

client.publish(„Haus/EG/Garage/Sensor/Abstand“, messagedistance); // Topic vergeben in diesem Bereich “ „. Sinnvoll nach Räumen und Funktion benennen.

Funktion testen

Bevor der Sensor in openHab eingebunden wird, ist es sinnvoll zu testen ob die Werte korrekt zum Broker übertragen werden. So können Fehler direkt an der Quelle ausgeschlossen werden. Hierzu nutze ich den kostenlosen MQTT Client MQTT.fx Damit kannst du beim Broker, in unserem Fall broker.hivemq.com, das Topic abonnieren (Subscribe) und schauen ob die Werte ankommen.

mqtt.fx mit Broker verbinden

mqtt.fx mit Broker verbinden

In der Adressleiste des Clients wird die Adresse des Brokers eingetragen. Der Port ist bereits ausgefüllt. Mit Connect wird die Verbindung aufgebaut.

Subscribe to topic MQTT.fx

Subscribe to topic MQTT.fx

Im nächsten Schritt wird Subscribe ausgewählt und die darunterliegende Leiste das Topic eingetragen. Hier Haus/EG/Garage/Sensor/Abstand. Mit Enter bestätigen. Die Daten werden vom Sensor im 15 Sekunden Takt übertragen. Nach spätestens 15 Sekunden sollte der erste Wert auftauchen. Wenn das funktioniert, kann der Sensor in openHAB integriert werden.

Items in openHAB anlegen

Sofern das MQTT Binding installiert ist, muss jetzt noch ein entsprechendes Item angelegt werden, das die Abstandswerte liest. Wie das MQTT Binding installiert und eingerichtet wird, kannst du hier nachlesen. Hierzu legst du am besten eine neue .items Datei mit dem Namen mqtt.items an. So behältst du die Übersicht wo sich deine Items befinden.

Aufgeschlüsselt steht in diesem Item: Es ist eine Nummer (Number) mit dem Namen Abstand_Garage, der Bezeichnung „Abstand [%s]“ ([%s] zeigt den String Wert an, also den Abstand, den der Sensor liefert) und als Quelle fungiert mqtt. Bitte beachte, dass die mqtt Adresse abweichen kann. Ich habe meinen Broker in der mqtt.cfg mosquitto genannt, daher mosquitto:.

Anwesenheitserkennung in Sitemap und Rules

In erster Linie möchten wir ja über diesen Wert definieren wann jemand zu Hause ist. Dafür benötigen wir einen Dummy Switch und eine Regel. Den Dummy Switch kannst du direkt in die mqtt.rules packen.

In der Regel legen wir fest wann die Anwesenheit auf AN oder AUS schalten soll. Die einfachste Version der Regel sieht dann so aus:

Die Regel besagt:

Wenn das Item Abstand_Garage einen neuen Wert bekommt
Sofern der Wert kleiner 60 ist und mein Schalter „Anwesenheit“ AUS ist –> Schalte Anwesenheit AN
Sofern der Wert größer 200 ist und mein Schalter „Anwesenheit“ AN ist –> Schalte Anwesenheit AUS

Die zusätzliche Prüfung des aktuellen Status von Anwesenheit bewirkt, dass nicht bei jedem Updates des Abstandswertes (alle 15 Sekunden) ein Kommando in Richtung Anwesenheit geschickt wird. Es würde sich zwar der der Status des Schalters nicht immer zwingend ändern, aber dennoch verursacht es unnötige Zeilen im Log 😉

Nun kommt es bei mir in der Garage ab und zu zu einem Lesefehler des Sensors. Immer nur, wenn die Garage leer ist. Ich vermute Schall „Querschläger“, die ein Hindernis vorgaukeln (Achtung: gefährliches Halbwissen! 😀 ) Das hatte zur Folge, dass trotz Abwesenheit der Abstand unter 60 gefallen ist und somit die Anwesenheit inklusive aller dazugehöriger Aktionen (Licht schalten, etc.) ausgelöst hat. Das wollte ich umgehen. Die Idee: Ich baue einen Zähler ein. Der Schwellwert muss mindestens 3x in Folge erreicht werden, bevor die Anwesenheit den Status ändert. An dieser Stelle möchte ich mich bei udo1toni aus dem KNX User Forum bedanken, der mir mit dem Zähler auf die Sprünge geholfen hat.

Hier passiert zusätzlich zur oben genannten Variante Folgendes:

Wenn der Abstand_Garage < 60 und der Counter <  3 ist, dann zähle beim Counter +1
Wenn der Abstand_Garage > 200 und der Counter > 0 ist, dann zähle beim Counter -1
Erst wenn der Counter 3 erreicht hat, schalte Anwesenheit AN
Erst wenn der Counter 0 erreicht hat, schalte Anwesenheit AUS

Ist man also tatsächlich abwesend ist der Counter dauerhaft auf 0. Kommt es zu einem Lesefehler wird +1 addiert. Der Counter steht bei 1. Es wird noch keine Aktion ausgelöst. Ist der Wert beim nächsten Update wieder hoch genug wird wieder 1 abgezogen und der Counter steht wieder auf 0.

Jetzt ist die Regel zur Anwesenheitserkennung fertig. Jetzt heißt es das Ergebnis noch in der Sitemap anzuzeigen.

Bei der Frage Anwesend oder nicht passe ON oder OFF nicht wirklich. Daher kannst du im Ordner transform eine Datei mit dem Namen anwesend.map und folgendem Inhalt anlegen:

Zusätzlich habe ich mit valuecolor=[==ON=“#008000″, ==OFF=“red“] dem jeweiligen Status noch eine Farbe gegeben. Das Ergebnis kann sich sehen lassen.

Anwesenheitserkennung Sitemap openHAB

Anwesenheitserkennung Sitemap openHAB

Jetzt kannst du noch weitere Aktion in Abhängigkeit der Anwesenheit schalten. Ich schalte das Flurlicht im Eingang bei Anwesenheit für 4 Minuten, wenn es draußen bereits dunkel ist. So komme ich immer in ein beleuchtetes Haus.

Hier noch einige Bilder der Eigenkonstruktion. Das Gehäuse ist selbst gedruckt. Die Vorlage zum Druck findest du hier.

Ultraschallsensor mit selbstgedrucktem Gehäuse

Ultraschallsensor mit selbstgedrucktem Gehäuse

Ultraschallsensor mit selbstgedrucktem Gehäuse

Ultraschallsensor mit selbstgedrucktem Gehäuse