Beste Vorgehensweise zur Thermostatsteuerung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Connor
Beiträge: 2
Registriert: 26. Nov 2017 13:09

Beste Vorgehensweise zur Thermostatsteuerung

Beitrag von Connor »

Hallo zusammen,

ich habe nach verschiedenen einfachen Schaltern nun ein Thermostat (Eurotronics Spirit) in meine OpenHab-Installation (Snapshot 2.2) eingebunden.
Aufgrund der Fehler, die ich bei den ersten Things und Items in ausreichender Zahl gemacht habe, hat die Inkludierung und die erste Konfiguration des Thermostats nun vergleichsweise fehlerfrei geklappt.
Die Temperatur kann über ein UI und - natürlich - auch über das Thermostat direkt gesteuert werden.
Ich bin nun noch auf der Suche nach der besten - oder zumindest einer sinnvollen - Vorgehensweise für die Konfiguration des Thermostats hinsichtlich der zu den verschiedenen Tageszeiten zu erreichenden Temperaturen.
Auf die erste Idee erscheinen mir die "Rules" als dafür zu kompliziert.

Danke für Eure Unterstützung,
Gruß,

Connor

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Re: Beste Vorgehensweise zur Thermostatsteuerung

Beitrag von seppy »

Hi Connor,
wenn Du nicht die normalerweise eingebaute Steuerung der Thermostate verwenden willst, bleiben Dir nur die Regeln. Vorteil ist dann eben auch die mögliche Anbindung von weiterer "Intelligenz" wie Temperatur, Kalender, Wettervorhersage, etc..
Du konfigurierst dann quasi nicht die Thermostate sondern überlässt die Steuerung der openHAB Regellogik.

Grüße,
Seppy
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Connor
Beiträge: 2
Registriert: 26. Nov 2017 13:09

Re: Beste Vorgehensweise zur Thermostatsteuerung

Beitrag von Connor »

Moin,

@seppy: Danke für Deine Rückmeldung und Deinen Vorschlag.
Scheinbar muss (darf?) ich mich tatsächlich noch einmal ein wenig genauer mit dem Thema regeln beschäftigen.
Da ich allerdings das Thermostat schnell in Betrieb nehmen musste, bin ich nun erst einmal den Weg über das GCal-Binding gegangen.
Das funktioniert erstaunlich gut. Leider habe ich das über CalDav nicht zum Laufen bekommen.

Danke nochmals für die Denkanstöße,
Gruß,

Connor

deranfänger
Beiträge: 45
Registriert: 12. Feb 2018 17:53

Re: Beste Vorgehensweise zur Thermostatsteuerung

Beitrag von deranfänger »

Hallo zusammen,

weiß jemand ein paar mehr Details zu diesem Thema?

ich selber habe openhabian auf einem Raspberry 3 laufen und habe derzeit einen Heizkörperthermostat über z wave am laufen.
Also über die Paper UI und die Basic UI kann ich die Temperatur einstellen.

nun würde ich gern eine Regel dazuschreiben, habe aber keine Ahnung wie ich sowas anfange.

mach ich das am besten mit virtuellen switches? oder kann man Temperatur und Zeit direkt in die Regel schreiben?
Wie würde das mit dem CalDav Binding funktionieren?
und wie würde ich ein Fensterkontakt einbeziehen?

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Re: Beste Vorgehensweise zur Thermostatsteuerung

Beitrag von seppy »

Hi,

hier mal ein Ausschnitt meiner Lösung:

Code: Alles auswählen

/***********************************************************************************
 * HEIZUNGSSTEUERUNG Wohnbereich
 * 
 * Komforttemperatur nach Zeit. Für die automatische Regelung ist ein Zeitfenster von 5 Mins. vorgesehen. In 
 * diesem Zeitraum werden manuelle Regelungen überschrieben. Danach kann bis zum nächsten Steuervorgang die Temperatur 
 * manuell geregelt werden. 
 * 
 * Drei Heizphasen:
 * 1) Morgens um die Räume auf eine angenehme Temperatur zu bringen (6-8 Uhr)
 * 2) Tagsüber auf erweiterter Konforttemperatur
 * 3) Absenktemperatur für die Nacht, je nach Wochentag/Wochenende unterschiedlich
 */
rule "Cron_Heating_Wohnbereich"
when
	Time cron "0 0/5 * * * ?" or
	System started
then
	var Integer hour = now.getHourOfDay
	var Integer min = now.getMinuteOfHour
	var Integer wd = now.getDayOfWeek
	//Prüfen ob Job läuft
	logDebug("HomeBox.HeatingRules:Cron_Heating_Wohnbereich", "JOB läuft")
	//Sicherstellen, dass die Temperaturstufen gesetzt sind
	if (GlobalHeatingSetBackTemp.state !== NULL && GlobalHeatingComfortTemp1.state !== NULL && GlobalHeatingComfortTemp2.state !== NULL){
		// Wochentags (Mo - Fr)
		if (GlobalHeatingPeriod.state.equals(ON) && wd <= 5){
			logDebug("HomeBox.HeatingRules:Cron_Heating_Wohnbereich", "Parameter für Heizungssteuerung: Heizperiode=ON, Wochentag=" + wd + ", Uhrzeit: " + hour + ":" + min)
			//6:00 Uhr Aufheizperiode Wohnbereich 
			if ((hour == 6 && min <= 5) && gEGWohnbereichTargetTemp.state != GlobalHeatingComfortTemp1.state) {
				logInfo("HomeBox.HeatingRules:Cron_Heating_Wohnbereich", "Setze Temperatur Wohnbereich auf Komforttemperatur " + GlobalHeatingComfortTemp1.state.toString + "°C geregelt")
				gEGWohnbereichTargetTemp.sendCommand(GlobalHeatingComfortTemp1.state as Number)				
			} 
			//23:00 Uhr außer Freitag Absenktemperatur zur Nacht 
			else if ((hour == 23 && min <= 5 && wd < 5) && gEGWohnbereichTargetTemp.state != GlobalHeatingSetBackTemp.state) {
				logInfo("HomeBox.HeatingRules:Cron_Heating_Wohnbereich", "Setze Temperatur Wohnbereich auf Absenktemperatur " + GlobalHeatingSetBackTemp.state.toString + "°C geregelt")
				gEGWohnbereichTargetTemp.sendCommand(GlobalHeatingSetBackTemp.state as Number)
			}
			//23:50 Uhr Freitag Absenktemperatur zur Nacht 
			else if ((hour == 23 && min <= 55 && wd == 5) && gEGWohnbereichTargetTemp.state != GlobalHeatingSetBackTemp.state) {
				logInfo("HomeBox.HeatingRules:Cron_Heating_Wohnbereich", "Setze Temperatur Wohnbereich auf Absenktemperatur " + GlobalHeatingSetBackTemp.state.toString + "°C geregelt")
				gEGWohnbereichTargetTemp.sendCommand(GlobalHeatingSetBackTemp.state as Number)
			} 
		}
		// Wochenende (Sa - So)
		else if (GlobalHeatingPeriod.state.equals(ON) && wd >= 6){
			logDebug("HomeBox.HeatingRules:Cron_Heating_Wohnbereich", "Parameter für Heizungssteuerung: Heizperiode=ON, Wochentag=" + wd)
			//8:00 Uhr Aufheizperiode Wohnbereich
			if ((hour == 8 && min <= 5) && gEGWohnbereichTargetTemp.state != GlobalHeatingComfortTemp1.state) {
				gEGWohnbereichTargetTemp.sendCommand(GlobalHeatingComfortTemp1.state as Number)
				logInfo("HomeBox.HeatingRules:Cron_Heating_Wohnbereich", "Temperatur Wohnbereich auf Komforttemperatur " + GlobalHeatingComfortTemp1.state.toString + "°C geregelt")
			} 
			//Samstag 23:50 Uhr Absenktemperatur zur Nacht 
			else if ((hour == 23 && min <= 55 && wd == 6) && gEGWohnbereichTargetTemp.state != GlobalHeatingSetBackTemp.state) {
				gEGWohnbereichTargetTemp.sendCommand(GlobalHeatingSetBackTemp.state as Number)
				logInfo("HomeBox.HeatingRules:Cron_Heating_Wohnbereich", "Temperatur Wohnbereich auf Absenktemperatur " + GlobalHeatingSetBackTemp.state.toString + "°C geregelt")
			}
			//Sonntag 20:00 Uhr Absenktemperatur zur Nacht 
			else if ((hour == 23 && min <= 5 && wd == 7) && gEGWohnbereichTargetTemp.state != GlobalHeatingSetBackTemp.state) {
				gEGWohnbereichTargetTemp.sendCommand(GlobalHeatingSetBackTemp.state as Number)
				logInfo("HomeBox.HeatingRules:Cron_Heating_Wohnbereich", "Temperatur Wohnbereich auf Absenktemperatur " + GlobalHeatingSetBackTemp.state.toString + "°C geregelt")
			}
		}
		logDebug("HomeBox.HeatingRules:Cron_Heating_Wohnbereich", "Prüfung erfolgreich")
	}
end

/***********************************************************************************
 * Ereignissteuerung bei geöffneter Tür im Wohnbereich
 * 
 * Wir im Wohnbereich eine Tür während der Heizperiode geöffnet und ist länger als
 * 5 Minuten geöffnet, werden alle Heizkörper abgeschaltet. 
 * Sobald alle Türen wieder geschlossen sind, wird die ursprüngliche Temperatur
 * wieder hergestellt. 
 */
rule "Event_WohnbereichDoor_open"
when
	Item InnenEGEsszimerTuersensorLinks changed or
	Item InnenEGEsszimerTuersensorRechts changed or
	Item EGKuecheTuersensorState changed or 
	Item EGWohnzimmerTuersensorState changed
then
	//Sämtliche Logik nur ausführen, wenn Heizperiode und der Ofen aus ist.
	if(GlobalHeatingPeriod.state == ON && GlobalFireplace.state == OFF){
		// Kein Timer läuft und alle Fenster sind geschlossen --> Wiederherstellen der letzten Temperatur
		if (previousState == OPEN && doorOpenTimerWohnbereich === null && InnenEGEsszimerTuersensorLinks.state == CLOSED && InnenEGEsszimerTuersensorRechts.state == CLOSED && EGKuecheTuersensorState.state == CLOSED && EGWohnzimmerTuersensorState.state == CLOSED){
			logInfo("HomeBox.HeatingRules:Event_WohnbereichDoor_open", "Alle Fenster und Türen im Wohnbereich geschlossen, setze letzte Zieltemperatur")
			//States wiederherstellen
			gEGWohnbereichTargetTemp.sendCommand(sysWohnbereichTargetTempState.state as Number)
		} 
		// Kein Timer läuft und ein Fenster wird geöffnet
		else if (doorOpenTimerWohnbereich === null && (InnenEGEsszimerTuersensorLinks.state == OPEN || InnenEGEsszimerTuersensorRechts.state == OPEN || EGKuecheTuersensorState.state == OPEN || EGWohnzimmerTuersensorState.state == OPEN)){
			logInfo("HomeBox.HeatingRules:Event_WohnbereichDoor_open", "Fenster oder Tür im Wohnbereich geöffnet")
			//Aktuelle Zieltemperatur speichern
			//States speichern
			sysWohnbereichTargetTempState.postUpdate(gEGWohnbereichTargetTemp.state as Number)
			logInfo("HomeBox.HeatingRules:Event_WohnbereichDoor_open", "gEGWohnbereichTargetTemp " + sysWohnbereichTargetTempState.state.toString + "°C gespeichert")
			//Timer mit gewünschtem Delay (doorOpenDelay) setzen
			doorOpenTimerWohnbereich = createTimer(now.plusSeconds(doorOpenDelay)) [|
				logInfo("HomeBox.HeatingRules:Event_WohnbereichDoor_open", "Delay " + doorOpenDelay + " verstrichen ,schalte Heizkörper aus")
				gEGWohnbereichTargetTemp.sendCommand(0)
				doorOpenTimerWohnbereich.cancel()
			]
			logInfo("HomeBox.HeatingRules:Event_WohnbereichDoor_open", "Starte Timer mit Delay " + doorOpenDelay)
		}
		// Timer läuft und alle Türen sind wieder geschlossen
		else if (previousState == OPEN && doorOpenTimerWohnbereich !== null && InnenEGEsszimerTuersensorLinks.state == CLOSED && InnenEGEsszimerTuersensorRechts.state == CLOSED && EGKuecheTuersensorState.state == CLOSED && EGWohnzimmerTuersensorState.state == CLOSED){
			logInfo("HomeBox.HeatingRules:Event_WohnbereichDoor_open", "Alle Fenster und Türen im Wohnbereich geschlossen, setze letzte Zieltemperatur (" + sysWohnbereichTargetTempState.state.toString + "°C)")
			//States wiederherstellen
			gEGWohnbereichTargetTemp.sendCommand(sysWohnbereichTargetTempState.state as Number)
			logInfo("HomeBox.HeatingRules:Event_WohnbereichDoor_open", "Beende laufenden Timer")
			doorOpenTimerWohnbereich.cancel()
			doorOpenTimerWohnbereich = null	
		}
		// Timer läuft und weitere Tür wird geöffnet
		else if (previousState == CLOSED && doorOpenTimerWohnbereich !== null) {
			logInfo("HomeBox.HeatingRules:Event_WohnbereichDoor_open", "Laufenden Timer gefunden, starte erneut mit Delay  " + doorOpenDelay)
			doorOpenTimerWohnbereich.reschedule(now.plusSeconds(doorOpenDelay))		
		}
	}
end

/***********************************************************************************
 * Steuerung über Wandthermostat
 * 
 * Die Steuerung über das Wandthermostat übersteuert die Zeitsteuerung. Sie wirkt
 * immer, dass heißt auch wenn bei deaktivierter Heizperiode die Zieltemperatur
 * verändert wird, werden die Heizkörper angeschaltet.
 *
 * Ausnahme: Der Ofen (GlobalFirePlace == ON)
 */
 rule "Event_WT_change"
 when
 	Item EGWohnzimmerWTTargetTemp changed
 then
 	if(GlobalFireplace.state == OFF){
	 	logInfo("HomeBox.HeatingRules:Event_WT_change", "Temperatur am WT oder manuell geregelt: " + EGWohnzimmerWTTargetTemp.state.toString + "°C")
		EGWohnzimmerManuMode.sendCommand(EGWohnzimmerWTTargetTemp.state as Number)
		logInfo("HomeBox.HeatingRules:Event_WT_change", "Setze Betriebsmodus MANUELL: " + EGWohnzimmerManuMode.state.toString + "°C")
	 	InnenEGEsszimmerHKTTargetTemp.sendCommand(EGWohnzimmerWTTargetTemp.state as Number)
	 	InnenEGWohnzimmerHKTLinksTargetTemp.sendCommand(EGWohnzimmerWTTargetTemp.state as Number)
	 	InnenEGWohnzimmerHKTRechtsTargetTemp.sendCommand(EGWohnzimmerWTTargetTemp.state as Number)
	 	logInfo("HomeBox.HeatingRules:Event_WT_change", "Zieltemperatur Wohnbereich auf " + EGWohnzimmerWTTargetTemp.state + "°C geregelt")
		if (GlobalHeatingPeriod.state == OFF) {
			pushover('Heizung im Wohnbereich außerhalb der Heizperiode aktiviert!')
		}
	 }
 end
Läuft bei mir seit drei Jahren. Neu ist die Ofensteuerung. Ich habe das Wanddthermostat in der Nähe des Ofens. Wenn dort die Temperatur in der Heitperiode über 24C°steigt, weiß ich mit Sicherheit das der Ofen an ist und die Heizung wird runtergefahren:

Code: Alles auswählen

/**
 * Ofen Erkennung
 * 
 * Bei überproportionalem Temperaturanstieg am Wandthermostat kann man davon ausgehen, dass der
 * Ofen angeheizt wurde
 */
rule "Event_Ofen_an"
when
	Item EGWohnzimmerWTCurrTemp changed
then
	if(GlobalHeatingPeriod.state == ON){
		var Integer hour = now.getHourOfDay
		var Integer min = now.getMinuteOfHour
		
		if ((EGWohnzimmerWTCurrTemp.state as Number) >= (GlobalHeatingComfortTemp1.state as Number) && GlobalFireplace.state == OFF) {
			logInfo("HomeBox.HeatingRules:Event_Ofen_an", "Temperatur Wandthermostat > " + GlobalHeatingComfortTemp1.state.toString + "°C (Komforttemperatur) => Ofen an, setze Heizkörper Wohnbereich 0°C")
			pushover("HomeBox Ofenerkennung: Temperatur Wandthermostat > " + GlobalHeatingComfortTemp1.state.toString + "°C (Komforttemperatur) => Ofen an, setze Heizkörper Wohnbereich 0°C")
			GlobalFireplace.sendCommand(ON)
			//States speichern
			sysWohnbereichTargetTempState.postUpdate(gEGWohnbereichTargetTemp.state as Number)
			gEGWohnbereichTargetTemp.sendCommand(0)
		} else if ((EGWohnzimmerWTCurrTemp.state as Number) < (GlobalHeatingComfortTemp1.state as Number) && GlobalFireplace.state == ON) {
			logInfo("HomeBox.HeatingRules:Event_Ofen_an", "Ofen aus, stelle letzten Zustand wieder her")
			GlobalFireplace.sendCommand(OFF)
			
			//Prüfen ob nicht schon Absenktemperatur bleiben kann
			if (hour <= 23 && min <= 5){
				//State wiederherstellen
				gEGWohnbereichTargetTemp.sendCommand(sysWohnbereichTargetTempState.state as Number)
				pushover("HomeBox Ofenerkennung: Ofen aus, stelle letzten Zustand wieder her (" + sysWohnbereichTargetTempState.state.toString + "°C)")
			}			
		}
	}
end
Viele Grüße,
Seppy
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

Antworten