Müllkalender - Nächste Abholung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
peter-pan
Beiträge: 2564
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Müllkalender - Nächste Abholung

Beitrag von peter-pan »

...jetzt hätt ich auch noch eine Frage :o :oops: !!. Was passiert bei einem Stromausfall mit dem Timer ? Wenn ich das richtig verstanden habe, wir der Timer ja am Vortag (~0 Uhr) berechnet und dann gesetzt. Läuft der dann nach dem Ausfall weiter oder ist der dann weg ? ;)

Der Cron müsste doch wieder da sein, oder ?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.1 openhabian

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

Re: Müllkalender - Nächste Abholung

Beitrag von udo1toni »

Ein Stromausfall führt zu einem Ausfall des openHAB Systems.

Wenn der Strom wieder da ist, startet auch openHAB neu. Wenn dies vor 19 Uhr des Vortages eines Termins passiert, wird beim initialisieren des Systems der nächste Termin erkannt und das entsprechende Item wird geändert. Die Änderung des Itemstatus führt zum Ausführen der Rule, nicht ein Time cron Trigger. Nun prüft die Rule, ob es sich um ein Ereignis handelt, welches gemeldet werden muss und setzt den Timer anhand des hinterlegten Datums.
Ich sehe jetzt nicht, warum das nicht funktionieren sollte.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2564
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Müllkalender - Nächste Abholung

Beitrag von peter-pan »

udo1toni hat geschrieben: 8. Jun 2022 10:58 Ich sehe jetzt nicht, warum das nicht funktionieren sollte.
Dann ist das ja genau anders herum. Timer geht, Cron nicht ..Mein "verqueres Denken" :oops: :oops: . Danke das du mich da auf den richtigen Pfad gesetzt hast. Hoffentlich weiss ich das beim nächsten Mal noch. Der alte Mann wird halt immer vergesslicher. Aber auf deine Hilfe kann man ja immer zählen. :D :D
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.1 openhabian

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

Re: Müllkalender - Nächste Abholung

Beitrag von udo1toni »

Nein, Time cron wird auch funktionieren, solange zum Zeitpunkt des Time cron Event auch das richtige im Kalenderevent drin steht. Ob ich nun um 19 Uhr prüfe, ob morgen Müll abgeholt wird, oder, wenn der Kalender sagt "es gibt ein neues Event" nachschaue, ob es sich um Müll handelt, und anschließend den verknüpften Zeitstempel nutze, um mir einen Wecker zu programmieren, sollte erst mal egal sein.

Es ist ja auch nicht so, dass es furchtbar verschwenderisch ist, einmal am Tag zu prüfen, ob es etwas für den nächsten Tag gibt. Mir ging es eher darum, dass man beide Varianten betreiben kann und keine der beiden Varianten zwangsläufig unter bestimmten Umständen nicht funktioniert.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

joe73
Beiträge: 16
Registriert: 26. Sep 2021 17:12

Re: Müllkalender - Nächste Abholung

Beitrag von joe73 »

udo1toni hat geschrieben: 7. Jun 2022 20:02 Ich mag auch meinen Senf dazu geben... O:)

Punkt 1: Es gibt gar keinen so großen Unterschied zwischen Time cron und createTimer. Time cron erzeugt einen Scheduler Eintrag ebenso wie wie createTimer. Der Unterschied ist aber dass createTimer einmalige Timer erzeugt, während Time cron (so man nicht alle Werte im Ausdruck fix setzt) immer einen wiederholenden Aspekt hat, und wenn es nur einmal im Jahr ist...

Wie der Scheduler dann die Rule triggert, entzieht sich meiner Kenntnis (createTimer legt den auszuführenden Code ja direkt im Scheduler ab, Time cron führt aber die Rule selbst auf), aber der Trigger kommt so oder so vom Scheduler.

Punkt 2: Der Time cron Ansatz wird vermutlich häufiger ausgeführt werden müssen. Wenn ich die Daten über den Kalender rein bekomme, muss ich bei Time cron also z.B. täglich um 19 Uhr prüfen, ob ein Termin am nächsten Tag ansteht, den ich melden muss.
Wenn ich createTimer verwende, kann eine Rule, die auf TerminInfoItem changed triggert anschließend TerminDatumItem verwenden, um etwas in der Richtung createTimer((TerminDatumItem.state as Date).midnight.minusHours(5)) (Nur Symbolcode)) zu verwenden. Der Timer wird also auf den Zeitpunkt fünf Stunden vor Tagesbeginn des Termins gesetzt. Die Prüfung auf Art des Termins muss natürlich vorher erfolgen und der Termin muss am Vortag vor 19 Uhr eingelesen sein, aber das gilt in ähnlicher Form auch für die Time cron Variante. Es spielt dann keine Rolle, wann der Termin vorher eingelesen wird, das könnte auch fünf Tage vorher sein. Dennoch wird nur ein Eintrag im Scheduler vorgenommen.
Hallo Udo1Toni!

Ich weiß, dein Post ist schon älter... aber ich habe hier ein Problem mit den Datumsformaten und komme einfach nicht weiter.
Vielleicht hast du mir ja einen Tipp, scheinst ziemlich fit mit OpenHab zu sein!
timer_Muell = createTimer((Kalender_Muell_1_Beginn.state as Date).midnight.minusHours(4), [|
timer_Muell = null
// Mach irgendwas
])

Das Item "Kalender_Muell_1_Beginn.state" ist vom Typ DateTime.

Ich bekomme hier die Fehlermeldung:
"Date cannot be resolved to a type."

Ich habe heute Nachmittag nun schon einige Zeit investiert, komme aber nicht dahinter :(

Vielen Dank für Deine Hilfe!

Markus

tim.l
Beiträge: 59
Registriert: 24. Jun 2022 08:16
Answers: 2
Wohnort: Bielefeld
Kontaktdaten:

Re: Müllkalender - Nächste Abholung

Beitrag von tim.l »

Interessanter Thread und da werde ich hellhörig. Ich versuche gerade mit müll.io die Schnittstelle zu vereinheitlichen. Wer es mal ausprobieren will, habe auch eine openHAB Anleitung: https://müll.io/integration/openhab Nehme auch gerne Feedback und auch weitere Versorger auf.

Beste Grüße,
Tim
Meine openHAB Erfahrungen bei mir im Blog: https://360friends.de/tag/openhab/ ;)

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

Re: Müllkalender - Nächste Abholung

Beitrag von udo1toni »

joe73 hat geschrieben: 3. Feb 2023 15:23 scheinst ziemlich fit mit OpenHab zu sein!
Geht so :)
joe73 hat geschrieben: 3. Feb 2023 15:23

Code: Alles auswählen

    timer_Muell = createTimer((Kalender_Muell_1_Beginn.state as Date).midnight.minusHours(4), [|
    timer_Muell = null
    // Mach irgendwas
    ]) 
Das Item "Kalender_Muell_1_Beginn.state" ist vom Typ DateTime.

Ich bekomme hier die Fehlermeldung:
"Date cannot be resolved to a type."
Ja, das ist korrekt. Es gibt keinen Datentyp Date (oder zumindest nicht so). Wenn Du ein DateTime Item hast, dann wird der Status dieses Items vom Typ DateTimeType sein. Also wäre es wenn, dann

Code: Alles auswählen

Kalender_Muell_1_Beginn.state as DateTimeType
Dummerweise erwartet createTimer() als Argumente leider nicht DateTimeType, sondern DateTime (als AbstractInstant) und DateTime ist etwas anderes als DateTimeType. Einfach gesagt ist DateTime hier ein JavaTime Objekt, also z.B. now()
DateTimeType kennt kein .midnight, genausowenig wie DateTime (oder auch jedes beliebige andere Datumsmodell in openHAB und Umgebung)
Selbst die Methode .minusHours() gibt es nicht bei DateTimeType.

Du möchtest einen Timer, der um 20 Uhr des Vortags des Termins auslöst. Dazu musst Du zunächst aus dem DateTimeType ein DateTime Objekt machen:

Code: Alles auswählen

val MyJavaTimeFromDateTimeItem = (Kalender_Muell_1_Beginn.state as DateTimeType).getZonedDateTime()
Mit diesem Wert kannst Du nun rechnen. Eine ZonedDateTime enthält eine Information über die Zeitzone, das ist auch im Zusammenhang mit Mitternacht von Bedeutung. Mitternacht erhältst Du mit dieser Methode:

Code: Alles auswählen

.with(LocalTime.MIDNIGHT)
Und hier funktioniert auch .minusHours()
Zusammen ergibt sich also dieser Bandwurm:

Code: Alles auswählen

val myAlarm = (Kalender_Muell_1_Beginn.state as DateTimeType).getZonedDateTime.with(LocalTime.MIDNIGHT).minusHours(4)
timer_Muell = createTimer(myAlarm, [|
    // mach was
])
Es versteht sich von selbst, dass timer_Muell eine global definierte Variable vom Typ Timer sein muss.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

joe73
Beiträge: 16
Registriert: 26. Sep 2021 17:12

Re: Müllkalender - Nächste Abholung

Beitrag von joe73 »

Hallo zusammen!

@udo1toni:
War das WE unterwegs, habe das Ganze aber gestern abend noch ausprobiert... und was soll ich sagen?
Hat wunderbar und auf Anhieb geklappt! Vielen Dank an dieser Stelle für die schnelle Hilfe (wieder mal)!! :)

Hast du zufällig einen Link um sich in das Thema Date/Time reinzufuchsen? Ich habe schon vieles gefunden, aber meist ist das Level dann schon etwas gehobener und/oder nicht auf DSL-Ebene.

Grüße

Markus

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

Re: Müllkalender - Nächste Abholung

Beitrag von udo1toni »

Ja, Datetime ist schon die fortgeschrittene Fortgeschrittenenklasse ;)

Es gibt im englischen Forum eine super Übersicht, die hilft, zu verstehen, wie man wann von wo nach wo kommt: https://community.openhab.org/t/datetim ... 3-x/107197
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

joe73
Beiträge: 16
Registriert: 26. Sep 2021 17:12

Re: Müllkalender - Nächste Abholung

Beitrag von joe73 »

Das habe ich gemerkt :)

Aber mit deiner Hilfe funktioniert es jetzt ja! Allerdings habe ich jetzt noch kleine Frage zum erstellen Timer.... der lautet je jetzt:

Code: Alles auswählen

	timer_Muell?.cancel
	val myAlarm = (Kalender_Muell_1_Beginn.state as DateTimeType).getZonedDateTime.with(LocalTime.MIDNIGHT).minusHours(4)
        timer_Muell = createTimer(myAlarm, [|
            timer_Muell = null
            var String message
            message = "Test"
        //   message = "Kalender: " + Kalender_Muell_1_Name.state + " schon an die Straße gestellt?"
            if (KodiOnline.state==ON) { Kodi_Muell_Notification.sendCommand(message) }
            telegramAction_Warn.sendTelegram(message)
        ])
"Kalender_Muell_1_Name" ist ein String-Item... sobald ich die Zeile mit "message =" nicht mehr auskommentiere, bekomme ich den folgenden Wust an Fehlermeldungen im Log, sobald der Timer auslöst:



Code: Alles auswählen

2023-02-06 20:00:00.002 [WARN ] [ore.internal.scheduler.SchedulerImpl] - Scheduled job '<unknown>' failed and stopped

java.lang.IllegalStateException: Cannot resolve proxy: calendar.rules#/1

	at org.eclipse.xtext.common.types.util.JavaReflectAccess.getRawType(JavaReflectAccess.java:109) ~[?:?]

	at org.eclipse.xtext.common.types.util.JavaReflectAccess.getField(JavaReflectAccess.java:58) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._assignValueTo(XbaseInterpreter.java:1354) ~[?:?]

	at org.openhab.core.model.script.interpreter.ScriptInterpreter._assignValueTo(ScriptInterpreter.java:211) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.assignValueTo(XbaseInterpreter.java:1327) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:1319) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

	at org.openhab.core.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:475) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:251) ~[?:?]

	at org.openhab.core.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:213) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:47) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:30) ~[?:?]

	at com.sun.proxy.$Proxy405.apply(Unknown Source) ~[?:?]

	at org.openhab.core.model.script.actions.ScriptExecution.lambda$0(ScriptExecution.java:97) ~[?:?]

	at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$12(SchedulerImpl.java:191) ~[?:?]

	at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$1(SchedulerImpl.java:88) ~[?:?]

	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]

	at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]

	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) [?:?]

	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]

	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]

	at java.lang.Thread.run(Thread.java:829) [?:?]

2023-02-06 20:00:00.027 [WARN ] [ore.internal.scheduler.SchedulerImpl] - Scheduled job '<unknown>' failed and stopped

java.lang.IllegalStateException: Cannot resolve proxy: calendar.rules#/1

	at org.eclipse.xtext.common.types.util.JavaReflectAccess.getRawType(JavaReflectAccess.java:109) ~[?:?]

	at org.eclipse.xtext.common.types.util.JavaReflectAccess.getField(JavaReflectAccess.java:58) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._assignValueTo(XbaseInterpreter.java:1354) ~[?:?]

	at org.openhab.core.model.script.interpreter.ScriptInterpreter._assignValueTo(ScriptInterpreter.java:211) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.assignValueTo(XbaseInterpreter.java:1327) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:1319) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

	at org.openhab.core.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:475) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:251) ~[?:?]

	at org.openhab.core.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:213) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:47) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:30) ~[?:?]

	at com.sun.proxy.$Proxy405.apply(Unknown Source) ~[?:?]

	at org.openhab.core.model.script.actions.ScriptExecution.lambda$0(ScriptExecution.java:97) ~[?:?]

	at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$12(SchedulerImpl.java:191) ~[?:?]

	at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$1(SchedulerImpl.java:88) ~[?:?]

	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]

	at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]

	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) [?:?]

	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]

	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]

	at java.lang.Thread.run(Thread.java:829) [?:?]


Solange "message" nur einen Testtext enthält, funktioniert das Benachrichtigen per Kodi und auch per Telegram ohne Fehler und Probleme.
Es scheint, ich könnte auf ""Kalender_Muell_1_Name" nicht innerhalb des Timers zugreifen... Kann das sein? Und wie kann ich das umgehen?


Gruß

Markus

Antworten