[Modul] iCal Calender in IP Symcon lesen und verarbeiten

Hi,
Welchen Kalender benutzt du? Bei mir ist die Adresse 192.168.178.2:5081/remote.php/dav/calendars/rb/personal/?export weil es über das WebDAV Protokoll geht.

Ralf

Hi Ralf,

wie gesagt, der Kalender liegt auf meiner Synology und wird wie in der Anleitung beschrieben:

Synology: http[s]://(server-name)[:server-port]/caldav/(user-name)/(calendar.name)--(suffix) Zu finden in der Calendar-App. Rechts in der Liste der Kalender das nach unten zeigende Dreieck neben dem Kalendernamen anklicken, "CalDAV-Konto"* auswählen, in dem PopUp die Adresse für Thunderbird kopieren.

eingebunden. Via Browser und von der Console (curl) des Symcon-Systems lässt sich der Kalender abfragen.

VG
Flo

Hast du mal in die Debugausgabe geschaut? Vielleicht hilft sie dir weiter.

Hi,

die oben beschriebene Fehlermeldung kommt aus „Meldungen“. Weitere Details werden leider nicht ausgegeben :frowning: Oder gibt es noch weitere Möglichkeiten auf debug-logs zuzugreifen?

Fehler in „Meldungen“:

Als ergänzende Info:

  • Symcon läuft im docker-container
  • V6.0 Professional

In den Instanzen gibt es die Möglichkeit, die Debugausgabe aufzurufen. Den Button findest du oben rechts.

Danke für den Tipp.
Leider steht da auch nicht wirklich mehr. :frowning:

Problem ist gelöst. Die Ursache lag in einer fehlerhaften docker-config.

Der ical liegt auf der synology 10.10.0.252
Die docker-container inkl. symcon ebenfalls auf 10.10.0.252

symcon war als bridged network konfiguriert und konnte keine Verbindung zum ical auf 10.10.0.252 herstellen.

Jetzt läuft Symcon im network modus „host“ und die Abfrage der Kalender funktioniert wunderbar. :+1:
Danke für Eure Tipps.

VG Flo

Seit ich auf SOGO umgestellt habe funktioniert nur mehr 1 Kalender (von 3).
Die Meldung die beim Kalender laden kommt ist:

Fatal error: Uncaught Exception: DateTimeZone::__construct(): Unknown or bad timezone (Amsterdam, Berlin, Bern, Rom, Stockholm, Wien) in /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/DateTimeZoneFactory.php:106
Stack trace:
#0 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/DateTimeZoneFactory.php(106): DateTimeZone->__construct('Amsterdam, Berl...')
#1 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/RegulateTimezoneFactory.php(530): Kigkonsult\Icalcreator\Util\DateTimeZoneFactory::assertDateTimeZone('Amsterdam, Berl...')
#2 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/RegulateTimezoneFactory.php(503): Kigkonsult\Icalcreator\Util\RegulateTimezoneFactory->processDatePropsTZIDattribute('DTEND', '39160619T000000', Array)
#3 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/RegulateTimezoneFactory.php(320): Kigkonsult\Icalcreator\Util\RegulateTimezoneFactory->processDtPr in /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/DateTimeZoneFactory.php on line 109

Kann die ics Datei gerne zur Verfügung stellen.

Schick sie mir mal bitte. Dann schaue ich sie mir an.

Burkhard

Es wird ein Termin angezeigt, der nicht existiert!? 13 09 2021

Wie gibts denn sowas?

Und noch dazu wird dieser Termin in der aktuellen Woche angezeigt? 20 09 2021

Skript:

<?php

//***********************************************************************************************************************
// Einstellungen

$KalenderId = 26174;
$UrlaubId = 41798;

// für Webfront
$TerminId_Heute = 49468;
$TerminId_Morgen = 48381;
$TerminId_Uebermorgen = 27701;

//für Alexa
$TerminId_HeuteA = 51696;
$TerminId_MorgenA = 16021;
$TerminId_UebermorgenA = 35400;


//************************************************************************************************************************
// Code

ICCR_UpdateCalendar($KalenderId); 
$calendar = ICCR_GetCachedCalendar($KalenderId);
$calendar_array = json_decode($calendar, true);

/*      // test
        $anzahl = count($calendar_array);

        array_walk_recursive($calendar_array, function($val, $key) use (&$keys) {
                $keys[] = $key;
            });
            print_r($keys);

        exit();
*/


SetValue($UrlaubId, false); /* Bool Variable die IPS sagt ob ich Urlaub habe wird gesetzt wenn ein Termin Urlaub heißt */

      // testen
      //  var_dump($calendar_array).PHP_EOL.PHP_EOL;

$heute = mktime(0, 0, 0, date("m")  , date("d") + 0, date("Y"));
$heute_flag = true;

$morgen = mktime(0, 0, 0, date("m")  , date("d") + 1, date("Y"));
$morgen_flag = true;

$uebermorgen = mktime(0, 0, 0, date("m")  , date("d") + 2, date("Y"));
$uebermorgen_flag = true;

$ende = $uebermorgen + 86400;

// für Webfront
$text1 = "";
$text2 = "";
$text3 = "";

// für Alexa ohne HTML Code
$text1a = "";
$text2a = "";
$text3a = "";


// **************************************************************************************************************************
// Heute

foreach ($calendar_array as $entry) 
{
    if ($entry["Status"] == 'CANCELLED') continue;
    if ($entry["allDay"] == false)
    {
        $stunde = date('H', $entry["From"]);
        $minute = date('i', $entry["From"]);
        $zeit = $stunde." Uhr ".$minute." ";
        
    }
    else
    {
        $entry["From"] = mktime(0, 0, 0, date("m", $entry["From"])  , date("d", $entry["From"]), date("Y", $entry["From"]));
        $entry["To"] = mktime(0, 0, 0, date("m", $entry["To"])  , date("d", $entry["To"]), date("Y", $entry["To"]));
    }

    if (($entry["From"] >= $heute) && ($entry["To"] <= $morgen))
    {
        if (($entry["allDay"]) && (date('H', time()) < 13))
        {
            if ($heute_flag)
            {   // wenn erster eintrag
                $text1a .= "Eure Termine Heute: ".PHP_EOL;              

                $heute_flag = false;                
            }
                $text1 .= "<b>".$entry["Name"]."</b> ".$entry["Location"]."<br>";
            

        }
        
        else if (($entry["allDay"] == false) && (time() < $entry["To"]))

        //else if ($entry["allDay"] == false)
        {
            if ($heute_flag)
            {  // wenn erster Eintrag
                $text1a .= "Eure Termine Heute: ".PHP_EOL;
                $heute_flag = false;             
            }
                $text1a .= "um ".$zeit;
         
                $text1a .= $entry["Name"]." ".PHP_EOL;
                $text1 .= "<b>".$entry["Name"]."</b> ".$entry["Location"];
                $text1 .= $zeit."<br>";


        }
        if (strpos($entry["Name"], "Urlaub") >= 0) SetValue($UrlaubId, true);

    }
    else if (($entry["From"] <= $heute) && ($entry["To"] >= $morgen))
    {
        if ($heute_flag)
        {   // wenn erster eintrag
            $text1a .= "Eure Termine Heute: ".PHP_EOL;  
           
            $heute_flag = false;
        }

            $text1a .= $entry["Name"]." ".PHP_EOL;
            $text1 .= "<b>".$entry["Name"]."</b> ".$entry["Location"]."<br>";  
    }

    if ($entry["From"] > $ende)
    {
        break;
    }
}


// *************************************************************************************************************************
// Morgen

foreach ($calendar_array as $entry) 
{

    if ($entry["Status"] == 'CANCELLED') continue;

    if ($entry["allDay"] == false)
    {
        $stunde = date('H', $entry["From"]);
        $minute = date('i', $entry["From"]);
        $zeit = $stunde." Uhr ".$minute." ";     
    }
    else
    {
        $entry["From"] = mktime(0, 0, 0, date("m", $entry["From"])  , date("d", $entry["From"]), date("Y", $entry["From"]));
        $entry["To"] = mktime(0, 0, 0, date("m", $entry["To"])  , date("d", $entry["To"]), date("Y", $entry["To"]));
    }

    if (($entry["From"] >= $morgen) && ($entry["To"] <= $uebermorgen))
       {

            if ($entry["allDay"])
            {
                    if ($morgen_flag)
                    {
                        $text2a .= "Morgen ".PHP_EOL;

                        $morgen_flag = false;
                    }   
                        $text2a .= $entry["Name"]." ".PHP_EOL;

                        $text2 .= "<b>".$entry["Name"]."</b> ".$entry["Location"]."<br>".PHP_EOL;          
                
            }

        
            else if (($entry["allDay"] == false) && (time() < $entry["To"]))
            {
                if ($morgen_flag)
                {
                    $text2a .= "Morgen ".PHP_EOL;

                    $morgen_flag = false;
                }   

                    $text2a .= "um ".$zeit;
                    $text2a .= $entry["Name"]." ".PHP_EOL;
                                      
                    $text2 .= "<b>".$entry["Name"]."</b> ".$entry["Location"];
                    $text2 .= $zeit."<br>"; 

            }
    }
    // länger dauernde einträge

    else if (($entry["From"] <= $morgen) && ($entry["To"] >= $uebermorgen))
        {
            if ($morgen_flag)
            {
                $text2a .= "Morgen ".PHP_EOL;

                $morgen_flag = false;
            }
                $text2a .= $entry["Name"]." ".PHP_EOL;
                $text2 .= "<b>".$entry["Name"]."</b> ".$entry["Location"]."<br>".PHP_EOL;
        
    }
    

    if ($entry["From"] > $ende)
    {
        break;
    }
  
}


// ********************************************************************************************************************************
// Übermorgen

foreach ($calendar_array as $entry) 
{
    if ($entry["Status"] == 'CANCELLED') continue;
    if ($entry["allDay"] == false)
    {
        $stunde = date('H', $entry["From"]);
        $minute = date('i', $entry["From"]);
        $zeit = $stunde." Uhr ".$minute." ";       
    }
    else
    {
        $entry["From"] = mktime(0, 0, 0, date("m", $entry["From"])  , date("d", $entry["From"]), date("Y", $entry["From"]));
        $entry["To"] = mktime(0, 0, 0, date("m", $entry["To"])  , date("d", $entry["To"]), date("Y", $entry["To"]));
    }

    if (($entry["From"] >= $uebermorgen) && ($entry["To"] <= $ende))
    {
        if ($entry["allDay"])
        {
            if ($uebermorgen_flag)
            {
                $text3a .= "Übermorgen ".PHP_EOL;

                $uebermorgen_flag = false;
            }

                $text3a .= $entry["Name"]." ".PHP_EOL;

                $text3 .= "<b>".$entry["Name"]."</b> ".$entry["Location"]."<br>";

        }
        else if (($entry["allDay"] == false) && (time() < $entry["To"]))
        {
            if ($uebermorgen_flag)
            {                            
                $text3a .= "Übermorgen ".PHP_EOL;

                $uebermorgen_flag = false;
            }

                $text3a .= "um ".$zeit;
                $text3a .= $entry["Name"]." ".PHP_EOL;
                       
                $text3 .= "<b>".$entry["Name"]."</b> ".$entry["Location"];
                $text3 .= $zeit."<br>";

        }
    }
    else if (($entry["From"] <= $uebermorgen) && ($entry["To"] >= $ende))
    {
        if ($uebermorgen_flag)
        {
            $text3a .= "Übermorgen ".PHP_EOL;

            $uebermorgen_flag = false;
        }
            $text3a .= $entry["Name"]." ".PHP_EOL;

            $text3 .= "<b>".$entry["Name"]."</b> ".$entry["Location"]."<br>";    
        

    }
    if ($entry["From"] > $ende)
    {
        break;
    }
}




if (strlen($text1) < 2) 
{
    $text1 = "<b>Heute gibt es zum Glück keine wichtigen Termine</b>";
    $text1a = "Heute gibt es zum Glück keine wichtigen Termine";
}
if (strlen($text2) < 2) 
{
    $text2 = "<b>Es gibt es zum Glück keine wichtigen Termine</b>";
    $text2a = "Morgen gibt es zum Glück keine wichtigen Termine";
}
if (strlen($text3) < 2) 
{
    $text3 = "<b>Es gibt es zum Glück keine wichtigen Termine</b>";
    $text3a = "Übermorgen gibt es zum Glück keine wichtigen Termine";
}

//print PHP_EOL.PHP_EOL.PHP_EOL.$text;

//echo $text1;

// für Webfront
SetValue($TerminId_Heute, $text1); /* 27911 Instanz einer Stringvariablen die den Text für alle Termine der nächsten 3 Tage enthält z.B. für Alexa */
SetValue($TerminId_Morgen, $text2); /* 27911 Instanz einer Stringvariablen die den Text für alle Termine der nächsten 3 Tage enthält z.B. für Alexa */
SetValue($TerminId_Uebermorgen, $text3); /* 27911 Instanz einer Stringvariablen die den Text für alle Termine der nächsten 3 Tage enthält z.B. für Alexa */

// für Alexa
SetValue($TerminId_HeuteA, $text1a); /* 27911 Instanz einer Stringvariablen die den Text für alle Termine der nächsten 3 Tage enthält z.B. für Alexa */
SetValue($TerminId_MorgenA, $text2a); /* 27911 Instanz einer Stringvariablen die den Text für alle Termine der nächsten 3 Tage enthält z.B. für Alexa */
SetValue($TerminId_UebermorgenA, $text3a); /* 27911 Instanz einer Stringvariablen die den Text für alle Termine der nächsten 3 Tage enthält z.B. für Alexa */



Hi,
warum existiert er nicht? Im Log ist er da und vom Script wird er gefunden. In der Ansicht steht er nicht. Vielleicht irgendwie versteckt oder so?

Ralf

Ich habe keine blasse Ahnung. Der erste Screenshot ist original vom Google Kalender!

Kann man Termine verstecken?

Hi,
nicht alle Felder aller Kalender werden in die IPS Struktur eingefügt. Lad deinen Kalender mal als ICS runter und schau nach was da bei EnBW steht. Bei meinem NextCloud-Kalender gibt es u.a. noch Priority und Class. Die meisten Kalender dürften z.B. Class:PUBLIC/PRIVAT haben und damit die Möglichkeit schaffen das Du deinen Kalender für andere Leute zugänglich machst.

Ralf

Also auch im ical Export ist nichts zu entdecken.

Ein Wunder.

Hi,
kein EnBW oder Stuttgart?

Ralf

Nein, nur Wochen davor und danach.
Auch wenn ich diese Termine lösche oder umbenenne ergibt es keinerlei Änderung.
Bin echt ratlos…

Merkwürdig.

Geh mal in die Kalender-Instanz dann Debug und dann Kalender laden. Schau was da steht.

Das Modul denkt sich doch keine Termine aus.

Ralf

Ich verstehe es ja auch nicht. Glaube gar nicht das das mit dem Modul zusammenhängt…

a

dump (3).txt (8,1 MB)

dump (1).txt (55,1 KB)

dump (2).txt (32,3 KB)

Aber irgendwíe vielleicht doch?
Schau mal Ralf,
der Kalender zeigt den ENBW Termin nur immer Mo-Do.
So wie die Wochen davor oder danach…

Fr/Sa/So nie.

Ich habe aber die Termine vorher und nach dieser Woche schon gelöscht/umbenannt und es war keine Änderung zu sehen…

Hi,
im Debug kann man schön sehen das EnBW im Kalender steht. Du hättest eigentlich auch in der ICS Datei (Export) finden müssen.

Ralf