[Modul] iCal Calender in IP Symcon lesen und verarbeiten

Hallo Zusammen,

Ich hatte das gleiche Problem, warum auch immer, legt die Standard Android APP die Termine falsch an.
Nutze ich die Outlook APP ist alles gut.

Vielleicht hilft es mal.

Grüße
Daniel

Hatte das gleiche Problem mit IOS Kalendereinträgen.
In der „RegulateTimezoneFactory.php“ habe ich in Zeile 155 die ‚Customized Time Zone‘ ergänzt.
Seit dem läuft alles super.

Gruß
Jürgen

@bumaas , kannst Du das vielleicht noch ergänzen? Danke

Hi,
in meinem 3 Jahre alten Script habe ich heute noch einen Fehler gefunden weil die Zeit heute umgestellt wurde und ich Morgen einen Termin habe. Bei ganztägigen Terminen lege ich die Startzeit 2 Stunden vor und die Endzeit 2 Stunden zurück damit der Termin auch bei Zeitumstellung im Tag liegt.

Hier mal meine aktuelle Version:

<?php
//error_reporting(E_ERROR | E_PARSE | E_NOTICE);
ICCR_UpdateCalendar(14290);
$calendar = ICCR_GetCachedCalendar(14290);
$calendar_array = json_decode($calendar, true);
$heute = mktime(0, 0, 0, date("m")  , date("d") + 0, date("Y"));
$heute_flag = true;
$morgen = $heute + 86400;
$morgen_flag = true;
$uebermorgen = $morgen + 86400;
$uebermorgen_flag = true;
$ende = $uebermorgen + 86400;
$text = "";
SetValue(10677, false);
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 = "";
        $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"]));
        $entry["From"] += 7200;
        $entry["To"] -= 7200;
    }
    if (($entry["From"] >= $heute) && ($entry["To"] < $morgen)){
        $pos = strpos($entry["Name"], "Geburtstag", 0);
        if ($pos === false) {        
            if (($entry["allDay"]) && (date('G') < 13)){
                if ($heute_flag){
                    $text .= "Heute   ".PHP_EOL;
                    $heute_flag = false;
                }
                if ((strstr($entry["Location"], '27299', false) === false) && (strlen($entry["Location"]) > 5)){
                    $text .= $entry["Name"] . " in " . $entry["Location"]."    ".PHP_EOL;
                }
                else{
                    $text .= $entry["Name"] ."    ".PHP_EOL;
                }
                if (strpos($entry["Name"], "Urlaub") !== false) SetValue(10677, true);
            }
            else if (time() < ($entry["From"] + 1800)){
                if ($heute_flag){
                    $text .= "Heute   ".PHP_EOL;
                    $heute_flag = false;
                }
                $text .= "um ".$zeit;
                if ((strstr($entry["Location"], '27299', false) === false) && (strlen($entry["Location"]) > 5)){
                    $text .= $entry["Name"] . " in " . $entry["Location"]."    ".PHP_EOL;
                }
                else{
                    $text .= $entry["Name"] ."    ".PHP_EOL;
                }
            }
        }
    }
    else if (($entry["From"] <= $heute) && ($entry["To"] >= $morgen)){
        if ($heute_flag){
            $text .= "Heute   ".PHP_EOL;
            $heute_flag = false;
        }
        if ((strstr($entry["Location"], '27299', false) === false) && (strlen($entry["Location"]) > 5)){
            $text .= $entry["Name"] . " in " . $entry["Location"]."    ".PHP_EOL;
        }
        else{
            $text .= $entry["Name"] ."    ".PHP_EOL;
        }
        if (strpos($entry["Name"], "Urlaub") !== false) SetValue(10677, true);
    }
    if ($entry["From"] > $ende){
        break;
    }
}
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 = "";
        $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"]));
        $entry["From"] += 7200;
        $entry["To"] -= 7200;
    }
    if (($entry["From"] >= $morgen) && ($entry["To"] < $uebermorgen)){
        $pos = strpos($entry["Name"], "Geburtstag", 0);
        if ($pos === false) {        
            if ($entry["allDay"]){
                if ($morgen_flag){
                    $text .= "Morgen   ".PHP_EOL;
                    $morgen_flag = false;
                }
                if ((strstr($entry["Location"], '27299', false) === false) && (strlen($entry["Location"]) > 5)){
                    $text .= $entry["Name"] . " in " . $entry["Location"]."    ".PHP_EOL;
                }
                else{
                    $text .= $entry["Name"] ."    ".PHP_EOL;
                }
            }
            else if (time() < $entry["To"]){
                if ($morgen_flag){
                    $text .= "Morgen   ".PHP_EOL;
                    $morgen_flag = false;
                }
                $text .= "um ".$zeit;
                if ((strstr($entry["Location"], '27299', false) === false) && (strlen($entry["Location"]) > 5)){
                    $text .= $entry["Name"] . " in " . $entry["Location"]."    ".PHP_EOL;
                }
                else{
                    $text .= $entry["Name"] ."    ".PHP_EOL;
                }
            }
        }
    }
    else if (($entry["From"] <= $morgen) && ($entry["To"] >= $uebermorgen)){
        if ($morgen_flag){
            $text .= "Morgen   ".PHP_EOL;
            $morgen_flag = false;
        }
        if ((strstr($entry["Location"], '27299', false) === false) && (strlen($entry["Location"]) > 5)){
            $text .= $entry["Name"] . " in " . $entry["Location"]."    ".PHP_EOL;
        }
        else{
            $text .= $entry["Name"] ."    ".PHP_EOL;
        }
    }
    if ($entry["From"] > $ende){
        break;
    }
}

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 = "";
        $zeit = $stunde." Uhr ".$minute . " ";
    }
    else{
        $entry["From"] += 7200;
        $entry["To"] -= 7200;
        $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)){
        $pos = strpos($entry["Name"], "Geburtstag", 0);
        if ($pos === false) {        
            if ($entry["allDay"]){
                if ($uebermorgen_flag){
                    $text .= "Übermorgen   ".PHP_EOL;
                    $uebermorgen_flag = false;
                }
                if ((strstr($entry["Location"], '27299', false) === false) && (strlen($entry["Location"]) > 5)){
                    $text .= $entry["Name"] . " in " . $entry["Location"]."    ".PHP_EOL;
                }
                else{
                    $text .= $entry["Name"] ."    ".PHP_EOL;
                }
            }
            else if (time() < $entry["To"]){
                if ($uebermorgen_flag){
                    $text .= "Übermorgen   ".PHP_EOL;
                    $uebermorgen_flag = false;
                }
                $text .= "um ".$zeit;
                if ((strstr($entry["Location"], '27299', false) === false) && (strlen($entry["Location"]) > 5)){
                    $text .= $entry["Name"] . " in " . $entry["Location"]."    ".PHP_EOL;
                }
                else{
                    $text .= $entry["Name"] ."    ".PHP_EOL;
                }
            }
        }
    }
    else if (($entry["From"] <= $uebermorgen) && ($entry["To"] >= $ende)){
        if ($uebermorgen_flag){
            $text .= "Übermorgen   ".PHP_EOL;
            $uebermorgen_flag = false;
        }
        if ((strstr($entry["Location"], '27299', false) === false) && (strlen($entry["Location"]) > 5)){
            $text .= $entry["Name"] . " in " . $entry["Location"]."    ".PHP_EOL;
        }
        else{
            $text .= $entry["Name"] ."    ".PHP_EOL;
        }
    }
    if ($entry["From"] > $ende){
        break;
    }
}

//if (strlen($text) < 2) $text = "Ralf Du hast Heute zum Glück keine Termine";
//print PHP_EOL.PHP_EOL.$text;
$html_text = '';
$html_text = str_replace(PHP_EOL, '<br>', $text);
$html_text = str_replace('Heute', '<strong>Heute</strong>', $html_text);
$html_text = str_replace('Morgen', '<strong>Morgen</strong>', $html_text);
$html_text = str_replace('Übermorgen', '<strong>Übermorgen</strong>', $html_text);
$text = str_replace('Morgen', '<break time="1s"/>' . 'Morgen', $text);
$text = str_replace('Übermorgen', '<break time="1s"/>' . 'Übermorgen', $text);
SetValue(27911, $text);
//SetValue(13874, '<p style="font-size: 1em;background-color:black;color:white;line-height:1.5em">'.$html_text.'</p>');
SetValue(13874, '<p style="font-size: 0.5em;color:white;line-height:1em">'.$html_text.'</p>');

?>

Falls ihr ein ähnliches oder abgewandeltes Script schon benutzt sucht nach ganztägigen Terminen und fügt bei den Zeiten ein

        $entry["From"] += 7200;
        $entry["To"] -= 7200;

hinzu-

Ralf

1 „Gefällt mir“

Mal eine ganz einfache Frage und entschuldige, wenn ich den 1000 Einträge langen Thread nicht ganz gelesen habe:

Die Notifier zeigen mit an, wenn ein RegEx im angegeben Zeitbereich gefunden wurde.
Wie kann ich das dann weiter verarbeiten?
Wie komme ich zum Beispiel an das Datum des gefundenen Eintrages?

Gegenfrage: wofür brauchst du das Datum? :slight_smile:

Aber schau dir mal

an. Da sollte alles Wissenswerte drinstehen. Z.B.

image

Dein Beispiel ist ja schon ganz gut. Danke dafür.

Ich muss mir wohl doch mal die Befehlsreferenz für dein Modul genauer ansehen :- )

Ich will eigentlich einfach nur die nächsten 3 Mülltermine mit Datum auflisten.

Ich spreche PHP leider nicht wirklich fließend, aber das scheint ein ganz schöner Aufwand zu werden, wenn man die ganzen JSON and array Tricks nicht kennt.

Nicht, wenn man ein Beispiel hat :slight_smile:

<?php
const CAL_ID = 47111; // Kalenderinstanz

$PresenceReason = json_decode(ICCR_GetNotifierPresenceReason(CAL_ID, 'NOTIFIER1'), true);

print_r($PresenceReason);

echo $PresenceReason['From'];

Hinweis: die Werte werden nur für Variablen gemeldet, die gerade „true“ sind.

Danke.
Kleine Unschönheit: Ich habe die Notifier umbenannt (in die verschiedenen Müllarten. Damit ist erstmal nicht mehr ersichtlich welcher Notifier für welche Variable gilt (zumal das Modul sie nach Namen umsortiert).
Ausserdem muss ich noch was überlegen, wenn 2 Müllarten gleichzeitig aktiv sind. Ich hatte bisher immer die nächsten 3 Termine angezeigt.

Ich versuche mal was anderes…

…und zwar:
Kann man Meldevariablen nach Tagen anlegen?
1440 bis 2880 = „morgen“ und dann „NAME“ und „FROM“ extrahieren?
2880 bis 4320 = „uebermorgen“, usw?

Lässt sich das mit Vorlauf und Nachlauf irgendwie machen? Man bräuchte eher ein von-bis. Geht ein negativer Nachlauf?

Wie müsste die RegEx aussehen, damit etwas gefunden wird, wenn der Datumsbereich ein Event hat?

Gibt es eine andere Möglichkeit auf die Notifier zuzugreifen, als über die Namen „NOTIFIERx“?
Ich wollte eigentlich über die Notifiervariablen im Objektbaum iterieren und dann die jeweiligen NotifierReason auslesen. Es gibt aber keine Bezug VariableID zu Notifier oder sehe ich das falsch?

Das wird alles zu umständlich. Es macht wohl mehr Sinn sich die Infos direkt aus dem Cache zu holen.

Trotzdem ist die Notifier Geschichte etwas eingeschränkt irgendwie, finde ich. Siehe meine beiden Bemerkungen oben… :slight_smile:

Bei der Funktion übergibst du den Ident, nicht den Variablennamen. Blende mal im Objektbaum die Spalte „Ident“ ein, dann wird es dir sicherlich klarer.

Hi Ralf,

bei deinem Skript (Danke!) zeigt er um 11 Uhr keine heutigen Termine mehr an.

Sollte das nicht erst ab 13 Uhr sein?

lg

Moin,

else if (time() < ($entry["From"] + 1800)){

ich zeige der Termin nur an bis 1/2 Stunde nach Start des Termins. Wenn man eine Besprechung oder einen Arzttermin hat wäre es nach eine 1/2 Stunde schon recht unhöflich.

Mit:

else if (time() < ($entry["To"] )){

solltest Du die Termine bis kurz vor Ende bekommen.

Ralf

2 „Gefällt mir“

Hallo,
ich bin grad am aufhübschen meiner neuen Webfront. mit der neuen 7.0 ist das ja richtig schick.
Hab bisher auf meiner "Startseite einen schönen Überblick. nun fehlt mir noch ein Kalender.
Ich versuche gerade mit dem ical Calender Reader zu basteln. Kalender aus Google kann ich schon abrufen. Nur weiss ich nicht weiter, wie ich die Daten visualisiert bekomme.
Mein Wunsch wäre eine einfache Listenübersicht der anstehenden Termine aus verschiedenen Kalender in den linken Bereich. Kann man das, und vor allem wie, irgendwie realisieren?

Grüße,
Stefan

Guten Morgen in die Runde! :slight_smile:

Ich habe die folgende Fehlermeldung:

Fatal error: Uncaught ValueError: Epoch doesn’t fit in a PHP integer in /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/DateTimeFactory.php:174
Stack trace:
#0 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/DateTimeFactory.php(174): DateTime->getTimestamp()
#1 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/DateTimeFactory.php(595): Kigkonsult\Icalcreator\Util\DateTimeFactory::cnvrtDateTimeInterface(Object(DateTime))
#2 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/DateTimeFactory.php(319): Kigkonsult\Icalcreator\Util\DateTimeFactory::setDateTimeTimeZone(Object(DateTime), ‚UTC‘)
#3 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/RexdateFactory.php(414): Kigkonsult\Icalcreator\Util\DateTimeFactory::conformStringDate(‚18840101T000000‘, false, true, false, ‚UTC‘)
#4 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Traits/RDATEtrait.php(184): Kigkonsult\Icalcreator\Util\RexdateFactory::prepInputRdate(Array, Array)
#5 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/CalendarComponent.php(409): Kigkonsult\Icalcreator\DScomponent->setRdate(Array, Array)
#6 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/CalendarComponent.php(211): Kigkonsult\Icalcreator\CalendarComponent->parse3thisProperties()
#7 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/CalendarComponent.php(446): Kigkonsult\Icalcreator\CalendarComponent->parse()
#8 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/CalendarComponent.php(212): Kigkonsult\Icalcreator\CalendarComponent->parse4subComps()
#9 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Vcalendar.php(901): Kigkonsult\Icalcreator\CalendarComponent->parse()
#10 /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Vcalendar.php(734): Kigkonsult\Icalcreator\Vcalendar->parse4subComps()
#11 /var/lib/symcon/modules/.store/de.bumaas.ical/iCalCalendarReader/iCalImporter.php(191): Kigkonsult\Icalcreator\Vcalendar->parse(‚BEGIN:VCALENDAR…‘)
#12 /var/lib/symcon/modules/.store/de.bumaas.ical/iCalCalendarReader/module.php(734): iCalImporter->ImportCalendar(‚BEGIN:VCALENDAR…‘)
#13 /var/lib/symcon/modules/.store/de.bumaas.ical/iCalCalendarReader/module.php(769): iCalCalendarReader->ReadCalendar()
#14 /var/lib/symcon/scripts/__generated.inc.php(12627): iCalCalendarReader->UpdateCalendar()
#15 /-(7): ICCR_UpdateCalendar(24499)
#16 {main}
thrown in /var/lib/symcon/modules/.store/de.bumaas.ical/libs/iCalcreator-master/src/Util/DateTimeFactory.php on line 174

Irgendwie kommt das Modul mit etwas nicht zurecht…

Jemand eine Idee dazu?

Joachim

Hi,
versuch mal die Beta die läuft bei mir seit Monaten mit IPS 7.

Ralf

Hi,
versuch mal mein Script aus dem Thread. Ich erzeuge einen Text und einen HTML-Text für die heute und die nächsten beiden Tage. Per Copy&Paste kann man es bestimmt einfach um weitere Tage erweitern.

Ralf

Hallo Ralf,

damit wird der Kalender offenbar fehlrfrei eingelesen - Vielen Dank!

Joachim

Hi,
wie zeigt sich das? Ich lese den Kalender mit dem Script nicht selbst ein sondern das macht alles iCal für mich.

Ich lese mit iCal seit einigen Jahren mein NextCloud Kalender ein und zeige/sage mir die Termine der nächsten Tage.

Ralf

Hat es jemand geschafft, den iCal von Nextcloud mit dem Modul anzuzapfen.
OwnCloud soll sehr ähnlich sein und nach dieser Anleitung des Modulentwicklers bin ich vorgegangen.
Hier ist das Dump-File dazu:
dump.txt (2,6 KB)

Ich verwende diese Kalender-URL:
https://nextcloud.xxx.ch/remote.php/dav/calendars/mb-stern@xxxx.ch/Symcon?export

Mein Kalender heisst ‚Symcon‘

Ich verwende Bneutzername und Passwort meines Nextcloud-Profils