Bitte lasst der Forensoftware Zeit, ein Posting zu veröffentlichen, und falls ihr mal aus Versehen etwas doppelt postet, löscht es auch wieder raus, mit eigenen Postings darf man das
Was die Rules betrifft, so denkst Du unnötig kompliziert und auch falsch.
Ich habe das in einem anderen Thread bereits erläutert, möchte es aber hier noch mal wiederholen:
createTimer() macht exakt eine Sache, es trägt im Scheduler einen Zeitpunkt und den auszuführenden Code ein. Eine Rule wie diese:
Code: Alles auswählen
var Timer tMyTimer = null
rule "create a timer"
when
System started
then
tMyTimer = createTimer(now.plusSeconds(x),[|
// irgendwelche Befehle
])
end
Läuft ziemlich genau eine Millisekunde und ist anschließend beendet. Nein, diese Rule hat mit dem auszuführenden Code rein gar nichts zu tun. Dieeser Codeblock:
ist lediglich ein Parameter, der an die Funktion
createTimer() übergeben wird. Ausgeführt wird dieser Code durch einen Thread, den der Scheduler zum Zeitpunkt x startet.
Unnötig kompliziert... Du stellst ja über Deine Slider die ON und OFF Dauer ein. Es reicht also eine Rule und auch ein Timer:
Code: Alles auswählen
// Globale Variablen zu Beginn der Datei definieren!
var Timer tZPumpe = null // Timer Zirkulationspumpe
rule "Zirkulationspumpe"
when
Item ZPumpeAn changed or // falls An-Zeit verstellt wurde
Item ZPumpeAus changed // falls Aus-Zeit verstellt wurde
then
tZPumpe?.cancel // Timer abbrechen, falls vorhanden
tZPumpe = createTimer(now.plusSeconds(1), [| // Timer anlegen und gleich ausführen
var Integer iDauer = 15 // Default Zeit, falls was schief gegangen ist
if(ZPumpe.state == ON) { // Falls Pumpe gerade eingeschaltet
ZPumpe.sendCommand(OFF) // Ausschalten
if(ZPumpeAus.state instanaceof Number) // Falls gültiger Wert für Aus-Zeit
iDauer = (ZPumpeAus.state as Number).intValue // übernimm diesen als Integer in die Variable
} else { // Falls Pumpe gerade nicht eingeschaltet
ZPumpe.sendCommand(ON) // Einschalten
if(ZPumpeAn.state instanaceof Number) // Falls gültiger Wert für An-Zeit
iDauer = (ZPumpeAn.state as Number).intValue // übernimm diesen als Integer in die Variable
}
tZPumpe.reschedule(now.plusMinutes(iDauer)) // Plane den Timer mit der Länge iDauer
])
end
Eine Rule.
Die Rule tirggert, sobald eine der Einstellungen geändert wurde.
Die beiden Einstellungen sollten persistiert werden,
mapdb mit
everyChange,restoreOnStartup reicht hierfür, es geht ja nur darum, dass die letzte Einstellung beim Start automatisch geladen wird.
Der Restore zählt übrigens auch als changed, so dass die Rule zum Systemstart mutmaßlich unmittelbar hintereinander zweimal gestartet wird, eben das erste Mal für den einen Parameter, das zweite Mal für den zweiten Parameter.
Gleich zu Beginn wird ein eventuell existierender Timer abgebrochen (weshalb es auch egal ist, dass die Rule zweimal aufgerufen wird). Anschließend wird der Timer erstellt und die Rule ist fertig. Die Rule läuft einmalig, wenn Du einen der beiden Parameter anpasst bzw. die Parameter über restoreOnStartup neu eingelesen werden. Die Ausführungsdauer der Rule liegt bei unter zwei Millisekunden.
Der Scheduler startet nach einer Sekunde den übergebenen Code.
Zuerst wird eine Integer Variable definiert und mit dem Default Wert 15 gefüllt. Dies ist notwendig, um sicher zu verhindern, dass im weiteren Verlauf Fehler auftreten.
Im zweiten Schritt prüft die Rule den Zustand der Pumpe. Ist sie an, so wird sie ausgeschaltet und der eingestellte Wert für die Ausschaltdauer in unsere Variable übernommen (falls denn ein gültiger Wert vorliegt). Ist die Pumpe nicht an, so wird sie eingeschaltet und der eingestellte Wert für die Einschaltdauer in die Variable übernommen (falls gültig...)
Anschließend wird der Timer erneut eingeplant, mit der zuvor bestimmten nächsten Ausführungszeit. Ausführungsdauer des Codeblocks typisch unter 5 Millisekunden.
Ein Watchdog ist sicherlich keine schlechte Idee, immerhin geht es hier um möglichen Verschleiß und Strom- sowie Heizkosten, allerdings sehe ich so eine Funktion nicht innerhalb openHAB. Du müsstest also ein unabhängiges System betreiben, welches den Zustand der Zirkulationspumpe direkt an der Pumpe überwacht. Alle Überwachung innerhalb openHAB ist etwas sinnlos, denn Du bräuchtest dafür ja wieder einen Timer, den Du dann ebenfalls überprüfen müsstest...