OpenHAB, Z-Wave und Fibaro Motion Sensor + Jalousiesteuerung

Es war so weit, die ersten beiden Fibaro-Geräte erhielten Einzug:

Natürlich brauchte der Server noch einen USB-Stick um auch Z-Wave fähig zu werden, hier habe ich mich für den Z-Wave ZME_UZB1 entschieden, da dieser nach Recherchen auf jeden Fall auch mit OpenHAB funktionsfähig sein sollte.

Die Einrichtung des USB-Sticks verlief problemlos. Treiber installiert, in der OpenHAB-Konfiguration den COM-Port eingetragen, neu gestartet und das wars.

Zunächst nahm ich den Multisensor in Betrieb. Über HABmin den Inklude-Modus aktiviert, Sensor inkludiert und dann die entsprechenden Items angelegt und erstmal einfach ausgegeben. Temperatur, Bewegung und Helligkeit waren tolle Parameter, um später so einiges damit zu machen.

OpenHAB Item-Konfiguration:

Number			FibEye1_Lux				"Helligkeit WZ [%.2f Lux]"		<sun>			(gWZ)				{ zwave="4:command=SENSOR_MULTILEVEL,sensor_type=3" }
Number			FibEye1_Battery			"Batterie [%d %%]"				<energy>		(gBattery)			{ zwave="4:command=BATTERY" }
Number			FibEye1_Temp			"Temp Eye WZ [%.2f °C]"			<temperature>	(gTemperatureEG)	{ zwave="4:command=SENSOR_MULTILEVEL,sensor_type=1" }
Contact			FibEye1_Motion			"Bewegung"						<shield>	    (gMotion)  			{ zwave="4:command=SENSOR_BINARY" }
Contact			FibEye1_Tamper			"Sabotage"						<shield>		(gAlarmTamper)		{ zwave="4:command=SENSOR_ALARM" }

Platziert habe ich den Sensor dann im Wohnzimmer, dort wo auch die elektrische Jalousie noch mit Hilfe des Fibaro Roller Shutter 2 „smart gemacht“ wurde.

Die OpenHAB Item-Konfiguration für die Jalousie-Steuerung:

Rollershutter	RolladeWZ				"Rollade Wohnzimmer [%.0f %%]"			<terrace>	(gBlind)	{ zwave="8:command=SWITCH_MULTILEVEL" }
Number			ShutterWatts			"Rollade Momentanverbrauch [%.1f W]"	<energy> 	(gWatts)	{ zwave="8:command=SENSOR_MULTILEVEL"}
Number			ShutterTotalEnergy		"Rollade Gesamtverbrauch [%.2f KWh]"	<energy> 	(gEnergy)	{ zwave="8:command=METER" }

Da der Roller Shutter 2 auch den Gesamt- und Momentanverbrauch übertragen kann, habe ich hierfür natürlich auch direkt die entsprechenden Items angelegt.

Zum ersten Mal die Rolladen über das Handy zu steuern war unglaublich. Doch mit Regeln konnte der Spaß nun so richtig los gehen.

Zunächst mal stand die Sicherheit auf dem Plan. Nachts sollte der Rolladen komplett schließen und morgens wieder öffnen. Die Regel erschien zunächst recht einfach, hatte aber das Problem, dass man, wenn man noch wach war und in den Garten wollte, zunächst die Rolladen wieder öffnen musste bevor man in den Garten gelangen konnte.

Die Idee war also, dass der Rolladen erst schließt, wenn keiner mehr raus möchte. Hier trat dann der Fibaro Multisensor in Aktion. Da dieser auch über einen Bewegungsmelder verfügt.

Die Regel ist nun etwas komplexer und funktioniert so:

  • Zwischen 22h und 6h wird der Rolladen komplett heruntergelassen, wenn 90 Minuten keine Bewegung mehr im Wohnzimmer stattgefunden hat
  • Zwischen 6h und 9h wird bei Bewegung der Rolladen auf 75% geöffnet

Die Regel in OpenHAB erfolgt wie üblich über ein Script, es sieht folgendermaßen aus:

import org.openhab.core.library.types.*
import org.openhab.model.script.actions.Timer
import org.joda.time.*

var Timer closeAtNightTimer

var int blindHalfOpened = 75
var int blindOpen = 99
var int blindClosed = 0

// Zwischen 22 Uhr und 6 Uhr Rolladen ganz runterfahren wenn 90 Minuten keine Bewegung im Wohnzimmer war
// Zwischen 6 und 12 Uhr bei Bewegung im Wohnzimmer Rolladen auf 75% fahren
rule "Rolladen runter in der Nacht"
when
	System started or
	Item FibEye1_Motion changed
then
	if(FibEye1_Motion.state == CLOSED)
	{
		var int hour = now.getHourOfDay()

		if( hour < 6 || hour >= 22 )
		{
			closeAtNightTimer = createTimer(now.plusMinutes(90))
			[|
				sendTelegram("bot", "Rolladen runter, 90 Minuten keine Bewegung")
				sendCommand(RolladeWZ, blindClosed)
			]			
		}
	}
	else
	{
		if(closeAtNightTimer != null)
		{
			closeAtNightTimer.cancel()
			closeAtNightTimer = null;
		}

		if( gPresence.state == ON && movementDetected == 0 )
		{
			var int hour = now.getHourOfDay()
			
			if( hour >= 6 && hour <= 12 && RolladeWZ.state <= 1 )
			{
				sendTelegram("bot", "Rolladen auf 75%, Zwischen 6h und 12h und Bewegung erkannt")
				sendCommand(RolladeWZ, blindHalfOpened)
				movementDetected = 1
			}	
		}
	}
end


rule "ResetMovementDetected"
when
	Time cron "0 0 5 * * ?"
then
	movementDetected = 0
end

Der Fehler mit dem Sonnenschutz

Wenn man manche Regeln nicht sauber durchdenkt, können auch mal richtig lustige Dinge passieren. Ich wollte eine Sonnenschutzfunktion programmieren. Dank des Motion Sensors von Fibaro, der ja auch die Helligkeit misst, sollte das relativ einfach sein. Die Regel sollte in etwa so aussehen:

  • Wenn Helligkeitssensor über XXX Lux, dann senke Rolladen auf 50% ab
  • Wenn Helligkeitssensor unter YYY Lux, dann fahre Rolladen wieder hoch

Als OpenHAB-Regel war dies auch schnell implementiert und sah dann folgendermaßen aus:

rule "Rolladen Sonnenschutz"
when
	System started or
	Item FibEye1_Lux changed
then
	if( FibEye1_Lux.state > 2000 && RolladeWZ.state > blindSun)
	{
		sendCommand(RolladeWZ, blindSun)
		sendTelegram("bot", "Rolladen Sonnenschutz")
	}
	else if( FibEye1_Lux.state < 500 && RolladeWZ.state == blindSun)
	{
		sendCommand(RolladeWZ, blindOpen)
		sendTelegram("bot", "Rolladen Sonnenschutz ENDE")
	}
end

Was war hier das Problem?

Die Regel führte zu einer Endlosschleife, so dass dauerhaft der Rolladen runter- und wieder hochgefahren wurde.
Denn aufgrund der Tatsache, dass der geschlossene Rolladen das Wohnzimmer verdunkelte, wurden die 500 Lux unterschritten, so dass der Rolladen wieder hochgefahren wurde. Dann war es natürlich wieder hell, die 2000 Lux wurden überschritten und der Rolladen wurde wieder herabgelassen usw.

Einige Monate später gab es dann einen zweiten Motion Sensor im Garten, der inzwischen anstelle des Motion Sensors im Wohnzimmer für die Helligkeitsmessung benutzt wird, damit tritt das Problem dann nicht mehr auf.