Beregnung Timer

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Beregnung Timer

Beitrag von Pepe1907 »

Hallo ihr Lieben,
ich habe nun meine Bregnungsanlage für den Rasen über Openhab erfolgreich installiert.
Kann die Pumpe, und die einzelnen Ventile Problemlos über die BasicUI schalten.
Nun würde ich gerne eine Rule erstellen bzw. habe schon eine Rule erstellt, diese funktioniert nur leider nicht.


Meine Items

Code: Alles auswählen


//Datum
DateTime Date  "Date [%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM]"  { channel="ntp:ntp:demo:dateTime" }
//Ventile
Switch channel1 "Channel 1" <lawnmower>  { gpio="pin:26 activelow:yes initialValue:high" }
Switch channel2 "Channel 2" <lawnmower>  { gpio="pin:19 activelow:yes initialValue:low" }
Switch channel3 "Channel 3" <pump>       { gpio="pin:13 activelow:yes"}
Switch channel4 "Channel 4" <garden>     { gpio="pin:6 activelow:yes"}
//Regen
Number   RainToday              "Rain_today [%.2f mm]"
Number   RainYesterday          "Rain_lastday [%.2f mm]"
//Beregnung
Switch beregnung "Automatische Beregnung" <rain>

Meine beregnung.rules

Code: Alles auswählen

var Timer timer = null
rule "Beregnung 2min"
when
	Item beregnung received update ON

then
    if(timer === null )  {
        logInfo("FILE", "Setting to ON and creating timer")
        channel1.sendCommand(ON)
        channel2.sendCommand(ON)
        channel3.sendCommand(ON)
        timer = createTimer(now.plusMinutes(2), [|
            logInfo("FILE", "Beregnung fertig")
            Beregnung.postUpdate(OFF)
            channel1.sendCommand(OFF)
            channel2.sendCommand(OFF)
            channel3.sendCommand(OFF)
            timer = null
        ])
    } 
end
Die Items werden eingeschaltet und der Timer startet auch. Nur leider wird nichts ausgeschaltet
von udo1toni » 21. Jun 2020 02:09
Die richtige Triggerquelle ist hier tatsächlich nicht Member of, sondern Item, und der richtige Trigger ist auch nicht received command, sondern changed.

Bis auf eine weitere Kleinigkeit sieht die Rule aber schon gut aus. Das Problem ist, wenn die Gruppe wieder auf ON wechselt, muss der Timer natürlich gestoppt werden, damit die Pumpe nicht abgeschaltet wird, falls innerhalb der 2 Minuten ein anderes Ventil öffnet. Dazu muss der Handle des Timers in einem Objekt gespeichert werden, um Zugriff zu behalten.

Code: Alles auswählen

// globale Variablen immer zu Beginn der Datei definieren!
var Timer tPumpe = null

rule "Pumpensteuerung"
when
    Item gVentil changed
then
    if(newState == ON) {
        channel3.sendCommand(ON)
        tPumpe?.cancel
        logInfo("pumpe", "Brunnenpumpe eingeschaltet, da ein oder mehrere Ventile geöffnet wurden")
    } else {
        tPumpe = createTimer(now.plusMinutes(2), [|
            logInfo("pumpe", "Brunnenpumpe wurde aufgrund geschlossener Ventile ausgeschaltet")
            channel3.sendCommand(OFF)
        ])
    }
end
newState ist eine implizite Variable, die zur Verfügung steht, wenn der Ruletrigger changed ist.
tPumpe?.cancel ist gleichbedeutend mit if(tPumpe !== null) tPumpe.cancel
Die Logbefehle erwarten zwei Strings als Parameter, wobei der erste String den Loggernamen enthält. Mit diesem Loggernamen kann man zur Laufzeit steuern, welche Logbefehle abgearbeitet werden, entsprechend sollte man den Loggernamen sinnvoll an der Aufgabe festmachen (hier z.B. eher "pumpe" als "File").
Da die Gruppe nur ON oder OFF als Status haben kann, braucht es kein zweites if-Statement (das kostet nur unnötig Rechenzeit), else reicht hier völlig.
Man kann das Lambda eines Timers auch nach dem Timer angeben, allerdings ist das Lambda ein Parameter, der übergeben wird. Das wird durch die von mir gewählte Schreibweise deutlicher. (Komma nach der Zeitangabe, Lambda, danach schließende Klammer)

Das sind aber nur kleine Korrekturen.
Gehe zur vollständigen Antwort
Zuletzt geändert von Pepe1907 am 11. Jun 2020 19:01, insgesamt 1-mal geändert.

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Beregnung Timer

Beitrag von Pepe1907 »

LOG

Code: Alles auswählen

2020-06-11 18:59:52.078 [INFO ] [.eclipse.smarthome.model.script.FILE] - Beregnung fertig
2020-06-11 18:59:52.083 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.Timer 2 2020-06-11T18:59:52.066+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  logInfo(<XStringLiteralImpl>,<XStringLiteralImpl>)
  <XFeatureCallImplCustom>.postUpdate(<XFeatureCallImplCustom>)
  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
  <null>.timer = <XNullLiteralImplCustom>
} ] threw an unhandled Exception: 
java.lang.reflect.UndeclaredThrowableException: null
	at com.sun.proxy.$Proxy140.apply(Unknown Source) ~[?:?]
	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [bundleFile:?]
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]
Caused by: org.eclipse.smarthome.model.script.engine.ScriptExecutionException: The name 'Beregnung' cannot be resolved to an item or type; line 14, column 13, length 9
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:141) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:954) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:235) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:857) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:231) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]
	... 4 more
2020-06-11 18:59:52.139 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.Timer 2 2020-06-11T18:59:52.066+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  logInfo(<XStringLiteralImpl>,<XStringLiteralImpl>)
  <XFeatureCallImplCustom>.postUpdate(<XFeatureCallImplCustom>)
  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
  <null>.timer = <XNullLiteralImplCustom>
} ] threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception.
	at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [bundleFile:?]
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]
Caused by: java.lang.reflect.UndeclaredThrowableException
	at com.sun.proxy.$Proxy140.apply(Unknown Source) ~[?:?]
	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]
	... 1 more
Caused by: org.eclipse.smarthome.model.script.engine.ScriptExecutionException: The name 'Beregnung' cannot be resolved to an item or type; line 14, column 13, length 9
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:141) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:954) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:235) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:857) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:231) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]
	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.$Proxy140.apply(Unknown Source) ~[?:?]
	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]
	... 1 more

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: Beregnung Timer

Beitrag von Darkwin101 »

Achte bitte auf Groß und Kleinschreibung die rule startet mit beregnung(klein) in der rule benutzt du aber Beregnung.postUpdate(OFF)(Groß)
In Openhab ist wichtig das Groß/Kleinschreibung beachtet wird.

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Beregnung Timer

Beitrag von Pepe1907 »

Perfekt passt super danke dir.
Kann man jetzt noch ne uhrzeit mittels timecron einfügen und dann beregnung postupdate rausgehen. Dass es dann jeden Tag um z.b. 21 00 aktiviert wird?

desidia
Beiträge: 22
Registriert: 20. Okt 2017 23:15
Answers: 0

Re: Beregnung Timer

Beitrag von desidia »

dafür brauchst du nur den when-Bereich mit einem Cron versehen

Code: Alles auswählen

when Time cron "0 0 21 * * ?"
das bedeutet jeden Tag um 21:00 Uhr würde dann dein automatismus durchlaufen.

wäre aber wirklich jeder Tag.
daher sollte man dann prüfen ob das Item "beregnung" auf ON steht (das kannst du ja manuell machen, z.B. wenn es am Tag schon geregnet hat, oder nicht mehr gesprengt werden muss...

dann wäre es:

Code: Alles auswählen


when Time cron "0 0 21 * * ?"
then if (beregnung.state == ON)
{
hier deine jetzige Regel
}
das würde jeden Tag um 21 Uhr prüfen ob Beregnung angeschaltet ist und wenn das WAHR (also ON) ist, würde die nächste Ebene geprüft, was dann deine eigentliche Regel ist.


aber andere Frage, du schaltest gleichzeitig alle Ventile an, lässt zwei Minuten sprengen und dann wieder aus?
das ist viel zu kompliziert über den Timer und das ganze geschnörkel...

die eigentliche Rule könnte auch sein:

Code: Alles auswählen

rule "Beregnung"
when Time cron "0 0 21 * * ?"
then if (beregnung.state == ON){
channel1.sendCommand(ON)
channel2.sendCommand(ON)
channel3.sendCommand(ON)
createTimer(now.plusMinutes(2)) [| channel1.sendCommand(OFF)]
createTimer(now.plusMinutes(2)) [| channel2.sendCommand(OFF)]
createTimer(now.plusMinutes(2)) [| channel3.sendCommand(OFF)]}
end

bzw. alle in eine Gruppen packen und dann die Gruppe schalten wäre wahrscheinlich noch einfacher (benutze ich nicht, weiß daher nicht 100% wie es geht, da ich meine Sprenger nacheinander schalte mit Abstand)

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Beregnung Timer

Beitrag von Pepe1907 »

Vielen dank für die schnelle und sehr hilfreiche Antwort.
aber andere Frage, du schaltest gleichzeitig alle Ventile an, lässt zwei Minuten sprengen und dann wieder aus?
Die 2 min habe ich nur gesetzt um die Regel zu testen. Ich lasse beide Kreise gleichzeitig laufen da die Brunnenpumpe genügend Durchfluss hat.(mehr als 4m²/h)

Würde die Regel auch so funktionieren? Da ich den ersten Kreis(Ventil 1) länger bewässern möchte als den anderen Kreis.

Code: Alles auswählen

rule "Beregnung"
when Time cron "0 0 21 * * ?"
then if (beregnung.state == ON){
channel1.sendCommand(ON)
channel2.sendCommand(ON)
channel3.sendCommand(ON)
createTimer(now.plusMinutes(60)) [| channel1.sendCommand(OFF)]
createTimer(now.plusMinutes(45)) [| channel2.sendCommand(OFF)]
createTimer(now.plusMinutes(60)) [| channel3.sendCommand(OFF)]}
end
Desweitern ist ja noch geplant die Wetterdaten bzgl. Regen in MySql zu speichern um so den gestrigen Tag auszuwerten um eine Beregnung evtl. für einen Tag auszusetzen wenn es zuvor viel geregnet hat.

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Beregnung Timer

Beitrag von Pepe1907 »

Wieso funktioniert diese Rule nicht?
leider wird beim starten meines Raspberrys die Relais geschaltet, um dies zu verhindern habe ich diese kleine Regel geschrieben
rule “Stromausfall”

when

System started

then
channel2.sendCommand(OFF)
channel1.sendCommand(OFF)
channel3.sendCommand(OFF)

end

desidia
Beiträge: 22
Registriert: 20. Okt 2017 23:15
Answers: 0

Re: Beregnung Timer

Beitrag von desidia »

Was sagt das log? Bzw mach mal einen timer rein für 20 Sekunden oder so, ggf sind die Kanäle einfach noch nicht "online" um geschaltet werden zu können

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Beregnung Timer

Beitrag von udo1toni »

Die Rule wird schon funktionieren, aber sie wird an Deinem Problem nichts ändern. Suche lieber den Grund, warum der Pi beim Starten die Relais schaltet, das darf nicht sein!

Gesendet von meinem SM-G973F mit Tapatalk

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Beregnung Timer

Beitrag von Pepe1907 »

desidia hat geschrieben: 11. Jun 2020 22:59 Was sagt das log? Bzw mach mal einen timer rein für 20 Sekunden oder so, ggf sind die Kanäle einfach noch nicht "online" um geschaltet werden zu können
2020-06-12 11:48:46.945 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'Stromausfall.rules' has errors, therefore ignoring it: [1,6]: no viable alternative at input '“'
udo1toni hat geschrieben: 12. Jun 2020 11:31 Die Rule wird schon funktionieren, aber sie wird an Deinem Problem nichts ändern. Suche lieber den Grund, warum der Pi beim Starten die Relais schaltet, das darf nicht sein!

Gesendet von meinem SM-G973F mit Tapatalk
Das verstehe ich leider auch nicht. hat das vielleicht irgendetwas mit der pinbelegung zu tun?

Antworten