openHAB – den Morgen mit Licht, Nachrichten und Radio automatisieren

Manche Tagesabläufe sind einfach immer irgendwie gleich, gerade dann, wenn die Kinder morgens in die Schule müssen, die eigene Arbeit wartet und einfach alles eben laufen muss.

Jeden morgen, wenn ich in Küche komme um das Frühstück herzurichten, mache ich das Licht an, das Radio und dann wird hergerichtet. Aber das kann man auch ganz gut automatisieren.

Die morgendliche Aufgabe für openhab heißt nun:

  1. Bei der ersten morgendlichen Bewegung im Wohnzimmer (hier ist ein Homematic-Bewegungsmelder im Einsatz) soll alles losgehen
    1. …aber nicht vor der Stunde, für die der Wecker gestellt wurde
    2. …und maximal vier Stunden später, nachdem der Wecker hätte gehen sollen
  2. Die beiden Wand-Dimm-Aktoren meines Wohnzimmers und der Licht-Aktor der Küche sollen angeschalten werden
  3. Das Webradio (ein Raspberry Pi3 mit HifiBerry AMP+ Verstärker) soll die aktuellen Nachrichten laden, abspielen und dann auf einen Radiostream umschalten.

Webradio konfigurieren

Das Webradio und die Nachrichten sind in diesem Artikel beschrieben. Lediglich ein paar Anpassungen habe ich vorgenommen. Ich habe den Webradio-Aufruf in eine Selektion in die Sitemap gepackt und per Szenenverwaltung das Nachrichten-Abspielen nun mit meiner Radiosender-Auswahl kombiniert:

.sitemap-Datei:

 Frame label="Webradio Küche" {
 Selection item=webradioKuecheEG mappings=[1="Aus",2="Radio 2Day München",3="SWR3",4="Bayern 1",5="Charivari",99="DLF Nachrichten"]
 Setpoint item=webradioKuecheEGvolume minValue=0 maxValue=200 step=10
 }

.rules-Datei:

val String TTS_URL = 'http://<IP DES SERVERS MIT STREAMPI>/streampi/streampi.php'

rule "Soundpi Webradio Senderverwaltung"
when
 Item webradioKuecheEG received command
then
 switch(receivedCommand) {
 case 1: {
 sendHttpGetRequest(TTS_URL + '?type=stop');
 }
 case 2: {
 sendHttpGetRequest(TTS_URL + '?type=stream&file=http://radio2day.ip-streaming.net/radio2day.m3u');
 }
 case 3: {
 sendHttpGetRequest(TTS_URL + '?type=stream&file=http://mp3-live.swr3.de/swr3_m.m3u');
 }
 case 4: {
 sendHttpGetRequest(TTS_URL + '?type=stream&file=http://streams.br.de/bayern1nbopf_2.m3u');
 }
case 99: {
 sendHttpPostRequest(TTS_URL,'application/x-www-form-urlencoded','&prio=2&volume=80&plugin=news-dlf')
 }
 } 
end

Regelwerk für die Morgenautomatik

Hier wird auf die Weckzeiten des in diesem Artikel beschriebenen Licht-Weckers zurückgegriffen, um dies nicht bei jeder ersten Bewegung auszulösen. Es wäre ja blöd, wenn man – aus welchen Gründen auch immer – nachts um eins kurz einmal durch’s Wohnzimmer läuft und deswegen gleich das Licht, die Nachrichten und das Webradio angeht. 😉

Das Regelwerk prüft auf die Uhrzeit gegen die Stunde der Weckerkonfiguration und schaltet dann zwei Dimmer und eine Lampe voll an, startet das Radio und merkt sich zuletzt den letzten Durchlauf der Morgenautomatik, damit es nicht zu mehrfachen Ausführungen am Tag kommt.

.items-Datei:

Kann man auch zu Debug-Zwecken in die Sitemap einbinden, muss man aber nicht. Das Item aber muss es geben.

DateTime morgenautomatik_last "Letzte Morgenautmatik [%1$td.%1$tm. %1$tT]" <calendar> (debug)

.rules-Datei:

import java.util.Date
import org.joda.time.*
import org.openhab.core.library.types.*

val String TTS_URL = 'http://192.168.188.189/streampi/streampi.php'

// import java.util.Calendar
// für später merken... var datumMorgenautomatik = (eg_pir_wozi_last.state as DateTimeType).calendar.get(Calendar::DAY_OF_MONTH)

rule "Morgenautomatik"
 when Item eg_pir_wozi_motion changed to ON
 then 
 var String timeLast = morgenautomatik_last.state.toString().substring(0,10)
 var String timeNow = now.toString().substring(0,10)
 val Integer weckerDifferenz = 4 // Nur max. 4 Stunden nach eingestelltem Wecker (Wert für Stunde) für den Tag, hier Item "weckerZeitStunde"
 
 if (timeNow != timeLast) { // Max. ein Mal am Tag ausführen!
 logInfo('rules', 'Morgenautomatik: Heute noch nicht gelaufen')
 var Integer aktuelleStunde = now.getHourOfDay().intValue
 var aktuellStunde = now.getHourOfDay()
 var weckerStunde = (weckerZeitStunde.state as DecimalType).intValue
 if ( (aktuellStunde - weckerDifferenz <= weckerStunde) && (aktuellStunde >= weckerStunde)) {
 logInfo('rules', 'Morgenautomatik: Liegt im definierten Intervall, wird gestartet')
 // Licht schalten, wenn noch dunkel
 var DateTime datumSonnenaufgang = new DateTime((astro_Sonnenaufgang.state as DateTimeType).calendar.timeInMillis)
 var DateTime datumSonnenuntergang = new DateTime((astro_Sonnenuntergang.state as DateTimeType).calendar.timeInMillis)
 val boolean istDunkel = datumSonnenaufgang.afterNow || datumSonnenuntergang.beforeNow
 if (istDunkel) {
 logInfo('rules', 'Morgenautomatik: Es ist draußen dunkel, Licht anschalten')
 eg_licht_kueche.sendCommand(ON)
 eg_licht_wohnen_wandcouch.sendCommand(100)
 eg_licht_wohnen_wandgarten.sendCommand(100)
 }
 // Nun Zeitstempel mit Zeitstempel der letzten Bewegung aktualisieren - heute braucht es keine Morgenautomatik mehr
 postUpdate(morgenautomatik_last, eg_pir_wozi_last.state)
 // Radio-Stream starten
 logInfo('rules', 'Morgenautomatik: Webradio wird gestartet')
 webradioKuecheEG.sendCommand(2)
 // Nachrichten starten (Stream läuft nachher automatisch weiter)
 logInfo('rules', 'Morgenautomatik: Nachrichten werden gestartet')
 webradioKuecheEG.sendCommand(99)
 // Radio-Stream starten (zweimal da streampi für den mp3-Webradiostream wartet, bis der Prozess 
 // beendet ist. Letzterer Aufruf dient letztlich nur zum Setzen auf den richtigen Eintrak in der 
 // Selektion in der Sitemap. Sonst bleibt dieser auf den Nachrichten und es erfolgt ggf. ein mehrfaches abspielen der News
 logInfo('rules', 'Morgenautomatik: Webradio wird gestartet')
 webradioKuecheEG.sendCommand(2)
 } else {
 logInfo('rules', 'Morgenautomatik: Liegt nicht im definierten Intervall')
 }
 
 } else {
 logInfo('rules', 'Morgenautomatik: Ist heute bereits gelaufen')
 } 
 end

Den initialen Wert für morgenautomatik_last muss man ggf. noch einmalig per Rule setzen, dann läuft es aber.

Und ausschalten muss man dann nach dem Frühstücken aktuell alles noch selbst, aber auch da kann man sich ja etwas basteln! 😉

 

Schreibe einen Kommentar

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