Die Fragestellung ist leider zu ungenau
Aber zuerst: Du hast da ein Item mit dem Namen
logInfo. Mach das bitte nicht!
Erst mal kommt man selbst schnell durcheinander, denn
logInfo kennt nun mal keine Methode
.postUpdate(). Und obwohl das momentan offensichtlich bei Dir funktioniert, gibt es keine Langzeitgarantie, denn
logInfo ist ein reserviertes Schlüsselwort, es kann gut passieren, dass die Rules DSL das irgendwann einfach als Fehler behandelt, und dann stehst Du da und verstehst nicht, warum die Rule plötzlich nicht mehr funktioniert.
Also besser einen anderen Namen für solch ein Item wählen, z.B. infoLog oder logInformation.
Nun zur eigentlichen Frage: Was meinst Du mit "anderer Aufgabenbereich"? Willst Du (unabhängig) einen zusätzlichen Verbraucher schalten?
So wie die Rule momentan gestrickt ist, ist sie eigentlich unnötig kompliziert. Ich bin jetzt zu faul, nachzuschauen, von wo wir ursprünglich kamen...
Jedenfalls möchtest Du im Grunde maximal einen Schaltvorgang pro Stunde haben, und zwar unabhängig von der Schaltrichtung. Ich denke, ursprünglich waren die Anforderungen andere, weshalb ON und OFF auch unterschiedlich behandelt wurden.
Mein aktuelles Angebot (ohne eine Erweiterung um die unbekannten zusätzlichen Funktionen):
Code: Alles auswählen
// Globale Variablen zu Beginn der Datei definieren!
var Timer tBwwp = null
var Integer iBwwp = 0 // 0 = neutral, 1 = stoppen, 2 = starten
rule "PV_total changed"
when
Item PV_total changed // Freigabe BWWP
then
if(!(newState instanceof Number)) // aktuell keine Zahl?
return;
val nCur = ((newState as Number).intValue // aktueller Wert, Integer soll reichen
)
if(nCur < 750 && iBwwp != 1) { iBwwp = 1 } else // Stoppbedingung und Timer nicht in Stopp Modus
if(nCur > 2000 && iBwwp != 2) { iBwwp = 2 } else // Startbedingung und Timer nicht in Start Modus
if(nCur >= 1000 && iBwwp == 1) { iBwwp = 0 } // falls Stopp Modus aktiv und über 1000
else return; // Modus nicht verändert, Abbruch
val strBwwp = if(iBwwp == 0) "neutral" else if(iBwwp == 1) "Stopp" else "Start" // Meldetext generieren
logInfo("bwwp","Leistung = {}, {}",nCur,strBwwp)
infoLog.postUpdate("iBwwp = " + iBwwp.toString + " (" + strBwwp * ")")
tBwwp?.cancel // bestehende Timer entfernen
if(iBwwp > 0) { // Muss Timer erzeugt werden?
tBwwp = createTimer(now.plusMinutes(5), [| // Timer anlegen, Start nach fünf Minuten
val strSoll = if(iBwwp == 1) "Stopp" else "Start"
if(Zigbee_Steckdose_1.changedSince(now.minusMinutes(60))) { // ist letzte Änderung weniger als 60 Minuten her?
logInfo("bwwp","Taktsperre, {} gefordert",strSoll)
tBwwp.reschedule(now.plusMinutes(5)) // Timer in 5 Minuten wieder ausführen
} else {
val swSoll = if(iBwwp == 1) OFF else ON
if(Zigbee_Steckdose_1.state != swSoll) { // Falls Zustand von Soll abweicht
val strIst = if(swSoll == ON) "steht" else "läuft"
Zigbee_Steckdose_1.sendCommand(swSoll.toString)
logInfo("bwwp","Pumpe {} mindestens 60 Minuten, {}e!",strIst,strSoll.toLower)
sendBroadcastNotification("BWWP " + swSoll.toString) // Gib Meldung aus
}
}
])
}
end
Die Rule entscheidet zunächst, welcher Modus gefordert ist. Ergibt sich daraus keine Änderung des Zustands, bricht die Rule ab (letztes else ohne weitere Bedingungen). Wurde der Modus geändert, wird eine Meldung generiert, ein bestehender Timer beendet und, falls Modus 1 oder 2 gewählt ist, neu angelegt.
Innerhalb des Timers wird die Taktung geprüft und gegebenenfalls eine Pause eingelegt. Ist die letzte Umschaltung mindestens 60 Minuten her, prüft der Code ob ein Schaltvorgang notwendig ist und führt diesen gegebenenfalls aus. Falls eine Umschaltung erfolgt, wird eine Meldung generiert.
Ein guter Teil des Codes wird für die Meldungen benötigt
aber zumindest ist es schon etwas weniger als in der alten Rule, 40 Zeilen vs. 57 Zeilen, wobei ein Teil natürlich auf die geänderte Formatierung zurückgeht.
Was die zusätzliche Funktion betrifft, so gibt es eine einfache Faustregel: Ist der Trigger identisch, baut man die Funktion in die bestehende Rule ein.
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.8, LXC), mit openHABian eingerichtet