Müllkalender, Klappe, die X.

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Müllkalender, Klappe, die X.

Beitrag von nw378 »

Moinsen,

ich habe per iCalender den Abfuhrplan eingebunden, das klappt auch alles prima.

Gerne möchte ich jetzt noch die nächsten Termine chronologisch sortiert anzeigen lassen und dazu in die vier items Tash_0X schreiben.

Meine items sehen so aus:

Code: Alles auswählen

Group gTrash

DateTime Abfall_Termin_schwarz     "schwarze Tonne [%1$tA, %1$td.%1$tm.%1$tY]"  (gTrash)    {channel="icalendar:eventfilter:412e35f1a4:78704cfe7b:result_0#begin"}
DateTime Abfall_Termin_blau        "blaue Tonne [%1$tA, %1$td.%1$tm.%1$tY]"     (gTrash)    {channel="icalendar:eventfilter:412e35f1a4:795742b652:result_0#begin"}
DateTime Abfall_Termin_gelb        "gelbe Tonne [%1$tA, %1$td.%1$tm.%1$tY]"     (gTrash)    {channel="icalendar:eventfilter:412e35f1a4:8713429895:result_0#begin"}
DateTime Abfall_Termin_gruen       "Grüne Tonne [%1$tA, %1$td.%1$tm.%1$tY]"     (gTrash)    {channel="icalendar:eventfilter:412e35f1a4:3d164849dc:result_0#begin"}

String Trash_01 (gTrash) 
String Trash_02 (gTrash) 
String Trash_03 (gTrash) 
String Trash_04 (gTrash) 
Aus dem englischen Forum habe ich folgenden Code-Schnippsel vom Meister ;-) gefunden:

Code: Alles auswählen

myList = gTrash.members.filter[d|d instanceof DateTimeType].sortBy[ "state" ]
myList.forEach[i|
    mytext = gTrash.members.filter[s|s instanceof StringType && s.name.endsWith(i.name.right(1))].head.state.toString
Die zweite Zeile bekomme ich aber nicht in meinem Kopf kompiliert. Bzw. wie bekomme ich die Trash-Items befeuert?
von nw378 » 18. Sep 2023 18:22
Nachtrag: die Labels der Items lassen sich doch bearbeiten, hierzu muss org.openhab.core.model.script.ScriptServiceUtil importiert werden und ein GenericItem kreiert werden.

Die rule schaut dann so aus:

Code: Alles auswählen

import org.openhab.core.model.script.ScriptServiceUtil

rule "Müllabfuhr: Termine sortieren"
  when Time cron "0 05 5 * * ? *" then
    val myList = gTrash.members.filter[d|d instanceof DateTimeItem].sortBy[d | (d.state as DateTimeType).getZonedDateTime() ]  
    myList.forEach[i,c|
       val farbe = i.name.toString.split("_").get(2)
       val String datetime_string  = (i.state as DateTimeType).format("%1$tA, %1$td.%1$tm.%1$ty")
       gTrashc.members.filter[s|s instanceof StringItem && s.name.endsWith((c+1).toString)].head.postUpdate(farbe) 
       gTrash.members.filter[s|s instanceof StringItem && s.name.endsWith((c+1).toString)].head.postUpdate(datetime_string) 
       gTrash.members.filter[s|s instanceof StringItem && s.name.endsWith((c+1).toString)].forEach[ s |
       val GenericItem item = ScriptServiceUtil.getItemRegistry.getItem(s.name) as GenericItem 
       if (farbe == "blau") item.setLabel("Papier") 
       else if (farbe == "gelb") item.setLabel("gelbe Tonne") 
       else if (farbe == "gruen") item.setLabel("Biotonne") 
       else if (farbe == "schwarz") item.setLabel("Restmüll") ]
    ]
    logInfo("Termine"," sortiert") 
end
und das Ergebnis so:
Bildschirmfoto 2023-09-18 um 18.19.02.png
Gehe zur vollständigen Antwort
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Müllkalender, Klappe, die X.

Beitrag von udo1toni »

Wer auch immer der Meister ist...

Der Code ist vermutlich nicht ganz korrekt. Eher sollte die erste Zeile so aussehen:

Code: Alles auswählen

myList = gTrash.members.filter[d|d.state instanceof DateTimeType].sortBy[ "state" ]
myList enthält dann anschließend alle Items aus gTrash, deren Status ein gültiges Datum enthält (und zwar aufsteigend sortiert).
Alternativ könnte man vermutlich auch nach dem Itemtype schauen

Code: Alles auswählen

myList = gTrash.members.filter[d|d instanceof DateTimeItem].sortBy[ "state" ]
Nun kannst Du diese Liste durchlaufen und z.B den Itemnamen und das hinterlegte Datum in die vier Textitems schreiben:

Code: Alles auswählen

myList.forEach[i,c|
    val myText = i.name + " " + i.state.toString
    gTrash.members.filter[s|s instanceof StringItem && s.name.endsWith(c.toString)].head.postUpdate(myText)
]
i ist das aktuelle Item (der Reihenfolge nach, nach dem Status chronologisch aufsteigend...)
c ist der Listenindex (also das wievielte Item der Liste gerade betrachtet wird)
s ist das erste String Item aus gTrash, dessen Name mit dem Index c endet (also "1", "2", "3" oder "4")

Nicht getestet...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Müllkalender, Klappe, die X.

Beitrag von nw378 »

Da muss ich auswendig lernen ;)

Die Regel läuft, das Ergebnis stimmt noch nicht so ganz:

[*] Die Sortierung erfolgt in umgekehrter Reihenfolge (was nicht schlimm wäre, wenn es immer so ist).
[*] Es werden nur drei von vier Items gefüllt, das letzte bleibt auf NULL.

Code: Alles auswählen

Item gTrash | NULL
Members:
Item Abfall_Termin_schwarz | 2023-09-22T00:00:00.000+0200
Item Abfall_Termin_blau | 2023-10-07T00:00:00.000+0200
Item Abfall_Termin_gelb | 2023-09-21T00:00:00.000+0200
Item Abfall_Termin_gruen | 2023-09-29T00:00:00.000+0200
Item Trash_01 | Abfall_Termin_blau 2023-10-07T00:00:00.000+0200
Item Trash_02 | Abfall_Termin_gelb 2023-09-21T00:00:00.000+0200
Item Trash_03 | Abfall_Termin_gruen 2023-09-15T00:00:00.000+0200
Item Trash_04 | NULL
Edit: mal etwas herumprobiert, - weiteren Kalendereintrag ergänzt, Name der Gruppe geändert. Ergebnis: "schwarzer" Termin wird berücksichtigt (zweiter grün nicht). Und die Sortierreihenfolge ist willkürlich. Bin verwirrt.

Code: Alles auswählen

Item gTrashs | NULL
Members:
Item Abfall_Termin_gruenx | 2023-09-29T00:00:00.000+0200
Item Abfall_Termin_schwarz | 2023-09-22T00:00:00.000+0200
Item Abfall_Termin_blau | 2023-10-07T00:00:00.000+0200
Item Abfall_Termin_gelb | 2023-09-21T00:00:00.000+0200
Item Abfall_Termin_gruen | 2023-09-29T00:00:00.000+0200
Item Trash_01 | Abfall_Termin_schwarz 2023-09-22T00:00:00.000+0200
Item Trash_02 | Abfall_Termin_blau 2023-10-07T00:00:00.000+0200
Item Trash_03 | Abfall_Termin_gelb 2023-09-21T00:00:00.000+0200
Item Trash_04 | Abfall_Termin_gruen 2023-09-29T00:00:00.000+0200
Item Trash_05 | NULL
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Müllkalender, Klappe, die X.

Beitrag von udo1toni »

ok, dann stimmt der Code noch nicht zu 100% :) Wie sieht die Rule jetzt aus? (am besten kompletter Code...)

Sortierrichtung sollte sich mit einem - vor dem Schlüsselwort umdrehen lassen, also evtl. so:

Code: Alles auswählen

myList = gTrash.members.filter[d|d instanceof DateTimeItem].sortBy[ - "state" ]
Kann aber auch sein, dass die Anführungszeichen hier gar nicht gebraucht werden, dafür aber der Datentyp für state angegeben werden muss (habe dazu ein Codeschnipsel gefunden)

Code: Alles auswählen

myList = gTrash.members.filter[d|d instanceof DateTimeItem].sortBy[ - (state as DateTimeType) ]
Fehlender letzter Wert: Es kann sein, dass der Listenindex (c) 0-basiert ist. Du könntest wahlweise ein zusätzliches Item Trash_00 anlegen oder den Wert entsprechend korrigieren:

Code: Alles auswählen

myList.forEach[i,c|
    val myText = i.name + " " + i.state.toString
    gTrash.members.filter[s|s instanceof StringItem && s.name.endsWith((c + 1).toString)].head.postUpdate(myText)
]
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Müllkalender, Klappe, die X.

Beitrag von nw378 »

Das vierte Element hat sich mit (c+1) lösen lassen.

Das Sortieren klappt leider immer noch nicht, ich habe alle Varianten mit "state" oder (state as DatetimeType) durchprobiert.

Die items sehen so aus:

Code: Alles auswählen

Group gTrash

DateTime Abfall_Termin_schwarz  "schwarze Tonne [%1$tA, %1$td.%1$tm.%1$tY]"     (gTrash)    {channel="icalendar:eventfilter:412e35f1a4:78704cfe7b:result_0#begin"}
DateTime Abfall_Termin_blau        "blaue Tonne [%1$tA, %1$td.%1$tm.%1$tY]"     (gTrash)    {channel="icalendar:eventfilter:412e35f1a4:795742b652:result_0#begin"}
DateTime Abfall_Termin_gelb        "gelbe Tonne [%1$tA, %1$td.%1$tm.%1$tY]"     (gTrash)    {channel="icalendar:eventfilter:412e35f1a4:8713429895:result_0#begin"}
DateTime Abfall_Termin_gruen       "Grüne Tonne [%1$tA, %1$td.%1$tm.%1$tY]"     (gTrash)    {channel="icalendar:eventfilter:412e35f1a4:3d164849dc:result_0#begin"}

String Trash_01 (gTrash) 
String Trash_02 (gTrash) 
String Trash_03 (gTrash) 
String Trash_04 (gTrash) 
die .rule so:

Code: Alles auswählen

rule "Termine sortieren"
  when Time cron "0 15 18 * * ? *" then
    val myList = gTrash.members.filter[d|d instanceof DateTimeItem].sortBy[ "state" ]
    myList.forEach[i,c|
       val myText = i.name + " " + i.state.toString
       gTrash.members.filter[s|s instanceof StringItem && s.name.endsWith((c+1).toString)].head.postUpdate(myText) 
    ]
    logInfo("Termine"," sortiert") 
end
und das Ergebnis so:

Code: Alles auswählen

Item gTrash | NULL
Members:
Item Trash_01 | Abfall_Termin_gelb 2023-09-21T00:00:00.000+0200
Item Trash_02 | Abfall_Termin_gruen 2023-09-29T00:00:00.000+0200
Item Trash_03 | Abfall_Termin_blau 2023-10-07T00:00:00.000+0200
Item Trash_04 | Abfall_Termin_schwarz 2023-09-22T00:00:00.000+0200
Item Abfall_Termin_gelb | 2023-09-21T00:00:00.000+0200
Item Abfall_Termin_gruen | 2023-09-29T00:00:00.000+0200
Item Abfall_Termin_blau | 2023-10-07T00:00:00.000+0200
Item Abfall_Termin_schwarz | 2023-09-22T00:00:00.000+0200
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Müllkalender, Klappe, die X.

Beitrag von udo1toni »

Strange...
Ich werde das mal ersuchen bei mir nachzustellen...
Gibt es irgendwelche Fehlermeldungen, wenn die Rule ausgeführt wird?
nw378 hat geschrieben: 16. Sep 2023 18:19 ich habe alle Varianten mit "state" oder (state as DatetimeType) durchprobiert.
Typo nur hier oder beim Probieren? Es muss state as DateTimeType heißen, also

Code: Alles auswählen

val myList = gTrash.members.filter[d|d instanceof DateTimeItem].sortBy[ - state as DateTimeType ]
Eventuell wäre auch

Code: Alles auswählen

val myList = gTrash.members.filter[d|d instanceof DateTimeItem].sortBy[ state as DateTimeType ].reverseView
möglich.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Müllkalender, Klappe, die X.

Beitrag von nw378 »

Ja, das war ein Typo im Forumsbeitrag. In der Regel stand state as DateTimeType.
Wenn ich das so eingebe, erhalte ich allerdings folgende Fehlermeldung in VSC:

Code: Alles auswählen

Bounds mismatch: The type arguments <Item, DateTimeType> are not a valid substitute for the bounded type parameters <T, C extends Comparable<? super C>> of the method sortBy(Iterable<T>, Function1<? super T, C>)(org.eclipse.xtext.xbase.validation.IssueCodes.type_bounds_missmatch)
Im Logfile steht:

Code: Alles auswählen

2023-09-17 11:24:04.341 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'abfall-1' failed: class org.openhab.core.library.types.DateTimeType cannot be cast to class java.lang.Comparable (org.openhab.core.library.types.DateTimeType is in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @1ecb80f; java.lang.Comparable is in module java.base of loader 'bootstrap') in abfall
Die Variante mit .sortBy[ "state" ] läuft ohne Fehlermeldung durch, aber eben auch ohne Sortieren.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Müllkalender, Klappe, die X.

Beitrag von udo1toni »

Und wie sieht es mit state ohne Anführungszeichen aus?

Code: Alles auswählen

val myList = gTrash.members.filter[d|d instanceof DateTimeItem].sortBy[ - state ]
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Müllkalender, Klappe, die X.

Beitrag von nw378 »

Heureka, ich hab's!

Das entscheidende war, dass d| in dem Suchabschnitt fehlte. Vollständig sieht die Regel jetzt so aus:

Code: Alles auswählen

rule "Termine sortieren"
  when Time cron "0 26 15 * * ? *" then
    val myList = gTrash.members.filter[d|d instanceof DateTimeItem].sortBy[d | (d.state as DateTimeType).getZonedDateTime() ]  
    myList.forEach[i,c|
       val myText = i.name + " " + i.state.toString
       gTrash.members.filter[s|s instanceof StringItem && s.name.endsWith((c+1).toString)].head.postUpdate(myText) 
    ]
    logInfo("Termine"," sortiert") 
end
Ob (d.state as DateTimeType).getZonedDateTime() notwendig ist, weiß ich nicht, aber es läuft. :-)

Merci!
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Müllkalender, Klappe, die X.

Beitrag von udo1toni »

Ach, das ist ja interessant.
Eigentlich sollte es ohne gehen, aber man lernt ja nie aus :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten