FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Kalendermodule => Thema gestartet von: TubeHead am 07 Februar 2026, 14:40:02

Titel: Calendar, CalView & Co
Beitrag von: TubeHead am 07 Februar 2026, 14:40:02
Hallo liebe Leute,

ich versuche mich gerade daran, Müllabfuhrtermine optisch auf den vorhandenen Ulanzi's darzustellen. Mit den Ulanzi's (AWTRIX) habe ich keine Probleme; die werden schon exzessiv eingesetzt. Aber mit dem Kalendermodul haperts...

Aktuell nutze ich eine lokale ICS, die wohl auch gelesen wird. Wenn ich den Dateinamen ändere erhalte ich bei "lastResponse" einen Error, wenn der Dateiname stimmt, erhalte ich ein OK.

Aktuell so definiert:

defmod kalender Calendar ical file ./abfallkalender.ics 3600
attr kalender group Kalender
attr kalender room 980 - Umwelt

setstate kalender initialized
setstate kalender 2026-02-07 13:45:35 lastResponse OK
setstate kalender 2026-02-07 13:43:45 nextWakeup 2026-02-07 14:43:45
setstate kalender 2026-02-07 14:22:02 state initialized

Das Intervall ist natürlich sinnlos kurz, aber zum Testen wohl erstmal ok.

Wenn ich jetzt ...
get kalender events format:full... absetze, sollte doch, nach meinem rudimentären Verständnis, eine Auflistung aller Termine in der Datei erfolgen, oder nicht?
Es passiert aber... nix ...

Letztendlich möchte ich einen Tag vorher (i.d.R. ein Sonntag, aber nicht immer!) schauen, was in der ICS bei "SUMMARY" steht und das dann per MQTT zu den Ulanzi's senden.

Da stehe ich jetzt vollkommen auf dem Schlauch, wie man das (mit DOIF) macht...

Könnte mich da bitte jemand DAU-konform einnorden?
Titel: Aw: Calendar, CalView & Co
Beitrag von: Nobbynews am 07 Februar 2026, 15:55:27
Schon mal ein
set kalender reload oder
set kalender update vor dem get ausgeführt?

Und dann besser in das richtige Unterforum verschieben:
ZitatModule: 57_Calendar.pm Maintainer: neubert Forum: Unterstützende Dienste/Kalendermodule
Titel: Aw: Calendar, CalView & Co
Beitrag von: TubeHead am 07 Februar 2026, 16:00:03
... japp ... Beides mehrfach. Ändert nichts.
Ok... Wie verschiebe ich als Nutzer einen Thread? Darf ich das denn?
Titel: Aw: Calendar, CalView & Co
Beitrag von: Nobbynews am 07 Februar 2026, 16:10:26
Wie man ein Thema verschiebt, steht hier beschrieben:
https://forum.fhem.de/index.php?topic=68904.0 (https://forum.fhem.de/index.php?topic=68904.0)
Titel: Aw: Calendar, CalView & Co
Beitrag von: Otto123 am 07 Februar 2026, 16:11:22
Hi,
Zitat von: TubeHead am 07 Februar 2026, 14:40:02Könnte mich da bitte jemand DAU-konform einnorden?
vornweg, es wäre generell sinnvoller spezielle Fragen in einem spezielleren Unterforum zu stellen. Das passenden Unterforum findet man mit: help Calendar bzw. help DOIF
Du solltest den Thread passend verschieben. Unten links gibt es einen Button ...

Die readings kommen mir eigenartig vor:
lastResponse OK - So ein Reading gibt es bei mir nicht?!
state initialized - sieht aus wie nur definiert und nichts geladen.
calname - hier steht bei meinen Kalendern immer der name des Kalenders drin. Aber vielleicht darf der fehlen.
nextUpdate sollte es eigentlich geben wenn ein Interval angegeben ist (welches per default bei 3600 liegt)?
Ein
get kalender events sollte alle Events liefern.

Was wird denn bei
get kalender vcalendar oder
get kalender vevents ausgegeben?

Wie ist die ics Datei entstanden? Was steht da drin?

Gruß Otto
Titel: Aw: Calendar, CalView & Co
Beitrag von: Nobbynews am 07 Februar 2026, 16:22:53
Zitat von: Otto123 am 07 Februar 2026, 16:11:22Die readings kommen mir eigenartig vor:
lastResponse OK - So ein Reading gibt es bei mir nicht?!
Hmmm, das gibt es bei mir allerdings:
READINGS:
    2026-02-07 03:05:01  calname        Abfall
    2026-02-07 03:05:00  lastResponse    OK
    2026-02-07 03:05:01  lastUpdate      2026-02-07 03:05:00
    2026-02-07 03:05:01  nextUpdate      2026-02-08 03:05:00
    2026-02-07 03:05:01  nextWakeup      2026-02-08 03:05:00
    2026-02-07 03:05:01  state          triggered
Attributes:
  cutoffLaterThan 040d
  cutoffOlderThan 14d

Scheint so, als ob die ics-Datei nicht in Ordnung ist.
Bei mir liefert ein get Abfall events
23.01.2026 00:00 24h Bioabfall
30.01.2026 00:00 24h Restabfall
04.02.2026 00:00 24h Leichtverpackungen
06.02.2026 00:00 24h Bioabfall
12.02.2026 00:00 24h Papier
13.02.2026 00:00 24h Restabfall
19.02.2026 00:00 24h Leichtverpackungen
21.02.2026 00:00 24h Bioabfall
27.02.2026 00:00 24h Restabfall
04.03.2026 00:00 24h Leichtverpackungen
06.03.2026 00:00 24h Bioabfall
12.03.2026 00:00 24h Papier
13.03.2026 00:00 24h Restabfall
18.03.2026 00:00 24h Leichtverpackungen
Titel: Aw: Calendar, CalView & Co
Beitrag von: TubeHead am 07 Februar 2026, 16:24:24
Ok, ich hangle mich mal anhand Deiner Fragen dazu durch...

Wenn ich "get kalender events" in der Kommandozeile absetze, erhalte ich ein leeres Popup. Setze ich es mit dem Button "get" und entsprechend im Dropdown "events" ausgewählt ab, passiert nichts.

Wenn ich vcalendar abfrage, erhalte ich eine Fehlermeldung:
fhem?detail=kalender line 8:
Uncaught SyntaxError: Unexpected string

Wenn ich vevents abfrage, erhalte ich ein leeres Resultat resp. es passiert nichts; wie events.

Die ICS habe ich mal beigefügt. Die stammt von unserem zuständigen Entsorger und wurde z.B. vom Google-Kalender anstandslos übernommen.

abfallkalender.ics

Die habe ich in das root von FHEM kopiert, also dort, wo auch die fhem.cfg verweilt. Die scheint er auch zu finden, denn sobald ich den Dateinamen ändere, erhalte ich einen Error.
Titel: Aw: Calendar, CalView & Co
Beitrag von: Otto123 am 07 Februar 2026, 16:32:05
Du solltest den Thread nicht schließen! Öffne ihn bitte wieder!

Die ICS Datei ist im Windows Format (CR LF) gespeichert, ich weiß nicht ob Calendar (Linux) damit klar kommt, ich denke nicht.

Hast Du eventuell selbst verursacht oder ist falsch geliefert.
Das Tool dos2unix könnte helfen. Oder die Datei mit Notpad ++ öffnen und im unix Formal (LF) speichern.

sudo apt install dos2unix
Zitat von: TubeHead am 07 Februar 2026, 16:24:24vom Google-Kalender anstandslos übernommen.
Warum bindest Du dann nicht den direkt ein? Ist doch besser als eine lokale Datei?
Google wird wohl beim Import das Windows Format tolerieren ... Linux tut dies normalerweise nicht und die Effekte sind meist "lustig"

Titel: Aw: Calendar, CalView & Co
Beitrag von: Nobbynews am 07 Februar 2026, 16:46:04
Ich habe jetzt die ics-Datei von meinem Entsorger nicht wie @Otto überprüft.
Inhaltlich sieht die Datei aber ok aus.
Vielleicht mal
./abfallkalender.ics durch
/opt/fhem/abfallkalender.ics ersetzen?

Allerdings habe ich das über einen Google-Kalender eingebunden.
Titel: Aw: Calendar, CalView & Co
Beitrag von: TubeHead am 07 Februar 2026, 16:49:52
... das war ja mal eine Sache ;) Aber nun ist ja wieder offen  8)

Ich habe die Datei nun mal mit NP++ zu UNIX/UTF8 geändert und wieder zurück kopiert. Dann Reload und Update... Ändert leider nichts

Über den Google-Kalender werde ich es später einbinden. Das hatte ich auch zuerst versucht, aber mit gleichen Ergebnissen. Daher hatte ich mit entschieden, erstmal zum Rumfrickeln mit einer Datei zu arbeiten, um evtl. andere Fehlerquellen ausschließen zu können, die mit dem Abgreifen bei Google zusammenhängen könnten.

@Nobbynews
Habe ich gerade auch mal gemacht. Ändert aber auch nichts...


PS: Kann mir mal wer eine bei einem selbst funktionierende ICS zur Verfügung stellen? Dann teste ich die mal um zu sehen, ob hier was an der Datei oder irgendwo anders was nicht stimmt...
Titel: Aw: Calendar, CalView & Co
Beitrag von: Otto123 am 07 Februar 2026, 16:59:38
Kann ich nicht nachvollziehen: Deine Datei im Unix Format nach /opt/fhem, exakt Deine Definition, set kalender reload gemacht, funktioniert einwandfrei:
define kalender Calendar ical file ./abfallkalender.ics
#   CFGFN     
#   DEF        ical file ./abfallkalender.ics
#   FUUID      698760b4-f33f-9d3c-3c44-fc7127b3c6413a43
#   NAME       kalender
#   NOTIFYDEV  global
#   NR         42
#   NTFY_ORDER 50-kalender
#   STATE      triggered
#   TYPE       Calendar
#   eventCount 11
#   READINGS:
#     2026-02-07 16:56:56   lastUpdate      2026-02-07 16:56:55
#     2026-02-07 16:56:56   nextUpdate      2026-02-07 17:56:55
#     2026-02-07 16:56:56   nextWakeup      2026-02-07 17:56:55
#     2026-02-07 16:56:56   state           triggered
#
setstate kalender triggered
setstate kalender 2026-02-07 16:56:56 lastUpdate 2026-02-07 16:56:55
setstate kalender 2026-02-07 16:56:56 nextUpdate 2026-02-07 17:56:55
setstate kalender 2026-02-07 16:56:56 nextWakeup 2026-02-07 17:56:55
setstate kalender 2026-02-07 16:56:56 state triggered

get events liefert
Zitat02.02.2026 00:00 24h Bioabfall
09.02.2026 00:00 24h Restmüll
09.02.2026 00:00 24h Gelbe Tonne
16.02.2026 00:00 24h Bioabfall
16.02.2026 00:00 24h Papier
23.02.2026 00:00 24h Gelbe Tonne
23.02.2026 00:00 24h Restmüll
02.03.2026 00:00 24h Bioabfall
09.03.2026 00:00 24h Restmüll
09.03.2026 00:00 24h Gelbe Tonne
16.03.2026 00:00 24h Bioabfall
16.03.2026 00:00 24h Papier
23.03.2026 00:00 24h Gelbe Tonne
23.03.2026 00:00 24h Restmüll
30.03.2026 00:00 24h Bioabfall
07.04.2026 00:00 24h Gelbe Tonne
07.04.2026 00:00 24h Restmüll
13.04.2026 00:00 24h Bioabfall
13.04.2026 00:00 24h Papier
20.04.2026 00:00 24h Gelbe Tonne
20.04.2026 00:00 24h Restmüll
27.04.2026 00:00 24h Bioabfall
04.05.2026 00:00 24h Gelbe Tonne
04.05.2026 00:00 24h Restmüll
11.05.2026 00:00 24h Papier
11.05.2026 00:00 24h Bioabfall
18.05.2026 00:00 24h Restmüll
18.05.2026 00:00 24h Gelbe Tonne
26.05.2026 00:00 24h Bioabfall
01.06.2026 00:00 24h Gelbe Tonne
01.06.2026 00:00 24h Restmüll
08.06.2026 00:00 24h Bioabfall
08.06.2026 00:00 24h Papier
15.06.2026 00:00 24h Restmüll
15.06.2026 00:00 24h Gelbe Tonne
22.06.2026 00:00 24h Bioabfall
29.06.2026 00:00 24h Gelbe Tonne
29.06.2026 00:00 24h Restmüll
06.07.2026 00:00 24h Bioabfall
06.07.2026 00:00 24h Papier
13.07.2026 00:00 24h Gelbe Tonne
13.07.2026 00:00 24h Restmüll
20.07.2026 00:00 24h Bioabfall
27.07.2026 00:00 24h Restmüll
27.07.2026 00:00 24h Gelbe Tonne
03.08.2026 00:00 24h Papier
03.08.2026 00:00 24h Bioabfall
10.08.2026 00:00 24h Restmüll
10.08.2026 00:00 24h Gelbe Tonne
17.08.2026 00:00 24h Bioabfall
24.08.2026 00:00 24h Restmüll
24.08.2026 00:00 24h Gelbe Tonne
31.08.2026 00:00 24h Bioabfall
31.08.2026 00:00 24h Papier
07.09.2026 00:00 24h Restmüll
07.09.2026 00:00 24h Gelbe Tonne
14.09.2026 00:00 24h Bioabfall
21.09.2026 00:00 24h Restmüll
21.09.2026 00:00 24h Gelbe Tonne
28.09.2026 00:00 24h Papier
28.09.2026 00:00 24h Bioabfall
05.10.2026 00:00 24h Restmüll
05.10.2026 00:00 24h Gelbe Tonne
12.10.2026 00:00 24h Bioabfall
19.10.2026 00:00 24h Gelbe Tonne
19.10.2026 00:00 24h Restmüll
26.10.2026 00:00 24h Bioabfall
26.10.2026 00:00 24h Papier
02.11.2026 00:00 24h Gelbe Tonne
02.11.2026 00:00 24h Restmüll
09.11.2026 00:00 24h Bioabfall
16.11.2026 00:00 24h Restmüll
16.11.2026 00:00 24h Gelbe Tonne
23.11.2026 00:00 24h Bioabfall
23.11.2026 00:00 24h Papier
30.11.2026 00:00 24h Gelbe Tonne
30.11.2026 00:00 24h Restmüll
07.12.2026 00:00 24h Bioabfall
14.12.2026 00:00 24h Restmüll
14.12.2026 00:00 24h Gelbe Tonne
18.12.2026 00:00 24h Papier
18.12.2026 00:00 24h Bioabfall
28.12.2026 00:00 24h Gelbe Tonne
28.12.2026 00:00 24h Restmüll
Habe es aber auch mit dem Windows Format probiert, scheint egal zu sein. Da liegt bei Dir ein andere Fehler vor!!!
Titel: Aw: Calendar, CalView & Co
Beitrag von: TubeHead am 07 Februar 2026, 17:02:26
 :o Kapiere ich nicht  :'(
Ist vielleicht das Modul irgendwie bei mir defekt? kann ich das manuell nach FHEM kopieren, um das ausschließen zu können?
Titel: Aw: Calendar, CalView & Co
Beitrag von: Otto123 am 07 Februar 2026, 17:04:33
was sagt
version Calendar
Zitat von: TubeHead am 07 Februar 2026, 17:02:26manuell nach FHEM kopieren
besser nicht :)
Titel: Aw: Calendar, CalView & Co
Beitrag von: TubeHead am 07 Februar 2026, 17:09:23
 ;D  ;D  ;D
Ich hatte gerade die gleiche Idee und ein komplettes FHEM-Update gemacht. Jetzt funktioniert das...  O:-)

War da mal in den vergangenen Monaten eine Version mit einer Macke? Scheint so... Und bei meinem Glück habe ich natürlich genau die noch gehabt...
Nun gut... Das Problem wäre gelöst... Gut das wir drüber gesprochen haben  ;)

Ich versuche jetzt mal, ob ich alleine dahinter komme, wie ich "morgige termine" mit DOIF fassen kann, um die Pixels anzusteuern. Kann also sein, da ich mich dazu noch mal melde...
Titel: Aw: Calendar, CalView & Co
Beitrag von: Nobbynews am 07 Februar 2026, 17:16:37
Zitat von: TubeHead am 07 Februar 2026, 17:09:23Ich versuche jetzt mal, ob ich alleine dahinter komme, wie ich "morgige termine" mit DOIF fassen kann, um die Pixels anzusteuern. Kann also sein, da ich mich dazu noch mal melde...
Dafür verwende ich das Modul Abfall: https://wiki.fhem.de/wiki/ABFALL (https://wiki.fhem.de/wiki/ABFALL)
defmod myAbfall ABFALL Abfall
attr myAbfall calendarname_praefix 0
attr myAbfall date_style date
attr myAbfall delimiter_reading |
attr myAbfall delimiter_text_reading und
attr myAbfall room 00_A,Unsorted
attr myAbfall stateFormat {"heute ".ReadingsVal($name,"now_text","keine Tonne")."\
<br>".ReadingsVal($name,"next_text","")." in ".ReadingsVal($name,"next_days","").\
" Tag(en)\
<br> am ".ReadingsVal($name,"next_weekday","")}
attr myAbfall weekday_mapping Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag

setstate myAbfall heute keine Tonne\
<br>Papier in 5 Tag(en)\
<br> am Donnerstag
setstate myAbfall 2026-02-07 03:05:01 Bioabfall_date 21.02.2026
setstate myAbfall 2026-02-07 03:05:01 Bioabfall_days 14
setstate myAbfall 2026-02-07 03:05:01 Bioabfall_description
setstate myAbfall 2026-02-07 03:05:01 Bioabfall_location XXXXXX
setstate myAbfall 2026-02-07 03:05:01 Bioabfall_text Bioabfall
setstate myAbfall 2026-02-07 03:05:01 Bioabfall_uid 771bc15115f74d2d381207c9a7db77b4googlecom
setstate myAbfall 2026-02-07 03:05:01 Bioabfall_weekday Samstag
setstate myAbfall 2026-02-07 03:05:01 Leichtverpackungen_date 19.02.2026
setstate myAbfall 2026-02-07 03:05:01 Leichtverpackungen_days 12
setstate myAbfall 2026-02-07 03:05:01 Leichtverpackungen_description
setstate myAbfall 2026-02-07 03:05:01 Leichtverpackungen_location XXXXX
setstate myAbfall 2026-02-07 03:05:01 Leichtverpackungen_text Leichtverpackungen
setstate myAbfall 2026-02-07 03:05:01 Leichtverpackungen_uid 6295763663e516a0e3ce2fa8c200ed5cgooglecom
setstate myAbfall 2026-02-07 03:05:01 Leichtverpackungen_weekday Donnerstag
setstate myAbfall 2026-02-07 03:05:01 Papier_date 12.02.2026
setstate myAbfall 2026-02-07 03:05:01 Papier_days 5
setstate myAbfall 2026-02-07 03:05:01 Papier_description
setstate myAbfall 2026-02-07 03:05:01 Papier_location XXXXXXX
setstate myAbfall 2026-02-07 03:05:01 Papier_text Papier
setstate myAbfall 2026-02-07 03:05:01 Papier_uid 466e495c3fdd071ffc55fa2dabe65118googlecom
setstate myAbfall 2026-02-07 03:05:01 Papier_weekday Donnerstag
setstate myAbfall 2026-02-07 03:05:01 Restabfall_date 13.02.2026
setstate myAbfall 2026-02-07 03:05:01 Restabfall_days 6
setstate myAbfall 2026-02-07 03:05:01 Restabfall_description
setstate myAbfall 2026-02-07 03:05:01 Restabfall_location XXXXXXX
setstate myAbfall 2026-02-07 03:05:01 Restabfall_text Restabfall
setstate myAbfall 2026-02-07 03:05:01 Restabfall_uid 8b4d88152540f37961bd9bc8d255f0c6googlecom
setstate myAbfall 2026-02-07 03:05:01 Restabfall_weekday Freitag
setstate myAbfall 2026-02-07 03:05:01 next Papier_5
setstate myAbfall 2026-02-07 03:05:01 next_date 12.02.2026
setstate myAbfall 2026-02-07 03:05:01 next_days 5
setstate myAbfall 2026-02-07 03:05:01 next_description
setstate myAbfall 2026-02-07 03:05:01 next_location XXXXXX
setstate myAbfall 2026-02-07 03:05:01 next_text Papier
setstate myAbfall 2026-02-07 03:05:01 next_weekday Donnerstag
setstate myAbfall 2026-02-07 03:05:01 state 5


Meine Ulanzi steuere ich über das reading next_days an:
defmod nNextDays notify myAbfall:next_days:.1 {\
 my $art = ReadingsVal("myAbfall","next_text","");;\
 ULANZI_SetCustomTonne("myULANZI",$art);;\
}\
Und dann noch in 99_myUtils (Quelle: https://forum.fhem.de/index.php?topic=140239.0 (https://forum.fhem.de/index.php?topic=140239.0)
sub ULANZI_SetCustomTonne {
    my ($name, $tonne) = @_;
   
    my %icon  = ("Papier"            => 12154,
                "Restabfall"        => 12155,
                "Leichtverpackungen" => 12212,
                "Bioabfall"          => 12442);               
   
    my %data = (
        textCase => "2",
        scrollSpeed => "80",
        text  => "Tonne rausstellen",
        icon => "$icon{$tonne}",
        lifetime => "64800",
        lifetimeMode => "0",
        #pushIcon => "2",
        repeat => "2",
        color => "#FFFFFF"
    );

    ULANZI_SetCustom($name, "Tonne", \%data);
}

sub ULANZI_publish {
    my ($name, $topic, $payload) = @_;

    my $hash = $defs{$name};

    my $devtopic = AttrVal($name, "devicetopic", undef);
    my $payload_str = JSON->new->encode($payload);
    IOWrite($hash, "publish", "$devtopic/$topic " . $payload_str);
}


sub ULANZI_SetCustom {
    my ($name, $appname, $payload) = @_;

    my $hash = $defs{$name};

    ULANZI_publish($name, "custom/$appname", $payload);
}


Durch Drücken der mittleren Taste an der Ulanzi kann die Anzeige beendet werden:
defmod nULANZI_button notify myULANZI:button.* {\
if ($EVTPART0 eq "buttonSelect"){\
 if (ReadingsNum("myAbfall","next_days",0) == 1){\
  fhem ("set MQTT2_Server publish awtrix_bb70d4/custom/Tonne {}");;\
  }\
 }\
}
Titel: Aw: Calendar, CalView & Co
Beitrag von: TubeHead am 08 Februar 2026, 12:43:52
... so kann man es natürlich auch machen 8)

Ich habe es jetzt anders gelöst.
Ursprünglich wollte ich ja einen der Indikatoren abwechselnd in den entsprechenden Farben abwechselnd blinken lassen. Das kann AWTRIX aber nativ nicht. Blinken ja, aber nicht im Wechsel mit zwei oder drei Farben. Das hätte per MQTT in einer Schleife an alle drei Pixeluhren gesendet werden müssen; zu viel Aufwand und Payload...
Ich setze daher nun eine CustomApp mit den entsprechenden Farben.

Das Modul "Abfall" nutze ich nicht. Ich bin den manuellen Weg gegangen mit zwei DOIF:

defmod set_trash DOIF ([13:00] and defined fhem('get calendar events filter:field(summary)=~"Restmüll" limit:when=tomorrow')) (set $SELF bk 1)\
DOELSEIF ([13:00] and defined fhem('get calendar events filter:field(summary)=~"Gelbe" limit:when=tomorrow')) (set $SELF ye 1)\
DOELSEIF ([13:00] and defined fhem('get calendar events filter:field(summary)=~"Papier" limit:when=tomorrow')) (set $SELF bl 1)\
DOELSE (set $SELF bk 0, set $SELF ye 0, set $SELF bl 0)
attr set_trash do always
attr set_trash group Kalender
attr set_trash readingList bk ye bl
attr set_trash room 980 - Umwelt
attr set_trash stateFormat bk,ye,bl

setstate set_trash 0,0,0
setstate set_trash 2026-02-08 11:34:44 bk 0
setstate set_trash 2026-02-08 11:34:44 bl 0
setstate set_trash 2026-02-08 11:34:44 cmd 4
setstate set_trash 2026-02-08 11:34:44 cmd_event set_trash
setstate set_trash 2026-02-08 11:34:44 cmd_nr 4
setstate set_trash 2026-02-08 11:23:19 mode enabled
setstate set_trash 2026-02-08 11:34:44 state cmd_4
setstate set_trash 2026-02-08 11:23:19 timer_01_c01 08.02.2026 13:00:00
setstate set_trash 2026-02-08 11:23:19 timer_02_c02 08.02.2026 13:00:00
setstate set_trash 2026-02-08 11:23:19 timer_03_c03 08.02.2026 13:00:00
setstate set_trash 2026-02-08 11:34:44 ye 0

... und ...

defmod set_pixel_muell DOIF ([set_trash] eq "0,0,0") (set MQTT publish pixel1/custom/trash {} )\
DOELSEIF ([set_trash] eq "1,0,0") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [4, 0, 24, 8, "#BEBEBE"]},{"dt": [4, 1, "M ü l l", "#00FF00"]}]} )\
DOELSEIF ([set_trash] eq "0,1,0") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [4, 0, 24, 8, "#FFFF00"]},{"dt": [4, 1, "M ü l l", "#00FF00"]}]} )\
DOELSEIF ([set_trash] eq "0,0,1") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [4, 0, 24, 8, "#0000FF"]},{"dt": [4, 1, "M ü l l", "#00FF00"]}]} )\
DOELSEIF ([set_trash] eq "1,1,0") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [2, 0, 13, 8, "#FFFF00"]},{"df": [17, 0, 13, 8, "#BEBEBE"]},{"dt": [3, 1, "M ü  l l", "#101010"]}]} )\
DOELSEIF ([set_trash] eq "0,1,1") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [2, 0, 13, 8, "#FFFF00"]},{"df": [17, 0, 13, 8, "#0000FF"]},{"dt": [3, 1, "M ü  l l", "#ff33ff"]}]} )\
DOELSEIF ([set_trash] eq "1,0,1") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [2, 0, 13, 8, "#BEBEBE"]},{"df": [17, 0, 13, 8, "#0000FF"]},{"dt": [3, 1, "M ü  l l", "#000000"]}]} )\
DOELSEIF ([set_trash] eq "1,1,1") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [0, 0, 10, 8, "#FFFF00"]},{"df": [11, 0, 10, 8, "#BEBEBE"]},{"df": [22, 0, 10, 8, "#0000FF"]},{"dt": [4, 1, "M ü l l", "#00FF00"]}]} )
attr set_pixel_muell group Kalender
attr set_pixel_muell room 980 - Umwelt

setstate set_pixel_muell cmd_1
setstate set_pixel_muell 2026-02-08 11:34:44 Device set_trash
setstate set_pixel_muell 2026-02-08 11:21:15 cmd 1
setstate set_pixel_muell 2026-02-08 11:21:15 cmd_event set_pixel_muell
setstate set_pixel_muell 2026-02-08 11:21:15 cmd_nr 1
setstate set_pixel_muell 2026-02-08 11:34:44 e_set_trash_STATE 0,0,0
setstate set_pixel_muell 2026-02-08 11:21:00 mode enabled
setstate set_pixel_muell 2026-02-08 11:21:15 state cmd_1

Inzwischen habe ich auch die Daten vom Google-Kalender anstelle der lokalen Datei eingebunden. Nun warte ich auf 13:00 Uhr, um zu schauen, ob auch alles automatisch funktioniert ;)

EDIT:
Funktioniert nicht wie erwartet  >:(  Ich habe (mal wieder) übersehen, das ein DOIF beim ersten Treffer beendet wird. Ich muss also die Abfragen noch umstellen... Irgendwann lerne ich das auch noch mal  ::)
Titel: Aw: Calendar, CalView & Co
Beitrag von: TubeHead am 08 Februar 2026, 14:42:30
Ich komme hier nicht weiter  :-X

Das erste DOIF habe ich in drei einzelne zerlegt (set_trash1, set_trash2, set_trash3), jeweils für eine "Tonne". Die ReadingList ist nur in set_trash1 verblieben; die anderen setzen dort das Reading.
Das funktioniert soweit vollkommen schmerzfrei! Aber...

Um es zu testen, hatte ich die Triggerzeit knapp in die Zukunft bei allen verlegt. Nach dem Trigger aber haben alle drei (!) ausgelöst, was nicht mit dem Inhalt des Kalenders übereinstimmt. Morgen ist die graue und die gelbe Tonne dran, nicht aber die blaue. Dennoch wird auch die "gefunden".

Was übersehe ich hier?

defmod set_trash1 DOIF ([14:00] and defined fhem('get calendar events filter:field(summary)=~"Restmüll" limit:when=tomorrow')) (set $SELF bk 1)\
DOELSE (set $SELF bk 0)
attr set_trash1 group Kalender
attr set_trash1 readingList bk ye bl
attr set_trash1 room 980 - Umwelt
attr set_trash1 stateFormat bk,ye,bl

setstate set_trash1 1,1,1
setstate set_trash1 2026-02-08 14:00:00 bk 1
setstate set_trash1 2026-02-08 14:00:00 bl 1
setstate set_trash1 2026-02-08 14:00:00 cmd 1
setstate set_trash1 2026-02-08 14:00:00 cmd_event timer_1
setstate set_trash1 2026-02-08 14:00:00 cmd_nr 1
setstate set_trash1 2026-02-08 13:29:55 mode enabled
setstate set_trash1 2026-02-08 14:00:00 state cmd_1
setstate set_trash1 2026-02-08 14:30:52 timer_01_c01 09.02.2026 14:00:00
setstate set_trash1 2026-02-08 14:00:00 ye 1

defmod set_trash2 DOIF ([14:00] and defined fhem('get calendar events filter:field(summary)=~"Gelbe" limit:when=tomorrow')) (set set_trash1 ye 1)\
DOELSE (set set_trash1 ye 0)
attr set_trash2 group Kalender
attr set_trash2 room 980 - Umwelt

setstate set_trash2 cmd_1
setstate set_trash2 2026-02-08 14:00:00 cmd 1
setstate set_trash2 2026-02-08 14:00:00 cmd_event timer_1
setstate set_trash2 2026-02-08 14:00:00 cmd_nr 1
setstate set_trash2 2026-02-08 13:19:14 mode enabled
setstate set_trash2 2026-02-08 14:00:00 state cmd_1
setstate set_trash2 2026-02-08 14:30:52 timer_01_c01 09.02.2026 14:00:00

defmod set_trash3 DOIF ([14:00] and defined fhem('get calendar events filter:field(summary)=~"Papier" limit:when=tomorrow')) (set set_trash1 bl 1)\
DOELSE (set set_trash1 bl 0)
attr set_trash3 group Kalender
attr set_trash3 room 980 - Umwelt

setstate set_trash3 cmd_1
setstate set_trash3 2026-02-08 14:00:00 cmd 1
setstate set_trash3 2026-02-08 14:00:00 cmd_event timer_1
setstate set_trash3 2026-02-08 14:00:00 cmd_nr 1
setstate set_trash3 2026-02-08 13:19:01 mode enabled
setstate set_trash3 2026-02-08 14:00:00 state cmd_1
setstate set_trash3 2026-02-08 14:30:52 timer_01_c01 09.02.2026 14:00:00
Titel: Aw: Calendar, CalView & Co
Beitrag von: TomLee am 08 Februar 2026, 17:35:31
Hallo,

vermute der Mischmasch aus DOIF Syntax und Perl Syntax geht so nicht im DOIF-Modus.

Versuchs mal im Perl-Modus:

defmod set_trash3 DOIF { if ([14:00] and defined fhem('get calendar events filter:field(summary)=~"Papier" limit:when=tomorrow')) {fhem('set set_trash1 bl 1')}\
else  {fhem('set set_trash1 bl 0')}}

Gruß Thomas

Titel: Aw: Calendar, CalView & Co
Beitrag von: TubeHead am 08 Februar 2026, 18:57:16
Ich war natürlich nicht faul und habe noch einen anderen Weg versucht. Ich habe jetzt die Daten indirekt über CalView abgefragt, Das kann ich direkt aus DOIF machen. Damit habe ich mir halt drei DOIF's zusammengebaut für die drei möglichen Tonnen und dann damit das quasi-binär Dingens gesetzt, was ich für das Setzen der Pixel abfrage.
Das funktioniert so...

Den direkten Perl-Mode werde ich mal ausprobieren, obwohl ich, wenn's um PERL-Modus geht, in einem Jahr nicht mehr weiß, was das bedeutet... :-[  ???

Titel: Aw: Calendar, CalView & Co
Beitrag von: Otto123 am 08 Februar 2026, 20:54:13
Nur so als Tipp: ich finde für mich CalView (und jedes weitere Modul wie Abfall oder so) völlig entbehrlich und deine Lösung mit einer Menge an DOIFs klingt ziemlich kompliziert. Das Calendar Device selbst kann viel mehr als nur den Kalender importieren. Es hat halt kaum Readings die etwas "zeigen", trotzdem ist alles "drin"!
Ich habe mit zwei userReadings alles in einem Device gemacht, zeigt mir den Typ und die Tage bis zur nächsten Tonne. Die beiden Werte bringe ich zur Ansage/Anzeige.
Beispiel:
Diese Attribute erzeugt beim einlesen des Kalenders für jeden Alarm einen Alarm Trigger einen halben Tag davor
onCreateEvent { $e->{alarm}= $e->{start}-43200 }Bedeutet: ein zusätzlicher nextWakeup um 12:00 Uhr und einen Alarmtrigger da meine Tagestermine um 00:00 starten. Könntest Du auch auf 14:00 Uhr setzen und mit einem notify auf diesen Alarm triggern und deine Tonne ausgeben.
Dieses userReadings zeigt einfach die nächste Tonne als Reading an. Den Wert kann man mit ReadingsVal() oder mit set magic auslesen.
Tonne:triggered {fhem('get '.$name.' events format:custom="$S" limit:from=43200,count=1',1)}
Die Events die beim Alarm erzeugt werden sehen z.B. so aus:
2026-01-27_12:00:00 AbfallKalender changed: 5k7aqih1paafpfalafi5l5c28kgooglecom alarm
2026-01-27_12:00:00 AbfallKalender alarm: 5k7aqih1paafpfalafi5l5c28kgooglecom

Ich hatte zu so etwas ähnlichem mal eine ausführliche Notiz  (https://heinz-otto.blogspot.com/2019/01/kalender-in-fhem-auf-bestimmte-termine.html)geschrieben.
Titel: Aw: Calendar, CalView & Co
Beitrag von: TomLee am 08 Februar 2026, 21:21:49
Geht es nicht darum den Status von mehreren, möglichen Tonnen an einem Tag darzustellen?
Dein Vorschlag begrenzt es auf den nächsten Termin...
Titel: Aw: Calendar, CalView & Co
Beitrag von: Otto123 am 08 Februar 2026, 22:07:33
wenns das gibt? Ja hast Recht, sein Kalender zeigt ja genau das.
Seine DOIFs sehen mMn anders aus. Aber kann sein ich verstehe es falsch.
Egal, ich wollte ja zeigen, dass man nicht einen Sack voll andere Module braucht, bloß weil der Inhalt von Calendar nicht gleich "ins Auge fällt" ;)
Titel: Aw: Calendar, CalView & Co
Beitrag von: TubeHead am 08 Februar 2026, 22:42:02
... Ihr habt beide etwas stimmiges geäußert ...

@Otto123
Wenn es auf PERL-Ebene geht, bin ich faktisch raus. Da verstehe ich so gut wie nichts von. Von daher bin ich auch noch nicht dahinter gestiegen, was genau Du da machst...

@TomLee
Genau. Ziel ist es ja, eine CustomApp auf die Ulanzi zu schieben, passend zu den anstehenden Tonnen am Folgetag. Das heißt auch, ich muss im Vorfeld erstmal erfassen, ob alle drei Tonnen dran sind (eher selten), eine oder zwei, wobei dann zu schauen ist, welche genau.
Es erschien mir am einfachsten, hier quasi mit einem 3-Bit-Code zu arbeiten und jedem Bit eine Tonne zuzuordnen; ist zwar nicht wirklich ein Bit, sondern ein String, aber das spielt ja keine Rolle.

Letztlich habe ich aktuell das hier (ohne den SetState-Teil und Attribute; da stehen sowieso nur Raum und Gruppe drin):

Für die gelbe Tomme:
defmod set_trash_ye DOIF (([KalView:t_001_daysleftLong] eq "morgen" or [KalView:t_001_daysleftLong] eq "heute") and [KalView:t_001_summary] eq "Gelbe Tonne") (set set_pixel_muell ye 1)\
DOELSEIF (([KalView:t_002_daysleftLong] eq "morgen" or [KalView:t_002_daysleftLong] eq "heute") and [KalView:t_002_summary] eq "Gelbe Tonne") (set set_pixel_muell ye 1)\
DOELSEIF (([KalView:t_003_daysleftLong] eq "morgen" or [KalView:t_003_daysleftLong] eq "heute") and [KalView:t_003_summary] eq "Gelbe Tonne") (set set_pixel_muell ye 1)\
DOELSE (set set_pixel_muell ye 0)

Für die blaue Tonne:
defmod set_trash_bl DOIF (([KalView:t_001_daysleftLong] eq "morgen" or [KalView:t_001_daysleftLong] eq "heute") and [KalView:t_001_summary] eq "Papier") (set set_pixel_muell bl 1)\
DOELSEIF (([KalView:t_002_daysleftLong] eq "morgen" or [KalView:t_002_daysleftLong] eq "heute") and [KalView:t_002_summary] eq "Papier") (set set_pixel_muell bl 1)\
DOELSEIF (([KalView:t_003_daysleftLong] eq "morgen" or [KalView:t_003_daysleftLong] eq "heute") and [KalView:t_003_summary] eq "Papier") (set set_pixel_muell bl 1)\
DOELSE (set set_pixel_muell bl 0)

Für die schwarze Tonne:
defmod set_trash_bk DOIF (([KalView:t_001_daysleftLong] eq "morgen" or [KalView:t_001_daysleftLong] eq "heute") and [KalView:t_001_summary] eq "Restmüll") (set set_pixel_muell bk 1)\
DOELSEIF (([KalView:t_002_daysleftLong] eq "morgen" or [KalView:t_002_daysleftLong] eq "heute") and [KalView:t_002_summary] eq "Restmüll") (set set_pixel_muell bk 1)\
DOELSEIF (([KalView:t_003_daysleftLong] eq "morgen" or [KalView:t_003_daysleftLong] eq "heute") and [KalView:t_003_summary] eq "Restmüll") (set set_pixel_muell bk 1)\
DOELSE (set set_pixel_muell bk 0)

Somit habe ich in den Variablen der gererierten redingList im "set_pixel_muell" DOIF im state eine Kommagetrennte Kombination aus 0 und 1, welche ich dann dazu benutze, im selbigen DOIF die CustomApp für die Ulanzi zusammenzubauen:
defmod set_pixel_muell DOIF ([$SELF] eq "0,0,0") (set MQTT publish pixel1/custom/trash {} )\
DOELSEIF ([$SELF] eq "1,0,0") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [4, 0, 24, 8, "#525252"]},{"dt": [5, 1, "M ü l l", "#00FF00"]}]} )\
DOELSEIF ([$SELF] eq "0,1,0") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [4, 0, 24, 8, "#FFFF00"]},{"dt": [5, 1, "M ü l l", "#00FF00"]}]} )\
DOELSEIF ([$SELF] eq "0,0,1") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [4, 0, 24, 8, "#0000FF"]},{"dt": [5, 1, "M ü l l", "#00FF00"]}]} )\
DOELSEIF ([$SELF] eq "1,1,0") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [2, 0, 13, 8, "#FFFF00"]},{"df": [17, 0, 13, 8, "#525252"]},{"dt": [3, 1, "M ü", "#101010"]},{"dt": [19, 1, "l l", "#101010"]}]} )\
DOELSEIF ([$SELF] eq "0,1,1") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [2, 0, 13, 8, "#FFFF00"]},{"df": [17, 0, 13, 8, "#0000FF"]},{"dt": [3, 1, "M ü", "#ff33ff"]},{"dt": [19, 1, "l l", "#ff33ff"]}]} )\
DOELSEIF ([$SELF] eq "1,0,1") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [2, 0, 13, 8, "#525252"]},{"df": [17, 0, 13, 8, "#0000FF"]},{"dt": [3, 1, "M ü", "#000000"]},{"dt": [19, 1, "l l", "#000000"]}]} )\
DOELSEIF ([$SELF] eq "1,1,1") (set MQTT publish pixel1/custom/trash {"draw":[{"df": [0, 0, 10, 8, "#FFFF00"]},{"df": [11, 0, 10, 8, "#525252"]},{"df": [22, 0, 10, 8, "#0000FF"]},{"dt": [4, 1, "M ü l l", "#00FF00"]}]} )
attr set_pixel_muell readingList bk ye bl
attr set_pixel_muell stateFormat bk,ye,bl


Schön wäre es, wenn es im DOIF o.ä. eine Möglichkeit gäbe, eine tabellarische Zuweisung zu generieren, wie es z.B. in Basic mit "Select Case" möglich ist, oder ein 2D-Array... Sowas in der Art... Aber so geht's auch...

Anbei ein PNG-Download aus der Ulanzi mit aktuellem Status der CustomApp. Wenn es nur eine Tonne ist, zieht sich die farbige Fläche halt von X2 bis X30, bei drei Tonnen sind es halt drei Quadrate. Kann man auch von Weitem gut erkennen...


Titel: Aw: Calendar, CalView & Co
Beitrag von: Nobbynews am 15 Februar 2026, 07:24:51
Zitat von: Otto123 am 08 Februar 2026, 20:54:13Ich habe mit zwei userReadings alles in einem Device gemacht, zeigt mir den Typ und die Tage bis zur nächsten Tonne. Die beiden Werte bringe ich zur Ansage/Anzeige.
Es kann manchmal so einfach sein.
Danke für den Zaunpfahl.