[Modul] iCal Calender in IP Symcon lesen und verarbeiten

Hallo zusammen,
super danke für das Update, funzt wieder.

Gruß Torsten

hab es jetzt hinbekommen, aber bei mir werden nachwievor keine Termine angezeigt

Hi, im Modul Store das Modul auswählen, ganz runter scrollen auf „Weitere Optionen“ klicken und die BETA installieren (bei mir steht Stable da ich die BETA schon habe).

Gruß Torsten

1 „Gefällt mir“

Hi, nach langer Zeit beschäftige ich mich mal wieder mit IPS. Wollte mein iCal jetzt für das Wandtablet nutzen in Zusammenhang mit IPSview. Habe hier die Funktion mit calendar.html und dem Webfront gefunden. Bei mir bleibt die Webfrontseite allerdings komplett leer.

Habe die calender.html und feed.php aus dem exampel Ordner in c:\programdata\symcon\webfront\user\iCal kopiert, die InstanzID eingetragen und IPS Dienst neu gestartet. Hab ich was verpasst oder sollte er mir nicht wenigstens einen Kalender oder irgendwas anzeigen!? Das iCal Modul ansich funktioniert und ruft Kalendereinträge sauber ab. Aktuell bin ich auf IPS 5.5, iCal über den Beta Kanal eben aktualisiert.

Gruß Pascal

EDIT: zu früh gepostet, die html in Post #535 hat geholfen :smiley:

Die in der Beta Version enthaltene calender.html unter Examples sollte eigentlich funktionieren.

Burkhard

Hmm … hab upgedatet und die Dateien erneut rüberkopiert. Datum war irgendwas von Juni. Ich check das später noch mal am wenn ich am PC bin.

Hi Bumaas, hab sie eben nochmal aus dem examples rauskopiert, Änderungsdatum ist 28.6., bleibt aber blank die Seite.

Danke! Schau ich mir mal an.
Die ID(s) hattest du sicherlich eingetragen, oder?

Jup. Hab auch verschiedene eingetragen, ohne Erfolg.

Moin Simon,

sag mal wie hast du die Termine an einem Tag so untereinander bekommen ? Ich habe das Script über deinem Beitrag als Vorlage benutzt. Sieht aber ganz anders aus.



Grüße

Hi,
blende im Editor mal die Spalte Position ein und dann vergebe Position 10 für 1., Position 20 für 2. und Position 30 für den 3. Eintrag. Das musst Du dann vielleicht für die Visualisierung wiederholen.

Ralf

Ähh stehe gerade extrem auf dem Schlauch.
In der Console habe ich mal die Spalte Position eingeblendet und 10…20 und 30 vergeben, aber in welchem „Editor“ soll ich die Position einblenden ? Webfront Editor kann man meines Wissens keine Spalten einblenden ?! Oder muss im Script noch etwas angepasst werden ? Bin kein Coder, habe kein plan :stuck_out_tongue:

Ich möchte nur, dass die Termine an einem Tag nicht ein einer Reihe hintereinander angezeigt werden sondern untereinander.
Danke Dir !

position

Hi,
wenn ich dich richtig verstehe wird die Anzeige im Editor nicht untereinander gehen. Für Web-Front müsste das Profil für die Variablen wohl nur auf ~TextBox gesetzt werden.

Alternative wäre vielleich auch eine komplette Kalenderanzeige:

Ralf

Guten Morgen,

ich habe hierzu meine ich das Skript noch etwas erweitert:

<?php

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

$KalenderId = 56245;
$UrlaubId = 51827;

$TerminId_Heute = 31341;
$TerminId_Morgen = 23948;
$TerminId_Uebermorgen = 51815;


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

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

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

//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;

$text1 = "";
$text2 = "";
$text3 = "";


// Heute
foreach ($calendar_array as $entry) {
    if ($entry["Status"] == 'CANCELLED') continue;
    if ($entry["allDay"] == false){
        $stunde = date('G', $entry["From"]);
        $minute = date('i', $entry["From"]);
        // if ($minute < 10) $minute = " ";
        // wenn Stunde <10 (2stellig) dann Leerzeichen dazu
        if ($stunde <= 9)
        {
            $zeit = "0".$stunde.":".$minute." Uhr ";
        }
        else
        {
            $zeit = $stunde.":".$minute." Uhr ";
        }
    }
    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('G', time()) < 13)){
            if ($heute_flag){
                // $text1 .= "Heute   ".PHP_EOL;
                $heute_flag = false;
            }
            $text1 .= $entry["Name"]."    ".PHP_EOL;
        }
        else if (($entry["allDay"] == false) && (time() < $entry["To"])){
            if ($heute_flag){
                // $text1 .= "Heute   ".PHP_EOL;
                $heute_flag = false;
            }
            //$text1 .= "um ".$zeit;
            $text1 .= $zeit;

            $text1 .= $entry["Name"]."    ".PHP_EOL;
        }
        if (strpos($entry["Name"], "Urlaub") >= 0) SetValue($UrlaubId, true);
    }
    else if (($entry["From"] <= $heute) && ($entry["To"] >= $morgen)){
        if ($heute_flag){
            // $text1 .= "Heute   ".PHP_EOL;
            $heute_flag = false;
        }
        $text1 .= $entry["Name"]."    ".PHP_EOL;
    }
    if ($entry["From"] > $ende){
        break;
    }
}

// Morgen
foreach ($calendar_array as $entry) {
    if ($entry["Status"] == 'CANCELLED') continue;
    if ($entry["allDay"] == false){
        $stunde = date('G', $entry["From"]);
        $minute = date('i', $entry["From"]);
        // if ($minute < 10) $minute = " ";
        // wenn Stunde <10 (2stellig) dann Leerzeichen dazu
        if ($stunde <= 9)
        {
            $zeit = "0".$stunde.":".$minute." Uhr ";
        }
        else
        {
            $zeit = $stunde.":".$minute." Uhr ";
        }
        
    }
    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){
                // $text2 .= "Morgen   ".PHP_EOL;
                $morgen_flag = false;
            }
            $text2 .= $entry["Name"]."    ".PHP_EOL;
        }
        else if (($entry["allDay"] == false) && (time() < $entry["To"])){
            if ($morgen_flag){
                // $text2 .= "Morgen   ".PHP_EOL;
                $morgen_flag = false;
            }
            // $text2 .= "um ".$zeit;
            $text2 .= $zeit;

            $text2 .= $entry["Name"]."    ".PHP_EOL;
        }
    }
    else if (($entry["From"] <= $morgen) && ($entry["To"] >= $uebermorgen)){
        if ($morgen_flag){
            // $text2 .= "Morgen   ".PHP_EOL;
            $morgen_flag = false;
        }
        $text2 .= $entry["Name"]."    ".PHP_EOL;
    }
    if ($entry["From"] > $ende){
        break;
    }
}

// Übermorgen
foreach ($calendar_array as $entry) {
    if ($entry["Status"] == 'CANCELLED') continue;
    if ($entry["allDay"] == false){
        $stunde = date('G', $entry["From"]);
        $minute = date('i', $entry["From"]);
        // if ($minute < 10) $minute = " ";
        // wenn Stunde <10 (2stellig) dann Leerzeichen dazu
        if ($stunde <= 9)
        {
            $zeit = "0".$stunde.":".$minute." Uhr ";
        }
        else
        {
            $zeit = $stunde.":".$minute." Uhr ";
        }
    }
    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){
                // $text3 .= "Übermorgen   ".PHP_EOL;
                $uebermorgen_flag = false;
            }
            $text3 .= $entry["Name"]."    ".PHP_EOL;
        }
        else if (($entry["allDay"] == false) && (time() < $entry["To"])){
            if ($uebermorgen_flag){
                // $text3 .= "Übermorgen   ".PHP_EOL;
                $uebermorgen_flag = false;
            }
            $text3 .= "um ".$zeit;
            $text3 .= $entry["Name"]."    ".PHP_EOL;
        }
    }
    else if (($entry["From"] <= $uebermorgen) && ($entry["To"] >= $ende)){
        if ($uebermorgen_flag){
            // $text3 .= "Übermorgen   ".PHP_EOL;
            $uebermorgen_flag = false;
        }
        $text3 .= $entry["Name"]."    ".PHP_EOL;
    }
    if ($entry["From"] > $ende){
        break;
    }
}

if (strlen($text1) < 2) $text1 = "Stefanie & Simon, Ihr habt Heute keine Termine!";
if (strlen($text2) < 2) $text2 = "Stefanie & Simon, Ihr habt Morgen keine Termine!";
if (strlen($text3) < 2) $text3 = "Stefanie & Simon, Ihr habt Übermorgen keine Termine!";
//print PHP_EOL.PHP_EOL.PHP_EOL.$text;

//echo $text1;

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 */


?>

Danach dann lediglich die 3 Variablen „anstehende Termine heute“ / „anstehende Termine morgen“ / „anstehende Termine übermorgen“ im WebFront integriert und ein Ereignis hinterlegt, bei welchem die Termine aktualisiert werden (bei mir der Bewegungsmelder, welcher das Tablet an der Wand aufweckt).

Ich habe hier umgestellt von Exchange auf SOGO. Im Modul also die URL angepasst. Es erscheinen wieder Termine, jedoch auch folgende Meldungen im Log.

16.08.2021 05:05:33 | 28743 | ERROR   | iCal Calendar Reader | Error 'COUNT must be a positive integer (> 0)' in CalRRule 'Geburtstag - Johanna Burtscher': Array
(
    [FREQ] => YEARLY
    [COUNT] => 0
    [BYMONTHDAY] => 15
    [BYMONTH] => 8
    [DTSTART] => DateTime Object
        (
            [date] => 2008-08-15 10:00:00.000000
            [timezone_type] => 3
            [timezone] => Europe/Berlin
        )

)

16.08.2021 05:10:11 | 19025 | ERROR   | ScriptEngine         | Result for Event 24327
<br />
<b>Fatal error</b>:  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:108
Stack trace:
#0 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/DateTimeZoneFactory.php(108): DateTimeZone-&gt;__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(501): Kigkonsult\Icalcreator\Util\RegulateTimezoneFactory-&gt;processDatePropsTZIDattribute('DTEND', '39160619T000000', Array)
#3 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/RegulateTimezoneFactory.php(316): Kigkonsult\Icalcreator\Util\RegulateTimezoneFactory-&gt;processDtPr in <b>/var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/DateTimeZoneFactory.php</b> on line <b>111</b><br />

16.08.2021 05:10:33 | 28743 | ERROR   | iCal Calendar Reader | Error 'COUNT must be a positive integer (> 0)' in CalRRule 'Hochzeitstag': Array
(
    [FREQ] => YEARLY
    [COUNT] => 0
    [BYMONTHDAY] => 19
    [BYMONTH] => 6
    [DTSTART] => DateTime Object
        (
            [date] => 2020-06-19 10:00:00.000000
            [timezone_type] => 3
            [timezone] => Europe/Berlin
        )

)

Eine Idee?

Vielen Dank. Läuft ! Textbox war auch noch ein guter Hinweis. :slight_smile:

Hi,
kleiner Erweiterungswunsch. In Kalender gibt es eine Option benachrichtigung X Tage vor Termnin. Bei NextCloud steht es als

BEGIN:VALARM
ACTION:DISPLAY
TRIGGER;RELATED=START:-P4D
END:VALARM

in der ICS Datei wobei -P4D 4 Tage vor Termin bedeutet. Könnte man die Infos auch im Modul bekommen?

Ralf

Das muss ich mir mal anschauen, ob das geht. Leider komme ich momentan nicht dazu. Vielleicht nächste Woche.

Keine Eile. 3 Tage habe ich ja schon mit meinem Script.

Hi zusammen,

meine Versuche das Modul zu implementieren schlagen mit folgender Fehlermeldung fehl.

28.08.2021, 09:48:00 | iCal Calendar Reader | Error (28) on connect - Connection timed out after 20000 milliseconds for https://10.10.0.252:5001/caldav/XYZXYZXYZ/

Der Fehler tritt bei der aktuellen „stable“ und „beta“ auf.

Der iCal liegt auf ner Synology und ist durch Aufrufen der URL über 'nen Browser erreichbar.
Auch via „curl“ kann ich den Kalender abrufen.

Was mache ich falsch? Habt Ihr nen Tipp für mich?
Danke im Voraus.