Re: Hilfe bei einer Rule
Verfasst: 30. Jan 2024 02:15
Also, der Channel ist als Typ Number:Temperature angegeben, dann sollte das passende Item ebenfalls von diesem Typ sein:
Die Metadaten unit gibt es seit openHAB4.0 und sie sind für QuantityType (bzw. UoM) Items nicht optional. Das angegebene Pattern sollte openHAB selbst setzen, aber sicher ist sicher.
Die Rule habe ich noch mal etwas angepasst:
Bevor der Timer überhaupt gestartet wird, initialisiert die Rule alle Heizungsitems mit 18 als Wert. Falls Du sicher sein kannst, dass alle Items eine gültige Zahl beinhalten, kannst Du darauf auch verzichten. Die Initialisierung betrifft allerdings nur die Items, in denen bisher keine Temperatur gespeichert ist, außerdem wirkt der Befehl ausschließlich auf das Item, nicht jedoch auf den Channel (weshalb man auch keine Vorkehrungen wegen zu vieler Updates in zu kurzem Zeitraum treffen muss).
Innerhalb des Timers habe ich den Code noch etwas angepasst, so dass nun doch noch ein Log erscheint.
Und: ich habe die Rule bei mir getestet
Code: Alles auswählen
Switch Heizungsschalter_Alle_Heizungen "Hauptschalter Automatik"
Group gSPOnline "Smartphones online"
Switch onlineLuca "Smartphone Luca" (gSPOnline) {channel="network:pingdevice:88c07738b0:online"}
Switch onlineNelly "Smartphone Nelly" (gSPOnline) {channel="network:pingdevice:7e73fbb35d:online"}
Switch onlineSilvia "Smartphone Silvia" (gSPOnline) {channel="network:pingdevice:4b2154548b:online"}
Switch onlineDaniel "Smartphone Daniel" (gSPOnline) {channel="network:pingdevice:d3462f161f:online"}
Group gTempSoll "Solltemperaturen"
Number:Temperature HeizungLucaZimmer_Solltemperatur "Solltemperatur Luca" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:1624e16bb3374ba8937d5244df2e789e:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungLucaZimmer_Solltemperatur_Fensterkontakt "Solltemperatur Luca Fenster" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:1624e16bb3374ba8937d5244df2e789e:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungNellyZimmer_Solltemperatur "Solltemperatur Nelly" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:ced269ec08fa447793a2b40a07d25ad5:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungNellyZimmer_Solltemperatur_Fensterkontakt "Solltemperatur Nelly Fenster" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:ced269ec08fa447793a2b40a07d25ad5:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungSchlafzimmer_Solltemperatur "Solltemperatur Schlafzimmer" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:5a5cb035986f494d8d048c582e52bc55:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungSchlafzimmer_Solltemperatur_Fensterkontakt "Solltemperatur Schlafzimmer Fenster" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:5a5cb035986f494d8d048c582e52bc55:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungBadezimmer_Solltemperatur "Solltemperatur Bad" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:f4ab49cd8ef44f85abf748fd513f6d21:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungBadezimmer_Solltemperatur_Fensterkontakt "Solltemperatur Bad Fenster" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:f4ab49cd8ef44f85abf748fd513f6d21:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungUnteresBadezimmer_Solltemperatur "Solltemperatur Bad unten" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:41297270ca984a8d8570a0030243a973:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungPartyraum_Solltemperatur "Solltemperatur Partyraum" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:17918643887840698438d721a6e9e86d:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungPartyraum_Solltemperatur_Fensterkontakt "Solltemperatur Partyraum Fenster" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:17918643887840698438d721a6e9e86d:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungTreppenhaus_Solltemperatur "Solltemperatur Treppenhaus" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:cba6993b2b5b4a5094d1d9df957fed58:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Number:Temperature HeizungTreppenhaus_Solltemperatur_Fensterkontakt "Solltemperatur Treppenhaus Fenster" (gTempSoll) {channel="livisismarthome:RST2:Livisi_SmartHome_Zentrale:cba6993b2b5b4a5094d1d9df957fed58:targetTemperature", unit="°C", stateDescription=""[pattern="%.1f °C"]}
Die Rule habe ich noch mal etwas angepasst:
Code: Alles auswählen
// Globale Variablen vor der ersten Rule definieren!
var Timer tSoll = null // Timer für Solltemperatur
var nSoll = 18.0 // Default Temperatur
rule "Solltemperatur setzen"
when
Item Heizungsschalter_Alle_Heizungen changed to ON or
Member of gSPOnline changed
then
if(Heizungsschalter_Alle_Heizungen.state != ON) // rule inaktiv?
return;
val bOnline = (gSPOnline.members.filter[i|i.state != OFF].size > 0) // true falls mindestens ein Gerät nicht OFF
nSoll = if(bOnline) 21 else 18 // Solltemperatur
val nStart = if(bOnline) 1 else 600 // Zeitverzögerung abhängig von Soll
gTempSoll.members.filter[i|!(i.state instanceof Number)].forEach[j| // uninitialisierte Items notfalls initialisieren
j.postUpdate(19)
]
tSoll?.cancel // laufende Timer abbrechen
tSoll = createTimer(now.plusSeconds(nStart), [| // nach nStart Sekunden
val lItems = gTempSoll.members.sortBy[name].filter[i|
(i.state as Number).floatValue != nSoll] // Liste aller Items die vom Soll abweichen
if(lItems.size == 0) // falls noch Abweichungen vom Soll bestehen
return;
tSoll.reschedule(now.plusSeconds(5)) // führe Timer erneut aus
logInfo("soll","Setze {} auf {}", lItems.head.name, nSoll)
lItems.head.sendCommand(nSoll) // Solltemperatur setzen
])
end
Innerhalb des Timers habe ich den Code noch etwas angepasst, so dass nun doch noch ein Log erscheint.
Und: ich habe die Rule bei mir getestet
