- Platform information:
- Hardware: Raspberry Pi 4
- OS: Raspbian Bullseye
- Java Runtime Environment: openjdk 11.0.14 2022-01-18
- openHAB version: 3.2.0
- Issue of the topic:
Every morning and evening I switch all my thermostates from “day” to “night” and back which basically means: Night temp: 18 °C and day temperature the last user set temperature.
Sometimes openHAB forgets to set the temperature of one thermostate. I.e. it still is set to 18 °C although we have reached the “day” program. - Please post configurations (if applicable):
I tried to shorten the rules as much as possible but in order to give you the full picture I had to post nearly all rules.
The init:
import java.util.Map
val Map<String, String> shellies = newHashMap
rule "IP Adressen festlegen"
when
System started
then
shellies.put("Keller", "192.168.188.66")
shellies.put("WC", "192.168.188.70")
shellies.put("Wohnzimmer", "192.168.188.68")
shellies.put("Kinderzimmer", "192.168.188.74")
shellies.put("Treppenhaus", "192.168.188.67")
shellies.put("Buero", "192.168.188.72")
shellies.put("BadDG", "192.168.188.69")
shellies.put("BadOG", "192.168.188.71")
shellies.put("Spielzimmer", "192.168.188.73")
shellies.put("Schlafzimmer", "192.168.188.75")
end
Day/Night switch:
rule "Fussbodenheizung: Nachtabsenkung"
when
Time cron "0 30 22 1/1 * ? *"
then
if(vIt_HZ_AusserHaus.state==OFF) {
vIt_HZ_Tag.sendCommand('OFF')
logInfo("Fussbodenheizung: Nachtabsenkung", "Nachtabsenkung aktiviert")
}
end
rule "Fussbodenheizung: Tagesprogramm"
when
Time cron "0 30 5 1/1 * ? *"
then
if(vIt_HZ_AusserHaus.state==OFF) {
vIt_HZ_Tag.sendCommand('ON')
logInfo("Fussbodenheizung: Tagesprogramm", "Tagesprogramm gestartet")
}
end
Now let us iterate through all thermostates:
rule "Fussbodenheizung: Tagesprogramm Temperaturen ändern"
when
Item vIt_HZ_Tag changed
then
gSollTemperaturen.members.forEach[ v_Heizung_Soll |
var String raumName = v_Heizung_Soll.name.split("_").get(3)
var v_Heizung_SollAnwender = gAnwenderSollTemperaturen.members.findFirst[ i | i.name.toString.contains(raumName) ] as NumberItem
if(vIt_HZ_Tag.state == ON) {
v_Heizung_Soll.sendCommand(v_Heizung_SollAnwender.state as Number)
} else {
v_Heizung_Soll.sendCommand(vIt_HZ_SollTempNacht.state as Number)
}
]
logInfo("Fussbodenheizung: Tagesprogramm Temperaturen ändern", "Alle Thermostate haben die Temperatur für das " + vIt_HZ_Tag.state + "-Programm erhalten")
end
And now the temperature settings “cascade” until they get sent to the shellies:
rule "Fussbodenheizung: Abschalt-/Einschaltwert neu berechnen"
when
Member of gSollTemperaturen received update
then
var v_Heizung_Soll = triggeringItem
var Double Hysterese = (vIt_HZ_Hysterese.state as Number).doubleValue()
var Double Abschaltwert = (v_Heizung_Soll.state as Number).doubleValue() + Hysterese
var Double Einschaltwert = Abschaltwert - 2 * Hysterese
var String roomName = v_Heizung_Soll.name.split("_").get(3)
val v_Heizung_Abschalt = gAbschaltTemperaturen.members.findFirst[ i | i.name.toString.contains(roomName) ] as NumberItem
val v_Heizung_Einschalt = gEinschaltTemperaturen.members.findFirst[ i | i.name.toString.contains(roomName) ] as NumberItem
logInfo("Fussbodenheizung: Abschalt-/Einschaltwert neu berechnen", "Solltemperatur geändert für " + roomName + ": " + v_Heizung_Soll.state + " °C")
// Heizungstimer abbrechen, falls Temperatur manuell geandert wird, bevor der Timer abgelaufen war
val GroupItem a_Heizung_Timer = gHeizungsTimer.members.findFirst[ timer | timer.name.toString.contains(roomName)] as SwitchItem
if(a_Heizung_Timer !== null) {
// Dieser Raum hat einen Ruecksetztimer (wahrscheinlich alle ausser das Treppenhaus)
if(a_Heizung_Timer.state == ON) {
a_Heizung_Timer.postUpdate(OFF)
logInfo("Fussbodenheizung: Abschalt-/Einschaltwert neu berechnen", "Timer " + a_Heizung_Timer.name + " wurde abgebrochen aufgrund manueller Temperaturaenderung.")
}
}
v_Heizung_Abschalt.sendCommand(Abschaltwert)
v_Heizung_Einschalt.sendCommand(Einschaltwert)
end
rule "Fussbodenheizung: Abschalt-/Einschaltwert an ein Shelly versenden"
when
Member of gEinschaltTemperaturen changed
then
var v_Heizung_Einschalt = triggeringItem
var String roomName = v_Heizung_Einschalt.name.split("_").get(3)
val v_Heizung_Abschalt = gAbschaltTemperaturen.members.findFirst[ i | i.name.toString.contains(roomName) ] as NumberItem
if(v_Heizung_Einschalt.state == NULL || v_Heizung_Abschalt.state == NULL) {
return;
}
var String ipAddress = shellies.get(roomName)
// http Befehl an Shelly senden
var String httpString = ""
httpString = "http://"+ipAddress+"/settings/ext_temperature/0?undertemp_threshold_tC=" + String::format("%.2f",(v_Heizung_Einschalt.state as Number).doubleValue())
sendHttpGetRequest(httpString)
httpString = "http://"+ipAddress+"/settings/ext_temperature/0?overtemp_threshold_tC=" + String::format("%.2f",(v_Heizung_Abschalt.state as Number).doubleValue())
sendHttpGetRequest(httpString)
logInfo("Fussbodenheizung: Abschalt-/Einschaltwert an ein Shelly versenden", "Neue Einschalttemperatur im Raum " + roomName + ": " + v_Heizung_Einschalt.state)
logInfo("Fussbodenheizung: Abschalt-/Einschaltwert an ein Shelly versenden", "Neue Abschalttemperatur im Raum " + roomName + ": " + v_Heizung_Abschalt.state)
Thread::sleep(1000)
end
- If logs where generated please post these here using code fences:
The log is very important here now. The temperature was not set for “Keller”.
2022-05-27 05:30:00.999 [INFO ] [ript.Fussbodenheizung: Tagesprogramm] - Tagesprogramm gestartet
2022-05-27 05:30:01.045 [INFO ] [bschalt-/Einschaltwert neu berechnen] - Solltemperatur geändert für Keller: 20.5 °C
2022-05-27 05:30:01.071 [INFO ] [g: Tagesprogramm Temperaturen ändern] - Alle Thermostate haben die Temperatur für das ON-Programm erhalten
2022-05-27 05:30:01.072 [INFO ] [bschalt-/Einschaltwert neu berechnen] - Solltemperatur geändert für Treppenhaus: 19.5 °C
2022-05-27 05:30:01.101 [INFO ] [bschalt-/Einschaltwert neu berechnen] - Solltemperatur geändert für Wohnzimmer: 21.0 °C
2022-05-27 05:30:01.126 [INFO ] [bschalt-/Einschaltwert neu berechnen] - Solltemperatur geändert für BadDG: 21.0 °C
2022-05-27 05:30:01.155 [INFO ] [bschalt-/Einschaltwert neu berechnen] - Solltemperatur geändert für BadOG: 21.0 °C
2022-05-27 05:30:01.180 [INFO ] [bschalt-/Einschaltwert neu berechnen] - Solltemperatur geändert für WC: 21.0 °C
2022-05-27 05:30:01.208 [INFO ] [bschalt-/Einschaltwert neu berechnen] - Solltemperatur geändert für Buero: 21.0 °C
2022-05-27 05:30:01.233 [INFO ] [bschalt-/Einschaltwert neu berechnen] - Solltemperatur geändert für Spielzimmer: 21.0 °C
2022-05-27 05:30:01.251 [INFO ] [bschalt-/Einschaltwert neu berechnen] - Solltemperatur geändert für Kinderzimmer: 21.0 °C
2022-05-27 05:30:01.269 [INFO ] [bschalt-/Einschaltwert neu berechnen] - Solltemperatur geändert für Schlafzimmer: 21.0 °C
2022-05-27 05:30:01.918 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Einschalttemperatur im Raum Treppenhaus: 19.2
2022-05-27 05:30:01.921 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Abschalttemperatur im Raum Treppenhaus: 19.8
2022-05-27 05:30:04.730 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Einschalttemperatur im Raum Wohnzimmer: 20.7
2022-05-27 05:30:04.732 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Abschalttemperatur im Raum Wohnzimmer: 21.3
2022-05-27 05:30:06.532 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Einschalttemperatur im Raum BadDG: 20.7
2022-05-27 05:30:06.551 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Abschalttemperatur im Raum BadDG: 21.3
2022-05-27 05:30:08.291 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Einschalttemperatur im Raum BadOG: 20.7
2022-05-27 05:30:08.295 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Abschalttemperatur im Raum BadOG: 21.3
2022-05-27 05:30:10.133 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Einschalttemperatur im Raum WC: 20.7
2022-05-27 05:30:10.136 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Abschalttemperatur im Raum WC: 21.3
2022-05-27 05:30:12.918 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Einschalttemperatur im Raum Buero: 20.7
2022-05-27 05:30:12.921 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Abschalttemperatur im Raum Buero: 21.3
2022-05-27 05:30:14.633 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Einschalttemperatur im Raum Spielzimmer: 20.7
2022-05-27 05:30:14.636 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Abschalttemperatur im Raum Spielzimmer: 21.3
2022-05-27 05:30:16.456 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Einschalttemperatur im Raum Kinderzimmer: 20.7
2022-05-27 05:30:16.465 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Abschalttemperatur im Raum Kinderzimmer: 21.3
2022-05-27 05:30:18.296 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Einschalttemperatur im Raum Schlafzimmer: 20.7
2022-05-27 05:30:18.298 [INFO ] [inschaltwert an ein Shelly versenden] - Neue Abschalttemperatur im Raum Schlafzimmer: 21.3
We see that the lower/upper temperatures were calculated for the room “Keller” as we can see in the message at 2022-05-27 05:30:01.045
but this information is not further propagated. The rule Einschaltwert an ein Shelly versenden
is not calculated for this room.
Is this probably a threading issue? I hoped to workaround this issue with the Thread:sleep(1000)
command in the rule Fussbodenheizung: Abschalt-/Einschaltwert neu berechnen
but it did not help.
Any ideas?
Best,
Oliver
PS. Parts of the code are inspired from this project Thermostatsteuerung by kriwanek