Müllkalender via openHAB

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Müllkalender via openHAB

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Airmaxchen
Beiträge: 33
Registriert: 29. Jan 2019 10:54

Re: Müllkalender via openHAB

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

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

Re: Müllkalender via openHAB

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Airmaxchen
Beiträge: 33
Registriert: 29. Jan 2019 10:54

Re: Müllkalender via openHAB

Beitrag von Airmaxchen »

Vielen Dank für den Hinweis. Da muss ich mich nur noch einlesen wie ich das Datum vergleiche.

Airmaxchen
Beiträge: 33
Registriert: 29. Jan 2019 10:54

Re: Müllkalender via openHAB

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

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

Re: Müllkalender via openHAB

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Airmaxchen
Beiträge: 33
Registriert: 29. Jan 2019 10:54

Re: Müllkalender via openHAB

Beitrag 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]

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

Re: Müllkalender via openHAB

Beitrag von udo1toni »

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

Benutzeravatar
alkaline
Beiträge: 173
Registriert: 20. Apr 2017 13:25

Re: Müllkalender via openHAB

Beitrag 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

Benutzeravatar
alkaline
Beiträge: 173
Registriert: 20. Apr 2017 13:25

Re: Müllkalender via openHAB

Beitrag 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"

Antworten