Seite 10 von 15

Re: Müllkalender via openHAB

Verfasst: 22. Okt 2019 16:47
von udo1toni
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.

Re: Müllkalender via openHAB

Verfasst: 22. Okt 2019 19:09
von Airmaxchen
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.

Re: Müllkalender via openHAB

Verfasst: 22. Okt 2019 23:49
von udo1toni
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.

Re: Müllkalender via openHAB

Verfasst: 23. Okt 2019 16:11
von Airmaxchen
Vielen Dank für den Hinweis. Da muss ich mich nur noch einlesen wie ich das Datum vergleiche.

Re: Müllkalender via openHAB

Verfasst: 27. Okt 2019 18:38
von Airmaxchen
Ich habe es jetzt einmal versucht. Leider hat die Rule scheinbar nicht ausgelöst.

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
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.

Re: Müllkalender via openHAB

Verfasst: 28. Okt 2019 00:12
von udo1toni
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

Code: Alles auswählen

Time cron "0 0 18 * * ?"  // Sekunde Minute Stunde Tag Monat Wochentag
Morgen als Datum wird auch anders erzeugt. Überhaupt gibt es normalerweise kein Datum ohne Zeit. Eine typische Variante wäre

Code: Alles auswählen

val DateTime dtTomorrow = new DateTime(now.withTimeAtStartOfDay.plusDays(1))
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

Code: Alles auswählen

logInfo("muell","Rule wurde getriggert!")
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.

Re: Müllkalender via openHAB

Verfasst: 29. Okt 2019 08:36
von Airmaxchen
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]

Re: Müllkalender via openHAB

Verfasst: 29. Okt 2019 19:24
von udo1toni
Wie gesagt, baue etwas Logging ein, dann kannst Du den Fehler einkreisen.

Re: Müllkalender via openHAB

Verfasst: 1. Jan 2020 20:23
von alkaline
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
@ Stefan: magst du mir deine js Dateien nochmals zum Download auflegen?

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

Re: Müllkalender via openHAB

Verfasst: 4. Jan 2020 13:56
von alkaline
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.

Code: Alles auswählen

abfall = dateTo.getFullYear() + "-" + (dateTo.getMonth() + 1) + "-" + ([b]dateTo.getDate() -1)[/b] + "T00:00:00"