Seite 2 von 2

Re: Beregnungs Rule

Verfasst: 11. Jun 2018 08:48
von Cyrelian
HI,

so, bin das gestern Abend nochmal alles durchgegangenen. Kein Schreibfehler drin.
Mit Rname:

Code: Alles auswählen

2018-06-11 08:46:31.476 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.2018-06-11T08:46:31.390+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  var Rname

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@14dfe15

  <null>.nRegner = <XBinaryOperationImplCustom>

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@cf58fc

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@99edac

} ] threw an unhandled Exception: 

java.lang.IllegalStateException: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(java.lang.String,java.lang.String) on instance: null

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1102) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:141) [145:org.eclipse.smarthome.model.script:0.10.0.b1]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) [145:org.eclipse.smarthome.model.script:0.10.0.b1]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) [145:org.eclipse.smarthome.model.script:0.10.0.b1]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) [145:org.eclipse.smarthome.model.script:0.10.0.b1]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) [145:org.eclipse.smarthome.model.script:0.10.0.b1]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [164:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at com.sun.proxy.$Proxy180.apply(Unknown Source) [?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) [145:org.eclipse.smarthome.model.script:0.10.0.b1]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [115:org.eclipse.smarthome.core.scheduler:0.10.0.b1]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [115:org.eclipse.smarthome.core.scheduler:0.10.0.b1]

Caused by: java.lang.IllegalArgumentException: argument type mismatch

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) ~[?:?]

	... 27 more

2018-06-11 08:46:31.492 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.2018-06-11T08:46:31.390+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  var Rname

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@14dfe15

  <null>.nRegner = <XBinaryOperationImplCustom>

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@cf58fc

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@99edac

} ] threw an exception.

org.quartz.SchedulerException: Job threw an unhandled exception.

	at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [115:org.eclipse.smarthome.core.scheduler:0.10.0.b1]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [115:org.eclipse.smarthome.core.scheduler:0.10.0.b1]

Caused by: java.lang.IllegalStateException: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(java.lang.String,java.lang.String) on instance: null

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1102) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:141) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

	at com.sun.proxy.$Proxy180.apply(Unknown Source) ~[?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) ~[?:?]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

	... 1 more

Caused by: java.lang.IllegalArgumentException: argument type mismatch

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:141) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

	at com.sun.proxy.$Proxy180.apply(Unknown Source) ~[?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) ~[?:?]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

	... 1 more

Re: Beregnungs Rule

Verfasst: 11. Jun 2018 09:42
von StefanH.
sorry für die blöde Frage, aber kann jmd. das ganze Vorhaben mal in einen Kontext bringen? Worum gehts hier eigentlich und wo findet man seppys orginal, auf das sich im ersten Post bezogen wird?

Re: Beregnungs Rule

Verfasst: 11. Jun 2018 12:27
von Cyrelian
Hi Stefan,

klar doch :D .

Es geht um eine automatische Gartenbewässerung und hier ist Seppys "Original"

https://blog.openhabforum.de/gartenbewa ... austufe-1/

CU
Cyrelian

Re: Beregnungs Rule

Verfasst: 11. Jun 2018 18:57
von udo1toni
Irgendwie sehe ich da aber gar keine Log-Zeile.
Zur Sicherheit hier nochmal die komplette Rule:

Code: Alles auswählen

val String filename = "irrigation.rules"                        // Loggername
val iRegnerMax = 3                                              // Anzahl Regner
var Number nRegner = 0                                          // Aktueller Regner

var Timer ABIrrigationTimer = null                              // Regnertimer
var Number Duration = 15                                        // Dauer

rule "Irrigation"
when
    Item ABBeregnung changed
then
    if (Automower_StatusCode.state != 1056) {                   //Prüfen ob der Automower in der Ladestation ist
        logInfo(filename,"Beregnung: Automower fährt noch!")
        return;
    }

    if (ABBeregnung.state == OFF && gABBeregnung.allMembers.filter(x | x.state == ON).size > 0) {
        logInfo(filename,"Beregnung: Beregnung wird deaktiviert")
        gABBeregnung.allMembers.filter(x | x.state != OFF).forEach[ item |
            item.sendCommand(OFF) 
        ]
        ABIrrigationTimer.cancel
        ABIrrigationTimer = null
    }

    else if (ABBeregnung.state == ON){                          //Beregnung wird aktiviert
        logInfo(filename,"Beregnung: Beregnung wird aktiviert")
        if (ABIrrigationTimer !== null) 
            ABIrrigationTimer.cancel
        nRegner = 0
        ABIrrigationTimer = createTimer(now.plusSeconds(1), [ |
            var String rName
            if (nRegner > 0 && nRegner <= iRegnerMax) {
                rName = "ABBeregnungMGV" + nRegner.toString
                logInfo(filename,"Beregnung: {} wird deaktiviert",rName) 
                sendCommand(rName,"OFF")
            }
            nRegner = nRegner + 1
            if (nRegner <= iRegnerMax) {
                rName = "ABBeregnungMGV" + nRegner.toString
                logInfo(filename,"Beregnung: {} wird aktiviert",rName)
                sendCommand(rName,"ON")
                ABIrrigationTimer.reschedule(now.plusMinutes(Duration))
            }
            if (nRegner > iRegnerMax)
                ABIrrigationTimer = null
        ])
    }
end
Und um ganz sicher zu gehen (obwohl das definitiv nicht notwendig sein sollte) auch noch den Befehl als String übergeben.

Re: Beregnungs Rule

Verfasst: 23. Apr 2023 17:00
von Selter
Hallo zusammen,

ich möchte gern die Rule von Udo für meine Bewässerung anpassen.
Es gibt 4 Beregnungskreise, die nacheinander ablaufen sollen. Jeder Kreis wird per Magnetventil (über Sonoff 4CH pro) geöffnet.
Die Switches ("OUT_x_sonoff4ch2_ch1" bis "OUT_x_sonoff4ch2_ch4") habe ich der Gruppe "gABBeregnung" zugewiesen.

Wo muss in der unten angepassten Rule die Pumpe ausgeschaltet werden? Der Befehl ist scheinbar an der falschen Stelle ("// PUMPE AUS)" ...


Code: Alles auswählen



val String filename = "BEREGNUNG"                        		// Loggername
val iRegnerMax = 4                                              // Anzahl Regner
var Number nRegner = 0                                          // Aktueller Regner

var Timer ABIrrigationTimer = null                              // Regnertimer
var Number Duration = 15                                        // Dauer

rule "Beregnung"
when
    Item ABBeregnung changed
then

    if (ABBeregnung.state == OFF && gABBeregnung.allMembers.filter(x | x.state == ON).size > 0) {
        logInfo(filename,"Beregnung: Beregnung wird deaktiviert")
		// OUT_x_sonoff4ch1_ch1.sendCommand(OFF)		// PUMPE AUS
		logInfo(filename,"Beregnung: Pumpe AUS")
        gABBeregnung.allMembers.filter(x | x.state != OFF).forEach[ item |
            item.sendCommand(OFF) 
        ]
        ABIrrigationTimer.cancel
        ABIrrigationTimer = null
    }

    else if (ABBeregnung.state == ON){                          //Beregnung wird aktiviert
        logInfo(filename,"Beregnung: Beregnung wird aktiviert")
        if (ABIrrigationTimer !== null) 
            ABIrrigationTimer.cancel
        nRegner = 0
		// OUT_x_sonoff4ch1_ch1.sendCommand(ON)					// PUMPE AN
		logInfo(filename,"Beregnung: Pumpe AN")
        ABIrrigationTimer = createTimer(now.plusSeconds(1), [ |
            var String rName
            if (nRegner > 0 && nRegner <= iRegnerMax) {
                rName = "OUT_x_sonoff4ch2_ch" + nRegner.toString
                logInfo(filename,"Beregnung: {} wird deaktiviert",rName) 
                sendCommand(rName,"OFF")
            }
            nRegner = nRegner + 1
            if (nRegner <= iRegnerMax) {
                rName = "OUT_x_sonoff4ch2_ch" + nRegner.toString
                logInfo(filename,"Beregnung: {} wird aktiviert",rName)
                sendCommand(rName,"ON")
                ABIrrigationTimer.reschedule(now.plusMinutes(Duration))
            }
            if (nRegner > iRegnerMax)
                ABIrrigationTimer = null

        ])
    }
end

Re: Beregnungs Rule

Verfasst: 23. Apr 2023 17:48
von udo1toni
Eigentlich sollte die Rule funktionieren.
Gibt es irgendwelche Fehlermeldungen?

Re: Beregnungs Rule

Verfasst: 23. Apr 2023 19:12
von Selter
Am Anfang wird die Pumpe korrekt eingeschaltet und die Magnetventile werden von 1 bis 4 entsprechend der Dauer abgearbeitet.
Nachdem das 4. Ventil ausgeschaltet wird, passiert nichts mehr und die Pumpe läuft weiter.
Fehlermeldungen gibt es nicht.

Im Log sieht es so aus:

Code: Alles auswählen

Item 'ABBeregnung' received command ON
Beregnung: Beregnung wird aktiviert
Beregnung: Pumpe AN
Item 'ABBeregnung' changed from OFF to ON
Beregnung: OUT_x_sonoff4ch2_ch1 wird aktiviert
Beregnung: OUT_x_sonoff4ch2_ch1 wird deaktiviert
Beregnung: OUT_x_sonoff4ch2_ch2 wird aktiviert
Beregnung: OUT_x_sonoff4ch2_ch2 wird deaktiviert
Beregnung: OUT_x_sonoff4ch2_ch3 wird aktiviert
Beregnung: OUT_x_sonoff4ch2_ch3 wird deaktiviert
Beregnung: OUT_x_sonoff4ch2_ch4 wird aktiviert
Beregnung: OUT_x_sonoff4ch2_ch4 wird deaktiviert

Re: Beregnungs Rule

Verfasst: 24. Apr 2023 01:50
von udo1toni
Ah. Jetzt hab ich es verstanden... Für die Pumpe brauchst Du ein eigenes Item.
Aber zunächst mal zwei andere Fragen:
Soll die Pumpe unmittelbar abschalten, wenn das letzte Ventil schließt?
Soll das erste Ventil unmittelbar öffnen, wenn die Pumpe anläuft?
Falls ja und ja, hast Du nur eine zusätzliche Stelle, an der Du die Pumpe ausschalten musst, dafür musst Du allerdings noch ein paar Klammern einfügen.
Diese Stelle:

Code: Alles auswählen

if (nRegner > iRegnerMax)
                ABIrrigationTimer = null

        ])
muss dann so aussehen:

Code: Alles auswählen

if (nRegner > iRegnerMax) {
                ABIrrigationTimer = null
                // Pumpe aus
            }
        ])
Die Rule schaltet vorne (oder oben?) alle Ventile aus, falls der Hauptschalter (das Item, welches die Rule triggert) auf OFF wechselt, allerdings nur, wenn auch mindestens ein Ventil offen ist, weshalb die Pumpe hier nur abschaltet wird, wenn das Abschalten während der Beregnung erfolgt. Man könnte natürlich die Bedingungen anders anlegen, aber eigentlich sollte die Pumpe ja nicht alleine laufen.
Im zweiten Teil wird der Timer angelegt und abhängig vom Zähler jeweils das passende Ventil geschaltet. Dabei wird immer zunächst ein Ventil ausgeschaltet, dann der Zähler um eins erhöht und das nächste Ventil eingeschaltet. ist das letzte Ventil ausgeschaltet worden, wird der Zähler wieder erhöht und ist nun außerhalb des zulässigen Bereichs, um weitere Ventile zu schalten. Ohne Pumpe reicht es dann, den Timer zu beseitigen. Mit Pumpe muss an dieser Stelle die Pumpe ausgeschaltet werden.

Es gibt noch andere Alternativen. Zum einen könntest Du eine zweite Rule anlegen, die getriggert wird, wenn eines der Items für die Ventile seinen Zustand geändert hat. Diese Rule kann dann prüfen, ob alle Ventile aus sind und nach einem kleinen Timeout die Pumpe abschalten, bzw die Pumpe automatisch starten, sobald eines der Ventile geöffnet wird.

Oder eine abgewandelte Rule, die sich um alles kümmert:

Code: Alles auswählen

var Integer iRegner = 0                                                            // Zähler aktueller Regner
var Timer   tIrrigation = null                                                     // Regnertimer
val Integer iDuration = 15                                                         // Dauer

rule "Beregnung"
when
    Item ABBeregnung changed
then
    tIrrigation?.cancel                                                            // vorhandene Timer abrechen
    if(ABBeregnung.state == OFF) {                                                 // bei AUS
        gABBeregnung.members.filter(x | x.state != OFF).forEach[ vent |            // alle Ventile, die nicht geschlossen sind
            vent.sendCommand(OFF)                                                  // schließen
            logInfo("sprinkler","Beregnung: Ventil {} wird deaktiviert",vent.name)
        ]
        if(Pumpe.state != OFF)
            tIrrigation = createTimer(now.plusSeconds(10), [ |                     // Ausschaltverzögerung für Pumpe
                Pumpe.sendCommand(OFF)
                logInfo("sprinkler","Beregnung: Pumpe AUS")
            ]
    } else {                                                                       // bei AN
        iRegner = 0                                                                // Zähler initialisieren
        Pumpe.sendCommand(ON)                                                      // Pumpe an
        logInfo("sprinkler","Beregnung: Pumpe AN") 
        tIrrigation = createTimer(now.plusSeconds(10), [ |                         // Einschaltverzögerung Ventile
            val Integer iRegnerMax = gABBeregnung.members.size                     // Anzahl Ventile automatisch bestimmen
            var String rName
            if(iRegner > 0 && iRegner <= iRegnerMax) {                             // Falls Zähler auf gültigen Regner zeigt
                rName = "OUT_x_sonoff4ch2_ch" + iRegner.toString                   // Namen festlegen
                logInfo("sprinkler","Beregnung: Ventil {} wird deaktiviert",rName) 
                sendCommand(rName,"OFF")                                           // und ausschalten
            }
            iRegner += 1                                                           // Zähler erhöhen
            if(iRegner <= iRegnerMax) {                                            // Falls Zähler auf gültigen Regner zeigt
                rName = "OUT_x_sonoff4ch2_ch" + iRegner.toString                   // Name festlegen
                logInfo(filename,"Beregnung: Ventil {} wird aktiviert",rName)
                sendCommand(rName,"ON")                                            // einschalten
                tIrrigation.reschedule(now.plusMinutes(iDuration))                 // und Timer planen mit iDuration Minuten
            } else
                ABBeregnung.postUpdate(OFF)                                        // Beregnungsschalter OFF
        ])
    }
end
Hier mit Kommentaren zum besseren Verständnis.

Bei OFF werden alle Regner abgeschaltet, die nicht schon aus sind. Läuft die Pumpe, wird ein Timer für die Ausschaltverzögerung gestartet.
Bei ON wird die Pumpe eingeschaltet. Anschließend startet die Einschaltverzögerung für die Ventile.
Innerhalb des Timers wird zunächst das aktuelle Ventil ausgeschaltet, falls der Zeiger auf ein Ventil zeigt. Anschließend wird der Zeiger erhöht und das nächste Ventil eingeschaltet. Wurde das letzte Ventil ausgeschaltet, wird der Schalter für die Rule selbst ausgeschaltet, was die Rule triggert und damit zum verzögerten Ausschalten der Pumpe führt.

Re: Beregnungs Rule

Verfasst: 26. Apr 2023 21:15
von Selter
Vielen Dank - die erste Variante reicht eigentlich schon aus.
Die abgewandelte Rule ist aber ein sehr gutes Lehrbeispiel, wie so etwas mit wenig Code umgesetzt werden kann.