Es gibt in den verschiedenen Foren zehntausende Codebeispiele von simpel bis Kopf explodiert
Ein anderer Ansatz läuft ähnlich, wie Deine ursprüngliche Rule:
Code: Alles auswählen
// globale Variablen werden zu Beginn der Datei definiert!
var Timer tKuehlung = null
rule "Solar_Kuehlprogramm"
when
Time cron "0 0 1 * * ?" // Montag-Sonntag 1 Uhr
then
tKuehlung?.cancel
logInfo("solarCooling","Kühlzyklus wird gestartet")
tKuehlung = createTimer(now,[|
var Number nSolarRLTemp = 55 // Default Wert, falls Sensorausfall
if(Speichertemperatur9.state instanceof Number) // Sensor liefert Wert
nSolarRLTemp = (Speichertemperatur9.state as Number).floatValue // also Sensortwert übernehmen
else
logWarn("solarCooling","Temperaturfühler liefert ungültigen Wert! ({})",Speichertemperatur9.state)
if(nSolarRLTemp < 60) { // Temperatur unter 60, also Ende
channel5.sendCommand(OFF) // Pumpe (endgültig) aus
logInfo("solarCooling","Kühlzyklus wird beendet. Temperatur {}",Speichertemperatur9.state)
tKuehlung = null // Timer deinitialisieren
} else { // Temperatur 60 oder größer
if(channel5.state == OFF) { // Falls Pumpe aus
channel5.sendCommand(ON) // Pumpe an
logInfo("solarCooling","Kühlzyklus: Pumpe starten")
tKuehlung.reschedule(now.plusSeconds(90)) // und nach 90 Sekunden Timer erneut ausführen
} else { // Falls Pumpe an
channel5.sendCommand(OFF) // Pumpe aus
logInfo("solarCooling","Kühlzyklus: Pumpe stoppen")
tKuehlung.reschedule(now.plusSeconds(180)) // und nach 180 Sekunden Timer erneut ausführen
}
}
])
end
Die Rule wird über Time cron getriggert und erstellt einen Timer, der unmittelbar ausgeführt wird.
Im Timer wird die Temperatur geprüft (wie gehabt...) und gegebenenfalls eine Warnmeldung bei Sensorausfall ausgegeben.
Liefert der Sensor einen Wert über (oder gleich) 60, so prüft die Rlue, ob die Pumpe läuft. Falls nicht wird sie gestartet und nach der festgelegten Zeit wir der Timer erneut ausgeführt. Falls die Pumpe läuft, wird sie gestoppt und nach der festgelegten Zeit wir der Timer erneut ausgeführt.
Die Rule ist so konzipiert, dass es unterschiedliche ON/OFF Zykluszeiten gibt. Die Zeiten musst Du halt entsprechend anpassen. Es gibt auch plusMillis(int), plusMinutes(int), plusHours(int),... falls die Zeiten etwas extremer sein sollten. Sobald die Speichertemperatur unter 60 gesunken ist, wird die Pumpe beim nächsten Timerdurchlauf gestoppt und der Timer nicht erneut ausgeführt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet