MyMüll.de: Einstieg in die Modul-Programmierung in FHEM

Begonnen von LuckyLuis, 10 Oktober 2020, 01:56:49

Vorheriges Thema - Nächstes Thema

LuckyLuis

Guten Morgen.

Ich möchte gerne damit beginnen, ein Modul für FHEM zu entwickeln.
Die Idee ist, via Web eine JSON-Liste mit Terminen von MyMüll herunterzuladen. Dabei sind drei Parameter

- City- und AreaID für myMüll
- Aktualisierungsintervall

bei der Definition des Moduls anzugeben. Dieses JSON-File wird in einen ICalendar konvertiert und in eine ics-Datei geschrieben. Soweit sollte es meiner Ansicht nach in FHEM kein Problem sein.

Nun zu meinen Fragen:
1. Anschließend möchte ich aus dem Modul heraus einen FHEM-Calendar (das bestehende Modul) in Verbindung mit dem erzeugten File automatisiert erstellen.
2. Bei jeder Aktualisierung wird Frage 1 bereinigt und neu durchgeführt.
3. Rechtlich: Da ich den Webservice eines Anbieters nutze: Benötige ich eine Genehmigung, wenn ich solch ein Modul für FHEM bereitstelle?

Zu 1. und 2.: Wird dieser Workflow in FHEM umsetzbar sein oder gibt es Beschränkungen?

Vielen Dank für Eure Unterstützung.

LuckyApo

yersinia

#1
Bist du mit deinem Vorhaben weitergekommen?

Meine Gemeinde ist letztes Jahr auf MyMüll umgestiegen, was ansich ganz nett ist (zumindest die App) - allerdings ist die ical-Verfügbarkeit ein Graus. Zurzeit importiere ich einmal im Jahr die zur Verfügung gestellte ical-Datei in einen privaten Kalender, welche dann FHEM zur Verfügung gestellt wird. Das nervt mich trotzdem, auch weil die Daten im Internet vorliegen und man von Aktualisierungen -außer in der App selbst- nichts mitbekommt.

Aus dem ioBroker und HomeKit Bereich habe ich dann etwas gefunden, wie man zumindest eine JSON Struktur erhält - und die kann man mit dem JsonMod-Modul auslesen.

Dazu benötigt man zunächst die ID der Gemeinde - die sucht man sich in diesem JSON-String raus:
https://mymuell.jumomind.com/mmapp/api.php?r=cities
Wegberg hat die id 66005 (wichtig ist auch auf das attribut has_streets = true zu achten; nur dann gibt es imho noch Straßen die in Abfuhrbezirke unterteilt sind; ansonsten ist der Abfuhrbezirk hier unter area_id hinterlegt).

Mit der (city_) id ruft man das Straßenverzeichnis auf:
https://mymuell.jumomind.com/mmapp/api.php?r=streets&city_id=66005
und sucht nach der Straße und notiert sich die area_id. Die Straße Am Gaskessel hat die area_id 2734.

Mit city_id und area_id kann man dann den Link generieren für das JsonMod Modul:
https://mymuell.jumomind.com/webservice.php?idx=termins&city_id=66005&area_id=2734&ws=3

Basierend auf den Link kann man das JsonMod-Device anlegen. Man filtert hierbei auf die Müllarten, die einen Interessieren.
Die Müllarten haben eigene IDs welche man unter Angabe der city_id unter diesem link findet:
https://mymuell.jumomind.com/mmapp/api.php?r=trash&city_id=66005

Über die readingsList generiert man sich die Readings:
multi(jsonPath("\$.._data[?(\@.cal_garbage_type in ['WEG_PAP', 'WEG_BIOTON', 'WEG_REST', 'WEG_LEICHT'])]"), concat(property('cal_garbage_type'), "_", property('cal_date')), property('cal_date_normal'));
das ganze Device als raw
defmod mymuelltest JsonMod https://mymuell.jumomind.com/webservice.php?idx=termins&city_id=66005&area_id=2734&ws=3
attr mymuelltest interval 0 8 * * *
attr mymuelltest readingList multi(jsonPath("\$.._data[?(\@.cal_garbage_type in ['WEG_PAP', 'WEG_BIOTON', 'WEG_REST', 'WEG_LEICHT'])]"), concat(property('cal_garbage_type'), "_", property('cal_date')), property('cal_date_normal'));;
attr mymuelltest update-on-start 0
attr mymuelltest webCmd reread


Generiert folgende Readings:
   READINGS:
     2022-01-25 15:59:18   .computedReadings WEG_LEICHT_2022-06-13,WEG_BIOTON_2022-06-01,WEG_LEICHT_2022-10-17,WEG_BIOTON_2022-01-12,WEG_LEICHT_2022-09-05,WEG_REST_2022-11-28,WEG_BIOTON_2022-03-09,WEG_BIOTON_2022-05-04,WEG_BIOTON_2022-11-16,WEG_BIOTON_2022-05-18,WEG_BIOTON_2022-09-21,WEG_LEICHT_2022-11-14,WEG_REST_2022-10-31,WEG_BIOTON_2022-09-07,WEG_REST_2022-05-02,WEG_LEICHT_2022-12-27,WEG_PAP_2022-10-10,WEG_LEICHT_2022-09-19,WEG_BIOTON_2022-07-27,WEG_LEICHT_2022-05-30,WEG_REST_2022-03-21,WEG_PAP_2022-08-15,WEG_REST_2022-07-11,WEG_LEICHT_2022-11-28,WEG_PAP_2022-07-18,WEG_BIOTON_2022-03-23,WEG_REST_2022-12-12,WEG_LEICHT_2022-07-25,WEG_LEICHT_2022-01-10,WEG_REST_2022-10-17,WEG_REST_2022-11-14,WEG_BIOTON_2022-04-21,WEG_BIOTON_2022-08-24,WEG_BIOTON_2022-11-30,WEG_LEICHT_2022-04-04,WEG_BIOTON_2022-04-06,WEG_LEICHT_2022-03-07,WEG_REST_2022-09-05,WEG_LEICHT_2022-03-21,WEG_BIOTON_2022-10-19,WEG_REST_2022-08-08,WEG_PAP_2022-05-24,WEG_REST_2022-03-07,WEG_REST_2022-09-19,WEG_LEICHT_2022-10-31,WEG_REST_2022-01-10,WEG_LEICHT_2022-04-19,WEG_LEICHT_2022-05-16,WEG_PAP_2022-06-20,WEG_BIOTON_2022-12-14,WEG_REST_2022-06-13,WEG_BIOTON_2022-12-29,WEG_REST_2022-06-27,WEG_REST_2022-10-04,WEG_BIOTON_2022-08-10,WEG_REST_2022-01-24,WEG_LEICHT_2022-06-27,WEG_LEICHT_2022-08-08,WEG_REST_2022-02-07,WEG_PAP_2022-01-03,WEG_LEICHT_2022-05-02,WEG_LEICHT_2022-02-21,WEG_REST_2022-08-22,WEG_LEICHT_2022-02-07,WEG_REST_2022-04-04,WEG_REST_2022-05-30,WEG_BIOTON_2022-11-03,WEG_BIOTON_2022-07-13,WEG_REST_2022-07-25,WEG_PAP_2022-03-28,WEG_BIOTON_2022-06-29,WEG_LEICHT_2022-12-12,WEG_BIOTON_2022-06-15,WEG_PAP_2022-04-25,WEG_BIOTON_2022-02-23,WEG_PAP_2022-09-12,WEG_PAP_2022-12-05,WEG_REST_2022-05-16,WEG_LEICHT_2022-07-11,WEG_LEICHT_2022-10-04,WEG_BIOTON_2022-10-06,WEG_REST_2022-04-19,WEG_PAP_2022-01-31,WEG_REST_2022-02-21,WEG_PAP_2022-03-02,WEG_PAP_2022-11-07,WEG_BIOTON_2022-02-09,WEG_LEICHT_2022-08-22,WEG_REST_2022-12-27,WEG_LEICHT_2022-01-24,WEG_BIOTON_2022-01-26
     2022-01-25 15:59:18   WEG_BIOTON_2022-01-12 12.01.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-01-26 26.01.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-02-09 09.02.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-02-23 23.02.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-03-09 09.03.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-03-23 23.03.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-04-06 06.04.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-04-21 21.04.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-05-04 04.05.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-05-18 18.05.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-06-01 01.06.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-06-15 15.06.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-06-29 29.06.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-07-13 13.07.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-07-27 27.07.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-08-10 10.08.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-08-24 24.08.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-09-07 07.09.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-09-21 21.09.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-10-06 06.10.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-10-19 19.10.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-11-03 03.11.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-11-16 16.11.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-11-30 30.11.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-12-14 14.12.2022
     2022-01-25 15:59:18   WEG_BIOTON_2022-12-29 29.12.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-01-10 10.01.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-01-24 24.01.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-02-07 07.02.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-02-21 21.02.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-03-07 07.03.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-03-21 21.03.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-04-04 04.04.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-04-19 19.04.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-05-02 02.05.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-05-16 16.05.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-05-30 30.05.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-06-13 13.06.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-06-27 27.06.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-07-11 11.07.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-07-25 25.07.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-08-08 08.08.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-08-22 22.08.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-09-05 05.09.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-09-19 19.09.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-10-04 04.10.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-10-17 17.10.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-10-31 31.10.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-11-14 14.11.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-11-28 28.11.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-12-12 12.12.2022
     2022-01-25 15:59:18   WEG_LEICHT_2022-12-27 27.12.2022
     2022-01-25 15:59:18   WEG_PAP_2022-01-03 03.01.2022
     2022-01-25 15:59:18   WEG_PAP_2022-01-31 31.01.2022
     2022-01-25 15:59:18   WEG_PAP_2022-03-02 02.03.2022
     2022-01-25 15:59:18   WEG_PAP_2022-03-28 28.03.2022
     2022-01-25 15:59:18   WEG_PAP_2022-04-25 25.04.2022
     2022-01-25 15:59:18   WEG_PAP_2022-05-24 24.05.2022
     2022-01-25 15:59:18   WEG_PAP_2022-06-20 20.06.2022
     2022-01-25 15:59:18   WEG_PAP_2022-07-18 18.07.2022
     2022-01-25 15:59:18   WEG_PAP_2022-08-15 15.08.2022
     2022-01-25 15:59:18   WEG_PAP_2022-09-12 12.09.2022
     2022-01-25 15:59:18   WEG_PAP_2022-10-10 10.10.2022
     2022-01-25 15:59:18   WEG_PAP_2022-11-07 07.11.2022
     2022-01-25 15:59:18   WEG_PAP_2022-12-05 05.12.2022
     2022-01-25 15:59:18   WEG_REST_2022-01-10 10.01.2022
     2022-01-25 15:59:18   WEG_REST_2022-01-24 24.01.2022
     2022-01-25 15:59:18   WEG_REST_2022-02-07 07.02.2022
     2022-01-25 15:59:18   WEG_REST_2022-02-21 21.02.2022
     2022-01-25 15:59:18   WEG_REST_2022-03-07 07.03.2022
     2022-01-25 15:59:18   WEG_REST_2022-03-21 21.03.2022
     2022-01-25 15:59:18   WEG_REST_2022-04-04 04.04.2022
     2022-01-25 15:59:18   WEG_REST_2022-04-19 19.04.2022
     2022-01-25 15:59:18   WEG_REST_2022-05-02 02.05.2022
     2022-01-25 15:59:18   WEG_REST_2022-05-16 16.05.2022
     2022-01-25 15:59:18   WEG_REST_2022-05-30 30.05.2022
     2022-01-25 15:59:18   WEG_REST_2022-06-13 13.06.2022
     2022-01-25 15:59:18   WEG_REST_2022-06-27 27.06.2022
     2022-01-25 15:59:18   WEG_REST_2022-07-11 11.07.2022
     2022-01-25 15:59:18   WEG_REST_2022-07-25 25.07.2022
     2022-01-25 15:59:18   WEG_REST_2022-08-08 08.08.2022
     2022-01-25 15:59:18   WEG_REST_2022-08-22 22.08.2022
     2022-01-25 15:59:18   WEG_REST_2022-09-05 05.09.2022
     2022-01-25 15:59:18   WEG_REST_2022-09-19 19.09.2022
     2022-01-25 15:59:18   WEG_REST_2022-10-04 04.10.2022
     2022-01-25 15:59:18   WEG_REST_2022-10-17 17.10.2022
     2022-01-25 15:59:18   WEG_REST_2022-10-31 31.10.2022
     2022-01-25 15:59:18   WEG_REST_2022-11-14 14.11.2022
     2022-01-25 15:59:18   WEG_REST_2022-11-28 28.11.2022
     2022-01-25 15:59:18   WEG_REST_2022-12-12 12.12.2022
     2022-01-25 15:59:18   WEG_REST_2022-12-27 27.12.2022


Die Frage, welche sich mir nun stellt, ist wie es nun von hier weiter geht?

Ist es sinnvoll, das ganze via myUtils funktion in eine lokale ical-Datei zu gießen und dem ABFALL-Modul zur Verfügung zu stellen? Wenn ja, wie würde dies am besten aussehen? Wäre Data::ICal eine Option?
Wie müsste JsonMod die Readings aufbauen, damit es im nächsten Schritt besser zu Verarbeiten wäre.

Vielleicht hat noch jemand Ideen, wie man hier weiter machen könnte. Und kann sogar perl-code beisteuern!? ;)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

yersinia

Jetzt hab ich noch etwas rumgespielt und man kann über ein zweites JsonMod-Device die Abfallarten als Text bekommen.
defmod mymuell_trashtypes JsonMod https://mymuell.jumomind.com/mmapp/api.php?r=trash&city_id=66005
attr mymuell_trashtypes interval 0 10 15 * *
attr mymuell_trashtypes disable 1
attr mymuell_trashtypes readingList multi(jsonPath("\$[*]"), property('name'), property('title'));;
attr mymuell_trashtypes update-on-start 0
attr mymuell_trashtypes webCmd reread

Ich denke, das muss man nicht so oft aktualisieren - deswegen steht disable auf 1. Man kann aber über das reread die Daten manuell aktualisieren.
Das ganze ergibt readings wie
   READINGS:
     2022-01-25 16:47:03   .computedReadings WEG_REST,WEG_BIOTON,WEG_PAP,WEG_GLAS,WEG_SCHADMO,WEG_WEIH,WEG_BIO,WEG_SCHAD,WEG_LEICHT
     2022-01-25 16:47:03   WEG_BIO         pflanzliche Gartenabfälle
     2022-01-25 16:47:03   WEG_BIOTON      Biomüll
     2022-01-25 16:47:03   WEG_GLAS        Glasverpackungen
     2022-01-25 16:47:03   WEG_LEICHT      Leichtverpackungen
     2022-01-25 16:47:03   WEG_PAP         Altpapier
     2022-01-25 16:47:03   WEG_REST        Restabfall
     2022-01-25 16:47:03   WEG_SCHAD       Schadstoffe
     2022-01-25 16:47:03   WEG_SCHADMO     Schadstoffmobil
     2022-01-25 16:47:03   WEG_WEIH        Weihnachtsbaum


Dadurch kann man das readingList des mymuelltest Devices aufbohren. In diesem Beispiel habe ich auch schon auf die Event-id umgestellt. Die Bezeichnung wird sich über ReadingsVal aus dem anderen Device geholt. Sollte es nicht mymuell_trashtypes heissen, müsst ihr es anpassen.
readingsList:
multi(jsonPath("\$.._data[?(\@.cal_garbage_type in ['WEG_PAP', 'WEG_BIOTON', 'WEG_REST', 'WEG_LEICHT'])]"), concat(property('cal_id'), "_date"), property('cal_date_normal'));
multi(jsonPath("\$.._data[?(\@.cal_garbage_type in ['WEG_PAP', 'WEG_BIOTON', 'WEG_REST', 'WEG_LEICHT'])]"), concat(property('cal_id'), "_type"), property('cal_garbage_type'));
multi(jsonPath("\$.._data[?(\@.cal_garbage_type in ['WEG_PAP', 'WEG_BIOTON', 'WEG_REST', 'WEG_LEICHT'])]"), concat(property('cal_id'), "_name"), ReadingsVal("mymuell_trashtypes",property('cal_garbage_type'),property('cal_garbage_type')));

Man könnte den type weglasse (zweite Zeile), wenn die Umwandlung sauber funktioniert (dritte Zeile).

Die Readings sehen dann in etwa so aus:
READINGS:
     2022-01-25 16:55:17   .computedReadings 105714835_name,105714768_type,105714773_date,105714766_name,105714767_name,105714772_name,105714815_date,105714786_name,105714787_name,105714774_type,105714745_name,105714825_type,105714788_type,105714820_type,105714732_type,105714734_name,105714838_date,105714713_type,105714752_date,105714719_name,105714723_date,105714827_date,105714826_date,105714818_name,105714731_date,105714714_date,105714816_type,105714817_type,105714751_type,105714748_date,105714753_name,105714830_name,105714722_name,105714724_type,105714772_type,105714786_type,105714774_name,105714787_type,105714825_name,105714788_name,105714745_type,105714780_date,105714835_type,105714768_name,105714771_date,105714779_date,105714766_type,105714767_type,105714747_date,105714746_date,105714818_type,105714733_date,105714753_type,105714722_type,105714830_type,105714724_name,105714817_name,105714816_name,105714785_date,105714828_date,105714751_name,105714729_date,105714765_date,105714713_name,105714820_name,105714732_name,105714734_type,105714836_date,105714719_type,105714837_date,105714754_date,105714721_date,105714783_type,105714770_name,105714755_date,105714781_name,105714735_type,105714764_date,105714784_date,105714769_name,105714725_name,105714778_date,105714763_type,105714821_date,105714819_type,105714737_date,105714736_date,105714757_type,105714720_name,105714832_name,105714756_type,105714834_type,105714829_date,105714728_date,105714717_name,105714716_name,105714822_type,105714730_type,105714824_name,105714718_type,105714833_date,105714750_date,105714775_name,105714769_type,105714725_type,105714776_date,105714777_date,105714782_date,105714715_date,105714763_name,105714781_type,105714783_name,105714770_type,105714735_name,105714822_name,105714730_name,105714824_type,105714839_date,105714717_type,105714716_type,105714775_type,105714814_date,105714831_date,105714718_name,105714726_date,105714727_date,105714823_date,105714819_name,105714738_date,105714832_type,105714756_name,105714757_name,105714720_type,105714834_name,105714749_date,105714778_type,105714715_name,105714763_date,105714784_type,105714776_name,105714777_name,105714782_name,105714735_date,105714764_type,105714783_date,105714755_type,105714718_date,105714833_type,105714726_name,105714750_type,105714727_name,105714814_name,105714831_name,105714728_type,105714839_name,105714730_date,105714822_date,105714756_date,105714757_date,105714834_date,105714749_name,105714738_name,105714829_type,105714821_type,105714823_name,105714736_type,105714819_date,105714737_type,105714764_name,105714755_name,105714781_date,105714770_date,105714715_type,105714778_name,105714769_date,105714725_date,105714784_name,105714777_type,105714776_type,105714782_type,105714738_type,105714829_name,105714832_date,105714720_date,105714749_type,105714823_type,105714737_name,105714736_name,105714821_name,105714775_date,105714814_type,105714831_type,105714833_name,105714750_name,105714726_type,105714727_type,105714824_date,105714728_name,105714839_type,105714716_date,105714717_date,105714825_date,105714788_date,105714815_type,105714774_date,105714779_name,105714768_date,105714771_name,105714773_type,105714780_name,105714817_date,105714816_date,105714785_name,105714828_name,105714751_date,105714748_type,105714724_date,105714827_type,105714826_type,105714733_name,105714731_type,105714746_name,105714714_type,105714747_name,105714721_name,105714836_name,105714837_name,105714752_type,105714754_name,105714723_type,105714732_date,105714820_date,105714729_name,105714765_name,105714838_type,105714713_date,105714779_type,105714766_date,105714767_date,105714773_name,105714780_type,105714835_date,105714771_type,105714745_date,105714772_date,105714815_name,105714786_date,105714787_date,105714752_name,105714719_date,105714836_type,105714837_type,105714754_type,105714723_name,105714721_type,105714729_type,105714765_type,105714838_name,105714734_date,105714748_name,105714753_date,105714722_date,105714830_date,105714785_type,105714828_type,105714731_name,tomorrow_name_0,105714746_type,105714714_name,105714747_type,105714826_name,105714827_name,105714818_date,105714733_type
     2022-01-25 16:55:17   105714713_date  30.05.2022
     2022-01-25 16:55:17   105714713_name  Restabfall
     2022-01-25 16:55:17   105714713_type  WEG_REST
     2022-01-25 16:55:17   105714714_date  31.10.2022
     2022-01-25 16:55:17   105714714_name  Restabfall
     2022-01-25 16:55:17   105714714_type  WEG_REST
     2022-01-25 16:55:17   105714715_date  12.12.2022
     2022-01-25 16:55:17   105714715_name  Restabfall
     2022-01-25 16:55:17   105714715_type  WEG_REST
     2022-01-25 16:55:17   105714716_date  19.04.2022
     2022-01-25 16:55:17   105714716_name  Restabfall
     2022-01-25 16:55:17   105714716_type  WEG_REST
     2022-01-25 16:55:17   105714717_date  22.08.2022
     2022-01-25 16:55:17   105714717_name  Restabfall
     2022-01-25 16:55:17   105714717_type  WEG_REST
     2022-01-25 16:55:17   105714718_date  28.11.2022
     2022-01-25 16:55:17   105714718_name  Restabfall
     2022-01-25 16:55:17   105714718_type  WEG_REST
     2022-01-25 16:55:17   105714719_date  04.04.2022
     2022-01-25 16:55:17   105714719_name  Restabfall
     2022-01-25 16:55:17   105714719_type  WEG_REST
     2022-01-25 16:55:17   105714720_date  27.12.2022
     2022-01-25 16:55:17   105714720_name  Restabfall
     2022-01-25 16:55:17   105714720_type  WEG_REST
     2022-01-25 16:55:17   105714721_date  07.02.2022
     2022-01-25 16:55:17   105714721_name  Restabfall
     2022-01-25 16:55:17   105714721_type  WEG_REST
     2022-01-25 16:55:17   105714722_date  19.09.2022
     2022-01-25 16:55:17   105714722_name  Restabfall
     2022-01-25 16:55:17   105714722_type  WEG_REST
     2022-01-25 16:55:17   105714723_date  13.06.2022
     2022-01-25 16:55:17   105714723_name  Restabfall
     2022-01-25 16:55:17   105714723_type  WEG_REST
     2022-01-25 16:55:17   105714724_date  16.05.2022
     2022-01-25 16:55:17   105714724_name  Restabfall
     2022-01-25 16:55:17   105714724_type  WEG_REST
     2022-01-25 16:55:17   105714725_date  25.07.2022
     2022-01-25 16:55:17   105714725_name  Restabfall
     2022-01-25 16:55:17   105714725_type  WEG_REST
     2022-01-25 16:55:17   105714726_date  21.02.2022
     2022-01-25 16:55:17   105714726_name  Restabfall
     2022-01-25 16:55:17   105714726_type  WEG_REST
     2022-01-25 16:55:17   105714727_date  10.01.2022
     2022-01-25 16:55:17   105714727_name  Restabfall
     2022-01-25 16:55:17   105714727_type  WEG_REST
     2022-01-25 16:55:17   105714728_date  07.03.2022
     2022-01-25 16:55:17   105714728_name  Restabfall
     2022-01-25 16:55:17   105714728_type  WEG_REST
     2022-01-25 16:55:17   105714729_date  11.07.2022
     2022-01-25 16:55:17   105714729_name  Restabfall
     2022-01-25 16:55:17   105714729_type  WEG_REST
     2022-01-25 16:55:17   105714730_date  02.05.2022
     2022-01-25 16:55:17   105714730_name  Restabfall
     2022-01-25 16:55:17   105714730_type  WEG_REST
     2022-01-25 16:55:17   105714731_date  24.01.2022
     2022-01-25 16:55:17   105714731_name  Restabfall
     2022-01-25 16:55:17   105714731_type  WEG_REST
     2022-01-25 16:55:17   105714732_date  14.11.2022
     2022-01-25 16:55:17   105714732_name  Restabfall
     2022-01-25 16:55:17   105714732_type  WEG_REST
     2022-01-25 16:55:17   105714733_date  08.08.2022
     2022-01-25 16:55:17   105714733_name  Restabfall
     2022-01-25 16:55:17   105714733_type  WEG_REST
     2022-01-25 16:55:17   105714734_date  17.10.2022
     2022-01-25 16:55:17   105714734_name  Restabfall
     2022-01-25 16:55:17   105714734_type  WEG_REST
     2022-01-25 16:55:17   105714735_date  05.09.2022
     2022-01-25 16:55:17   105714735_name  Restabfall
     2022-01-25 16:55:17   105714735_type  WEG_REST
     2022-01-25 16:55:17   105714736_date  27.06.2022
     2022-01-25 16:55:17   105714736_name  Restabfall
     2022-01-25 16:55:17   105714736_type  WEG_REST
     2022-01-25 16:55:17   105714737_date  04.10.2022
     2022-01-25 16:55:17   105714737_name  Restabfall
     2022-01-25 16:55:17   105714737_type  WEG_REST
     2022-01-25 16:55:17   105714738_date  21.03.2022
     2022-01-25 16:55:17   105714738_name  Restabfall
     2022-01-25 16:55:17   105714738_type  WEG_REST
     2022-01-25 16:55:17   105714745_date  28.03.2022
     2022-01-25 16:55:17   105714745_name  Altpapier
     2022-01-25 16:55:17   105714745_type  WEG_PAP
     2022-01-25 16:55:17   105714746_date  18.07.2022
     2022-01-25 16:55:17   105714746_name  Altpapier
     2022-01-25 16:55:17   105714746_type  WEG_PAP
     2022-01-25 16:55:17   105714747_date  03.01.2022
     2022-01-25 16:55:17   105714747_name  Altpapier
     2022-01-25 16:55:17   105714747_type  WEG_PAP
     2022-01-25 16:55:17   105714748_date  10.10.2022
     2022-01-25 16:55:17   105714748_name  Altpapier
     2022-01-25 16:55:17   105714748_type  WEG_PAP
     2022-01-25 16:55:17   105714749_date  24.05.2022
     2022-01-25 16:55:17   105714749_name  Altpapier
     2022-01-25 16:55:17   105714749_type  WEG_PAP
     2022-01-25 16:55:17   105714750_date  07.11.2022
     2022-01-25 16:55:17   105714750_name  Altpapier
     2022-01-25 16:55:17   105714750_type  WEG_PAP
     2022-01-25 16:55:17   105714751_date  12.09.2022
     2022-01-25 16:55:17   105714751_name  Altpapier
     2022-01-25 16:55:17   105714751_type  WEG_PAP
     2022-01-25 16:55:17   105714752_date  05.12.2022
     2022-01-25 16:55:17   105714752_name  Altpapier
     2022-01-25 16:55:17   105714752_type  WEG_PAP
     2022-01-25 16:55:17   105714753_date  20.06.2022
     2022-01-25 16:55:17   105714753_name  Altpapier
     2022-01-25 16:55:17   105714753_type  WEG_PAP
     2022-01-25 16:55:17   105714754_date  31.01.2022
     2022-01-25 16:55:17   105714754_name  Altpapier
     2022-01-25 16:55:17   105714754_type  WEG_PAP
     2022-01-25 16:55:17   105714755_date  15.08.2022
     2022-01-25 16:55:17   105714755_name  Altpapier
     2022-01-25 16:55:17   105714755_type  WEG_PAP
     2022-01-25 16:55:17   105714756_date  25.04.2022
     2022-01-25 16:55:17   105714756_name  Altpapier
     2022-01-25 16:55:17   105714756_type  WEG_PAP
     2022-01-25 16:55:17   105714757_date  02.03.2022
     2022-01-25 16:55:17   105714757_name  Altpapier
     2022-01-25 16:55:17   105714757_type  WEG_PAP
     2022-01-25 16:55:17   105714763_date  17.10.2022
     2022-01-25 16:55:17   105714763_name  Leichtverpackungen
     2022-01-25 16:55:17   105714763_type  WEG_LEICHT
     2022-01-25 16:55:17   105714764_date  12.12.2022
     2022-01-25 16:55:17   105714764_name  Leichtverpackungen
     2022-01-25 16:55:17   105714764_type  WEG_LEICHT
     2022-01-25 16:55:17   105714765_date  30.05.2022
     2022-01-25 16:55:17   105714765_name  Leichtverpackungen
     2022-01-25 16:55:17   105714765_type  WEG_LEICHT
     2022-01-25 16:55:17   105714766_date  25.07.2022
     2022-01-25 16:55:17   105714766_name  Leichtverpackungen
     2022-01-25 16:55:17   105714766_type  WEG_LEICHT
     2022-01-25 16:55:17   105714767_date  19.09.2022
     2022-01-25 16:55:17   105714767_name  Leichtverpackungen
     2022-01-25 16:55:17   105714767_type  WEG_LEICHT
     2022-01-25 16:55:17   105714768_date  02.05.2022
     2022-01-25 16:55:17   105714768_name  Leichtverpackungen
     2022-01-25 16:55:17   105714768_type  WEG_LEICHT
     2022-01-25 16:55:17   105714769_date  22.08.2022
     2022-01-25 16:55:17   105714769_name  Leichtverpackungen
     2022-01-25 16:55:17   105714769_type  WEG_LEICHT
     2022-01-25 16:55:17   105714770_date  10.01.2022
     2022-01-25 16:55:17   105714770_name  Leichtverpackungen
     2022-01-25 16:55:17   105714770_type  WEG_LEICHT
     2022-01-25 16:55:17   105714771_date  24.01.2022
     2022-01-25 16:55:17   105714771_name  Leichtverpackungen
     2022-01-25 16:55:17   105714771_type  WEG_LEICHT
     2022-01-25 16:55:17   105714772_date  31.10.2022
     2022-01-25 16:55:17   105714772_name  Leichtverpackungen
     2022-01-25 16:55:17   105714772_type  WEG_LEICHT
     2022-01-25 16:55:17   105714773_date  14.11.2022
     2022-01-25 16:55:17   105714773_name  Leichtverpackungen
     2022-01-25 16:55:17   105714773_type  WEG_LEICHT
     2022-01-25 16:55:17   105714774_date  07.03.2022
     2022-01-25 16:55:17   105714774_name  Leichtverpackungen
     2022-01-25 16:55:17   105714774_type  WEG_LEICHT
     2022-01-25 16:55:17   105714775_date  21.03.2022
     2022-01-25 16:55:17   105714775_name  Leichtverpackungen
     2022-01-25 16:55:17   105714775_type  WEG_LEICHT
     2022-01-25 16:55:17   105714776_date  28.11.2022
     2022-01-25 16:55:17   105714776_name  Leichtverpackungen
     2022-01-25 16:55:17   105714776_type  WEG_LEICHT
     2022-01-25 16:55:17   105714777_date  08.08.2022
     2022-01-25 16:55:17   105714777_name  Leichtverpackungen
     2022-01-25 16:55:17   105714777_type  WEG_LEICHT
     2022-01-25 16:55:17   105714778_date  27.12.2022
     2022-01-25 16:55:17   105714778_name  Leichtverpackungen
     2022-01-25 16:55:17   105714778_type  WEG_LEICHT
     2022-01-25 16:55:17   105714779_date  04.10.2022
     2022-01-25 16:55:17   105714779_name  Leichtverpackungen
     2022-01-25 16:55:17   105714779_type  WEG_LEICHT
     2022-01-25 16:55:17   105714780_date  21.02.2022
     2022-01-25 16:55:17   105714780_name  Leichtverpackungen
     2022-01-25 16:55:17   105714780_type  WEG_LEICHT
     2022-01-25 16:55:17   105714781_date  05.09.2022
     2022-01-25 16:55:17   105714781_name  Leichtverpackungen
     2022-01-25 16:55:17   105714781_type  WEG_LEICHT
     2022-01-25 16:55:17   105714782_date  11.07.2022
     2022-01-25 16:55:17   105714782_name  Leichtverpackungen
     2022-01-25 16:55:17   105714782_type  WEG_LEICHT
     2022-01-25 16:55:17   105714783_date  04.04.2022
     2022-01-25 16:55:17   105714783_name  Leichtverpackungen
     2022-01-25 16:55:17   105714783_type  WEG_LEICHT
     2022-01-25 16:55:17   105714784_date  19.04.2022
     2022-01-25 16:55:17   105714784_name  Leichtverpackungen
     2022-01-25 16:55:17   105714784_type  WEG_LEICHT
     2022-01-25 16:55:17   105714785_date  13.06.2022
     2022-01-25 16:55:17   105714785_name  Leichtverpackungen
     2022-01-25 16:55:17   105714785_type  WEG_LEICHT
     2022-01-25 16:55:17   105714786_date  16.05.2022
     2022-01-25 16:55:17   105714786_name  Leichtverpackungen
     2022-01-25 16:55:17   105714786_type  WEG_LEICHT
     2022-01-25 16:55:17   105714787_date  07.02.2022
     2022-01-25 16:55:17   105714787_name  Leichtverpackungen
     2022-01-25 16:55:17   105714787_type  WEG_LEICHT
     2022-01-25 16:55:17   105714788_date  27.06.2022
     2022-01-25 16:55:17   105714788_name  Leichtverpackungen
     2022-01-25 16:55:17   105714788_type  WEG_LEICHT
     2022-01-25 16:55:17   105714814_date  29.06.2022
     2022-01-25 16:55:17   105714814_name  Biomüll
     2022-01-25 16:55:17   105714814_type  WEG_BIOTON
     2022-01-25 16:55:17   105714815_date  27.07.2022
     2022-01-25 16:55:17   105714815_name  Biomüll
     2022-01-25 16:55:17   105714815_type  WEG_BIOTON
     2022-01-25 16:55:17   105714816_date  04.05.2022
     2022-01-25 16:55:17   105714816_name  Biomüll
     2022-01-25 16:55:17   105714816_type  WEG_BIOTON
     2022-01-25 16:55:17   105714817_date  14.12.2022
     2022-01-25 16:55:17   105714817_name  Biomüll
     2022-01-25 16:55:17   105714817_type  WEG_BIOTON
     2022-01-25 16:55:17   105714818_date  21.04.2022
     2022-01-25 16:55:17   105714818_name  Biomüll
     2022-01-25 16:55:17   105714818_type  WEG_BIOTON
     2022-01-25 16:55:17   105714819_date  23.02.2022
     2022-01-25 16:55:17   105714819_name  Biomüll
     2022-01-25 16:55:17   105714819_type  WEG_BIOTON
     2022-01-25 16:55:17   105714820_date  19.10.2022
     2022-01-25 16:55:17   105714820_name  Biomüll
     2022-01-25 16:55:17   105714820_type  WEG_BIOTON
     2022-01-25 16:55:17   105714821_date  26.01.2022
     2022-01-25 16:55:17   105714821_name  Biomüll
     2022-01-25 16:55:17   105714821_type  WEG_BIOTON
     2022-01-25 16:55:17   105714822_date  12.01.2022
     2022-01-25 16:55:17   105714822_name  Biomüll
     2022-01-25 16:55:17   105714822_type  WEG_BIOTON
     2022-01-25 16:55:17   105714823_date  09.02.2022
     2022-01-25 16:55:17   105714823_name  Biomüll
     2022-01-25 16:55:17   105714823_type  WEG_BIOTON
     2022-01-25 16:55:17   105714824_date  06.04.2022
     2022-01-25 16:55:17   105714824_name  Biomüll
     2022-01-25 16:55:17   105714824_type  WEG_BIOTON
     2022-01-25 16:55:17   105714825_date  18.05.2022
     2022-01-25 16:55:17   105714825_name  Biomüll
     2022-01-25 16:55:17   105714825_type  WEG_BIOTON
     2022-01-25 16:55:17   105714826_date  10.08.2022
     2022-01-25 16:55:17   105714826_name  Biomüll
     2022-01-25 16:55:17   105714826_type  WEG_BIOTON
     2022-01-25 16:55:17   105714827_date  13.07.2022
     2022-01-25 16:55:17   105714827_name  Biomüll
     2022-01-25 16:55:17   105714827_type  WEG_BIOTON
     2022-01-25 16:55:17   105714828_date  06.10.2022
     2022-01-25 16:55:17   105714828_name  Biomüll
     2022-01-25 16:55:17   105714828_type  WEG_BIOTON
     2022-01-25 16:55:17   105714829_date  07.09.2022
     2022-01-25 16:55:17   105714829_name  Biomüll
     2022-01-25 16:55:17   105714829_type  WEG_BIOTON
     2022-01-25 16:55:17   105714830_date  29.12.2022
     2022-01-25 16:55:17   105714830_name  Biomüll
     2022-01-25 16:55:17   105714830_type  WEG_BIOTON
     2022-01-25 16:55:17   105714831_date  30.11.2022
     2022-01-25 16:55:17   105714831_name  Biomüll
     2022-01-25 16:55:17   105714831_type  WEG_BIOTON
     2022-01-25 16:55:17   105714832_date  16.11.2022
     2022-01-25 16:55:17   105714832_name  Biomüll
     2022-01-25 16:55:17   105714832_type  WEG_BIOTON
     2022-01-25 16:55:17   105714833_date  03.11.2022
     2022-01-25 16:55:17   105714833_name  Biomüll
     2022-01-25 16:55:17   105714833_type  WEG_BIOTON
     2022-01-25 16:55:17   105714834_date  09.03.2022
     2022-01-25 16:55:17   105714834_name  Biomüll
     2022-01-25 16:55:17   105714834_type  WEG_BIOTON
     2022-01-25 16:55:17   105714835_date  24.08.2022
     2022-01-25 16:55:17   105714835_name  Biomüll
     2022-01-25 16:55:17   105714835_type  WEG_BIOTON
     2022-01-25 16:55:17   105714836_date  21.09.2022
     2022-01-25 16:55:17   105714836_name  Biomüll
     2022-01-25 16:55:17   105714836_type  WEG_BIOTON
     2022-01-25 16:55:17   105714837_date  15.06.2022
     2022-01-25 16:55:17   105714837_name  Biomüll
     2022-01-25 16:55:17   105714837_type  WEG_BIOTON
     2022-01-25 16:55:17   105714838_date  01.06.2022
     2022-01-25 16:55:17   105714838_name  Biomüll
     2022-01-25 16:55:17   105714838_type  WEG_BIOTON
     2022-01-25 16:55:17   105714839_date  23.03.2022
     2022-01-25 16:55:17   105714839_name  Biomüll
     2022-01-25 16:55:17   105714839_type  WEG_BIOTON


Man kann sogar nach Datum suchen - also um für heute oder morgen Termine zu finden. Dafür nutze ich eine Perl-sub in der myUtils, die mir das Datum als YYYY-MM-DD zurück gibt.
Zitat von: yersinia am 06 Dezember 2021, 09:10:41
Hier ein Update um die letzten drei Tage zu bekommen. Geänderte mydividate() in 99_myUtils.pm:
sub mydividate {
use DateTime qw( );

my $offset = shift // 0;
if(!looks_like_number($offset)) {
$offset = 0;
}

my $dateYMD =
DateTime
      ->now( time_zone => 'local' )
      ->set_time_zone('floating')
      ->truncate( to => 'day' )
      ->add( days => $offset )
      ->strftime('%Y-%m-%d');

return $dateYMD;
}

Aufruf dann entweder für heute:
mydividate()
für gestern (offset = -1 Tage):
mydividate(-1)
oder morgen (+1 Tag):
mydividate(1)

Das readingList ergänze ich in der mymuelltest dann entsprechend:
multi(jsonPath("\$.._data[?(\@.cal_date in ['".mydividate()."'])]"), concat("today_name_", count()), ReadingsVal("mymuell_trashtypes",property('cal_garbage_type'),property('cal_garbage_type')));
multi(jsonPath("\$.._data[?(\@.cal_date in ['".mydividate(1)."'])]"), concat("tomorrow_name_", count()), ReadingsVal("mymuell_trashtypes",property('cal_garbage_type'),property('cal_garbage_type')));

ergibt dann als reading für morgen:
     2022-01-25 16:55:17   tomorrow_name_0 Biomüll
(da es für heute keinen Termin gibt, gibt es auch kein reading)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

yersinia

#3
Ich denke ich hab jetzt eine recht passable Lösung gefunden. Ist zwar irgendwie durch den Rücken übers Knie ins Auge, aber es funktioniert. Da man dies aber eher selten Aktualisiert, sollte das machbar sein.
1. wir brauchen zwei JsonMod Devices wie oben beschrieben: eines um Abfallarten zu erhalten und eines für die Termine
2. ein bisschen perl-code in der myUtils kippt das in eine ical-datei und legt diese unter /tmp ab
optional:
3. ein Calendar-Device um diese ical-Datei einzulesen
4. ein ABFALL-Device um das ganze aufzubereiten

Hinweis: ein regelmäßiges Update der Daten macht imho wenig Sinn - 1x/Monat reicht, denke ich. Deswegen sind alle JsonMod Devices disabled und können manuell aktualisiert werden (via reread). Wer möchte kann dies alles über ein at o.ä. regeln. (siehe auch DOIF-Vorschlag im Update vom 27.01. unten)
Ein seltener Datenabruf kann auch dafür Sorgen, dass man beim Anbieter unterm Radar fliegt und wenig auffällt (zum Bsp dann durch häufige Abfragen).


Vorgehen:
1. sucht euch wie oben beschrieben euren Abfuhrbezirk raus und erstellt das erste JsonMod Device für die Abfallarten:
defmod mymuell_trashtypes JsonMod https://mymuell.jumomind.com/mmapp/api.php?r=trash&city_id=66005
attr mymuell_trashtypes disable 1
attr mymuell_trashtypes group MyMüll
attr mymuell_trashtypes interval 0 10 15 * *
attr mymuell_trashtypes readingList multi(jsonPath("\$[*]"), property('name'), property('title'));;
attr mymuell_trashtypes room MyMüll
attr mymuell_trashtypes stateFormat { my $ret = "last Update: ";;\
  $ret .= POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,".computedReadings","2000-01-01 00:00:00"))));;\
  return $ret;;\
  }
attr mymuell_trashtypes update-on-start 0
attr mymuell_trashtypes webCmd reread

Wichtig: einmalig ein reread durchführen!

2. das Device mit den Abfallarten wird für das zweite JsonMod Device benötigt - siehe dort das userAttribut trashTypeDevice: dies muss den Devicenamen aus Punkt 1 enthalten, da readingList darauf zurückgreift und die Beschreibung entsprechend ergänzt. Mit den gefunden Abfuhrbezirken (oben beschrieben) erstellt ihr das JsonMod Device für die Termine:
defmod mymuell_trash JsonMod https://mymuell.jumomind.com/webservice.php?idx=termins&city_id=66005&area_id=2734&ws=3
attr mymuell_trash userattr trashTypeDevice
attr mymuell_trash disable 1
attr mymuell_trash group MyMüll
attr mymuell_trash interval 0 11 15 * *
attr mymuell_trash readingList multi(jsonPath("\$.._data[?(\@.cal_garbage_type in ['WEG_PAP', 'WEG_BIOTON', 'WEG_REST', 'WEG_LEICHT'])]"), concat(property('cal_id'), "_date"), property('cal_date_normal'));;\
multi(jsonPath("\$.._data[?(\@.cal_garbage_type in ['WEG_PAP', 'WEG_BIOTON', 'WEG_REST', 'WEG_LEICHT'])]"), concat(property('cal_id'), "_name"), ReadingsVal("mymuell_trashtypes",property('cal_garbage_type'),property('cal_garbage_type')));;
attr mymuell_trash room MyMüll
attr mymuell_trash stateFormat { my $ret = "last Update: ";;\
  $ret .= POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,".computedReadings","2000-01-01 00:00:00"))));;\
  return $ret;;\
}
attr mymuell_trash trashTypeDevice mymuell_trashtypes
attr mymuell_trash update-on-start 0
attr mymuell_trash webCmd reread

Adaptiert das readingList ('WEG_PAP', 'WEG_BIOTON', 'WEG_REST', 'WEG_LEICHT') nach euren Wünschen bzw. den Abfallarten, die euch interessieren. Die zur Verfügung stehenden Arten findet ihr im ersten JsonMod Device (mymuell_trashtypes):
   READINGS:
     2022-01-26 16:53:28   WEG_BIO         pflanzliche Gartenabfälle
     2022-01-26 16:53:28   WEG_BIOTON      Biomüll
     2022-01-26 16:53:28   WEG_GLAS        Glasverpackungen
     2022-01-26 16:53:28   WEG_LEICHT      Leichtverpackungen
     2022-01-26 16:53:28   WEG_PAP         Altpapier
     2022-01-26 16:53:28   WEG_REST        Restabfall
     2022-01-26 16:53:28   WEG_SCHAD       Schadstoffe
     2022-01-26 16:53:28   WEG_SCHADMO     Schadstoffmobil
     2022-01-26 16:53:28   WEG_WEIH        Weihnachtsbaum

Wichtig: einmalig ein reread durchführen!

3. öffnet das Terminal eurer FHEM Installation und installiert die Pakete libdata-ical-perl und libdatetime-format-ical-perl (und notiert euch die ggfs für eure recovery Dokumentation)
sudo apt update && sudo apt install libdatetime-format-ical-perl libdata-ical-perl

4. in FHEM navigiert ihr zu der 99_myUtils.pm und fügt folgenden perl code hinzu:
sub mymuell_trash {
  # created by yersinia - version 2022-01-27
  # https://forum.fhem.de/index.php/topic,114898.msg1091233.html#msg1091233
  #
  use Data::ICal    qw( ); #requires libdata-ical-perl
  use Data::ICal::Entry::Event qw( );
  use Data::ICal::Entry::TimeZone qw( );
  use DateTime                 qw( );
  use DateTime::Format::ICal   qw( ); #requires libdatetime-format-ical-perl

  my $mymdev = shift // return "mymuell device not defined - call is mymueltrash(\"<DEVICE>\")";
 
  my $todayYMD = DateTime
      ->now(time_zone => 'local')
      ->set_time_zone('floating')
      ->truncate(to => 'day')
      ->strftime('%Y-%m-%d');

  if(defined($mymdev)) {
  if(ReadingsVal($mymdev,".computedReadings","none") eq "none") {
#reading is not available - either device wrong or not yet reloaded
return "Reading .computedReadings is not available. Have you reloaded JsonMod device ".$mymdev."?";
}
  #get readings from device
my @mymreadings = split(',',ReadingsVal($mymdev,".computedReadings",""));

# https://perlmaven.com/generate-calendar-in-ical-format
my $trashcalendar = Data::ICal->new();

# add timezone to Calendar https://manpages.debian.org/bullseye/libdata-ical-perl/Data::ICal::Entry::TimeZone.3pm.en.html
my $tz = "Europe/Berlin";
my $trashtimezone = Data::ICal::Entry::TimeZone->new();
$trashtimezone->add_properties(tzid => $tz);
$trashcalendar->add_entry($trashtimezone);

my $trashEvLastModified = POSIX::strftime("%Y%m%dT%H%M%S",localtime(time_str2num(ReadingsTimestamp($mymdev,".computedReadings",($todayYMD." 00:00:00")))));

foreach my $mymr (@mymreadings) {
    if($mymr =~ m/_name/) {
my $trashevent = Data::ICal::Entry::Event->new;
my $trashEvId = substr($mymr,0,(length($mymr)-length("_date")));  #extract id by cutting off last characters
my $trashEvDesc = ReadingsVal($mymdev,$mymr,"");
my ($d,$m,$y) = split('\.',ReadingsVal($mymdev,($trashEvId."_date"),""));
my $trashEvBegin = DateTime->new(
    year => $y,
    month => $m,
    day => $d,
);
$trashEvBegin = $trashEvBegin->ymd('');

my $trashEvEnd = DateTime->new(
    year => $y,
    month => $m,
    day => $d,
);
# make an all-day-event by adding one day to date
$trashEvEnd->add(days => 1);
$trashEvEnd = $trashEvEnd->ymd('');

$trashevent->add_properties(
        summary     => $trashEvDesc,
        description => $trashEvDesc,
comment => "generated by fhem script from MyMuell Device ".$mymdev." on ".$todayYMD,
dtstart => [$trashEvBegin, {TZID => $tz}],
dtend => [$trashEvEnd, {TZID => $tz}],
'last-modified' => [$trashEvLastModified, {TZID => $tz}],
        uid         => "fhem-mymuell-".$mymdev."-".$trashEvId,
    );
    $trashcalendar->add_entry($trashevent);
} else {
next;
}
}
my $trashIcalFilename = "/tmp/fhem_mymuell_".$mymdev.".ics";
my $trasherror = FileWrite($trashIcalFilename, $trashcalendar->as_string);
return $trasherror;
  } else {
  return "mymuell device not defined - call is mymueltrash(\"<DEVICE>\")";
  }
}


4. führt die sub aus indem ihr in der FHEM Kommandozeile (wichtig ist, dass die JsonMode Devices unter Punkt 1 und 2 vorher zumindest einmal ein reload hatten und readings vorhanden sind):
{mymuell_trash("mymuell_trash")}
eingebt. die Funktion benötigt als Paramater den Devicenamen des zweiten JsonMod Devices (punkt 2). Es gibt keine aktive Rückmeldung - ihr solltet aber im Ordner /tmp eine ical Datei finden (bekommt ihr im Terminal mit ls -la /tmp raus:
-rw-r--r--  1 fhem dialout 12459 26. Jan 17:39 fhem_mymuell_mymuell_trash.ics
Der Dateiname setzt sich zusammen aus fhem_mymuell_<devicename>.ics.
Passt den Pfad in der sub an, wenn ihr die ical-Datei woanders haben wollt/braucht.



Optional:
5. erstellt ein Calendar Device, welches auf die Datei zugreift - achtet auf den korrekten Pfad im File-Parameter:
defmod mymuell_calendar Calendar ical file /tmp/fhem_mymuell_mymuell_trash.ics 43200
attr mymuell_calendar group MyMüll
attr mymuell_calendar hideLaterThan 43d
attr mymuell_calendar hideOlderThan 1d
attr mymuell_calendar room MyMüll

Das Interval ist mit 43200s (12h) angegeben - das sollte eigtl reichen. Am Besten wäre ein manuelles Update nachdem die ical-Datei neu geschrieben worden ist.

6. erstellt ein ABFALL-Device - auch hier muss das korrekte KalenderDevice angeben werden.
defmod mymuell_abfall ABFALL mymuell_calendar
attr mymuell_abfall calendarname_praefix 0
attr mymuell_abfall date_style date
attr mymuell_abfall delimiter_reading |
attr mymuell_abfall delimiter_text_reading  und
attr mymuell_abfall group MyMüll
attr mymuell_abfall room MyMüll
attr mymuell_abfall verbose 0
attr mymuell_abfall stateFormat next_text in next_days Tag(en)
attr mymuell_abfall weekday_mapping Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag




Ich hab das bei mir nun erfolgreich getestet - mein FHEM ist Stand Revision 25551 und läuft auf einem RasPi4 mit RaspiOS 11 (bullseye) und perl v5.32.1.
Ggf müssen weitere Pakete (JsonMod) oder Module (ABFALL) installiert werden bevor ihr anfangen könnt.

Da ich kein perl Programmierer bin, geht das Ganze sicher auch eleganter/besser/performanter. Vlt kann einer der perl-gurus hier ein prüfenden Blick drüber werfen und optimieren. Ich wäre dankbar. :)


Update 2022-01-27:
- das Abfall-Device ist mir zu geschwätzig -> verbose 0
- Interval von 43200(s) (= 12h) für das Calendar Device hinzugefügt
- Vorlage umbenannt von mymuelltest -> mymuell_trash
- Dateiendung der Kalenderdatei von .ical auf .ics korrigiert
- das perl script fügt der ical-Datei nun Zeitzone (Europe/Berlin), last-modified und Kommentar hinzu; andere uid für die events (bestehend aus fhem-mymuell-<device>-<id des Termins aus JsonMod Device>)
- die Termine sind jetzt ganztägig (vorher von 00:00:00 bis 23:59:59; jetzt von YYYYMMDD bis YYYYMM(DD+1))
- Vorschlag für ein DOIF, welches die Quellen zweimal im Monat aktualisiert (am 2. und 16.):
defmod mymuell_doif DOIF ([15:00:00] and\
(($mday == 2) or ($mday == 16)))\
({Log3 "mymuell_doif",3,"mymuell: update trashtype"}, set mymuell_trashtypes reread)\
({Log3 "mymuell_doif",3,"mymuell: update trash events"}, set mymuell_trash reread)\
({Log3 "mymuell_doif",3,"mymuell: call ical function"}, {mymuell_trash("mymuell_trash")})
attr mymuell_doif do always
attr mymuell_doif group MyMüll
attr mymuell_doif room MyMüll
attr mymuell_doif wait rand(900),30,60




Update 2022-01-28: neuer Thread myMüll Abfuhrtermine in FHEM und als ics-Datei
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl