Seite 1 von 2

Müllkalender, Klappe, die X.

Verfasst: 15. Sep 2023 13:24
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?

Re: Müllkalender, Klappe, die X.

Verfasst: 15. Sep 2023 14:45
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...

Re: Müllkalender, Klappe, die X.

Verfasst: 16. Sep 2023 09:48
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

Re: Müllkalender, Klappe, die X.

Verfasst: 16. Sep 2023 13:06
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)
]

Re: Müllkalender, Klappe, die X.

Verfasst: 16. Sep 2023 18:19
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

Re: Müllkalender, Klappe, die X.

Verfasst: 16. Sep 2023 19:09
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.

Re: Müllkalender, Klappe, die X.

Verfasst: 17. Sep 2023 11:26
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.

Re: Müllkalender, Klappe, die X.

Verfasst: 17. Sep 2023 14:55
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 ]

Re: Müllkalender, Klappe, die X.

Verfasst: 17. Sep 2023 15:29
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!

Re: Müllkalender, Klappe, die X.

Verfasst: 17. Sep 2023 15:37
von udo1toni
Ach, das ist ja interessant.
Eigentlich sollte es ohne gehen, aber man lernt ja nie aus :)