Guten Morgen !
Meine Beregnung ist installiert und läuft jetzt seit ein paar Tagen.
Es funktioniert alles ganz gut, bis auf ein Problem:
Die Beregnung startet nicht am nächsten Tag von selbst. Wenn ich aber Manuel eine Startzeit eingebe die am gleichen Tag ist funktioniert alles. Ist die Zeit aber erst am nächsten Tag, wird nicht ausgelöst.
Noch eine Info: Jeden Tag um 1 Uhr wird ein Backup erstellt und neu gestartet.
Danke für eure Hilfe !
Hier eine Log mit einen Fehler:
Code: Alles auswählen
2020-07-08 05:13:19.743 [vent.ItemStateChangedEvent] - Schalter3rssi changed from -49.00 to -50.00
2020-07-08 05:13:30.760 [vent.ItemStateChangedEvent] - Schalter1rssi changed from -70.00 to -71.00
==> /var/log/openhab2/openhab.log <==
2020-07-08 05:14:03.381 [INFO ] [ipse.smarthome.model.script.watering] - Kontrolliere Wochentag
2020-07-08 05:14:03.386 [INFO ] [ipse.smarthome.model.script.watering] - Warte auf Startzeit
==> /var/log/openhab2/events.log <==
2020-07-08 05:14:03.392 [ome.event.ItemCommandEvent] - Item 'Info' received command Starte Beregnung um 5:16
2020-07-08 05:14:03.396 [ome.event.ItemCommandEvent] - Item 'bInfo' received command ON
2020-07-08 05:14:03.404 [vent.ItemStateChangedEvent] - Info changed from to Starte Beregnung um 5:16
2020-07-08 05:14:03.405 [vent.ItemStateChangedEvent] - bInfo changed from OFF to ON
2020-07-08 05:14:09.815 [vent.ItemStateChangedEvent] - Schalter5volt changed from 3.29 to 3.27
2020-07-08 05:14:10.674 [vent.ItemStateChangedEvent] - ext3000_Pingzeit changed from 2.0 to 1.0
2020-07-08 05:14:13.815 [vent.ItemStateChangedEvent] - Schalter4volt changed from 3.01 to 3.02
2020-07-08 05:14:15.814 [vent.ItemStateChangedEvent] - Schalter2rssi changed from -69.00 to -70.00
2020-07-08 05:14:19.820 [vent.ItemStateChangedEvent] - Schalter3rssi changed from -50.00 to -49.00
2020-07-08 05:14:24.837 [vent.ItemStateChangedEvent] - Schalter7rssi changed from -74.00 to -75.00
2020-07-08 05:15:09.884 [vent.ItemStateChangedEvent] - Schalter6volt changed from 3.20 to 3.21
2020-07-08 05:15:09.899 [vent.ItemStateChangedEvent] - Schalter5volt changed from 3.27 to 3.25
2020-07-08 05:15:13.906 [vent.ItemStateChangedEvent] - Schalter4volt changed from 3.02 to 3.01
2020-07-08 05:16:00.014 [ome.event.ItemCommandEvent] - Item 'WetterPrognose' received command ON
==> /var/log/openhab2/openhab.log <==
2020-07-08 05:16:00.011 [ERROR] [org.quartz.core.JobRunShell ] - Job DEFAULT.Timer 9 2020-07-08T05:16:00.000+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
<XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
} ] threw an unhandled Exception:
java.lang.NullPointerException: null
at org.eclipse.smarthome.model.script.engine.ScriptError.<init>(ScriptError.java:65) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:140) ~[?:?]
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.evaluateArgumentExpressions(XbaseInterpreter.java:1205) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1135) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:861) ~[?:?]
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.$Proxy464.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:?]
2020-07-08 05:16:00.057 [INFO ] [ipse.smarthome.model.script.watering] - RegenPrognose_24: 0.0
2020-07-08 05:16:00.051 [ERROR] [org.quartz.core.ErrorLogger ] - Job (DEFAULT.Timer 9 2020-07-08T05:16:00.000+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
<XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
} ] 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.NullPointerException
at org.eclipse.smarthome.model.script.engine.ScriptError.<init>(ScriptError.java:65) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:140) ~[?:?]
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.evaluateArgumentExpressions(XbaseInterpreter.java:1205) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1135) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:861) ~[?:?]
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.$Proxy464.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
==> /var/log/openhab2/events.log <==
2020-07-08 05:16:00.088 [ome.event.ItemCommandEvent] - Item 'Beregnung' received command ON
2020-07-08 05:16:00.107 [vent.ItemStateChangedEvent] - Beregnung changed from OFF to ON
==> /var/log/openhab2/openhab.log <==
2020-07-08 05:16:00.113 [INFO ] [clipse.smarthome.model.script.regner] - 1. Durchlauf
==> /var/log/openhab2/events.log <==
2020-07-08 05:16:00.118 [vent.ItemStateChangedEvent] - Sperre changed from OFF to ON
2020-07-08 05:16:00.123 [vent.ItemStateChangedEvent] - Info changed from Starte Beregnung um 5:16 to Beregnung gestartet !
Hier die Rule:
Code: Alles auswählen
rule "Startzeit einstellen"
when
Member of gWeekdays changed or // Wochentag geändert
Item Startzeit_Minuten changed or // Minuten geändert
Item Startzeit_Stunden changed or // Stunden geändert
Time cron "1 0 0 * * ?" // täglich um 00:00:01 Uhr
then
// Alle Wochentag-Items müssen in der Gruppe gWeekdays zusammengefasst sein, damit der Trigger oben funktioniert
var dayOfWeekSetting = newArrayList(
Monday.state,
Tuesday.state,
Wednesday.state,
Thursday.state,
Friday.state,
Saturday.state,
Sunday.state
)
var int minutes = 0 // Initialwert für Minuten definieren
if(Startzeit_Minuten.state instanceof Number) { // Falls das Item eine gültige Zahl enthält
minutes = (Startzeit_Minuten.state as Number).intValue // Setze minutes auf diese Zahl
if(minutes > 59) minutes = 0 // Falls Obergrenze überschritten setze auf 0
if(minutes < 0) minutes = 59 // Falls Untergrente unterschritten setze auf 59
}
Startzeit_Minuten.postUpdate(minutes) // Schreibe Wert in das Item
var int hours = 0 // Initialwert für Sunden definieren
if(Startzeit_Stunden.state instanceof Number) { // Falls das Item eine gültige Zahl enthält
hours = (Startzeit_Stunden.state as Number).intValue // Setze hours auf diese Zahl
if(hours > 23) hours = 0 // Falls Obergrenze überschritten setze auf 0
if(hours < 0) hours = 23 // Falls Untergrente unterschritten setze auf 23
}
Startzeit_Stunden.postUpdate(hours) // Schreibe Wert in das Item
val int startMinutes = hours * 60 + minutes // Zeit in Minuten
tStartRegner?.cancel
logInfo("watering","Kontrolliere Wochentag") // geplante Beregnung canceln
if(dayOfWeekSetting.get(now.getDayOfWeek-1) == ON) { // Falls heute Beregnung gewünscht
if(now.getMinuteOfDay < startMinutes) {
logInfo("watering","Warte auf Startzeit")
Info.sendCommand("Starte Beregnung um " + (Startzeit_Stunden.state as Number) + ":" + if((Startzeit_Minuten.state as Number) < 10)"0" + (Startzeit_Minuten.state as Number) else (Startzeit_Minuten.state as Number) )
bInfo.sendCommand(ON) // Falls Startzeit noch nicht erreicht
tStartRegner = createTimer(now.withTimeAtStartOfDay.plusMinutes(startMinutes),[| // Setze einen Timer auf gewünschte Startzeit
WetterPrognose.sendCommand(ON) // Starte zur gewünschten Zeit
])
}
}
else logInfo("watering","Wochentag ist Ausgeschaltet")
end
rule "Wetter und Feuchtigkeit einbinden"
when
Item WetterPrognose received command
then
//Wind
var wind = 0
if(WetterAktuellWindgesch.state instanceof Number){
wind = ((WetterAktuellWindgesch.state as Number).floatValue).intValue
var maxwind = 0
if(maxWind.state instanceof Number)
maxwind = ((maxWind.state as Number).floatValue).intValue
if(wind >= maxwind){
Beregnung.sendCommand(OFF)
logWarn("watering","Derzeit ist es zu windig! {} km/h: Abbruch!", wind)
Info.sendCommand("Windgeschwidigkeit zu hoch: Abbruch!")
bInfo.sendCommand(ON)
}
//Regen
if(WetterAktuellRegen.state instanceof Number && Wetter3hRegen.state instanceof Number && Wetter6hRegen.state instanceof Number && Wetter12hRegen.state instanceof Number && Wetter24hRegen.state instanceof Number && Wetter72hRegen.state instanceof Number){
RegenPrognose_24.postUpdate(((WetterAktuellRegen.state as Number + Wetter3hRegen.state as Number + Wetter6hRegen.state as Number + Wetter12hRegen.state as Number + Wetter24hRegen.state as Number) * 1000) * 2)
logInfo("watering","RegenPrognose_24: " + RegenPrognose_24.state)
if((RegenPrognose_24.state as Number) >= (minRegen.state as Number)){
logWarn("watering","Es wird genug Regnen! {} mm/m²: Abbruch !", RegenPrognose_24.state)
Info.sendCommand("Es wird genug Regnen: Abbruch!")
Beregnung.postUpdate(OFF)
}
//Feuchtigkeit
if(gFeuchtDurchschnitt.state <= 300) {
logWarn("watering","Feuchtigkeit ist {} : Abbruch !", gFeuchtDurchschnitt.state)
//Info.postUpdate("Feuchtigkeit ist {} : Abbruch !", gFeuchtDurchschnitt.state)
Beregnung.postUpdate(OFF)
}
else
{
Beregnung.sendCommand(ON)
}
}
}
end
rule "Beregnung EIN"
when
Item Beregnung received command
then
if(receivedCommand == OFF) {
logWarn("watering","Beregnung wird abgebrochen!")
sendBroadcastNotification("Beregnung wird abgebrochen!") //Nachricht an openhab APP
postUpdate(Info, "Beregnung abgebrochen !")
bInfo.sendCommand(ON) // Info Bestätigung einschalten
tRegner?.cancel // Timer stoppen
tRegner = null // Variable leeren
gRegner.members.filter[i|i.name.contains("Power")].filter[j| j.state != OFF].forEach[r|r.sendCommand(OFF)] // alle Regner abschalten
//Pumpe.sendCommand(OFF) // Pumpe abschalten
Sperre.postUpdate(OFF) // Bediensperre aufheben
}
else
{
if(tRegner !== null) {
logWarn("watering","Regner scheint noch zu laufen! Abbruch")
return;
}
iRegner = 0
Sperre.postUpdate(ON)
//Pumpe.sendCommand(ON)
postUpdate(Info, "Beregnung gestartet !")
sendBroadcastNotification("Beregnung gestartet !")
tRegner = createTimer(now.plusMillis(10),[|
iRegner++ // nächsten Regener anwählen
logInfo("regner","{}. Durchlauf",iRegner)
gRegner.members.filter[i|i.name.contains("Power")].filter[j| j.state != OFF].forEach[r|r.sendCommand(OFF)] // alle Regner abschalten
val maxRegner = gRegner.members.filter[i|i.name.contains("Sperre")].filter[j| j.state == OFF].size // wieviele Regner sollen insgesamt beregnen?
logInfo("regner","{}. Durchlauf von {} Durchläufen.",iRegner,maxRegner)
if(iRegner > maxRegner) { // letzten Regner schon erreicht?
logInfo("regner","Alle Regner sind schon gelaufen!")
sendBroadcastNotification("Beregnung Fertig !")
postUpdate(Info, "Beregnung Fertig !")
bInfo.sendCommand(ON) // Info Bestätigung einschalten
tRegner = null // Dann Schluss!
Sperre.postUpdate(OFF)
Beregnung.postUpdate(OFF) // Item zurücksetzen
//Pumpe.sendCommand(OFF)
return;
}
Thread::sleep(15000) // kleine(15 sec) Pause einlegen
val strRegner = gRegner.members.filter[i|i.name.contains("Sperre")].filter[j| j.state == OFF].sortBy[name].get(iRegner-1).name.split("_").get(2) //Namen des Regner ermitteln
logInfo("regner","Nächster Regner: {}",strRegner)
gRegner.members.filter[i|i.name.contains("Power") && i.name.contains(strRegner)].head.sendCommand(ON) // Regner einschalten
val Dauer =(gRegner.members.filter[i|i.name.contains("Dauer") && i.name.contains(strRegner)].head.state as Number).intValue
logInfo("regner","Regenr wird nach {} Minuten wieder abgeschaltet.",Dauer)
tRegner.reschedule(now.plusMinutes(Dauer)) // Nächste Ausführung planen
])
}
end