OpenHAB2 – Sonos und FRITZ!Box

Ups, da war die Musik wohl mal wieder zu laut und man hat den Anruf verpasst. Das sollte doch eigentlich mit einem SmartHome lösbar sein. Für viele bedeutet SmartHome ja einfach toll Lichter und sonstige Dinge vom Handy an und ausknipsen können, für mich ist der Fokus aber ein anderer. Die Automatisierung soll automatisch für mehr Komfort sorgen ohne, dass ich etwas dafür tun muss. So z.B. auch meine Steuerung des Frühstücksradios. Genauso soll hier TV und Sonos im Bedarfsfall still sein, wenn ein Anruf kommt. Die Erkennung läuft über die FRITZ!Box gemeinsam mit dem TR064 Binding. Dazu braucht man ein Item welches das Klingeln abfragt:

Switch  FBX_ringing "Anruf eingehend [%s]" {fritzboxtr064="callmonitor_ringing" }

Für die Sonos und das Samsung TV habe ich jeweils ein Item zum Muten angelegt

Switch  SON_mute "Sonos Mute" {channel="sonos:PLAY1:RINCON_XXXXXXXXXXX:mute"}
Switch	SAM_mute "TV Mute"    {channel="samsungtv:tv:XXXXXXXXXXXXXXXXX:mute"}

Und hier die einfache Regel dazu. Für mich war nur wichtig, dass das Muten nur rückgängig gemacht wird, wenn es auch aus der Regel kommt, deshalb merke ich mir das in den Variablen sonos und tv.

var sonos = 0
var tv = 0

rule "Anruf an"
  when
    Item FBX_ringing changed from OFF to ON
  then
    if ( SON_status.state == "PLAYING") {
      logWarn("Anruf", "Sonos Mute ON")
      sendCommand(SON_mute, ON)
      sonos = 1
    }
    if ( SAM_on.state == ON && SAM_mute.state == OFF) {
      logWarn("Anruf", "TV Mute ON")
      sendCommand(SAM_mute, ON)
      tv = 1
    }
end

rule "Anruf aus"
  when
    Item FBX_ringing changed from ON to OFF
  then
    if ( sonos === 1 ) {
      logWarn("Anruf", "Sonos Mute OFF")
      sendCommand(SON_mute, OFF)
      sonos = 0
    }
    if ( tv === 1 ) {
      logWarn("Anruf", "TV Mute OFF")
      sendCommand(SAM_mute, OFF)
      tv = 0
    }		
end

Das Ganze geht mit Sicherheit auch noch deutlich komplexer da es in meinem Fall aber genau ein Festnetztelefon im Haus gibt und ich somit nur die Sonos und den Fernseher in diesem Raum muten muss reicht das völlig für mich.

OpenHAB2 – Überwachung der Waschmaschine

Meine Ausgangssituation ist eine Waschmaschine, welche im Keller steht. Keiner möchte mehrmals hinlaufen um festzustellen ob der Waschvorgang abgeschlossen ist.

Was wird benötigt? Im Endeffekt nur eine Schaltsteckdose mit Energiemessfunktion die auch die Leistung der Waschmaschine verträgt. In meinem Fall habe ich nun eine Devolo Home Control Schaltsteckdose/Messsteckdose 2.0 im Einsatz welche bis zu 3000 Watt verträgt. Zunächst wollte ich einen Aeon Smart Switch 6 verwenden, welcher jedoch eine schlechte Funkreichweite und somit leider hinter der Waschmaschine nicht funktioniert hat.

Folgende Items habe ich angelegt:

Switch  SD3_on       "WaMa Steckdose"               {channel="zwave:xxx:switch_binary"}
Number  SD3_kwh      "Verbrauch Gesamt [%.2f kWh]"  {channel="zwave:xxx:meter_kwh"}	
Number  SD3_volt     "Spannung [%.0f Volt]"	    {channel="zwave:xxx:meter_voltage"}	
Number  SD3_watt     "Leistung [%.1f Watt]"	    {channel="zwave:xxx:meter_watts"}
Number  SD3_kwh_akt  "Verbrauch aktuell [%.2f kWh]"
Number  SD3_kwh_save "Verbrauch Speicher [%.2f kWh]"	

Da meter_reset aktuell noch nicht implementiert ist habe ich mit mit SD3_kwh_akt und SD3_kwh_save eine Krücke gebaut und speichere beim Einschalten den bisherigen Gesamtverbrauch aus SD3_kwh in die save Variable und berechne bei jeder Änderung von SD3_kwh die akt Variable. Dazu dienen die folgenden Regeln:

rule "WaMa Verbrauchsdaten 1"
  when 
    Item SD3_on changed from OFF to ON
  then
    SD3_kwh_save.postUpdate(SD3_kwh.state)
    SD3_kwh_akt.postUpdate(0.0)
end

rule "WaMa Verbrauchsdaten 2"
  when 
    Item SD3_kwh changed
  then
    SD3_kwh_akt.postUpdate((SD3_kwh.state as DecimalType).doubleValue  - (SD3_kwh_save.state as DecimalType).doubleValue)
end

Für die eigentliche Regel musste ich zunächst den Standby Verbrauch der Waschmaschine ermitteln. Dieser liegt bei mir bei ca. 1,2 Watt, weshalb ich die Schwelle ab der die Waschmaschine als fertig erkannt wird auf 2 Watt festgelegt habe.  Die Regel wird natürlich bei jeder Änderung der Wattzahl ausgeführt. Wenn die Steckdose an, der Timer WAMAoff null und die aktuelle Leistung in Watt kleiner als der Schwellwert (2.0 Watt) ist, so wird ein Timer erzeugt. Der Timer läuft 5 Minuten, damit etwaige Pause der Waschmaschine die Benachrichtigung nicht auslösen und auch das Finale freigeben der Tür am Ende des Waschgangs erfolgt ist. Steig der Energieverbrauch wieder an während der Timer noch läuft, so wird der Timer gecancelt und auf den Initialwert null gesetzt.

Sobald der Timer abgelaufen ist wird die Schaltsteckdose ausgeschaltet, die Lautstärke der Sonos auf 40% gestellt und ein Text, welcher auch die benötigte Energie in kWh enthält über die Sonos ausgegeben. Schlussendlich noch eine Push Nachricht auf die Handys, falls gerade niemand die Sprachausgabe hört.

var Timer WAMAoff = null

rule "WaMa"
  when 
    Item SD3_watt changed
  then
    if (SD3_on.state == ON && SD3_watt.state < 2.0 && WAMAoff == null) {
      logWarn("Waschmaschine","Set Timer")
      WAMAoff = createTimer(now.plusMinutes(5), [|
        logWarn("Waschmaschine","aus")
        sendCommand(SD3_on, OFF)
        sendCommand(SON_volinfo, 40)
        say("Die Waschmaschine ist fertig und hat" + (SD3_kwh_akt.state as DecimalType).doubleValue.toString.replaceAll("\\.",",") + "Kilowattstunden verbraucht")
        sendBroadcastNotification("Waschmaschine fertig")
        ])		
    }
    if (SD3_on.state == ON && SD3_watt.state > 2.0 && WAMAoff != null) {
        logWarn("Waschmaschine","Reset Timer")
        WAMAoff.cancel
        WAMAoff = null
    }
end

Nun ist abwarten und Tee trinken angesagt ob sich die Regel auch bewährt.

OpenHAB2 und Sonos – Projekt Frühstücksradio

Wäre es nicht schön, wenn morgens auf dem Weg zum Frühstückstisch das Radio automatisch angeht? Was für eine Frage. Natürlich wäre es das. Beschlossene Sache und los geht es. Zunächst muss also Sonos Binding installiert werden um die Sonos Box dann über die Inbox als „Thing“ hinzuzufügen. Danach legen wir das Volume und das Playuri item an. Über das Volume Item setzen wir später die Wunschlautstärke, dass die Musik uns nicht gleich umhaut falls z.B. am Abend vorher Musik auch etwas lauter gehört wurde. Über das Playuri Item setzen wir den Radio-Stream. Es gibt auch ein Radio Item aber damit wollte es bei mir nicht klappen.

//Sonos Wohnzimmer
Dimmer  SON_vol   "Volume [%.1f %%]" soundvolume>   (gSonos)	{channel="sonos:PLAY1:RINCON_XXX:volume"}
String  SON_uri		                                        {channel="sonos:PLAY1:RINCON_XXX:playuri"}

Nun fehlt nur noch die passende Regel.

var Timer SONRun = null
rule "Fruehstuecksradio"
   when
    Item MS1_mot changed from OFF to ON
   then
    if(SONRun == null && (now.getHourOfDay() >= 6 && now.getHourOfDay() < 9)){
      logWarn("Fruehstuecksradio", "Trigger!")
      sendCommand(SON_vol, 16)
      sendCommand(SON_uri, "x-rincon-mp3radio://http://sr.audiostream.io/sr/1009/mp3/128/sr1")
      SONRun = createTimer(now.plusHours(4), [|logWarn("Fruehstuecksradio","Timer Off")])	
    }
    else {
      logWarn("Fruehstuecksradio", "Job already done")
    }
end

Grundsätzlich würde es reichen, wenn die Box loslegt sobald mein Bewegungsmelder (MS1_mot) im Wohnzimmer auslöst und die aktuelle Uhrzeit in einem gewissen Bereich wie hier z.B. 6 und 9 Uhr liegt. Dies hätte aber zur Folge, dass es quasi nicht möglich ist die Box in dieser Zeit wieder stumm zu bekommen oder etwas anderes zu hören, da jede erneute Bewegung das Radio startet. Deshalb definiere ich den Timer SONRun. Dieser wird beim Auslösen auf 4 Stunden gestellt und erst wenn der Timer abgelaufen kann die Regel erneut ausgeführt werden. Da der Timer länger läuft als der mögliche Auslösezeitraum groß ist kann das Radio somit nur einmal gestartet werden.