Mit Sonos Termine aus dem Calendar Modul vorlesen lassen

Begonnen von Sharky878, 21 November 2016, 11:53:11

Vorheriges Thema - Nächstes Thema

Sharky878

Hallo...

Ich weiß nicht, ob der Beitrag hier rein gehört, aber ich hoffe trotzdem hilfe zu bekommen.
Mein problem ist, dass ich gern möchte, dass Sonos mir auf Befehl meine Termine mit Uhrzeit, Titel, Ort und Bemerkungen aus dem Calendar Modul (Google Kalender) vorliest.
Das Calendar Modul ist soweit fertig, doch ich bräuchte ein skript, oder irgendwas, was sonos jetzt dazu bringt, nach einer Aktion meiner seits die Einträge vorzulesen.

Danke im Vorraus und MfG Sharky

Otto123

Hallo,

der Sonos Speak Befehl kann z.B. direkt auf Readings zugreifen. Du kannst also die readings vom Calendar Modul direkt zusammenstellen:set Sonos_Wohnzimmer Speak 45 de Bla bla  [Device:Reading1] immer noch bla

Vielleicht geht es ja schon so.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

eddtima

#2
Nun ist das zwar schon ein uralter Thread, den ich hier aufwärme, aber ich fand die Idee trotzdem gut und habe es nirgends gefunden, sich als "Message of the Day" per natürlicher Sprachansage von seiner Sonos
- Je nach Tageszeit freundlich begrüßen zu laassen
- das aktuelle lokale Wetter, Frostwarnung, Tagestiefst- und -Höchsttemperaturen und die weiteren Aussichten für Morgens, Mittags und Abends mit auf den Weg zu bekommen und
- die nächsten Termine vorgelesen
- sowie einen Hinweis auf die nächsten Mülltonnenleerungen
- und zum Abschluss noch ein schlaues Zitat mit auf den Weg zu bekommen.

Zum Beispiel, wenn der Bewegungsmelder einen auf dem morgendlichen Weg zur Kaffeemaschine abfängt, ein Wandtaster gedrückt oder die Gesichtserkennung die weltbeste aller Ehefrauen erkannt hat ;-)

Drum habe ich diese Sprach-Begrüßungsfunktion als Perl-Funktion gebaut und wer Spaß dran hat, mag es nutzen. Die Funktion setzt folgendes voraus:
- Das Sonos Modul und mindestens eine Sonos
- Ein Wetter-Device basierend auf dem Proplanta-Modul
- einen Kalender mit dem CalView-Modul
- den Abfallkalender aus diesem FHEM Forum.

Eine lokale Wetterstation ist optional, bei mir eine Homematic HM-WDS100-C6-O-2 Outdoor Wetterstation. Wenn sie vorhanden ist, liefert sie zusätzlich zur aktuellen lokalen Temperatur und Luftfeuchte noch eine Ansage, ob es aktuell regnet oder nicht.

Die Funktion kann in den Formulierungen für die Begrüßung und Wetteransagen nach Euren Wünschen variieren, sodass es nicht zu langweilig werden sollte. Ach ja, ab Abends, 18:00 Uhr macht eine Wetteransage für den laufenden Tag natürlich nur noch für die Nachtschicht Sinn, ab da wird die Wettervorhersage des nächsten Tages angesagt. Das kann jeder je nach persönlicher Situation schnell auf seine eigenen Vorlieben anpassen.

Weitere Anagen, wie zB. Staumeldungen, Pollenwarnungen und lokale Hochwasserwarnungen können analog dem bereits eingebauten Wetter- und Kalendereinträgen integrierbar. Hauptsache, die vorzulesende Information liegt mehr oder weniger direkt in Textform in Device-Readings vor.

So wrd es aufgerufen:
define act_on_irgendwas notify irgendeinEreignis { ReadCalendar("FamCalView",3,"wetter","Wetterstation","Abfallkalender",15,"Sonos_SonosGalerie","Till");; }
Die 8 Parameter der Funktion ReadCalendar() sind (1) Name des CalViews aus dem die Events vorgelesen werden sollen, (2) Anzahl der vorzulesenden Events, negative Zahl liest alle Events vor, (3) Name des Proplanta Wetter-Devices, (4) Name einer lokalen Wetterstation, falls vorhanden, sonst leer "", (5) Name des Abfallkalenders (6) Lautstärke der Sprachansage und (7) Name des zu nutzenden Sonos-Devices ( 8 ) Name der anszusprechenden Person.

Diese Zeile ist in der 99_MyUtils.pm ganz am Anfang bei den Moduldeklarationen einzufügen, damit die min() und max() Funktion funktioniert:

use List::Util qw[min max];


Diese Zeilen sind in der 99_MyUtils.pm als eigene Funktion einzufügen:

##################################################################
#####  Lese Kalender vor, Sprachausgabe auf Sonoszone  ###########
##################################################################
sub ReadCalendar ($$$$$$$$)
{
my ($calendar,$events2Read,$wetter,$wetterstation,$wasteDevice,$volume,$sonosName,$spokenTo) = @_; #8 Params: Kalender, #Events, Proplanta Wetterdevice, lok. Wetterstation, Mülltermindevice, Lautstärke, Sonoszone, Name
my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
my $sprachAusgabe = "";

my $ctoday = ReadingsVal("$calendar", 'c-today', "0");
my $ctomorrow = ReadingsVal("$calendar", 'c-tomorrow', "0");
my $eventCounter = 0;

if ($events2Read <= -1) { $eventCounter = ReadingsVal("$calendar", 'c-term', "0") }
else { $eventCounter = minNum($events2Read,ReadingsVal("$calendar", 'c-term', "0")) ;}

my @t_daysleft = (' '.ReadingsVal("$calendar", 't_001_daysleft', "0"),ReadingsVal("$calendar", 't_002_daysleft', "0"),ReadingsVal("$calendar", 't_003_daysleft', "0"),ReadingsVal("$calendar", 't_004_daysleft', "0"),ReadingsVal("$calendar", 't_005_daysleft', "0"),ReadingsVal("$calendar", 't_006_daysleft', "0"),ReadingsVal("$calendar", 't_007_daysleft', "0"),ReadingsVal("$calendar", 't_008_daysleft', "0"),ReadingsVal("$calendar", 't_009_daysleft', "0"),ReadingsVal("$calendar", 't_010_daysleft', "0"));
my @t_daysleftLong = (' '.ReadingsVal("$calendar", 't_001_daysleftLong', "0"),ReadingsVal("$calendar", 't_002_daysleftLong', "0"),ReadingsVal("$calendar", 't_003_daysleftLong', "0"),ReadingsVal("$calendar", 't_004_daysleftLong', "0"),ReadingsVal("$calendar", 't_005_daysleftLong', "0"),ReadingsVal("$calendar", 't_006_daysleftLong', "0"),ReadingsVal("$calendar", 't_007_daysleftLong', "0"),ReadingsVal("$calendar", 't_008_daysleftLong', "0"),ReadingsVal("$calendar", 't_009_daysleftLong', "0"),ReadingsVal("$calendar", 't_010_daysleftLong', "0"));
my @t_weekdayname = (' '.ReadingsVal("$calendar", 't_001_weekdayname', "0"),ReadingsVal("$calendar", 't_002_weekdayname', "0"),ReadingsVal("$calendar", 't_003_weekdayname', "0"),ReadingsVal("$calendar", 't_004_weekdayname', "0"),ReadingsVal("$calendar", 't_005_weekdayname', "0"),ReadingsVal("$calendar", 't_006_weekdayname', "0"),ReadingsVal("$calendar", 't_007_weekdayname', "0"),ReadingsVal("$calendar", 't_008_weekdayname', "0"),ReadingsVal("$calendar", 't_009_weekdayname', "0"),ReadingsVal("$calendar", 't_010_weekdayname', "0"));
my @t_bdate = (' '.ReadingsVal("$calendar", 't_001_bdate', "0"),ReadingsVal("$calendar", 't_002_bdate', "0"),ReadingsVal("$calendar", 't_003_bdate', "0"),ReadingsVal("$calendar", 't_004_bdate', "0"),ReadingsVal("$calendar", 't_005_bdate', "0"),ReadingsVal("$calendar", 't_006_bdate', "0"),ReadingsVal("$calendar", 't_007_bdate', "0"),ReadingsVal("$calendar", 't_008_bdate', "0"),ReadingsVal("$calendar", 't_009_bdate', "0"),ReadingsVal("$calendar", 't_010_bdate', "0"));
my @t_summary = (' '.ReadingsVal("$calendar", 't_001_summary', "0"),ReadingsVal("$calendar", 't_002_summary', "0"),ReadingsVal("$calendar", 't_003_summary', "0"),ReadingsVal("$calendar", 't_004_summary', "0"),ReadingsVal("$calendar", 't_005_summary', "0"),ReadingsVal("$calendar", 't_006_summary', "0"),ReadingsVal("$calendar", 't_007_summary', "0"),ReadingsVal("$calendar", 't_008_summary', "0"),ReadingsVal("$calendar", 't_009_summary', "0"),ReadingsVal("$calendar", 't_010_summary', "0"));

# Generierung des Begrüßungstextes
my @greetingMorning = ("Guten Morgen lieber $spokenTo. ","Hallo $spokenTo. ","Hast Du gut geschlafen $spokenTo? ","Morgenstund hat Gold im Mund, guten Morgen $spokenTo! ","Was für ein toller Morgen, und jetzt kommst auch noch Du, lieber $spokenTo! ");
my @greetingDay = ("Hallo lieber $spokenTo. ","Hallo $spokenTo. ","Guten Tag, $spokenTo. ","Willkommen zu Hause lieber $spokenTo. ","Schön, dass Du da bist $spokenTo! ");
my @greetingEvening = ("Guten Abend, lieber $spokenTo. ","Hallo $spokenTo! ","N Abend $spokenTo. ","Je später der Abend, desto schöner die Gäste lieber $spokenTo! ","Schönen guten Abend $spokenTo. ");
if ($Stunden <= 11) { $sprachAusgabe = $greetingMorning[int(rand($#greetingMorning+1))]}
elsif ($Stunden <= 17) { $sprachAusgabe = $greetingDay[int(rand($#greetingDay+1))]}
else { $sprachAusgabe = $greetingEvening[int(rand($#greetingEvening+1))];}

# Generierung des Wettertextes - Lokaler Teil
my @uebergangWetter =("Zunächst zum aktuellen Wetter. ","Bestimmt willst Du wissen, wie das Wetter heute wird. ","Sicher interessiert Dich das Wetter heute. ");
my @weatherLocallyPart1 = ("Die Außentemperatur beträgt gerade ","Draußen haben wir gerade ","Draußen ist es im Moment ");
my @weatherLocallyPart2 = (" und wir haben eine Luftfeuchte von "," und die Luftfeuchtigkeit beträgt "," und ich habe eine Luftfeuchtigkeit gemessen von ");
my @weatherLocallyPart3_rain = ("Leider regnet es gerade.","Leider brauchst Du jetzt gerade einen Regenschirm. ","Es regnet gerade Hunde und Katzen. ");
my @weatherLocallyPart3_noRain = ("Es regnet gerade nicht.","Du brauchst gerade keinen Regenschirm. ","Es regnet aktuell nicht. ");
$sprachAusgabe .= $uebergangWetter[int(rand($#uebergangWetter+1))];
if ($wetterstation ne "") {
$sprachAusgabe .= $weatherLocallyPart1[int(rand($#weatherLocallyPart1+1))].ReadingsVal($wetterstation, 'temperature', "0").' Grad';
$sprachAusgabe .= $weatherLocallyPart2[int(rand($#weatherLocallyPart2+1))].ReadingsVal($wetterstation, 'humidity', "0").' Prozent. ';
if (ReadingsVal($wetterstation, 'isRaining', "0") == 0) { $sprachAusgabe .= $weatherLocallyPart3_noRain[int(rand($#weatherLocallyPart3_noRain)+1)];}
else { $sprachAusgabe .= $weatherLocallyPart3_rain[int(rand($#weatherLocallyPart3_rain+1))]; }
}

# Generierung des Wettertextes - Wettervorhersage
my @weatherPrefixToday = ("Am heutigen Tag","Heute");
my @weatherPrefixTomorrow = ("Am morgigen Tag","Morgen");
my @weatherTodayMorningIstEs = (" zu Tagesbeginn ist es "," ist das Wetter zu früher Stunde "," zu Tagesbeginn ist das Wetter "," am Morgen ");
my @weatherTodayMorningRechneMit = (" zu Tagesbeginn rechne mit "," gibt es zu früher Stunde "," stelle dich ein auf "," zum Tagesstart ");
my @weatherTodayDayIstEs = ("Später Mittags ist es ","Mittags ","Ab Mittag ist das Wetter ","Am Mittag ");
my @weatherTodayDayRechneMit = ("Später Mittags rechne mit ","Mittags gibt es ","Ab Mittag stelle Dich ein auf ","Am Mittag ");
my @weatherTodayEveningIstEs = ("Und Abends ist es ","Und danach am Abend ","Später am Abend ","Am Abend ");
my @weatherTodayEveningRechneMit = (" und Abends rechne mit "," und es gibt am Abend "," und später am Abend stelle Dich ein auf "," und am Abend ");
my @weatherChanceOfRain = ("Das Niederschlagsrisiko liegt maximal bei ","Mit Regen musst Du maximal rechnen mit ","Regen gibt es maximal mit ");
my @weatherExtrTempPart1 = ("Die Tagestiefsttemperatur beträgt ","Die Tagestemperaturen liegen zwischen ","Rechne mit Temperaturen zwischen ");
my @weatherExtrTempPart2 = (" Grad und der Tageshöchstwert liegt bei "," und höchstens "," und maximal ");
my @weatherExtrTempPart3 = (" Grad. "," Grad. "," Grad. ");
my @weatherFrost = ("Du musst mit Frost rechnen. ","Achtung, es könnte glatt werden. ","Vorsicht, es wird kalt werden und es besteht die Gefahr von Glätte. ");
my @weatherNoFrost = ("Es besteht keine Glättegefahr. ","Es wird nicht frieren. ","Du musst nicht mit Glätte rechnen. ");

if ($Stunden <= 17) { #Bei Abfrage vor 17:59 Uhr wird der aktuelle Tag ausgegeben, ab 18:00 der morgige
if ((ReadingsVal($wetter, 'fc0_weatherMorning', "0") eq "Nebel") || (ReadingsVal($wetter, 'fc0_weatherMorning', "0") eq "Regenschauer") || (ReadingsVal($wetter, 'fc0_weatherMorning', "0") eq "Regen") ) {
$sprachAusgabe .= $weatherPrefixToday[int(rand($#weatherPrefixToday+1))].$weatherTodayMorningRechneMit[int(rand($#weatherTodayMorningRechneMit+1))].ReadingsVal($wetter, 'fc0_weatherMorning', "0").'. '; }
else { $sprachAusgabe .= $weatherPrefixToday[int(rand($#weatherPrefixToday+1))].$weatherTodayMorningIstEs[int(rand($#weatherTodayMorningIstEs+1))].ReadingsVal($wetter, 'fc0_weatherMorning', "0").'. '; }

if ((ReadingsVal($wetter, 'fc0_weatherDay', "0") eq "Nebel") || (ReadingsVal($wetter, 'fc0_weatherDay', "0") eq "Regenschauer") || (ReadingsVal($wetter, 'fc0_weatherDay', "0") eq "Regen") ) {
$sprachAusgabe .= $weatherTodayDayRechneMit[int(rand($#weatherTodayDayRechneMit+1))].ReadingsVal($wetter, 'fc0_weatherDay', "0").'. '; }
else { $sprachAusgabe .= $weatherTodayDayIstEs[int(rand($#weatherTodayDayIstEs+1))].ReadingsVal($wetter, 'fc0_weatherDay', "0").'. '; }

if ((ReadingsVal($wetter, 'fc0_weatherNight', "0") eq "Nebel") || (ReadingsVal($wetter, 'fc0_weatherNight', "0") eq "Regenschauer") || (ReadingsVal($wetter, 'fc0_weatherNight', "0") eq "Regen") ) {
$sprachAusgabe .= $weatherTodayEveningRechneMit[int(rand($#weatherTodayEveningRechneMit+1))].ReadingsVal($wetter, 'fc0_weatherNight', "0").'. '; }
else { $sprachAusgabe .= $weatherTodayEveningIstEs[int(rand($#weatherTodayEveningIstEs+1))].ReadingsVal($wetter, 'fc0_weatherNight', "0").'. '; }

$sprachAusgabe .= $weatherChanceOfRain[int(rand($#weatherChanceOfRain+1))].maxNum(ReadingsVal($wetter, 'fc0_chOfRain09', "0"),ReadingsVal($wetter, 'fc0_chOfRain12', "0"),ReadingsVal($wetter, 'fc0_chOfRain15', "0"),ReadingsVal($wetter, 'fc0_chOfRain18', "0")).' Prozent. ';
if (ReadingsVal($wetter, 'fc0_frost', "99") == 0) { $sprachAusgabe .= $weatherNoFrost[int(rand($#weatherNoFrost)+1)];}
else { $sprachAusgabe .= $weatherFrost[int(rand($#weatherFrost+1))]; }
my $eventsIndex = int(rand($#weatherExtrTempPart1+1));
$sprachAusgabe .= $weatherExtrTempPart1[$eventsIndex].ReadingsVal($wetter, 'fc0_tempMin', "99").$weatherExtrTempPart2[$eventsIndex].ReadingsVal($wetter, 'fc0_tempMax', "0").$weatherExtrTempPart3[$eventsIndex];
}
else { #Bei Abfrage vor 17:59 Uhr wird der aktuelle Tag ausgegeben, ab 18:00 der morgige
if ((ReadingsVal($wetter, 'fc1_weatherMorning', "0") eq "Nebel") || (ReadingsVal($wetter, 'fc1_weatherMorning', "0") eq "Regenschauer") || (ReadingsVal($wetter, 'fc1_weatherMorning', "0") eq "Regen") ) {
$sprachAusgabe .= $weatherPrefixTomorrow[int(rand($#weatherPrefixTomorrow+1))].$weatherTodayMorningRechneMit[int(rand($#weatherTodayMorningRechneMit+1))].ReadingsVal($wetter, 'fc1_weatherMorning', "0").'. '; }
else { $sprachAusgabe .= $weatherPrefixTomorrow[int(rand($#weatherPrefixToday+1))].$weatherTodayMorningIstEs[int(rand($#weatherTodayMorningIstEs+1))].ReadingsVal($wetter, 'fc1_weatherMorning', "0").'. '; }

if ((ReadingsVal($wetter, 'fc1_weatherDay', "0") eq "Nebel") || (ReadingsVal($wetter, 'fc1_weatherDay', "0") eq "Regenschauer") || (ReadingsVal($wetter, 'fc1_weatherDay', "0") eq "Regen") ) {
$sprachAusgabe .= $weatherTodayDayRechneMit[int(rand($#weatherTodayDayRechneMit+1))].ReadingsVal($wetter, 'fc1_weatherDay', "0").'. '; }
else { $sprachAusgabe .= $weatherTodayDayIstEs[int(rand($#weatherTodayDayIstEs+1))].ReadingsVal($wetter, 'fc1_weatherDay', "0").'. '; }

if ((ReadingsVal($wetter, 'fc1_weatherNight', "0") eq "Nebel") || (ReadingsVal($wetter, 'fc1_weatherNight', "0") eq "Regenschauer") || (ReadingsVal($wetter, 'fc1_weatherNight', "0") eq "Regen") ) {
$sprachAusgabe .= $weatherTodayEveningRechneMit[int(rand($#weatherTodayEveningRechneMit+1))].ReadingsVal($wetter, 'fc1_weatherNight', "0").'. '; }
else { $sprachAusgabe .= $weatherTodayEveningIstEs[int(rand($#weatherTodayEveningIstEs+1))].ReadingsVal($wetter, 'fc1_weatherNight', "0").'. '; }

$sprachAusgabe .= $weatherChanceOfRain[int(rand($#weatherChanceOfRain+1))].maxNum(ReadingsVal($wetter, 'fc1_chOfRain09', "0"),ReadingsVal($wetter, 'fc1_chOfRain12', "0"),ReadingsVal($wetter, 'fc1_chOfRain15', "0"),ReadingsVal($wetter, 'fc1_chOfRain18', "0")).' Prozent Wahrscheinlichkeit. ';
if (ReadingsVal($wetter, 'fc1_frost', "99") == 0) { $sprachAusgabe .= $weatherNoFrost[int(rand($#weatherNoFrost)+1)];}
else { $sprachAusgabe .= $weatherFrost[int(rand($#weatherFrost+1))]; }
my $eventsIndex = int(rand($#weatherExtrTempPart1+1));
$sprachAusgabe .= $weatherExtrTempPart1[$eventsIndex].ReadingsVal($wetter, 'fc1_tempMin', "99").$weatherExtrTempPart2[$eventsIndex].ReadingsVal($wetter, 'fc1_tempMax', "0").$weatherExtrTempPart3[$eventsIndex];
}

# Generierung des Mülltonnenrausstelltextes
my @cansReading = ("BioTonne","BlaueTonne","GelbeTonne","Restmuell");
my @cans = ("Biotonne","Altpapiertonne","Gelbe Tonne","Restmülltonne");
my $nextCan = minNum(ReadingsVal($wasteDevice, $cansReading[0], "99"), ReadingsVal($wasteDevice, $cansReading[1], "99"), ReadingsVal($wasteDevice, $cansReading[2], "99"), ReadingsVal($wasteDevice, $cansReading[3], "99"));

my $index; #Bestimmung der Tage, bis die nächste Tonne raus muss
for ( $index = 0; ReadingsVal($wasteDevice, $cansReading[$index], "99") != $nextCan; ++$index)  {  }
#Sprachausgabe, wenn die Tonne morgen oder in den nächsten Tagen rausgestellt werden muss
my @garbageCansNextPart1ge2 = ("In ","Bereite Dich schon einmal vor, dass in ","Denke daran, dass in ");
my @garbageCansNextPart2ge2 = (" Tagen muss die "," Tagen die "," Tagen die ");
my @garbageCansNextPart3ge2 = (" rausgestellt werden. "," an die Straße gestellt werden muss. "," rausgestellt werden muss. ");
my @garbageCansNextPart1eq1 = ("Morgen wird die ","Die ","Denke daran, dass Du heute noch die ");
my @garbageCansNextPart2eq1 = (" abgeholt, bitte heute rausstellen. "," muss heute an die Strasse gestellt werden, morgen ist sie zur Leerung fällig. "," herausstellt, morgen ist Leerung. ");
my @garbageCansNextPart1eq0 = ("Oh, das wird knapp, heute wird die ","Schau nochmal nach, die ","Die Müllabfuhr holt heute die ");
my @garbageCansNextPart2eq0 = (" abgeholt. "," muss heute an die Straße gestellt werden. "," ab, bitte Tonne rausstellen. Hoffentlich bist Du nicht zu spät. ");
if ($nextCan >= 2) { #Sprachausgabe, wenn die Tonne übermorgen oder später rausgestellt werden muss
my $garbageCansNextIndex = int(rand($#garbageCansNextPart1ge2+1));
$sprachAusgabe .= $garbageCansNextPart1ge2[$garbageCansNextIndex].ReadingsVal($wasteDevice, $cansReading[$index], "99").$garbageCansNextPart2ge2[$garbageCansNextIndex].$cans[$index].$garbageCansNextPart3ge2[$garbageCansNextIndex];
}
elsif ($nextCan == 1) { #Sprachausgabe, wennn die Tonne morgen rausgestellt werden muss
my $garbageCansNextIndex = int(rand($#garbageCansNextPart1eq1+1));
$sprachAusgabe .= $garbageCansNextPart1eq1[$garbageCansNextIndex].$cans[$index].$garbageCansNextPart2eq1[$garbageCansNextIndex];
}
else {
my $garbageCansNextIndex = int(rand($#garbageCansNextPart1eq0+1));
$sprachAusgabe .= $garbageCansNextPart1eq0[$garbageCansNextIndex].$cans[$index].$garbageCansNextPart2eq0[$garbageCansNextIndex];
}
#Bestimmung der Tage, bis die übernächste Tonne raus muss
my @garbageCansFurtherPart1ge2 = ("Der nächste fällige Abfall muss in ","Als nächstes muss in ","Und Achtung, in ");
my @garbageCansFurtherPart2ge2 = (" Tagen raus und ist die "," Tagen die "," Tagen muss die ");
my @garbageCansFurtherPart3ge2 = (". "," an der Straße stehen. "," rausgestellt werden. ");
my @garbageCansFurtherPart1eq1 = ("Der nächste fällige Abfall ist die ","Als nächstes muss morgen die ","Und Achtung, morgen muss die ");
my @garbageCansFurtherPart2eq1 = (" und wird morgen angeholt. "," an der Straße stehen. "," rausgestellt sein. ");
my @garbageCansFurtherPart1eq0 = ("Der nächste fällige Abfall ist die ","Als nächstes muss heute noch die ","Und Achtung, heute muss noch die ");
my @garbageCansFurtherPart2eq0 = (" und wird heute noch abgeholt. "," an der Straße stehen. "," rausgestellt werden. ");

my $furtherIndex = 0;
my $tempMin = 99;
my $n = 0;
while ($n <= @cans) {
if (($index != $n) and (ReadingsVal($wasteDevice, $cansReading[$n], "99") <= $tempMin))  {
$tempMin = ReadingsVal($wasteDevice, $cansReading[$n], "99");
$furtherIndex = $n;
}
$n += 1;
}

if ( ReadingsVal($wasteDevice, $cansReading[$furtherIndex], "99") >= 2) {
my $garbageFurtherIndex = int(rand($#garbageCansFurtherPart1ge2+1));
$sprachAusgabe .= $garbageCansFurtherPart1ge2[$garbageFurtherIndex].ReadingsVal($wasteDevice, $cansReading[$furtherIndex], "99").$garbageCansFurtherPart2ge2[$garbageFurtherIndex].$cans[$furtherIndex].$garbageCansFurtherPart3ge2[$garbageFurtherIndex];
}
elsif ( ReadingsVal($wasteDevice, $cansReading[$furtherIndex], "99") == 1) {
my $garbageFurtherIndex = int(rand($#garbageCansFurtherPart1eq1+1));
$sprachAusgabe .= $garbageCansFurtherPart1eq1[$garbageFurtherIndex].$cans[$furtherIndex].$garbageCansFurtherPart2eq1[$garbageFurtherIndex];
}
else {
my $garbageFurtherIndex = int(rand($#garbageCansFurtherPart1eq0+1));
$sprachAusgabe .= $garbageCansFurtherPart1eq0[$garbageFurtherIndex].$cans[$furtherIndex].$garbageCansFurtherPart2eq0[$garbageFurtherIndex];
}

# Generierung des Textes für die Kalendereinträge
my @uebergangEvents =("Hoffentlich passend zum Wetter werfe ich einen Blick in Deinen Kalender. ","Sicher fragst Du Dich, welche Termine der Kalender für Dich bereithält. ","Und was ist außerdem demnächst noch so los? ","Was steht außerdem noch heute und in den nächsten Tagen an? ","Und welche Verabredungen erwarten Dich außerdem? ");
my @eventsPart1 = (" steht der Termin "," hast Du Dir "," könnt Ihr Euch auf "," habt Ihr "," ist "," steht ");
my @eventsPart2 = (" an. "," vorgenommen. "," freuen. "," geplant. "," in der Planung. "," auf dem Programm. ");

$n = 0;
my $lastDate = '-1';
#Ausabe der Terminanzahl in den nächsten 2 Tagen
$sprachAusgabe .= $uebergangEvents[int(rand($#uebergangEvents+1))];
if ($ctoday == 0 && $ctomorrow ==0) {$sprachAusgabe .= "Heute und morgen stehen keine weiteren Ereignisse mehr an. "}
else {
if ($ctoday >= 2) { $sprachAusgabe .= "Heute stehen $ctoday Ereignisse an. "; }
elsif ($ctoday == 1 ) { $sprachAusgabe .= "Heute steht noch ein Ereignis an. "; }
else { $sprachAusgabe .= "Heute stehen keine Ereignisse mehr an. "; }
if ($ctomorrow >= 2) { $sprachAusgabe .= "Und morgen warten $ctomorrow Termine auf Dich. "; }
elsif ($ctomorrow == 1 ) { $sprachAusgabe .= "Und Morgen wartet ein Termin auf Dich. "; 0}
else { $sprachAusgabe .= "Und morgen wartet kein Termin mehr auf Dich. "; }
} #Ausgabe der Termine fälligen Termine in gewünschter Anzahl
while ($n < $eventCounter ) {
my $eventsIndex = int(rand($#eventsPart1+1));
if ( $lastDate == $t_daysleft[$n]) { #Mehrere Termine am gleichen Tag sollen nicht immer wieder das Datum wiederholen
$sprachAusgabe .= "Am gleichen Tag ".$eventsPart1[$eventsIndex].$t_summary[$n].$eventsPart2[$eventsIndex];
}
else { $sprachAusgabe .= $t_daysleftLong[$n].", am ".$t_weekdayname[$n].", dem ".$t_bdate[$n].$eventsPart1[$eventsIndex].$t_summary[$n].$eventsPart2[$eventsIndex]; }
$lastDate = $t_daysleft[$n];
++$n;
}

# Generierung des Zitat des Tages 
my @uebergangCOTD =(" Und hier noch das Zitat des Tages für Dich. "," Das Zitat des Tages lautet: "," Darf ich Dir noch ein Zitat mit auf den Weg geben? "," Hier noch ein schlauer Spruch für Dich: ");
my @COTD = ("Alles, was der Verstand des Menschen erdenken und glauben kann, das kann er auch erreichen. Von (Napoleon Hill). ","Man sieht nur mit dem Herzen gut. Das Wesentliche ist für die Augen unsichtbar. Von (Antoine de Saint-Exupéry). ","Ich habe mehr als 9.000 Würfe verfehlt. Ich habe fast 300 Spiele verloren. 26 Mal wurde mir der entscheidende Wurf anvertraut und ich verfehlte ihn. Ich habe immer wieder Fehler gemacht. Und deshalb bin ich erfolgreich. Von (Michael Jordan). ","Beurteile einen Tag nicht nach den Früchten, die du geerntet hast, sondern an den Samen, die du gesät hast. Von (Robert Louis Stevenson). ","Sei du die Veränderung, die du in der Welt sehen möchtest. Von (Mahatma Gandhi). ","Alles, was ich über das Leben gelernt habe, kann ich in drei Worten zusammenfassen: Es geht weiter. Von (Robert Frost). ","Leben: Das ist das, was passiert, während du fleißig andere Pläne machst. Von (Allen Saunders). ","Das, worauf es im Leben ankommt, können wir nicht vorausberechnen. Die schönste Freude erlebt man immer da, wo man sie am wenigsten erwartet hat. Von (Antoine de Saint-Exupéry). ","Das Glück des Lebens besteht nicht darin, wenig oder keine Schwierigkeiten zu haben, sondern sie alle siegreich und glorreich zu überwinden. Von (Carl Hilty). "," Wer einmal sich selbst gefunden, kann nichts auf dieser Welt mehr verlieren. Von (Stefan Zweig). ","Es sind nicht die Jahre deines Lebens, die zählen. Was zählt, ist das Leben innerhalb dieser Jahre. Von (Abraham Lincoln). ","Wenn alles gegen dich ist, dann erinnere dich: Ein Flugzeug hebt ab, weil es gegen den Wind fliegt, nicht mit dem Wind. Von (Henry Ford). ","Arbeite an deinen Träumen – sonst stellt dich jemand ein, um an seinen Träume zu arbeiten. Von (Farrah Gray). ","Ganz gleich, wie beschwerlich das Gestern war, stets kannst du im Heute von Neuem beginnen. Von (Buddhistische Lebensweisheit). ","Das Geheimnis des Glücks ist, statt der Geburtstage die Höhepunkte des Lebens zu zählen. Von (Mark Twain). ","Ein wahrhaft reicher Mann ist der, dessen Kinder in seine Arme laufen, auch wenn er leere Hände hat. Von (Unbekannt). ","Wenn du gute Kinder haben möchtest, dann investiere doppelt so viel Zeit in sie und nur halb so viel Geld. Von (Abigail Van Buren). ","Begrenze dein Kind nicht auf das, was du gelernt hast, denn es ist in einer anderen Zeit geboren. Von (Aus dem Hebräischen). ","Drei Dinge sind uns aus dem Paradies geblieben: die Sterne der Nacht, die Blumen des Tages und die Augen der Kinder. Von (Dante Alighieri). ","Es gibt kein Alter, in dem alles so irrsinnig intensiv erlebt wird wie in der Kindheit. Wir Großen sollten uns daran erinnern, wie das war. Von (Astrid Lindgren). ","Jedes Kind ist ein Künstler. Die Schwierigkeit liegt darin, ein Künstler zu bleiben, wenn es erwachsen wird. Von (Pablo Picasso). ","Vergiss also nie Spaß am Leben zu haben und deiner Phantasie freien Lauf zu lassen. Hör auf dein Herz und vertraue den Menschen die dich Lieben – so wirst du ein Lebenskünstler bleiben. Von . ","Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt. Von (Albert Einstein). ","Suche nicht andere, sondern dich selbst zu übertreffen. Von (Cicero). ","lle dich nicht einem Wettrennen darum, wer der Beste ist. Versuche einfach als du, mit all deinen Eigenschaften, die beste Version von dir zu sein. Von . ","Darum liebe ich die Kinder, weil sie die Welt und sich selbst noch im schönen Zauberspiegel ihrer Phantasie sehen. Von (Theodor Storm). ","Kinder müssen mit Erwachsenen sehr viel Nachsicht haben. Von (Antoine de Saint-Exupéry). ","Viele Dinge ergreifen das Auge, folge aber nur den Dingen, die das Herz ergreifen. Von (Altes indisches Sprichwort). ","Manche Männer bemühen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen zum Beispiel mit der Relativitätstheorie. Von (Albert Einstein). ","Die Erfahrung lehrt uns, dass Liebe nicht darin besteht, dass man einander ansieht, sondern dass man gemeinsam in die gleiche Richtung blickt. Von (Antoine de Saint-Exupéry). ","Liebe ist der Entschluss das Ganze eines Menschen zu bejahen, die Einzelheiten mögen sein, wie sie wollen. Von (Otto Flake). ","Wenn man sich von den Bergen entfernt, so erblickt man sie erst recht in ihrer wahren Gestalt; so ist es auch mit Freunden. Von (Unbekannt). ","Du bildest stets die Schnittmenge deiner besten Freunde. Sie reflektieren wer du bist und was du sein möchtest im Leben. Von (Unbekannt). ","Von allen Geschenken, die uns das Schicksal gewährt, gibt es kein größeres Gut als die Freundschaft – keinen größeren Reichtum, keine größere Freude. Von (Epikur von Samos). ","Freundschaft ist eine Tür zwischen zwei Menschen. Sie kann manchmal knarren, sie kann klemmen, aber sie ist nie verschlossen. Von (Balthasar Gracián y Morales). ","Wie viel Unrecht kann die Umarmung eines Freundes wieder gutmachen. Von (Jean-Jacques Rousseau). ","Wenn man sich von den Bergen entfernt, so erblickt man sie erst recht in ihrer wahren Gestalt; so ist es auch mit Freunden. Von (Hans Christian Andersen). ","Ein bisschen Freundschaft ist mir mehr wert als die Bewunderung der ganzen Welt. Von (Otto Eduard Leopold von Bismarck). ","Menschen zu finden, die mit uns fühlen und empfinden, ist wohl das schönste Glück auf Erden. Von (Carl Spitteler). ","Die Freunde, die man um vier Uhr morgens anrufen kann, die zählen. Von (Marlene Dietrich). ","Dem Vogel ein Nest, der Spinne ein Netz, dem Menschen – Freundschaft. Von (William Blake). "," Das Vertrauen gibt dem Gespräch mehr Stoff als Geist. Von (François de La Rochefoucauld). ","Ziel des Lebens ist es nicht, ein erfolgreicher Mensch zu sein, sondern ein wertvoller. Von (Albert Einstein). ","Ich habe nicht versagt. Ich habe 10.000 Wege gefunden, wie etwas nicht funktioniert. Von (Thomas A. Edison). ","Die größte Entscheidung deines Lebens liegt darin, dass du dein Leben ändern kannst, indem du deine Geisteshaltung änderst. Von (Albert Schweizer). ","Jeder ist ein Genie! Aber wenn Du einen Fisch danach beurteilst, ob er auf einen Baum klettern kann, wird er sein ganzes Leben glauben, dass er dumm ist. Von (Albert Einstein). ","Unsere Sichtweise entscheidet über unsere Zufriedenheit. Von (Unbekannt). ","Du kannst Kreativität nicht aufbrauchen. Je mehr du sie nutzt, desto mehr hast du von ihr. Von (Maya Angelou). ","Schreibe entweder etwas, das sich zu lesen lohnt. Oder lebe ein Leben über das es sich zu schreiben lohnt. Von (Benjamin Franklin). ","Es ist nicht wichtig, wie langsam du gehst, solange du nicht stehen bleibst. Von (Konfuzius). ","Zweige Wege scheiden sich im Wald. Ich nahm den wenig bereisten – und das machte den Unterschied. Von (Robert Frost). ","Die Menschen sagen, dass Motivation nicht dauerhaft ist. Das Baden allerdings auch nicht. Deshalb empfehlen wir es auch täglich. Von (Zig Ziglar). ","Ziele auf den Mond. Wenn du ihn verfehlst, landest du immerhin bei den Sternen. Von (Les Brown). ","Der einzige Weg, um großartige Arbeit zu vollbringen, ist zu lieben, was du tust. Wenn du es noch nicht gefunden hast, dann suche weiter – gib dich nicht vorher zufrieden. Von (Steve Jobs). ","Wenn du wissen willst, wer du warst, dann schau, wer du bist. Wenn du wissen willst, wer du sein wirst, dann schau, was du tust. Von (Buddhistische Weisheit). ","Erst die Möglichkeit, einen Traum zu verwirklichen, macht unser Leben lebenswert. Von (Paulo Coelho). "," Tätigkeit ist der wahre Genuss des Lebens, ja das Leben selbst. Von (Friedrich von Schlegel). ","Wenn du tust, was du immer getan hast, dann wirst du bekommen, was du immer bekommen hast. Von (Tony Robbins). ","Träume groß und traue dich, zu versagen. Von (Norman Vaughan). ","Es gibt nur einen Weg, um Kritik zu vermeiden: Nichts tun, nichts sagen, nichts sein. Von (Aristoteles). ","Wenn ich am Ende meines Lebens vor Gott stehen werde, dann hoffe ich, dass ich kein Talent mehr übrig habe und sagen kann: Ich habe alles genutzt, was du mir gegeben hast. Von (Erma Bombeck). ","Ich sterbe lieber aus Leidenschaft als aus Langeweile. Von (Vincent van Gogh). ","Ich bin nicht das Produkt meiner Umstände. Ich bin das Produkt meiner Entscheidungen. Von (Stephen Covey). ","Lebe als würdest du morgen sterben. Lerne als würdest du für immer leben. Von (Mahatma Gandhi). ","Dunkelheit kann keine Dunkelheit vertreiben – nur Licht kann es. Genauso kann Hass keinen Hass vertreiben – nur Liebe kann es. Von (Martin Luther King). ","Es muss immer eine Not oder eine Liebe über die Menschen kommen, damit sie einfach miteinander sind. Von (Anna Schieber). "," Du magst denjenigen vergessen, mit dem du gelacht hast, aber nie denjenigen, mit dem du geweint hast. Von (Khalil Gibran). ","Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein. Von (Albert Einstein). ","Come on, never give up! Von (Menderes Bagci). ","Weil die Klugen immer nachgeben, regieren die Dummen die Welt. Von (Unbekannt). ","Ein leerer Magen ist ein schlechter Ratgeber. Von (Albert Einstein). ","Vergiss nicht: Im Wort beneiden steckt Neid. Das ist nicht gut. Von (David Ortega). ","Leute sagen, NICHTS ist unmöglich, aber ich mache doch NICHTS jeden Tag. Von (Winnie the Pooh). ","Ich kann auch ohne Karriere leben. Von (Menderes Bagci). ","Heute morgen wurde mir das wieder klar: Mein Leben ist im Grunde eine einzige Katastrophe. Von (Gunter Gabriel). ","Man sollte wirklich heiraten. Wenn man eine gute Frau bekommt, wird man glücklich. Wenn man eine schlechte Frau bekommt, wird man Philosoph. Von (Sokrates). "," Das weiß ich doch selber, dass ich nicht gut singen kann. Von (Menderes Bagci). ");
$sprachAusgabe .= $uebergangCOTD[int(rand($#uebergangCOTD+1))];
$sprachAusgabe .= $COTD[int(rand($#COTD+1))];

# Generierung des Verabschiedungstextes
my @sayCiao = (" Ich wünsche Dir einen schönen Tag $spokenTo. "," Mach es gut lieber $spokenTo! "," Asta la vista, Baby! "," Mach was Gutes draus! "," Nun liegt es an Dir, was Du draus machst. ");
$sprachAusgabe .= $sayCiao[int(rand($#sayCiao+1))];
Log 3, "ReadCalendar: $sprachAusgabe";

# Ausgabe auf die Sonos
fhem("set $sonosName Speak $volume de $sprachAusgabe");
    Log 3, "ReadCalendar Command: set $sonosName Speak $volume de $sprachAusgabe";
}



Verbesserungsvorschläge oder Fragen immer gerne. Was Perl angeht, geht es bestimmt auch kürzer, aber Lesbarkeit ist für mich derzeit noch wichtiger als perl'sches Buchstabensparen ;-)

Have fun
/Till
FHEM auf Odroid N2, FTUI, etwa 110 Homematic Devices verschiedenster Coleur, BMWi3, Gardena, Hue, Sonos, Alexa, Harmony Hub, Samsung TV