automatisches Thermostat mit OpenHAB und Danfoss LC-13


Das Thermostat von Danfoss ist jetzt integriert, aber es lässt sich die Themeratur nur manuell einstellen. Nun wäre schön, wenn sich die Temperatur zeitgesteuert automatisch einstellen würde. An den Werktagen benötige ich für meine Zwecke zwei Timer und am Wochenden einen. Jeder Timer hat eine Anfangs- und eine Endezeit. In diesem Zeitraum wird das Thermostat auf die gewählte Komforttemperatur eingestellt. Außerhalb des Zeitraums wird das Thermostat auf die Spartemperatur eingestellt.Da jeder Timer eine Anfangs- und eine Endezeit hat und zusätzlich noch die Komfort- und Spartemperatur konfiguriert werden soll sind 8 Number-Items notwendig.

Number	Thermostat_Kom	"Thermostat_Kom [%.1f]"
Number	Thermostat_Spar	"Thermostat_Spar [%.1f]"
Number	Timer1_Stunde	"Timer1_Stunde [%d]"
Number	Timer1_Minute	"Timer1_Minute [%d]"
Number	Timer2_Stunde	"Timer2_Stunde [%.1f]"
Number	Timer2_Minute	"Timer2_Minute [%.1f]"
Number	Timer3_Stunde	"Timer3_Stunde [%.1f]"
Number	Timer3_Minute	"Timer3_Minute [%.1f]"
Number	Timer4_Stunde	"Timer4_Stunde [%.1f]"
Number	Timer4_Minute	"Timer4_Minute [%.1f]"
Number	Timer5_Stunde	"Timer5_Stunde [%.1f]"
Number	Timer5_Minute	"Timer5_Minute [%.1f]"
Number	Timer6_Stunde	"Timer6_Stunde [%.1f]"
Number	Timer6_Minute	"Timer6_Minute [%.1f]"

Zusätzlich habe ich die Timer- und Temperatureinstellungen in meiner MySQL Datenbank gespeichert und OpenHAB so konfiguriert das beim Neustart die gespeicherten Werte wiederhergestellt werden.

Items {
	Timer1_Stunde : strategy = restoreOnStartup, everyChange
	Timer1_Minute : strategy = restoreOnStartup, everyChange
	Timer2_Stunde : strategy = restoreOnStartup, everyChange
	Timer2_Minute : strategy = restoreOnStartup, everyChange
	Timer3_Stunde : strategy = everyChange, restoreOnStartup
	Timer3_Minute : strategy = restoreOnStartup, everyChange
	Timer4_Stunde : strategy = everyChange, restoreOnStartup
	Timer4_Minute : strategy = restoreOnStartup, everyChange
	Timer5_Stunde : strategy = everyChange, restoreOnStartup
	Timer5_Minute : strategy = restoreOnStartup, everyChange
	Timer6_Stunde : strategy = everyChange, restoreOnStartup
	Timer6_Minute : strategy = restoreOnStartup, everyChange
	Thermostat_Kom : strategy = restoreOnStartup, everyChange
	Thermostat_Spar : strategy = restoreOnStartup, everyChange
}

Nun muss die Sitemap erstellt werden. Ich habe auf der Startseite die beiden Temperaturen dargestellt. In jeweils einem Untermenü sind die Timer für die Wochentage und das Wochenende untergebracht.

sitemap Test label="Main Menu"
{
Frame label="Thermostat" {
				Setpoint item=Thermostat_Kom label="Komfort Temperatur [%.1f C]" icon="heating" minValue=14 maxValue=26 step=0.5				
				Setpoint item=Thermostat_Spar label="Spar Temperatur [%.1f C]" icon="heating" minValue=14 maxValue=26 step=0.5				
			}			
			Frame label="Zeiteinstellungen" {
				Text label="Einstellungen Wochentage" icon="heating" {
					Frame label="Timer 1" {
						Text label="Start Komfort Temperatur" icon="heating"						
						Setpoint item=Timer1_Stunde label="Stunde [%d]" icon="clock" minValue=0 maxValue=23 step=1						
						Setpoint item=Timer1_Minute label="Minute [%d]" icon="clock" minValue=0 maxValue=59 step=5						
						Text label="Ende Komfort Temperatur" icon="heating"						
						Setpoint item=Timer2_Stunde label="Stunde [%d]" icon="clock" minValue=0 maxValue=23 step=1						
						Setpoint item=Timer2_Minute label="Minute [%d]" icon="clock" minValue=0 maxValue=59 step=5						
					}					
					Frame label="Timer 2" {
						Text label="Start Komfort Temperatur" icon="heating"						
						Setpoint item=Timer3_Stunde label="Stunde [%d]" icon="clock" minValue=0 maxValue=23 step=1						
						Setpoint item=Timer3_Minute label="Minute [%d]" icon="clock" minValue=0 maxValue=59 step=5						
						Text label="Ende Komfort Temperatur" icon="heating"						
						Setpoint item=Timer4_Stunde label="Stunde [%d]" icon="clock" minValue=0 maxValue=23						
						Setpoint item=Timer4_Minute label="Minute [%d]" icon="clock" minValue=0 maxValue=59 step=5						
					}					
				}				
				Text label="Einstellungen Wochenende" icon="heating" {
					Frame {
						Text label="Start Komfort Temperatur" icon="heating"						
						Setpoint item=Timer5_Stunde label="Stunde [%d]" icon="clock" minValue=0 maxValue=23 step=1						
						Setpoint item=Timer5_Minute label="Minute [%d]" icon="clock" minValue=0 maxValue=59 step=5						
						Text label="Ende Komport Temperatur" icon="heating"						
						Setpoint item=Timer6_Stunde label="Stunde [%d]" icon="clock" minValue=0 maxValue=23 step=1						
						Setpoint item=Timer6_Minute label="Minute [%d]" icon="clock" minValue=0 maxValue=59 step=5						
					}					
				}
			}
}

Ist das alles erledigt, muss das Regelwerk erstellt werden. Ich habe versucht die Regel so einfach wie möglich zu halten, da sie vielleicht später noch mal gewartet werden muss.
Diese Regel wir einmal pro Minute aufgerufen, immer zur 0. Sekunde. Nun wird geprüft welcher Wochentag ist. Die Funktion now.getDayofWeek gibt für jeden Wochentag eine Zahl zurück. Für Montag die 1, für Dienstag die 2 usw. Ist also DayofWeek kleiner 6 muss ein Wochentag sein, ist DayofWeek größer als 5 ist Wochenende. Nun muss noch die aktuelle Stunde und die aktuelle Minute mit den eingestellten Werten der SetPoint-Items verglichen werden und bei Übereinstimmung wird dem Thermostat die entsprechende Temperatur übermittelt.

rule "Kinderzimmer Thermostat"
when
        Time cron "0 * * * * ?"
then
		var Number komfort = 0.0
		var Number spar = 0.0
		var Number dow = now.getDayOfWeek()

		// Init Komfort Temp
		if (komfort.state == "Uninitialized") 
			{ komfort=20.5 } 
			else
			{ komfort=(komfort.state as DecimalType) }
		
		// Init Spar Temp
		if (spar.state == "Uninitialized")
			{ spar=16.0 } 
			else
			{ spar=(spar.state as DecimalType) }
				
		if dow < 6 
		{
			logInfo("Thermostat Kinderzimmer","Wochenende: nein" )
			
			//Komfort Temp Start
	    	if( Timer1_Stunde.state == now.getHourOfDay() && Timer1_Minute.state == now.getMinuteOfHour() )
	          	{
					logInfo("Thermostat Kinderzimmer","Set Temp: " + komfort.toString)
					sendCommand(Thermostat_Kinderzimmer ,komfort.toString)
				}
			// Komfort Temp Stop
			if( Timer2_Stunde.state == now.getHourOfDay() && Timer2_Minute.state == now.getMinuteOfHour() )
	          	{
	          		logInfo("Thermostat Kinderzimmer","Set Temp: " + spar.toString)
					sendCommand(Thermostat_Kinderzimmer, spar.toString)
				}
			//Komfort Temp Start
	    	if( Timer3_Stunde.state == now.getHourOfDay() && Timer3_Minute.state == now.getMinuteOfHour() )
	          	{
					logInfo("Thermostat Kinderzimmer","Set Temp: " + komfort.toString)
					sendCommand(Thermostat_Kinderzimmer, komfort.toString)
				}
			// Komfort Temp Stop
			if( Timer4_Stunde.state == now.getHourOfDay() && Timer4_Minute.state == now.getMinuteOfHour() )
	          	{
	          		logInfo("Thermostat Kinderzimmer","Set Temp: " + spar.toString)
					sendCommand(Thermostat_Kinderzimmer, spar.toString)
				}
		}	
		else
		{
			logInfo("Thermostat Kinderzimmer","Wochenende: ja" )
			if( Timer5_Stunde.state == now.getHourOfDay() && Timer5_Minute.state == now.getMinuteOfHour() )
	          	{
					logInfo("Thermostat Kinderzimmer","Set Temp: " + komfort.toString)
					sendCommand(Thermostat_Kinderzimmer, komfort.toString)
				}
			// Komfort Temp Stop
			if( Timer6_Stunde.state == now.getHourOfDay() && Timer6_Minute.state == now.getMinuteOfHour() )
	          	{
	          		logInfo("Thermostat Kinderzimmer","Set Temp: " + spar.toString)
					sendCommand(Thermostat_Kinderzimmer, spar.toString)
				}
		}
		
end

Wenn das alles eingerichtet ist, sollte es so aussehen.

Auf der Haupseite sieht man die eingestellten Temperaturen und die Untermenüs für Werktage und Wochenende.


Schreibe einen Kommentar