Zunächst einmal wäre es besser, keine Screenshots zu posten, wenn es auch Text gibt (in diesem Fall in der Rule Anzeige auf die Code-Ansicht wechseln, den YAML Code kopieren und hier (ganz wichtig) als Code markiert einfügen (Codemarkierung: Im vollständigen Editor </> anklicken, dies fügt die entsprechenden Tags ein. Du kannst Die Tags auch einfach hin schreiben).
Text ist besser lesbar und nimmt viel weniger Platz ein als das Bild. In technischen Foren gilt oftmals das Gegenteil vom Sprichwort "Ein Bild sagt mehr als tausend Worte" - zumindest wenn es eine Codeansicht gibt.
Du
kannst das eventuell mit drei simple Rules lösen, ich behaupte aber, dass es nicht sinnvoll ist.
Als DSL Rule sieht das so aus:
Code: Alles auswählen
var Timer tSplitstart = null
rule "Starte Splitgerät falls Überschuss"
when
Item SF_Power_total changed
then
if(AC_AUTOMATIC_TEST.state != ON) {
tSplitstart?.cancel
tSplitstart = null
return;
}
val nPower = if(SF_Power_total.state instanceof Number)
- (SF_Power_total.state as Number).floatValue
else
0
if(tSplitstart !== null && nPower < 3000) {
tSplitstart.cancel
tSplitstart = null
} else if(tSplitstart === null && nPower > 3000) {
tSplitstart = createTimer(now.plusSeconds(60),[|
Daikin_Onecta_AC_DG_Power.sendCommand(ON)
tSplitstart = null
])
}
end
Die Rule wird getriggert, wenn die Leistung sich ändert. Ja, man könnte noch zusätzlich den Schalter AC_AUTOMATIC_TEST berücksichtigen, aber vermutlich wird die Rule eh alle paar Sekunden durch eine Wertänderung getriggert (falls nicht, dürfte das Ganze recht schnell sinnlos werden)
Die Rule prüft zunächst, ob der Schalter auf ON steht. Ist dies nicht der Fall, so wird ein evtl. zu diesem Zeitpunkt laufender Timer gestoppt und entfernt. Anschließend beendet sich die Rule. (Dies entspricht dem But only if für den Schalter, kümmert sich aber auch um den Timer. In der simple Variante bräuchtest Du dafür eine weitere Rule)
Läuft die Rule noch, so wird die gemessene Leistung aus dem Item ausgelesen und in einer lokalen Konstante gespeichert, und zwar mit negativem Vorzeichen (Letztlich ist es egal, welches Vorzeichen die Zahl hat...) Sollte das Item aus irgendeinem Grund keine gültige Zahl liefern, so wird der Wert auf 0 gesetzt.
Nun folgen zwei Prüfungen. Die erste prüft, ob ein Timer angelegt ist, aber die Leistung unter 3000 liegt. Ist das der Fall, so wird der Timer gestoppt und entfernt (das könnte im simple Mode die zweite Rule mit übernehmen, die sich auch um den Schalter kümmert, quasi das Gegenteil des Timer Starts)
Die zweite Prüfung (die nur erfolgt, falls die erste nicht zutraf) prüft auf die gegenteiligen Bedingungen (Timer ist nicht angelegt, aber Leistung über 3000). Ist das Der Fall, so wird der Timer angelegt.
Damit ist die Rule beendet.
Läuft der Timer nach 60 Sekunden ab, so wird das Aggregat eingeschaltet (die Rule hätte den Timer ja schon entfernt, wenn die Leistung unter 3000 gesunken wäre).
Falls Du nicht mit DSL Rules arbeiten willst, kannst Du ein ähnliches Verhalten auch mit Blockly erzeugen. Falls Du nur keine Textdateien verwenden willst, aber mit DSL als solcher keine Probleme hast, kannst Du den Code teilweise auch über eine UI Rule verwenden, bis auf den Timer.
Die einfachste Variante wäre dann ein Item, welches mit einer Expiration angelegt ist (add Metadata).
Das läuft dann so, dass das Item von der Rule auf OFF oder ON gesetzt wird, je nachdem, ob die Leistung über oder unter 3000 liegt. (über 3000 -> Status ON, unter 3000 -> Status OF)
Wird der Zustand ON des Items in der eingestellten Zeitspanne nicht mehr von der Rule verändert, so sendet das Item über die Expiration einen Befehl OFF, welcher dann eine weitere Rule triggert, die sich um das Aktivieren des Aggregats kümmert.
Das Expiration Item kannst Du auch mit simple Rules verwenden. aber Du brauchst so mindestens drei Rules, die sich um ein Problem kümmern, während es mit Code sehr einfach mit einer Rule zu erledigen ist.
Weiterhin ist es unschön, dass das Item mit einem Befehl OFF den Timer startet, das lässt sich aber kaum vermeiden. Man könnte das Item auch umgekehrt verwenden, dann wäre der Start des Timers ein OFF, was irgendwie auch nicht schick ist.
Disclaimer: Da ich die DSL Rule nicht extra in openHAB angelegt habe, sind wahrscheinlich irgendwo Tippfehler enthalten
KEINe Tippfehler sind !== und ===, da gehören tatsächlich drei Zeichen für den Vergleich hin (identisch/nicht identisch, das ist etwas anderes als gleich/ungleich)