Startseite » künstlicher Sonnenaufgang mit OpenHAB, Kalender und Hue

künstlicher Sonnenaufgang mit OpenHAB, Kalender und Hue

Morgens von langsam aufdimmenden Licht geweckt zu werden, unterstützt deinen Prozess in den Tag zu starten. Mit einer Smart-Blub wie Phillips Hue lässt sich das leicht bewerkstelligen. Ich steuere dieses Ereignis darüber hinaus mit meinem Google Kalender um sich verändernde Verhältnisse einfach abzubilden.

Kalender-Item

Den Kalender richte ich mittels des OpenHAB ical-Moduls ein. Die zugehörigen Items sehen so aus:

Group:Switch:COUNT(ON)		igCalWaking										"Weckprofil"						(sgBedroom)["WebService"]
Switch				KalenderWecken_CurrentEventPresence						"Current Event Presence"			(igCalWaking)												{ channel="icalendar:calendar:Wecken:current_presence" }
String				KalenderWecken_CurrentEventTitle						"Current Event Title"				(igCalWaking)												{ channel="icalendar:calendar:Wecken:current_title" }
DateTime			KalenderWecken_CurrentEventStart						"Current Event Start"				(igCalWaking)												{ channel="icalendar:calendar:Wecken:current_start" }
DateTime			KalenderWecken_CurrentEventEnd							"Current Event End"					(igCalWaking)												{ channel="icalendar:calendar:Wecken:current_end" }

Smart-Bulb-Item

In meinem Fall verwende ich Phillips Hue zusammen mit zigbee2mqtt.

//		Schlafzimmer
Group  		igSchlafzimmerLight        			"Schlafzimmer"          		      				(sgBedroom)["Lightbulb", "Group"]									
Color		SchlafzimmerRoom_Farbe				"Farbe"						<ColorLight>			(igSchlafzimmerLight,sgBedroom,tgLSchange)["Control", "Light"]						{ autoupdate="false", channel="mqtt:topic:myMosquitto:HueBulbBedRoom:color", alexa="Color" }
Dimmer		SchlafzimmerRoom_Farbtemperatur		"Farbtemperatur"			<ColorLight>			(igSchlafzimmerLight,tgLSinterrupt,sgBedroom)["Control", "ColorTemperature"]		{ autoupdate="false", channel="mqtt:topic:myMosquitto:HueBulbBedRoom:color_temperature", alexa="ColorTemperature" }
Dimmer		SchlafzimmerRoom_Helligkeit			"Licht"						<DimmableLight>			(igSchlafzimmerLight,tgLSinterrupt,sgBedroom)["Control", "Brightness"]				{ autoupdate="false", channel="mqtt:topic:myMosquitto:HueBulbBedRoom:brightness", alexa="Brightness,PowerState" }
String		SchlafzimmerRoom_Lightshow			"Lightshow"											(igSchlafzimmerLight,tgLightshow,sgBedroom)["Control", "DynamicScene"]				{ alexa="Mode" [capabilityNames="@Setting.Mode",supportedModes="Normal,Kerzenlicht,Polarlicht,Farbwechsel,Zufallsfarben,Gewitter,TV-Simulation"] }
Dimmer		SchlafzimmerRoom_LightshowSpeed		"Geschwindigkeit"									(igSchlafzimmerLight,sgBedroom)["Control", "DynamicSpeed"]							{ alexa="RangeValue" [capabilityNames="Geschwindigkeit,Speed", supportedRange="0:100:10", presets="10=@Value.Low:@Value.Minimum,50=@Value.Medium:Normal,100=@Value.High:@Value.Maximum"] }
String		SchlafzimmerRoom_Interface			"Interface"											(igSchlafzimmerLight)["Control", "Interface"]										{ channel="mqtt:topic:myMosquitto:HueBulbBedRoom:interface" }

Sonnenaufgang-Rule

Die Folgende Regel vollführt den Trick. Dabei greife ich auf eine mathematische Lösung zurück. Das Licht wird über einen bestimmten Zeitraum bis zu einem maximalen Wert aufgedimmt. Alle Schritte dazwischen werden berechnet. Wenn der aktuelle Status zu weit von dem durch dieses System berechneten Status abweicht, wird nicht weiter damit fortgefahren. Dadurch kann der Vorgang manuell durch Ein- oder Ausschalten abgebrochen werden.

/etc/openhab/rules/bedroom-wakeup-light.rules

val int stepTime = 2 //minutes
val int sunriseTime = 30 //minutes
val int maxValue = 60 //%


rule "Wochenprofile ein math"
when
	Time cron "0 0/2 * * * ?"
then {
	if(KalenderWecken_CurrentEventStart.state != UNDEF){
		val eventStarted = (KalenderWecken_CurrentEventStart.state as DateTimeType).getZonedDateTime()
		var double diffSec = (now.toInstant().toEpochMilli() - eventStarted.toInstant().toEpochMilli())/1000
		var double diffMin = diffSec/60
		var double stepPerMin = maxValue/sunriseTime
		
		//Soll-Wert zu dem Zeitpunk
		var double setpoint = diffMin * stepPerMin
		if(setpoint > maxValue){
			setpoint = maxValue
		}
		
		//Untergrenze des Sollwertes
		var double setpointLow = (diffMin - stepTime) * stepPerMin
		if(setpointLow < 0){
			setpointLow = 0
		}
		
		var e = SchlafzimmerBg_Helligkeit
		var actualValue = (e.state as DecimalType).intValue
		
		if(
			actualValue >= setpointLow &&
			actualValue < setpoint
		){
			e.sendCommand(setpoint)
		}
	}
}
end

rule "Wochenprofile aus"
when
	Item KalenderWecken_CurrentEventPresence changed to OFF
then {
	SchlafzimmerRoom_Helligkeit.sendCommand(0)
}
end

Kommentar verfassen

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

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..

Translate »