- die ReadingNamen sind minimal anders, aber das ist kein Problem ....
- das Splitten bei "," geht nicht, das "," wird bei deiner Version nicht durch KOMMA ersetzt. Ersetze ich das Komma vorher, wie in meinem Beispiel dann läuft es
die ReadingNamen sind minimal anders, aber das ist kein Problem ....
Ja, Teile des Readingsnamen werden sicherheitshalber nochmal von
makeReadingName kontrolliert/korrigiert.
Ansonsten ist "minimal anders" sehr unspezifisch.

Zum Thema days_left:
bei meinem Kalender startet der Termin um 7:00Uhr.
Nehmen wir als an: 18.11.2022 07:00Uhr ist $e_start
Es ist aktuell 16.11.2022 12:45Uhr
Bei meiner Rechnung kommt dann 1,xx raus, durch die Konvertierung zu int kommt halt 1 raus. Jetzt kann man das drehen wie man will, 1 Tag ist definitv falsch. Außerdem ziehen wir die Startzeit heran, am Tag der "Abholung" wird dadurch days_left negativ werden, bewirkt die konvertierung. Mit der Prüfung ob days_left <= 0 ist wir der Termin dann bereits ignoriert, das kann gewünscht sein, würde ich aber so nicht machen wollen.
Immer wieder faszinierend, wie unterschiedlich die Welt ist und wenn man seinen Würfel verlässt plötzlich andere Konstellationen bei rum kommen.

Danke für die Fehlerkorrektur und die days_left Optimierung.
Aus meiner Sicht, sollte man sich aber nicht an die "onCreateEvent"-Geschichte anhängen, sondern eigentlich müsste man ein notify verwenden, alle Events holen und dabei "sinnvoll sortieren", die Events dann mit einer Routine (ähnlich zu dieser) durchrattern. Dann würde man sich Mehrfach-Änderungen der Readings sparen. Weiterhin kann man so auch auf das löschen der Readings verzichten. Aber genau dann wird die Unterscheidung zwischen myUtils und eigenem Modul nicht mehr eindeutig 
Völlig dacor. Und damit beende ich dies für mich hier auch damit:
sub garbage_pickup_readings {
# onCreateEvent => {main::garbage_pickup_readings("device",$e->start,$e->summary)}
use POSIX qw( strftime );
use Time::Local;
my $caldev = shift;
my $e_start = shift;
my $e_summary = shift;
my $dt = strftime("%d.%m.%Y", localtime($e_start)); #Nur Datum des Events ermitteln
my $devhash = $defs{$caldev};
my %replacement = ("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss", "Leerung " => "");
my $replacementKeys = join ("|", keys(%replacement));
$e_summary =~ s/($replacementKeys)/$replacement{$1}/eg;
#$e_summary =~ tr/a-zA-Z0-9\-_//dc; #from ABFALL Modul; not needed -> we use makeReadingsName
$e_summary =~ s/, /KOMMA/g; # , durch das Wort KOMMA ersetzen
my @tonnen = split(/KOMMA/,$e_summary); #shift @tonnen; #Events splitten falls durch KOMMA getrennt
#benutzte Variablen deklarieren
my $reading_date;
my $reading_name;
my $reading_epoch;
my $reading_days_left;
my $reading_weekday;
my $days_left;
my $weekday;
my %wdDE = ("Monday" => "Montag", "Tuesday" => "Dienstag", "Wednesday" => "Mittwoch", "Thursday" => "Donnerstag", "Friday" => "Freitag", "Saturday" => "Samstag", "Sunday" => "Sonntag");
my $wdDEKeys = join ("|", keys(%wdDE));
readingsBeginUpdate($devhash);
foreach my $a (@tonnen) {
#Reading-Namen zusammensetzen
$a = makeReadingName($a);
$reading_date = "waste_".$a."_date";
$reading_name = "waste_".$a."_name";
$reading_epoch = "waste_".$a."_epoch";
$reading_days_left = "waste_".$a."_days_left";
$reading_weekday= "waste_".$a."_weekday";
#Wenn Readings nicht existiert oder $e_start < aktuell eingetragenes Datum
#days left berechnen
#$days_left = int(($e_start - time)/86400);
$days_left = int((time_str2num(strftime("%Y-%m-%d", localtime($e_start))." 00:00:00") - time_str2num(strftime("%Y-%m-%d", localtime(time)). " 00:00:00"))/86400);
if (($days_left >= 0) &&
((ReadingsNum($caldev,$reading_epoch,0) >= $e_start) || (ReadingsNum($caldev,$reading_epoch,0) == 0))) {
#Wochentag ermitteln
$weekday = strftime("%A",localtime($e_start));
$weekday =~ s/($wdDEKeys)/$wdDE{$1}/eg;
readingsBulkUpdate($devhash, $reading_epoch, $e_start);
$a =~ s/_/ /g;
readingsBulkUpdate($devhash, $reading_name, $a);
readingsBulkUpdate($devhash, $reading_date, $dt);
readingsBulkUpdate($devhash, $reading_days_left, $days_left);
readingsBulkUpdate($devhash, $reading_weekday, $weekday);
}
}
readingsEndUpdate($devhash, 1);
}
Interessanter Zeitvertreib, aber führt
so nicht zum Ziel.
Ich würde gern Yersinia als neuen Maintainer ins Rampenlicht schieben 
Nein Danke. Dafür habe ich zu wenig Ahnung von FHEM, Perl, dem ABFALL-Modul im speziellen und wie man
richtig programmiert. Und wenn man keine Ahnung hat aber bei den Großen mitspielen will, dann