Müllkalender via openHAB
- udo1toni
- Beiträge: 13942
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Müllkalender via openHAB
Wie hast Du den Kalender eingebunden?
Du brauchst ein Item, welches vor dem eigentlichen Termin eine Information enthält, aus der Du den Schaltbefehl errechnen kannst, z.B. das Datum des Termins -> bei Änderung des Items, prüfe auf morgen, falls nicht, prüfe am nächsten Tag wieder, falls ja, setze Timer, der das Licht um 18 Uhr einschaltet.
Du brauchst ein Item, welches vor dem eigentlichen Termin eine Information enthält, aus der Du den Schaltbefehl errechnen kannst, z.B. das Datum des Termins -> bei Änderung des Items, prüfe auf morgen, falls nicht, prüfe am nächsten Tag wieder, falls ja, setze Timer, der das Licht um 18 Uhr einschaltet.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 33
- Registriert: 29. Jan 2019 10:54
Re: Müllkalender via openHAB
Der Kalender ist mit dem CalDAV Binding eingebunden. Ich habe folgende Items für die nächsten beiden Termine erstellt (mehr brauche ich nicht):
String CalDav_Muell1 "Termin [%s]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:1 value:NAME" }
DateTime CalDav_MuellDate1 "Datum [%1$td.%1$tm.%1$tY]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:1 value:START" }
String CalDav_Muell2 "Termin [%s]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:2 value:NAME" }
DateTime CalDav_MuellDate2 "Datum [%1$td.%1$tm.%1$tY]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:2 value:START" }
In dem Kalender gibt es vier verschiedene Müllarten (jeweils als ganztägiges Ereignis), die mir für die Funktion aber egal sind, es soll einfach nur melden, dass etwas ansteht.
String CalDav_Muell1 "Termin [%s]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:1 value:NAME" }
DateTime CalDav_MuellDate1 "Datum [%1$td.%1$tm.%1$tY]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:1 value:START" }
String CalDav_Muell2 "Termin [%s]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:2 value:NAME" }
DateTime CalDav_MuellDate2 "Datum [%1$td.%1$tm.%1$tY]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:2 value:START" }
In dem Kalender gibt es vier verschiedene Müllarten (jeweils als ganztägiges Ereignis), die mir für die Funktion aber egal sind, es soll einfach nur melden, dass etwas ansteht.
- udo1toni
- Beiträge: 13942
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Müllkalender via openHAB
Dann musst Du nur die beiden DateTime Items in einer Rule überprüfen, ob sie das morgige Datum enthalten (vielleicht kann das sogar eine Rule übernehmen, die ohnehin z.B. um 03:00:01 Uhr nachts läuft und andere Items aktualisiert. Wenn das Datum des nächsten Tages dabei ist, startest Du einen Timer (gegeben Startzeit 3 Uhr liefe der Timer dann 15 Stunden bis 18 Uhr), wenn der Timer abläuft, schaltet er das Licht ein.
03:00:01 Uhr wegen Sommer/Winterzeit Umstellung, damit ist sicher, dass der Zeitabstand immer fix ist.
03:00:01 Uhr wegen Sommer/Winterzeit Umstellung, damit ist sicher, dass der Zeitabstand immer fix ist.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 33
- Registriert: 29. Jan 2019 10:54
Re: Müllkalender via openHAB
Vielen Dank für den Hinweis. Da muss ich mich nur noch einlesen wie ich das Datum vergleiche.
-
- Beiträge: 33
- Registriert: 29. Jan 2019 10:54
Re: Müllkalender via openHAB
Ich habe es jetzt einmal versucht. Leider hat die Rule scheinbar nicht ausgelöst.
Seht ihr vielleicht meinen Fehler in der Rule?
Eigentlich hätte ich gedacht, dass ich einfach täglich um 18 Uhr das Datum vergleiche und dann die LEDs einschalte. Leider war auch im Log nichts zu sehen.
Code: Alles auswählen
rule "Müll-LED"
when
Time cron "0 18 * * *"
then
var date1_tomorrow = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate() + 1);
if (date1_tomorrow.getFullYear() == CalDav_MuellDate1.getFullYear() && date1_tomorrow.getMonth() == CalDav_MuellDate1.getMonth() && date1_tomorrow.getDate() == CalDav_MuellDate1.getDate()) {
XiaomiMiSmartHomeGateway_Brightness.sendCommand("100")
XiaomiMiSmartHomeGateway_Color.sendCommand("255,222,173")
}
end
Eigentlich hätte ich gedacht, dass ich einfach täglich um 18 Uhr das Datum vergleiche und dann die LEDs einschalte. Leider war auch im Log nichts zu sehen.
- udo1toni
- Beiträge: 13942
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Müllkalender via openHAB
Die Rule funktioniert aus verschiedenen Gründen nicht.
Zuerst einmal ist der Trigger fehlerhaft.
openHAB verwendet Quartz cron, welches sekundengenau arbeitet. Außerdem muss im Time cron Ausdruck zwingend exakt ein Fragezeichen vorkommen, und zwar entweder im Wochentagsfeld oder im Tagesfeld. der korrekte Ausdruck, um die Rule täglich um 18:00:00 Uhr triggern zu lassen wäre
Morgen als Datum wird auch anders erzeugt. Überhaupt gibt es normalerweise kein Datum ohne Zeit. Eine typische Variante wäre
wobei das auch falsch sein kann, DateTime ist immer etwas heikel, weil es zwei zueinander inkompatible Arten von DateTime in openHAB gibt.
Baue zu Anfang der Rule eine Zeile
ein, um eine Log Zeile in der Datei openhab.log zu erhalten, jedes Mal, wenn die Rule triggert.
Weitere Zeilen der Art innerhalb der Rule können dann helfen, einen Fehler zu finden, der die Rule abbrechen lässt.
Zuerst einmal ist der Trigger fehlerhaft.
openHAB verwendet Quartz cron, welches sekundengenau arbeitet. Außerdem muss im Time cron Ausdruck zwingend exakt ein Fragezeichen vorkommen, und zwar entweder im Wochentagsfeld oder im Tagesfeld. der korrekte Ausdruck, um die Rule täglich um 18:00:00 Uhr triggern zu lassen wäre
Code: Alles auswählen
Time cron "0 0 18 * * ?" // Sekunde Minute Stunde Tag Monat Wochentag
Code: Alles auswählen
val DateTime dtTomorrow = new DateTime(now.withTimeAtStartOfDay.plusDays(1))
Baue zu Anfang der Rule eine Zeile
Code: Alles auswählen
logInfo("muell","Rule wurde getriggert!")
Weitere Zeilen der Art innerhalb der Rule können dann helfen, einen Fehler zu finden, der die Rule abbrechen lässt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 33
- Registriert: 29. Jan 2019 10:54
Re: Müllkalender via openHAB
Ich habe jetzt den Time cron gewechselt. Leider bekomme ich im Log da eine große Fehlermeldun:
Code: Alles auswählen
2019-10-29 08:33:56.933 [ERROR] [org.quartz.core.JobRunShell ] - Job DEFAULT.2019-10-29T08:33:56.927+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ {
org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1b2ed94
} ] threw an unhandled Exception:
java.lang.NullPointerException: null
at org.eclipse.smarthome.model.script.engine.ScriptError.<init>(ScriptError.java:66) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:140) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:902) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:865) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:224) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:768) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:220) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1116) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:992) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:902) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:226) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:244) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:447) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:228) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:190) ~[?:?]
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.$Proxy192.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) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]
- udo1toni
- Beiträge: 13942
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Müllkalender via openHAB
Wie gesagt, baue etwas Logging ein, dann kannst Du den Fehler einkreisen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
- alkaline
- Beiträge: 173
- Registriert: 20. Apr 2017 13:25
Re: Müllkalender via openHAB
@ Stefan: magst du mir deine js Dateien nochmals zum Download auflegen?StefanH. hat geschrieben: ↑6. Jan 2018 02:39 wow, das ist spaet geworden hau mich jetzt in die Falle. kannst es gerne mal ausprobieren
http://upload.haupt.xyz/files/abfall.zip
Ich hab ein paar Sachen beruecksichtigt:
1. Mein Abfallentsorger stellt keinen kompletten Kalender zur Verfuegung. Deshalb muss ich einmal im Jahr den Papier, Restmuell und gelben Sack Kalender in EINE ics Datei mergen. Das fuehrt dann leider dazu, dass die Text Eintraege in der Datei nicht sortiert sind. Das Skript loopt daher komplett durch den Kalender durch, weil es immer noch vermutet ein "später" ein jüngeres Datum zu erwischen.
2. Es wird entsprechend reagiert, wenn am Jahresende keine weitere Leerung ansteht
3. Mehrere Termine am gleichen Tag werden in der sitemap zusammen angezeigt.
Die Notifications sprich cron trigger hab ich noch nicht getestet.
Stefan
Nachdem ich nun die *ics ebenfalls downloaden muss, scheint alles um einen Tag verschoben zu sein, wie andere auch schon berichteten.
Die morgige Abholung wird damit erst einen Tag später angezeigt....
Gruß
Alkaline
- alkaline
- Beiträge: 173
- Registriert: 20. Apr 2017 13:25
Re: Müllkalender via openHAB
Hi
konnte es selbst lösen, indem ich die *.js Dateien um einen Tag zurücksetze. Mir ist damit leider nicht klar, warum dies im Gegensatz zur Online Variante getan werden muss, aber damit geht es.
konnte es selbst lösen, indem ich die *.js Dateien um einen Tag zurücksetze. Mir ist damit leider nicht klar, warum dies im Gegensatz zur Online Variante getan werden muss, aber damit geht es.
Code: Alles auswählen
abfall = dateTo.getFullYear() + "-" + (dateTo.getMonth() + 1) + "-" + ([b]dateTo.getDate() -1)[/b] + "T00:00:00"