Also, eventuell könnte man das noch etwas optimieren

aber als erster Ansatz:
Code: Alles auswählen
// Switch SpsDgk1RelayOutput -> Rührwerk
// Switch SpsDgk2RelayOutput -> Heizung?
// Switch Ruehrwerkautomatik -> Automatikbetrieb
// Switch Ruehrwerkdauerbetrieb -> Dauerbetrieb
// Number RuehrwerkZeitAn -> Einschaltzeit
// Number RuehrwerkZeitAus -> Ausschaltzeit
// globale Variablen
var Timer tRuehrwerk = null //
var Number nRuehrwerkOn = 1
var Number nRuehrwerkOff = 2
rule "Rührwerk Automatik"
when
Item Ruehrwerkautomatik changed
then
tRuehrwerk?.cancel
if(newState == OFF && Ruehrwerkdauerbetrieb.state != ON) {
SpsDgk1RelayOutput.sendCommand(OFF)
// weitere Aufgaben beim Abschalten der Automatik
return;
}
nRuehrwerkOn = if(RuehrwerkZeitAn.state instanceof Number) (RuehrwerkZeitAn.state as Number).intValue else 1
nRuehrwerkOff = if(RuehrwerkZeitAus.state instanceof Number) (RuehrwerkZeitAus.state as Number).intValue else 2
tRuehrwerk = createTimer(now,[|
var soll = OFF
if(SpsDgk1RelayOutput.state != ON) soll = ON
if(Ruehrwerkdauerbetrieb.state == ON) soll = ON
val zeit = if(soll == ON) nRuehrwerkOn else nRuehrwerkOff
if(SpsDgk1RelayOutput.state != soll)
SpsDgk1RelayOutput.sendCommand(soll.toString)
tRuehrwerk.reschedule(now.plusMinutes(zeit))
])
end
Die Rule wird jedes Mal ausgeführt, wenn der Automatik-Schalter seinen Status wechselt.
Als erstes wird ein eventuell vorhandener Timer gelöscht.
Anschließend prüft die Rule, ob das Rührwerk abgeschaltet werden muss (Dauerbetrieb ist aus und Automatikbetrieb ist aus). Ist das der Fall, so schaltet die Rule das Rührwerk ab und beendet sich danach selbst (weitere Aufgaben können hier auch noch eingebaut werden).
Ist der Neue Status hingegen ON oder Dauerbetrieb ist ON, so holt sich die Rule die eingestellten Zeiten für Rühren und Pause aus den beiden Items, wobei als Default Wert 1 Minute Rühren und 2 Minuten Pause genommen werden, falls die Items keinen gültigen Wert liefern.
Anschließend wird der Timer angelegt und unmittelbar ausgeführt.
Innerhalb des Timers wird der Sollszustand auf OFF festgelegt. Anschließend prüft der Code, ob der Motor aus ist, dann muss der Sollzustand auf ON gewechselt werden. Das gleiche gilt, falls Dauerbetrieb aktiv ist.
Nun wird abhängig vom Sollzustand die Dauer bis zur nächsten Ausführung des Timers festgelegt. Anschließend wird das Relais auf den Sollzustand geschaltet und der Timer für die erneute Ausführung eingeplant.
Unschön: Ob der Dauerbetrieb beendet wurde, wird nur überprüft, wenn der Timer ausgeführt wird, es kommt also darauf an, welche An-Zeit eingestellt ist. Bei einer Minute sollte das aber unkritisch sein

Ansonsten wechselt der Timer immer zwischen ON und OFF hin und her, mit den beiden Zeiten nRuehrwerkOn und nRuehrwerkOff.
Frage zum Vorgang: Kannst Du nicht direkt auswerten, ob die Heizung aktiv ist? Dann könntest Du Dir evtl. den Schalter für den Dauerbetrieb sparen?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet