Schon länger hatte ich den Wunsch, meine Smarthome-Installation über einen schönen kleinen Bildschirm zu steuern. openHAB bietet ja grundsätzlich ein schönes Webinterface, das per URL in jedem Browser aufrufbar ist. Hier gibt es auch professionelle Anbieter, aber da sind schnell um die 1.000,- € ausgegeben. Da stimmen Kosten-Nutzen-Verhältnis nicht, das ist es mir nicht wert.
Dann begann ich, mit einem 50€-10″-Made-In-China-Touchscreen für einen meiner Raspberrys zu experimentieren. Allerdings war das eine wirklich wackelige Bastellösung. Der Bildschirm war, was den Touch betrifft, nicht so genau und schwer zu bedienen und die GUI vom Raspberry ist eben auch nicht so geschmeidig zu bedienen, wie man es einfach schon vom Handy gewohnt ist.
Bei der Recherche nach weiteren Möglichkeiten bin ich dann auf die Idee gekommen, einfach ein mit Strom versorgtes Tablet an die Wand zu hängen. Dies hat dann auch die Vorteile, dass Android-Apps nach belieben installiert werden können und openHAB selbst hat ja auch eine brauchbare Android-App. Und in diese Richtung ist es dann auch gegangen…
Da mir ein neues, großes Tablet für so einen Zweck zu schade war, habe ich von einem Freund sein altes Nexus 7 (2012) überlassen bekommen. Dieses habe ich zuerst mit einer Android 7.1 lineage Version bespielt. Nun läuft auf dem 5 Jahre alten Tablet ein aktuelles System – und das sogar ganz flüssig.
Was ich bei der Montage dann aber berücksichtigen wollte, waren folgende Aspekte:
- Die Bedienoberfläche soll sofort bedienbar sein oder einfach anschaltbar sein
- Das Tablet bzw. eher das Display soll nicht im Dauer-An-Modus sein
Da das Nexus 7 nicht über einen Näherungssensor oder eine Möglichkeit, ein Tap-To-Wake-Up durchzuführen, verfügt, habe ich kurz überlegt, die Kamera evtl als Art Bewegungsmelder zu verwenden. Apps hierfür gibt es einige. Aber irgendwie fand ich es doch ein bisschen gruselig, wenn streng genommen ständig eine Kamera in meinem Wohnzimmer steht und alles filmt. Dann habe ich mir gedacht, das „Tap“ auf dem Display via Gravity-Sensoren abzufangen und via Tasker den Bildschirm einzuschalten. Dies funktioniert grundsätzlich, aber nicht zuverlässig genug, wenn das Tablett irgendwo drangebaut ist. Da muss man manchmal doch etwas mehr am Bildschirm wackeln…
Der letzte Ansatz hatte mir dann besser gefallen: Ich nutze nun die bereits vorhandenen Hausautomatisierungskomponenten um festzulegen, ob das Tablet ein- oder ausgeschalten sein soll, genauer wie folgt:
- Das Tablet erhält die App Tasker installiert. Tasker ist ein praktischer Helfer, man kann hier ziemlich viele Automatismen auf Basis verschiedener Ereignisse ablaufen lassen.
- Tasker erhält zusätzlich das Plugin Tasker Event Server. Damit wird ein schlanker Webserver auf dem Android installiert. Dieser horcht auf Port 8765. Über diesen Können Tasker-Profile angestoßen werden. Ein Profil ist für das Anschalten des Displays verantwortlich, eines ist für das Ausschalten verantwortlich.
- openHAB übernimmt nun via rules die Kontrolle. Ist jemand im Wohnzimmer (Bewegungsmelder, Lichtsteuerung, Radio) wird das Tablet via POST-Request an den Tasker-Webserver angeschalten. Nach gewisser Inaktivität wird das Tablet wieder automatisch ausgeschalten.
Apps installieren
Einfach per Appstore die Apps openHAB, Tasker, Tasker Event Server installieren. Bei mir war es via Tasker nicht möglich, den Bildschirm anzusteuern / einzuschalten, daher wird zusätzlich die App Secure Settings benötigt.
Tasker einrichten
Task „Screen Aufwecken“
- Neuer Task hinzufügen
- Aktionskategorie „Plugin“, Plugin „Secure Settings“
- Im Plugin die Aktion konfigurieren, hier wählen wir „Actions“, „Wake Device“, Duration: „Manual On“.
Profil „Aufwecken“
- neues Profil hinzufügen
- „Ereignis“ wählen, Ereigniskategorie „Plugin“ auswählen
- Plugin „TNES: Tasker Network Event Server“ auswählen
- Konfiguration editieren und Event Name „aufwecken“ eintragen, Filters: display==on eintragen.
- Konfiguration speichern und das Profil mit dem bereits erstellten Task „Screen Aufwecken“ verknüpfen.
Profil testen:
Zum Testen einfach in einen Webbrowser gehen und die URL des Geräts am Port 8765 aufrufen und per POST/GET-Parameter den bei „Filter“ eingetragenen Wert übergeben. Bei mit ist das folgende URL:
http://tablet.fritz.box:8765/?display=on
Das Tablet sollte durch den Aufruf nun automatisch anschalten werden.
Task „Screen Aus“
- Neuer Task hinzufügen
- Aktionskategorie „Plugin“, Plugin „Secure Settings“
- Im Plugin die Aktion konfigurieren, hier wählen wir „Dev Admin Actions“, „Lock Device“.
Profil „Ausschalten“
- neues Profil hinzufügen
- „Ereignis“ wählen, Ereigniskategorie „Plugin“ auswählen
- Plugin „TNES: Tasker Network Event Server“ auswählen
- Konfiguration editieren und Event Name „ausschalten“ eintragen, Filters: display==off eintragen.
- Konfiguration speichern und das Profil mit dem bereits erstellten Task „Screen Aus“ verknüpfen.
Profil testen:
Analog zum obigen Test gilt nun folgende URL:
http://tablet.fritz.box:8765/?display=off
Das Tablet sollte durch den Aufruf nun automatisch ausgeschalten werden.
openHAB anpassen
openHAB soll sich so verhalten, dass wenn sich jemand im Wohnzimmer aufhält, dass dann mindestens für 15 Minuten das Tablet angeschalten ist. Nach den 15 Minuten wird es automatisch ausgeschalten.
Hierzu gibt es nun mehrere Elemente, die eine Rolle spielen:
- Ein Item vom Typ Switch in openHAB, welches den Status des Tablets enthält (ON oder OFF) und ein DateTime – Item, welches den Zeitstempel des letzten das Display aktivierenden Events enthält. Dies wird für den Ausschalttimer benötigt.
- Eine Rule zum tatsächlichen Schalten des Displays, wenn entweder der Switch in der openHAB-GUI betätigt wurde oder der Befehl von anderen Rules kommt, das Display zu schalten.
- Mehrere Rules für verschiedene Anwendungsfälle (Licht an, Radio an, Bewegung, …) welche das Einschalten übernimmt. Dies soll Event-Basiert erfolgen (also wenn Lichter, Radio oder Bewegungsmelder auf AN gehen).
- Eine Rule, welche das Ausschalten übernimmt. Auch hier erfolgt dies Event-basiert. Ist alles so, dass das Display aus gehen soll, wird ein Timer von 15 Minuten gestartet. War zwischenzeitlich nichts los, wird das Display wirklich ausgeschalten.
Items-Datei:
Switch tabletDisplay "Display Tablet" <network> DateTime tabletDisplayLastOn "Letzter Grund für Einschalten" (debug)
Rules-Datei:
/** * Regeln zur Ansteuerung des Smart-Home-Steuerungs-Tablets * * Das Tablet ist via Tasker und Tasket Network Service angesteuert * und jeweils so lange aktiv, bis es explizit wieder entsprechend * ausgeschaltet wird */ import org.openhab.core.library.types.* import java.util.TimeZone import java.util.Calendar val String tabletUrl = 'http://192.168.188.33:8765/' val Integer tabletTimerSeconds = 60*15 // Nachlauf in Sekunden, wie lange Tablett zusätzlich an sein soll. val boolean log = true rule "Tablet tatsächlich schalten" when Item tabletDisplay changed then val String logPrefix = '[Tablet Anschalt-Regel] ' if (tabletDisplay.state == ON) { if (log) logInfo('rules', logPrefix + 'Schalte Display an') sendHttpGetRequest(tabletUrl + '?display=on') } else { if (log) logInfo('rules', logPrefix + 'Schalte Display aus') sendHttpGetRequest(tabletUrl + '?display=off') } end rule "Tablet aktivieren bei Anwesenheit in Wohnzimmer (ohne Dimmer)" when Item eg_pir_wozi_motion changed from OFF to ON or Item eg_licht_essen changed from OFF to ON or Item eg_licht_kueche changed from OFF to ON or Item eg_licht_wohnen changed from OFF to ON then tabletDisplay.postUpdate(ON) tabletDisplayLastOn.postUpdate(new DateTimeType(java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin")))) end rule "Tablet aktivieren bei Anwesenheit in Wohnzimmer (Dimmer)" when Item eg_licht_wohnen_wandcouch changed or Item eg_licht_wohnen_wandgarten changed then if ((eg_licht_wohnen_wandgarten.state > 0) || (eg_licht_wohnen_wandcouch.state > 0)) { tabletDisplay.postUpdate(ON) tabletDisplayLastOn.postUpdate(new DateTimeType(java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin")))) } end rule "Tablet aktivieren bei laufendem Webradio Küche" when Item webradioKuecheEG changed then if (webradioKuecheEG.state != 1) { tabletDisplay.postUpdate(ON) tabletDisplayLastOn.postUpdate(new DateTimeType(java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin")))) } end rule "Tablet ausschalten erkennen" when Item eg_pir_wozi_motion changed from ON to OFF or Item eg_licht_essen changed from ON to OFF or Item eg_licht_kueche changed from ON to OFF or Item eg_licht_wohnen changed from ON to OFF or Item eg_licht_wohnen_wandcouch changed to 0 or Item eg_licht_wohnen_wandgarten changed to 0 or Item webradioKuecheEG changed to 1 then val String logPrefix = '[Tablet Ausschalt-Regel] ' logInfo('rules', logPrefix + 'Ausschalten angefragt, überprüfe, ob Ausschalten tatsächlich erfolgen soll...') if ( (eg_pir_wozi_motion.state == OFF) && (eg_licht_essen.state == OFF) && (eg_licht_kueche.state == OFF) && (eg_licht_wohnen.state == OFF) && (eg_licht_wohnen_wandcouch.state == 0) && (eg_licht_wohnen_wandgarten.state == 0) && (webradioKuecheEG.state == 1) ) { logInfo('rules', logPrefix + 'Alles ausgeschalten, Tablet-Timer für Auschalten aktiviert') // Nun Timer setzen und dann nochmal prüfen, ob zwischenzeitlich nicht ein Anschaltevent eingetreten ist // Dies ist daran erkennbar, dass die tabletDisplayLastOn beim Ausführen des Timers einen anderen Wert hat // als aktuell. In diesem Fall läuft bereits ein zweiter Timer oder wird laufen, wenn alles wieder aus ist. var String timeStamp = tabletDisplayLastOn.state.toString() createTimer(now.plusSeconds(tabletTimerSeconds)) [| if (log) logInfo('rules', logPrefix + 'Timer erreicht, prüfe, ob Tablet ausgeschalten werden soll...') if (timeStamp == tabletDisplayLastOn.state.toString()) { if (log) logInfo('rules', logPrefix + 'Schalte aus') tabletDisplay.postUpdate(OFF) } else { if (log) logInfo('rules', logPrefix + 'Schalte nicht aus, zwischenzeitliches Ereignis eingetreten, das das Ausschalten verhindert, Debug-Daten: ' + timeStamp + ' -- ' + tabletDisplayLastOn.state.toString()) } ] } end
Ab an die Wand – oder auf die Halterung…
Am Ende habe ich mich dann doch dafür entschieden, das Tablet nicht direkt an der Wand zu befestigen. Da es nun ja nicht nur für die openHAB-Steuerung verwendet werden kann – es ist ja ein voll funktionsfähiges und aktuelles Android. Wenn es z.B. mal zum Kochen mit chefkoch in der Küche neben dem Wohnraum benötigt wird, ist es schnell rübergedreht. Dazu habe ich mir schnell eine kleine Holz-Halterung aus einer noch über gebliebenen Holz-Platte gebaut und ich denke es ist ein ganz ansehnliches Ergebnis in Buche massiv geölt herausgekommen 😉
Viel Spaß beim Nachbasteln!