ich benötige Eure Hilfe bei der Realisierung meiner Heizungsregelung. Aber fangen wir ganz vorne an.
Aktueller IST-Zustand:
Ich habe an allen Heizkörpern in meinem Haus Eurotronic Spirits verbaut. Diese werden aktuell noch händisch über die sitemap eingestellt, also das Einstellen der Soll-Temperatur, Heizkörper AN oder Aus, etc. Einzig die Spirits in den Badezimmern werden mittels einer Rule getriggert.
Dort ist eine Heizzeit festgelegt und wenn in dieser Zeit das Fenster geöffnet wird geht der Heizkörper aus.
Hier mal ein Ausschnitt aus der rule für einen Heizkörper.
heizkörper.rules
Code: Alles auswählen
var Timer fenstertimer = null // Timervariable definieren
// Heizzeit für Heizkörper Badezimmer oben
rule "Heizung Bad oben"
when
Time cron "0 0 5 * * ?" or // Triggere täglich um 5 Uhr
Time cron "0 0 23 * * ?" or // Triggere täglich um 23 Uhr
Item Fenster_Bad_oben_Status changed // Triggere wenn der Fensterkontakt geschaltet hat
then
if(now.getHourOfDay > 4 && now.getHourOfDay < 23) { // Innerhalb des Zeitfensters?
if(Fenster_Bad_oben_Status.state != CLOSED) { // Fenster offen oder nicht initialisiert?
BDO_Heizung_Mode.sendCommand(0)
logInfo("Heizung", "Fenster im Bad oben geöffnet und Heizkörper abgedreht")
fenstertimer = createTimer(now.plusMinutes(10), [| // Starte Timer für Meldung
sendPushoverMessage(pushoverBuilder("Info, Fenster Bad oben 10 Min. geöffnet").withDevice("iPhoneXR"))
fenstertimer = null
]) // Lambda in die Funktion verschoben, Lesbarkeit des Codes
} else { // Fenster ist geschlossen!
BDO_Heizung_Mode.sendCommand(1)
logInfo("Heizung", "Fenster im Bad oben geschlossen und Heizkörper aufgedreht")
if(fenstertimer !== null) { // Timer läuft?
fenstertimer.cancel // Timer abbrechen
fenstertimer = null
}
}
}
else { // Außerhalb des Zeitfensters, Heizung aus!
BDO_Heizung_Mode.sendCommand(0)
logInfo("Heizung", "Nachtmodus Bad oben")
if(fenstertimer !== null) { // Timer läuft?
fenstertimer.cancel // Timer abbrechen
fenstertimer = null
}
}
end
Vor einiger Zeit habe ich im englischsprachigen openhab Forum einen Beitrag bzw. ein Howto über einer Heizungsregelung von Thom Dietrich gefunden (https://community.openhab.org/t/heating ... odes/34843).
Diese entspricht im Prinzip schon meinen Vorstellungen, allerdings würde ich diese gerne noch um folgende Punkte erweitern:
- Eine Festgelegte Heizzeit. Innerhalb der Heizzeit stellen sich die Thermostate auf den Modus "HEAT", Außerhalb in den Mode "OFF".
- Sommermodus. Sofern ich den Mode OFF_SUMMER setze sollen ebenfalls alle Thermostate in den Mode "OFF" gehen und dort bleiben, bis ein anderen Mode gesetzt wird.
- Fenster-offen Erkennung. Wird innerhalb der Heizzeit z.B. im Bad das Fenster geöffnet soll der Heizkörper so lange aus gehen bis das Fenster wieder geschlossen wird.
Nun stellt sich mir die Frage wieviel man in einer rule unterbringen kann, bzw. wie man dies am sinnvollsten angeht.
Ich habe als erstes man angefangen, die nötigen items gemäß des Howtos anzulegen.
Hier findet Ihr einen Ausschnitt für einen Heizkörper. Die weiteren Heizkörper sind natürlich identisch aufgebaut.
Eurotronic.items
Code: Alles auswählen
Number BDO_Heizung_ActTemp "BDO_Heizung Ist-Temperatur [%.1f °C]" <temperature> { channel="zwave:device:e16eec95:node35:sensor_temperature", autoupdate="false" }
Number BDO_Heizung_Mode "BDO_Heizung Thermostatmodusmodus" <temperature> (Heating_Mode) { channel="zwave:device:e16eec95:node35:thermostat_mode", autoupdate="false" }
Number BDO_Heizung_SetTemp "BDO_Heizung Solltemperatur [%.1f °C]" <temperature> (Heating_TargetTemps) { channel="zwave:device:e16eec95:node35:thermostat_setpoint_heating", autoupdate="false" }
Number BDO_Heizung_SetTempEco "BDO_Heizung Solltemperatur Eco [%.1f °C]" <temperature> (Heating_TargetTempsEco) { channel="zwave:device:e16eec95:node35:thermostat_setpoint_heating_econ", autoupdate="false" }
Dimmer BDO_Heizung_Valve "BDO_Heizung Ventilstellung [%d %%]" <heating> { channel="zwave:device:e16eec95:node35:switch_dimmer", autoupdate="false" }
Number BDO_Heizung_Battery "BDO_Heizung Batteriezustand [%s %%]" <battery> { channel="zwave:device:e16eec95:node35:battery-level", autoupdate="false" }
Switch BDO_Heizung_AlarmSystem "BDO_Heizung Alarm (System)" { channel="zwave:device:e16eec95:node35:alarm_system", autoupdate="false" }
Switch BDO_Heizung_Alarm_Power "BDO_Heizung Alarm (Power)" { channel="zwave:device:e16eec95:node35:alarm_power", autoupdate="false" }
Number BDO_Heizung_ExtTemp "BDO_Heizung Aktuelle Temperatur extern" <temperature> { channel="zwave:device:e16eec95:node35:sensor_report", autoupdate="false" }
String BDO_Heizung_ActTemp_SetTemp "BDO_Heizung Akt-Temp / Soll-Temp [%s]" <temperature> (Heating_Ist_Soll)
Number BDO_PresetTempNormal "BDO_Heizung Soll-Temperatur Zeitprogramm (Normal Mode) [%.1f °C]" (Heating_TargetPresets)
System.items
Code: Alles auswählen
String Whg_Heating_Mode "Wohnung Heizmodus [%s]" <heating> (Whg)
Switch Whg_Heating_UpdateHeater "Sende Soll-Temperaturen an Heizkörper" <heating> (Whg)
Heizung-modus.rules
Code: Alles auswählen
val String filename = "Heizung-modus.rules"
// vordefinierte Temperaturen
val Number tempHigh = 23.0
val Number tempComfort = 21.0
val Number tempMid = 19.0
val Number tempLower = 17.0
val Number tempAway = 15.0
rule "Initialisiere noch nicht initialisierte virtuelle Items"
when
Time cron "0 03 23 * * ?"
then
createTimer(now.plusSeconds(180)) [ |
logInfo(filename, "Whg_Heating system gestartet")
if (Whg_Heating_Mode.state == NULL) Whg_Heating_Mode.postUpdate("NORMAL")
Heating_TargetPresets.members.filter[item | item.state == NULL].forEach[item | item.postUpdate(21.0)]
Whg_Heating_UpdateHeater.sendCommand(ON)
]
end
rule "Überprüfung der Heizzeit"
when
Time cron "0 0 5 * * ?" or //Triggere täglich um 5 Uhr
Time cron "0 0 23 * * ?" or //Triggere täglich um 23 Uhr
then
if(now.getHourOfDay > 4 && now.getHourOfDay < 23) { //Innerhalb des Zeitfensters?
if(Whg_Heating_Mode.state == "NORMAL" || Whg_Heating_Mode.state == "URLAUB" || Whg_Heating_Mode.state == "SICKDAY") { //Modus Normal, Urlaub oder Sickdday aktiviert?
BDO_Heizung_Mode.sendCommand(1) //Setze Heizkröper in den Heat Modus
}
else(Whg_Heating_Mode.state == "OFF_SUMMER") { //Falls die oben Parameter nicht passen oder der Sommermodus aktiviert ist
BDO_Heizung_Mode.sendCommand(0) //Setze die Heizkörper in den Modus AUS
}
}else {
BDO_Heizung_Mode.sendCommand(0) // Heizkörper AUS, da außerhalb der Heizzeit
}
end
rule "Heizmodus umschalten und Stellglieder setzen"
when
Item Whg_Heating_Mode received update or
Item Whg_Heating_UpdateHeater received command ON
then
Whg_Heating_UpdateHeater.postUpdate(OFF)
logInfo(filename, "Wohnung Heizmodus: " + Whg_Heating_Mode.state)
switch Whg_Heating_Mode.state {
case "NORMAL" : {
BDO_Heizung_SetTemp.sendCommand(BDO_PresetTempNormal.state as Number)
}
case "URLAUB": {
BDO_Heizung_SetTemp.sendCommand(tempComfort)
}
case "SICKDAY": {
BDO_Heizung_SetTemp.sendCommand(tempHigh)
}
case "OFF_SUMMER": {
BDO_Heizung_Mode.sendCommand(0)
}
default: { logError(filename, "Wohnung Heizmodus ungültig: " + Whg_Heating_Mode.state) }
}
end
// Whg_Heating_Mode NORMAL Zeitprogramm
rule "MON-FRI, 05:01"
when
Time cron "0 1 5 ? * MON-FRI *"
then
logInfo(filename, "Wohnung Heizmodus: Zeitprogramm: " + now.toString)
BDO_PresetTempNormal.postUpdate(21.0)
Whg_Heating_UpdateHeater.sendCommand(ON)
end
rule "SAT-SUN, 06:00"
when
Time cron "0 0 6 ? * SAT,SUN *"
then
logInfo(filename, "Wohnung Heizmodus: Zeitprogramm: " + now.toString)
BDO_PresetTempNormal.postUpdate(21.0)
Whg_Heating_UpdateHeater.sendCommand(ON)
end
Ich habe mich damit beschäftigt, hier der aktuelle Stand:
Heizung-modus.rules --> Teilweise zusammengefasst
Code: Alles auswählen
rule "Heizungsmodus"
when
Time cron "0 0 5 * * ?" or
Time cron "0 0 23 * * ?" or
Item Whg_Heating_Mode received update or
Item Whg_Heating_UpdateHeater received command ON
then
if(now.getHourOfDay > 4 && now.getHourOfDay < 23) {
if(Whg_Heating_Mode.state == "NORMAL" || Whg_Heating_Mode.state == "URLAUB" || Whg_Heating_Mode.state == "SICKDAY") {
logInfo("Heizung", "Heating Mode: " + Whg_Heating_Mode.state)
BDO_Heizung_Mode.sendCommand(1)
Whg_Heating_UpdateHeater.postUpdate(OFF)
switch Whg_Heating_Mode.state {
case "NORMAL": {
BDO_Heizung_SetTemp.sendCommand(BDO_PresetTempNormal.state as Number)
}
case "URLAUB": {
BDO_Heizung_SetTemp.sendCommand(tempComfort)
}
case "SICKDAY": {
BDO_Heizung_SetTemp.sendCommand(tempHigh)
}
case "OFF_SUMMER": {
Heating_Mode.sendCommand(0)
}
default : { logError(filename, "Heating Mode unknown: " + Whg_Heating_Mode.state) }
}
}else(Whg_Heating_Mode.state == "OFF_SUMMER") {
logInfo("Heizung", "Heating Mode: " + Whg_Heating_Mode.state)
Whg_Heating_UpdateHeater.postUpdate(OFF)
BDO_Heizung_Mode.sendCommand(0)
}
}else {
logInfo("Heizung", "Nachtmodus Whg")
Whg_Heating_UpdateHeater.postUpdate(OFF)
Heating_Mode.sendCommand(0)
}
end
Schreibe ich diese in einer separaten rule? Wie sieht es dann in dieser rule mit der Heizzeit aus? Wäre das doppelt gemoppelt oder muss man diese sogar nochmal hinzufügen?
Ich bin aktuell ziemlich überfordert und weiß ehrlich gesagt gar nicht mehr wo in anfangen soll. Ich hoffe das Ihr mir bei der Realisierung meines Vorhabens helfen könnt. Ich danke euch schon mal im voraus!!!