Smarthome-Update

Über das Thema „Smarthome“ muss ich demnächst mal einen längeren Beitrag verfassen und hier posten. Kurz gesagt, im letzten Jahr hat sich an der Stelle sehr viel bei uns im Haus getan. Angefangen hat es ja damals, abgesehen von der RWE-Smarthome-Lösung die nicht wirklich SMART ist, mit ein paar 1-Wire-Sensoren und FHEM.

Mittlerweile ist die Migration nach openHAB beendet und alle möglichen Sensoren, Aktoren, usw. sind miteinander über openHAB und die entsprechenden Bindings vernetzt und verbunden.

Aktuell, und weil ich danach gefragt worden bin, möchte ich an der Stelle mal unsere Anwesenheitserkennung auf Basis von openHAB vorstellen.
Das Projekt selbst, ist hier zu finden: https://github.com/jschanz/openhab-presence

Vorab sei vielleicht folgendes noch gesagt. Ich habe bei der Recherche zum Thema Anwesenheitsprüfung mit openHAB oder presence detection mit openHAB unzählige Anleitungen, Vorschläge, etc gefunden. Leider hat keine der vorgeschlagenen Lösungen bei mir fehlerfrei funktioniert. Von daher habe ich mir die Mühe gemacht und auf Basis von unseren Anforderungen eine Lösung gebastelt.
Die vorgestellte Lösung nutzt das networkhealth-binding von openHAB. Es werden keine gesonderten Hacks für Fritz!Box, TP-Link, Netgear, etc. verwendet. Alles basiert auf ICMP, wenn openHAB mit Root-Rechten läuft. Wenn nicht, wird ein TCP-Connect auf Port 7 durchgeführt. Das führt manchmal zu manch seltsamem Verhalten, da nicht jeder Netzwerkstack dies so implemetiert.

In diesem Beispiel werden zwei Mobiltelefone (Dave und Alice) erstellt. IP-Adressen bitte entsprechend anpassen. Die Datei hier kommt als presence.items in das configuration/items/-Verzeichnis.

Im nächsten Schritt werden die erstellten Items in der Sitemap sichtbar gemacht. Dazu entweder eine eigene presence.sitemap anlegen oder den Code entsprechend in die eigene Sitemap einbauen.

Wenn nach dem automatischen Reload der openHAB-Konfiguration (Logfile anschauen) alles funktioniert hat, kann der erste Test beginnen. Dazu einfach das WLAN an einem der Mobiltelefone deaktivieren und im events.log den Statuswechsel überprüfen. Der Schalter auf der Sitemap sollte danach ebenfalls den Status wechseln.

Komplizierter und mit etwas Logik versehen ist die dazugehörige Regel. Dieses Rule-Set steuert die Anwesenheit. Dazu werden pro Person zwei Schalter verwendet. Dies stellt sicher, dass es zu keinem „Flapping“ kommt, wenn das Mobiltelefon kurzzeitig die Verbindung zum WLAN verliert. Ist das Mobiltelefon länger als 5 Minuten abwesend, wird der Abwesenheitsstatus der Person auf OFF gesetzt. An der Stelle kann auch mit kürzeren Werten experimentiert werden, 5 Minuten sollten aber auf jeden Fall sicher sein.

Diese Art der Regel ist etwas aufwändig, da sich der Code an vielen Stellen wiederholt und für jede neue Person ein weiteres Mal dupliziert werden muss. Leider ist es mir nicht gelungen in openHAB dies auf eine bessere Version zu lösen. Ob es wirklich nur an mir lag, mag ich nicht ganz ausschließen. Allerdings verhält sich auch openHAB an vielen Stelle nicht ganz konsistent. So hat bei mir z.B. die vorgeschlagene Variante mit „changed from OFF to ON“ nicht zuverlässig funktioniert, da das Item stellenweise im Status undefiniert war, obwohl eine Sekunde zuvor der Wechsel von ON auf OFF problemlos funktioniert hat.

Dank der passenden Android-App, lässt sich der Status ebenfalls überprüfen.

Screenshot_2016-01-11-22-38-36

Wa lässt sich nun damit machen? Ein paar Beispiele, welche wir realisiert haben, möchte ich kurz zeigen:

  • Coming-Home-Funktion: Licht in der Einfahrt, Diele und Küche einschalten, wenn jemand nach Hause kommt (Telefon bucht sich ins WLAN ein).
  • Lüftungsanlage auf Stufe 1 stellen, wenn niemand Zuhause ist und die Luftfeuchtigkeit in Ordnung ist. Kommt jemand nach Hause, wird die Lüftungsanlage wieder auf Stufe 2 gestellt.
  • Diverse Geräte (Fernseh, Receiver, Radios, etc.) ausschalten, wenn niemand Zuhause ist.
  • Rolläden automatisch hochfahren, wenn morgens der letzte das Haus verlässt.
  • Licht in der Diele ausschalten, wenn ein Gerät die Verbindung zum WLAN verliert.

4 Gedanken zu „Smarthome-Update

  1. Eine Frage vorab, habe ich so noch gar nicht gefunden bei dir im Blog. Warum nun openHAB und nicht mehr FHEM?

    Ich stehe noch ganz am Anfang bei der Geschichte und hatte dies gerade gefunden, nachdem ich mich im FHEM-Forum angemeldet hatte 😉

    Freue mich über Infos!

    • Warum openHAB? Gute Frage .. Vielleicht bin ich da ja noch einen Blogeintrag dazu schuldig 🙂
      FHEM und openHAB bietet grundsätzlich den selben Funktionsumfang. Was bei uns für openHAB spricht ist unter anderem die Integration der RWE Smarthome Zentrale. Dies bietet meines Wissens nach FHEM bisher nicht.
      Unabhängig davon würde ich openHAB auch unter anderen Gesichtspunkten empfehlen. Zum einen ist technische Umsetzung etwas moderner und vor allem flexibler (Bus-System -> http://www.openhab.org/features/architecture.html) zum anderen ist die „Programmierung“ deutlich einfacher und nachvollziehbarer als bei FHEM. Wer dort mal Perl in Perl verschachtelt hat und vor lauter Escaping nicht mehr durchgeblickt hat, weiß was ich meine 🙂

  2. Hallo Jens,
    ich habe Deine Anleitung zur Anwesenheit Schritt für Schritt übernommen,
    die Handy´s (zweimal WinPhone u. zweimal Android) werden auch meistens
    erkannt, aber eben auch manchmal wenn sie nicht da sind.
    Die Lumia´s melden sich aber nach einer gewissen Zeit auch wieder ab,
    wenn sie sich abschalten.
    Aber die Geschichte mit dem Anwesentheitsstatus funktioniert nicht, und ehrlich gesagt verstehe ich auch nicht warum Du das so machst. Ist doch eigentlich doppelt, oder aus welchem Grund ist das so.

    In der RULE:
    rule „Anwesenheit setzen, wenn mindestens ein Mobiltelefon gefunden wurde“
    when
    Item gMobiles changed
    then
    if (Presence.state != ON) {
    if(gMobiles.members.filter(s | s.state == ON).size > 0) {
    logInfo(„presence.rules“, „Ein oder mehr Mobiletelefone im WLAN gefunden. Anwesenheit setzen.“)
    sendCommand(Presence, ON)
    }
    }
    end

    fragst Du ein „Item gMobiles“ auf Änderung ab, aber diese ITEM finde ich nirgends, oder habe ich etwas vergessen oder falsch gemacht?
    Wäre toll wenn Du mir helfen könntest.
    Gruß
    Knut

    • Hallo Knut …
      Die vorgestellte Lösung setzt auf drei unterschiedliche Status-Typen. Für den ersten Status-Typ wird der Status des Mobiltelefons im WLAN ermittelt und auf ON oder OFF gesetzt. Meldet sich das Mobiltelefon aus dem WLAN ab, wird ein Timer gestartet, welcher nach einer gewissen Zeit den Status des Inhabers aus OFF setzt. Meldet sich das Mobiltelefon vor Ablauf des Timers wieder im WLAN an, wird der Timer abgebrochen und der Status des Inhabers nicht verändert. Dies soll ein eventuelles „Flapping“ verhindern.
      Sind alle Inhaber nicht mehr im WLAN angemeldet (OFF), dann wird mit Hilfe der Regel von oben der globale Anwesenheitsstatus im Haus auf OFF gesetzt. Mit Hilfe dieses dritten Status (Items) schalten wir z.B. das Haus in den Energiesparmodus.
      Mittlerweile habe ich den Code noch etwas erweitert und setzte Owntracks und MQTT zusätzlich als weiteren Status ein. Falls es dich interessiert, kannst du mir gerne kurz eine Mail schreiben.

      Grüße
      Jens

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.