<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Google Kalender (ICS) für Material Design &amp; Mini-Kalender]]></title><description><![CDATA[<h2>Einleitung</h2>
<p dir="auto">Für ioBroker gibt es bereits einen Adapter zum Einbinden von Google-Kalendern. Da dieser jedoch einige Funktionen vermissen ließ, die ich für meine Visualisierung benötigte, habe ich ein eigenes Script erstellt. <strong>Dieses ist speziell auf die Darstellung in Material Design und meine Anforderungen zugeschnitten</strong>.</p>
<p dir="auto">Das Script liest beliebig viele Google-Kalender über deren private ICS-Adresse ein, verarbeitet wiederkehrende Termine, <strong>ergänzt automatisch Feiertage (Deutschland oder Österreich) sowie Sommer- und Winterzeit</strong> und erzeugt zwei Datenpunkte für unterschiedliche Darstellungen.</p>
<p dir="auto"><img src="/assets/uploads/files/1784369973109-unbenannt_anonymized.png" alt="Unbenannt_anonymized.png" class=" img-fluid img-markdown" /></p>
<hr />
<h1>Voraussetzungen</h1>
<ul>
<li>JavaScript-Adapter</li>
<li>Installiertes npm-Modul:
<ul>
<li><code>node-ical</code> <strong>(als zusätzliches NPM-Paket - aktuelle Version: 0.26.1)</strong></li>
</ul>
</li>
<li>Mindestens ein Google-Kalender mit privater ICS-Adresse</li>
<li>Material Design (Scrounger 0.5.94) (VIS-1) für großen Kalender</li>
<li>JSON oder Tabellen Widget für kleinen Kalender<br />
<strong><a class="plugin-mentions-user plugin-mentions-a" href="/user/oliverio" aria-label="Profile: oliverio">@<bdi>oliverio</bdi></a> hier könntest du eventuell über vis-jsontemplate noch etwas beitragen</strong></li>
</ul>
<hr />
<h1>Konfiguration</h1>
<p dir="auto">Alle Einstellungen befinden sich übersichtlich am Anfang des Scripts und können ohne Änderungen am eigentlichen Code angepasst werden.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Konstante</th>
<th>Beschreibung</th>
<th>Mögliche Werte</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>dp_Main</code></td>
<td>Datenpunktpfad für die erzeugten Datenpunkte</td>
<td>Beliebiger Datenpunktpfad</td>
</tr>
<tr>
<td><code>BASE_URL</code></td>
<td>Pfad zu den Icons des Mini-Kalenders</td>
<td>URL oder lokaler VIS-Pfad</td>
</tr>
<tr>
<td><code>C1_PAST_DAYS</code></td>
<td>Vergangene Tage im großen Kalender</td>
<td>Zahl ≥ 0</td>
</tr>
<tr>
<td><code>C1_FUTURE_DAYS</code></td>
<td>Zukünftige Tage im großen Kalender</td>
<td>Zahl ≥ 0</td>
</tr>
<tr>
<td><code>M1_PAST_DAYS</code></td>
<td>Vergangene Tage im Mini-Kalender</td>
<td>Zahl ≥ 0</td>
</tr>
<tr>
<td><code>M1_FUTURE_DAYS</code></td>
<td>Zukünftige Tage im Mini-Kalender</td>
<td>Zahl ≥ 0</td>
</tr>
<tr>
<td><code>LAND</code></td>
<td>Land für die Feiertagsberechnung</td>
<td><code>DE</code> oder <code>AT</code></td>
</tr>
<tr>
<td><code>Bundesland</code></td>
<td>Bundesland für regionale Feiertage</td>
<td><strong>DE:</strong> <code>BW</code>, <code>BY</code>, <code>BE</code>, <code>BB</code>, <code>HB</code>, <code>HH</code>, <code>HE</code>, <code>MV</code>, <code>NI</code>, <code>NW</code>, <code>RP</code>, <code>SL</code>, <code>SN</code>, <code>ST</code>, <code>SH</code>, <code>TH</code>&lt;br&gt;<strong>AT:</strong> <code>W</code>, <code>NÖ</code>, <code>OÖ</code>, <code>S</code>, <code>T</code>, <code>V</code>, <code>St</code>, <code>K</code>, <code>B</code></td>
</tr>
<tr>
<td><code>CALENDARS</code></td>
<td>Eingebundene Google-Kalender</td>
<td>Besitzer, ICS-Adresse, Farbe und Icon</td>
</tr>
<tr>
<td><code>KEYWORD_STYLE</code></td>
<td>Individuelle Farben und Emojis</td>
<td>Frei erweiterbar</td>
</tr>
</tbody>
</table>
<hr />
<h1>Kalender konfigurieren</h1>
<p dir="auto">Jeder Google-Kalender wird in der Konstante <code>CALENDARS</code> eingetragen.</p>
<p dir="auto">Beispiel:</p>
<pre><code class="language-javascript">{
    owner: "Mama",
    url: "https://....basic.ics",
    color: "#a71b1b",
    img: BASE_URL + "Mama.png"
}
</code></pre>
<h3>Bedeutung der einzelnen Einträge</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Parameter</th>
<th>Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>owner</code></td>
<td>Frei wählbare Bezeichnung des Kalenders</td>
</tr>
<tr>
<td><code>url</code></td>
<td>Private ICS-Adresse des Google-Kalenders</td>
</tr>
<tr>
<td><code>color</code></td>
<td>Standardfarbe für die Darstellung im großen Kalender</td>
</tr>
<tr>
<td><code>img</code></td>
<td>Icon für die Darstellung im Mini-Kalender</td>
</tr>
</tbody>
</table>
<p dir="auto">Es können beliebig viele Kalender eingebunden werden.</p>
<blockquote>
<p dir="auto"><strong>Hinweis</strong></p>
<p dir="auto">Die Bezeichnung aus <strong><code>owner</code></strong> wird gleichzeitig als Filter für den Mini-Kalender verwendet.</p>
<p dir="auto">Dadurch können später gezielt Termine einzelner Kalender angezeigt werden, z. B.:</p>
<ul>
<li><code>ALLE</code></li>
<li><code>Mama</code></li>
<li><code>Papa</code></li>
<li><code>Kind</code></li>
<li><code>Arbeit</code></li>
<li><code>Verein</code></li>
</ul>
<p dir="auto">Die möglichen Filter entsprechen immer den vergebenen <code>owner</code>-Namen.</p>
</blockquote>
<p dir="auto"><img src="/assets/uploads/files/1784370013216-unbenannt_anonymized2.png" alt="Unbenannt_anonymized2.png" class=" img-fluid img-markdown" /></p>
<hr />
<h1>Individuelle Schlüsselwörter</h1>
<p dir="auto">Über <code>KEYWORD_STYLE</code> können beliebige Schlüsselwörter definiert werden.</p>
<p dir="auto">Wird eines dieser Wörter im Titel eines Kalendereintrags gefunden, wird automatisch:</p>
<ul>
<li>eine eigene Farbe verwendet</li>
<li>optional ein Emoji angehängt</li>
</ul>
<p dir="auto">Beispiele:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Schlüsselwort</th>
<th>Ergebnis</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>geburt</code></td>
<td>🎂 und definierte Geburtstagsfarbe</td>
</tr>
<tr>
<td><code>kiko</code></td>
<td>🐱 und definierte Farbe</td>
</tr>
<tr>
<td><code>loki</code></td>
<td>🐱 und definierte Farbe</td>
</tr>
</tbody>
</table>
<p dir="auto">Natürlich können beliebig viele eigene Begriffe ergänzt werden.</p>
<p dir="auto">Die Erkennung erfolgt unabhängig von Groß- und Kleinschreibung.</p>
<hr />
<h1>Besondere Funktionen</h1>
<h2>Geburtstage</h2>
<p dir="auto">Geburtstage werden <strong>automatisch</strong> erkannt und entsprechend hervorgehoben.</p>
<p dir="auto">Hierfür muss der Titel des Kalendereintrags lediglich das Wort <strong>„Geburtstag“</strong> enthalten.</p>
<p dir="auto">Beispiele:</p>
<ul>
<li>Geburtstag Oma</li>
<li>Geburtstag Max</li>
<li>Geburtstag Lisa Müller</li>
</ul>
<p dir="auto">Das Script erkennt den Begriff automatisch und versieht den Termin mit dem 🎂-Emoji sowie der in <code>KEYWORD_STYLE</code> definierten Farbe.</p>
<hr />
<h2>"In Memory"-Einträge</h2>
<p dir="auto">Auch <strong>Gedenktage</strong> oder <strong>Jahrestage</strong> verstorbener Personen können automatisch erkannt werden.</p>
<p dir="auto">Hierfür muss der Titel des Kalendereintrags den Text <strong>„In Memory“</strong> enthalten.</p>
<p dir="auto">Beispiele:</p>
<ul>
<li>In Memory Opa</li>
<li>In Memory Oma</li>
<li>In Memory Max Mustermann</li>
</ul>
<p dir="auto">Diese Termine werden im großen Kalender automatisch:</p>
<ul>
<li>grau dargestellt</li>
<li>mit einem 🕯️-Emoji versehen</li>
<li>bewusst dezent hervorgehoben</li>
</ul>
<p dir="auto">Im Mini-Kalender werden diese Einträge automatisch ausgeblendet, damit die Terminliste übersichtlich bleibt.</p>
<p dir="auto">Die Erkennung erfolgt ebenfalls unabhängig von Groß- und Kleinschreibung.</p>
<hr />
<h1>Unterstützte Funktionen</h1>
<p dir="auto">Das Script bietet unter anderem:</p>
<ul>
<li>Einbindung <strong>beliebig</strong> vieler Google-Kalender</li>
<li>Unterstützung <strong>wiederkehrender Termine</strong></li>
<li>Verarbeitung von Ausnahmen (EXDATE)</li>
<li>Automatische Erkennung von Geburtstagen</li>
<li>Automatische Erkennung von "In Memory"-Einträgen</li>
<li>Gesetzliche <strong>Feiertage für Deutschland</strong></li>
<li>Gesetzliche <strong>Feiertage für Österreich</strong></li>
<li>Regionale Feiertage <strong>je Bundesland</strong></li>
<li>Automatische Anzeige von Sommer- und Winterzeit</li>
<li>Individuelle Farben pro Kalender</li>
<li>Individuelle Icons pro Kalender</li>
<li>Keyword-Erkennung mit eigener Farbzuweisung</li>
<li><strong>Emoji-Unterstützung</strong></li>
<li><strong>Transparente Darstellung bereits vergangener Termine</strong></li>
<li>Besitzerfilter für den Mini-Kalender</li>
<li>Automatische Aktualisierung alle 5 Minuten</li>
</ul>
<hr />
<h1>Datenpunkte</h1>
<p dir="auto">Das Script erstellt automatisch folgende Datenpunkte:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Datenpunkt</th>
<th>Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0_userdata.0.calendar.c1</code></td>
<td>Daten für den großen Kalender (Material Design / Scrounger)</td>
</tr>
<tr>
<td><code>0_userdata.0.calendar.m1</code></td>
<td>Daten für den Mini-Kalender</td>
</tr>
<tr>
<td><code>0_userdata.0.calendar.inhaber</code></td>
<td>Filter für den Mini-Kalender</td>
</tr>
</tbody>
</table>
<p dir="auto">Über den Datenpunkt <strong><code>0_userdata.0.calendar.inhaber</code></strong> kann jederzeit festgelegt werden, welche Termine im Mini-Kalender angezeigt werden.</p>
<p dir="auto">Beispiele:</p>
<ul>
<li><code>ALLE</code></li>
<li><code>Mama</code></li>
<li><code>Papa</code></li>
<li><code>Kind</code></li>
<li><code>Arbeit</code></li>
<li><code>Verein</code></li>
</ul>
<p dir="auto">Die möglichen Werte entsprechen den unter <code>owner</code> vergebenen Namen.</p>
<p dir="auto"><img src="/assets/uploads/files/1784370044022-unbenannt_anonymized3.png" alt="Unbenannt_anonymized3.png" class=" img-fluid img-markdown" /></p>
<hr />
<h1>Feiertage</h1>
<p dir="auto">Das Script ergänzt automatisch gesetzliche Feiertage.</p>
<p dir="auto">Unterstützt werden:</p>
<ul>
<li>Deutschland</li>
<li>Österreich</li>
</ul>
<p dir="auto">Abhängig vom eingestellten Bundesland werden automatisch nur die gültigen regionalen Feiertage angezeigt.</p>
<p dir="auto">Zusätzlich werden automatisch folgende Termine erzeugt:</p>
<ul>
<li>Beginn der Sommerzeit ☀️</li>
<li>Beginn der Winterzeit ❄️</li>
</ul>
<hr />
<h1>Anpassungsmöglichkeiten</h1>
<p dir="auto">Folgende Bereiche können jederzeit angepasst werden:</p>
<ul>
<li>Kalender hinzufügen oder entfernen</li>
<li>Farben ändern</li>
<li>Icons austauschen</li>
<li>Anzeigezeiträume ändern</li>
<li>Schlüsselwörter erweitern</li>
<li>Land wechseln (<code>DE</code> / <code>AT</code>)</li>
<li>Bundesland ändern</li>
</ul>
<hr />
<h1>Hinweise</h1>
<p dir="auto">Für den Zugriff auf einen Google-Kalender wird dessen <strong>private ICS-Adresse</strong> benötigt.</p>
<p dir="auto">Diese findet ihr in den Einstellungen des jeweiligen Kalenders unter <strong>„Geheime Adresse im iCal-Format“</strong>.</p>
<p dir="auto">Die erzeugten Datenpunkte können anschließend direkt in Material Design (Scrounger) oder jeder anderen Visualisierung verwendet werden.</p>
<hr />
<h1>Feedback</h1>
<p dir="auto">Das Script ist aus meinen eigenen Anforderungen entstanden und wird bei Bedarf weiterentwickelt.</p>
<p dir="auto">Ich freue mich über Verbesserungsvorschläge, Ideen oder Fehlerberichte. Vielleicht ist das Script auch für andere eine interessante Alternative oder Ergänzung zum vorhandenen Google-Kalender-Adapter.</p>
<h1>Das Script (Code)</h1>
<pre><code>// === Google Kalender (ICS) für Material Design &amp; Mini-Kalender ===
 
//Erst-Version 1.0.0 - 18.07.2026
//Ersteller Ro75.
 
//Voraussetzungen (Version 1.0.0 getestet mit)
//NodeJS: 22.22.x
//Javascript-Adapter: 9.0.18
//Admin-Adapter: 7.8.23
//js-controler: 7.2.2

//********** START KONFIGURATION **********

// @ts-nocheck
const dp_Main    = "0_userdata.0.calendar."; //Pfad für Datenpunkt

const BASE_URL   = 'http://192.168.10.99:8082/vis.0/'; //Bildpfad für Kalenderbilder z.B. Familienbilder (Mama, Papa, Kind)

const C1_PAST_DAYS   = 30;  // Anzahl Tage rückwärts für großen Kalender (materialdesign - Scrounger) (Vergangenheit)
const C1_FUTURE_DAYS = 120; // Anzahl Tage vorwärts für großen Kalender (materialdesign - Scrounger) (Zukunft)

const M1_PAST_DAYS   = 0;   // Anzahl Tage rückwärts für Minikalender (Vergangenheit)
const M1_FUTURE_DAYS = 30;  // Anzahl Tage vorwärts für Minikalender (Zukunft)

// Deutschland (DE), Österreich (AT)
const LAND = "DE";          //dein Land

// Deutschland: Süden/Westen: BW (Baden-Württemberg), BY (Bayern), HE (Hessen), RP (Rheinland-Pfalz), SL (Saarland)
// Deutschland: Norden/Osten: BE (Berlin), BB (Brandenburg), HB (Bremen), HH (Hamburg), MV (Mecklenburg-Vorpommern), NI (Niedersachsen), NW (Nordrhein-Westfalen), SN (Sachsen), ST (Sachsen-Anhalt), SH (Schleswig-Holstein), TH (Thüringen)
// Österreichische Landespatrone: Josef (T,V), Florian (OÖ), Rupert (S), Leopold (W,NÖ), Martin (B), Klemens (K)
const Bundesland = "SN";    // dein Bundesland

// Liste aller eingebundenen Google-Kalender (jeweils private ICS-Adresse)
const CALENDARS = [
    {
        owner: "Mama", // Besitzer/Zuordnung - Nach dieser Bezeichnung kann auch ein Filter ("0_userdata.0.calendar.inhaber") gesetzt werden
        url: "https://calendar.google.com/calendar/ical/XXXXXXXXXXXXXXXXXXXXXXgmail.com/private-faXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/basic.ics", // private ICS-URL
        color: "#a71b1b", // Standardfarbe des Kalenders - großer Kalender (materialdesign - Scrounger)
        img: BASE_URL + "Mama.png" // Icon für Darstellung - kleiner Kalender
    },
    {
        owner: "Kind",
        url: "https://calendar.google.com/calendar/ical/t3lYYYYYYYYYYYYYYYYYYYYYYYgroup.calendar.google.com/private-341YYYYYYYYYYYYYYYYYYYYYYYYYYYY/basic.ics",
        color: "#e4c441",
        img: BASE_URL + "Kind2.png"
    },
    {
        owner: "Papa",
        url: "https://calendar.google.com/calendar/ical/0suZZZZZZZZZZZZZZZZZZZZZZZZ%40group.calendar.google.com/private-9e0ZZZZZZZZZZZZZZZZZZZZZZZZ/basic.ics",
        color: "#039be5",
        img: BASE_URL + "Papa.png"
    }
];

// Stilregeln für bestimmte Schlüsselwörter in Ereignisnamen (z.B. Farbe + Emoji)
const KEYWORD_STYLE = {
    "geburt": { color: "#33B679", emoji: " 🎂" },   // Beispiel: Geburtstage - Ein Kalendereintrag lautet z.B. "Geburtstag Oma Helga" oder "Geburtstag Klaus"
    "kiko":   { color: "#8E24AA", emoji: " 🐱" },   // Beispiel: benutzerdefinierte Namen - Ein Kalendereintrag lautet z.B. "Tierarzt Kiko"
    "loki":   { color: "#8E24AA", emoji: " 🐱" }    // Beispiel: benutzerdefinierte Namen - Ein Kalendereintrag lautet z.B. "Tierarzt Loki"
};


//********************************** AB HIER KEINE ÄNDERUNGEN MEHR **********************************/
const ical  = require('node-ical');
const axios = require('axios');

const DP_C1      = dp_Main + "c1";
const DP_M1      = dp_Main + "m1";
const DP_INHABER = dp_Main + "inhaber";

const HOLIDAYS_BY_STATE = {
    "Neujahr": ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"],
    "Karfreitag": ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"],
    "Ostersonntag": ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"],
    "Ostermontag": ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"],
    "Tag der Arbeit": ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"],
    "Christi Himmelfahrt": ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"],
    "Pfingstmontag": ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"],
    "Tag der Deutschen Einheit": ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"],
    "1. Weihnachtsfeiertag": ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"],
    "2. Weihnachtsfeiertag": ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"],

    "Heilige Drei Könige": ["BW","BY","ST"],
    "Fronleichnam": ["BW","BY","HE","NW","RP","SL"],
    "Mariä Himmelfahrt": ["SL","BY"],
    "Reformationstag": ["BB","MV","SN","ST","TH","SH","HH","NI"],
    "Allerheiligen": ["BW","BY","NW","RP","SL"],
    "Buß- und Bettag": ["SN"]
};

const HOLIDAYS_BY_STATE_AT = {
    "Neujahr": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Heilige Drei Könige": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Ostersonntag": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Ostermontag": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Staatsfeiertag": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Christi Himmelfahrt": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Pfingstsonntag": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Pfingstmontag": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Fronleichnam": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Mariä Himmelfahrt": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Nationalfeiertag": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Allerheiligen": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "Mariä Empfängnis": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "1. Weihnachtsfeiertag": ["W","NÖ","OÖ","S","T","V","St","K","B"],
    "2. Weihnachtsfeiertag": ["W","NÖ","OÖ","S","T","V","St","K","B"],

    "Josef": ["T","V"],
    "Florian": ["OÖ"],
    "Rupert": ["S"],
    "Leopold": ["W","NÖ"],
    "Martin": ["B"],
    "Klemens": ["K"]
};

let cachedEvents = [];

async function smartCreateState(id, value, common = {}) {
    if (!existsState(id)) {
        await createState(id, value, common);
    }
}

function setStateIfChanged(id, value) {
    const state = getState(id);
    if (!state) return;

    const old = state.val;
    const isObject = v =&gt; v !== null &amp;&amp; typeof v === "object";

    if (isObject(value)) {
        const newStr = JSON.stringify(value);
        let oldStr = null;

        if (typeof old === "string") oldStr = old;
        else if (isObject(old)) oldStr = JSON.stringify(old);

        if (newStr === oldStr) return;
        return setState(id, newStr, true);
    }

    if (old === value) return;
    setState(id, value, true);
}

async function initStates() {
    await smartCreateState(DP_C1, "[]", {read: true, write: false, type: "string", name: 'Kalender groß'});
    await smartCreateState(DP_M1, "[]", {read: true, write: false, type: "string", name: 'Kalender klein'});
    await smartCreateState(DP_INHABER, "ALLE", {read: true, write: true, type: "string", name: 'Inhaberfilter'});
}

function hexToRgba(hex, alpha = 1) {
    hex = hex.replace(/^#/, '');
    const bigint = parseInt(hex, 16);
    return `rgba(${(bigint &gt;&gt; 16) &amp; 255}, ${(bigint &gt;&gt; 8) &amp; 255}, ${bigint &amp; 255}, ${alpha})`;
}

function fadeColor(hex, alpha = 0.25) {
    hex = hex.replace(/^#/, '');
    const bigint = parseInt(hex, 16);
    let r = (bigint &gt;&gt; 16) &amp; 255;
    let g = (bigint &gt;&gt; 8) &amp; 255;
    let b = bigint &amp; 255;

    r = Math.round(r + (255 - r) * 0.55);
    g = Math.round(g + (255 - g) * 0.55);
    b = Math.round(b + (255 - b) * 0.55);

    return `rgba(${r}, ${g}, ${b}, ${alpha})`;
}

function getKeywordColorEmoji(event, fallback) {
    const e = (event || "").toLowerCase();

    for (const key in KEYWORD_STYLE) {
        if (e.includes(key)) return KEYWORD_STYLE[key];
    }

    return { color: fallback, emoji: "" };
}

function formatDate(date, format) {
    const pad = n =&gt; n.toString().padStart(2, '0');
    const yyyy = date.getFullYear();
    const mm   = pad(date.getMonth() + 1);
    const dd   = pad(date.getDate());
    const HH   = pad(date.getHours());
    const MM   = pad(date.getMinutes());

    const f = {
        "YYYY-MM-DD HH:mm": `${yyyy}-${mm}-${dd} ${HH}:${MM}`,
        "DD.MM.YYYY HH:mm": `${dd}.${mm}.${yyyy} ${HH}:${MM}`,
        "DD.MM.YYYY":       `${dd}.${mm}.${yyyy}`,
        "YYYY-MM-DD":       `${yyyy}-${mm}-${dd}`,
        "HH:mm":            `${HH}:${MM}`
    };
    return f[format];
}

function isInMemoryEvent(norm) {
    return norm.event.toLowerCase().includes("in memory");
}

function lastSunday(year, month) {
    const d = new Date(year, month + 1, 0);
    while (d.getDay() !== 0) d.setDate(d.getDate() - 1);
    return d;
}

function getEasterDate(year) {
    const f = Math.floor;
    const G = year % 19;
    const C = f(year / 100);
    const H = (C - f(C / 4) - f((8 * C + 13) / 25) + 19 * G + 15) % 30;
    const I = H - f(H / 28) * (1 - f(29 / (H + 1)) * f((21 - G) / 11));
    const J = (year + f(year / 4) + I + 2 - C + f(C / 4)) % 7;
    const L = I - J;
    const month = 3 + f((L + 40) / 44);
    const day   = L + 28 - 31 * f(month / 4);
    return new Date(year, month - 1, day);
}

function getHolidays(year) {
    const easter = getEasterDate(year);
    const add = (date, days) =&gt; new Date(date.getTime() + days * 86400000);

    if (LAND === "DE") {
        const MAP = HOLIDAYS_BY_STATE;

        const holidays = [
            { name: "Neujahr 🎉",                 date: new Date(year, 0, 1),  states: MAP["Neujahr"] },
            { name: "Karfreitag 🎉",              date: add(easter, -2),       states: MAP["Karfreitag"] },
            { name: "Ostersonntag 🎉",            date: easter,                states: MAP["Ostersonntag"] },
            { name: "Ostermontag 🎉",             date: add(easter, 1),        states: MAP["Ostermontag"] },
            { name: "Tag der Arbeit 🎉",          date: new Date(year, 4, 1),  states: MAP["Tag der Arbeit"] },
            { name: "Christi Himmelfahrt 🎉",     date: add(easter, 39),       states: MAP["Christi Himmelfahrt"] },
            { name: "Pfingstmontag 🎉",           date: add(easter, 50),       states: MAP["Pfingstmontag"] },
            { name: "Tag der Deutschen Einheit 🎉", date: new Date(year, 9, 3), states: MAP["Tag der Deutschen Einheit"] },
            { name: "1. Weihnachtsfeiertag 🎉",   date: new Date(year, 11, 25), states: MAP["1. Weihnachtsfeiertag"] },
            { name: "2. Weihnachtsfeiertag 🎉",   date: new Date(year, 11, 26), states: MAP["2. Weihnachtsfeiertag"] },

            { name: "Heilige Drei Könige 🎉",     date: new Date(year, 0, 6),  states: MAP["Heilige Drei Könige"] },
            { name: "Fronleichnam 🎉",            date: add(easter, 60),       states: MAP["Fronleichnam"] },
            { name: "Mariä Himmelfahrt 🎉",       date: new Date(year, 7, 15), states: MAP["Mariä Himmelfahrt"] },
            { name: "Reformationstag 🎉",         date: new Date(year, 9, 31), states: MAP["Reformationstag"] },
            { name: "Allerheiligen 🎉",           date: new Date(year, 10, 1), states: MAP["Allerheiligen"] }
        ];

        const bussbettag = (() =&gt; {
            const d = new Date(year, 10, 23);
            while (d.getDay() !== 3) d.setDate(d.getDate() - 1);
            return d;
        })();

        holidays.push({ name: "Buß- und Bettag 🎉", date: bussbettag, states: MAP["Buß- und Bettag"] });
        return holidays;
    } else if (LAND === "AT") {
        const MAP = HOLIDAYS_BY_STATE_AT;

        const holidays = [
            { name: "Neujahr 🎉",                 date: new Date(year, 0, 1),  states: MAP["Neujahr"] },
            { name: "Heilige Drei Könige 🎉",     date: new Date(year, 0, 6),  states: MAP["Heilige Drei Könige"] },

            { name: "Ostersonntag 🎉",            date: easter,                states: MAP["Ostersonntag"] },
            { name: "Ostermontag 🎉",             date: add(easter, 1),        states: MAP["Ostermontag"] },

            { name: "Staatsfeiertag 🎉",          date: new Date(year, 4, 1),  states: MAP["Staatsfeiertag"] },
            { name: "Christi Himmelfahrt 🎉",     date: add(easter, 39),       states: MAP["Christi Himmelfahrt"] },
            { name: "Pfingstsonntag 🎉",          date: add(easter, 49),       states: MAP["Pfingstsonntag"] },
            { name: "Pfingstmontag 🎉",           date: add(easter, 50),       states: MAP["Pfingstmontag"] },
            { name: "Fronleichnam 🎉",            date: add(easter, 60),       states: MAP["Fronleichnam"] },

            { name: "Mariä Himmelfahrt 🎉",       date: new Date(year, 7, 15), states: MAP["Mariä Himmelfahrt"] },
            { name: "Nationalfeiertag 🎉",        date: new Date(year, 9, 26), states: MAP["Nationalfeiertag"] },
            { name: "Allerheiligen 🎉",           date: new Date(year, 10, 1), states: MAP["Allerheiligen"] },
            { name: "Mariä Empfängnis 🎉",        date: new Date(year, 11, 8), states: MAP["Mariä Empfängnis"] },
            { name: "1. Weihnachtsfeiertag 🎉",   date: new Date(year, 11, 25), states: MAP["1. Weihnachtsfeiertag"] },
            { name: "2. Weihnachtsfeiertag 🎉",   date: new Date(year, 11, 26), states: MAP["2. Weihnachtsfeiertag"] },

            { name: "Josef 🎉",                   date: new Date(year, 2, 19), states: MAP["Josef"] },
            { name: "Florian 🎉",                 date: new Date(year, 4, 4),  states: MAP["Florian"] },
            { name: "Rupert 🎉",                  date: new Date(year, 8, 24), states: MAP["Rupert"] },
            { name: "Leopold 🎉",                 date: new Date(year, 10, 15), states: MAP["Leopold"] },
            { name: "Martin 🎉",                  date: new Date(year, 10, 11), states: MAP["Martin"] },
            { name: "Klemens 🎉",                 date: new Date(year, 10, 23), states: MAP["Klemens"] }
        ];

        return holidays;
    }

    return [];
}

function createHolidayEvents(year) {
    const list   = getHolidays(year, LAND);
    const events = [];

    for (const h of list) {
        if (!h.states.includes(Bundesland)) continue;

        const start = new Date(h.date.getFullYear(), h.date.getMonth(), h.date.getDate(), 0, 0);
        const end   = new Date(h.date.getFullYear(), h.date.getMonth(), h.date.getDate(), 23, 59);

        const norm = normalizeEvent({start, end, summary: h.name, description: "", location: "", datetype: "date"}, "Feiertag", "#880088", "");
        events.push(norm);
    }

    const sommer = lastSunday(year, 2);
    {
        const start = new Date(sommer.getFullYear(), sommer.getMonth(), sommer.getDate(), 0, 0);
        const end   = new Date(sommer.getFullYear(), sommer.getMonth(), sommer.getDate(), 23, 59);

        const norm = normalizeEvent({start, end, summary: "Beginn der Sommerzeit ☀️", description: "", location: "", datetype: "date"}, "Feiertag", "#ffaa00", "");
        events.push(norm);
    }

    const winter = lastSunday(year, 9);
    {
        const start = new Date(winter.getFullYear(), winter.getMonth(), winter.getDate(), 0, 0);
        const end   = new Date(winter.getFullYear(), winter.getMonth(), winter.getDate(), 23, 59);

        const norm = normalizeEvent({start, end, summary: "Beginn der Winterzeit ❄️", description: "", location: "", datetype: "date"}, "Feiertag", "#00aaff");
        events.push(norm);
    }

    return events;
}

function normalizeEvent(evt, owner, color, img) {
    let start = evt.start;
    let end   = evt.end;

    if (evt.datetype === 'date') {
        start = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0);
        end   = new Date(start.getFullYear(), start.getMonth(), start.getDate(), 23, 59);
    }

    return {
        startTime: start,
        endTime: end,
        isFullDay: evt.datetype === 'date',
        durationHours: (end - start) / 3600000,
        event: evt.summary || "",
        section: evt.description || "",
        location: evt.location || "",
        calColor: color,
        classRaw: owner,
        img: img
    };
}

function renderEventC1(norm) {
    if (isInMemoryEvent(norm)) {
        norm.calColor = "#808080";
        norm.event   += " 🕯️";
    }

    let start = formatDate(norm.startTime, "YYYY-MM-DD HH:mm");
    let end   = formatDate(norm.endTime,   "YYYY-MM-DD HH:mm");

    if (norm.isFullDay) {
        start = formatDate(norm.startTime, "YYYY-MM-DD");
        end   = formatDate(norm.endTime,   "YYYY-MM-DD");
    }

    const isPast = norm.endTime &lt; new Date();
    let bg  = hexToRgba(norm.calColor, 0.6);
    let txt = "#ffffff";

    if (isPast) {
        bg  = fadeColor(norm.calColor, 0.25);
        txt = "#dddddd";
    }

    const ce = getKeywordColorEmoji(norm.event, norm.calColor);

    return {start, end, name: norm.event + " " + norm.section + ce.emoji, color: bg, colorText: txt};
}

function renderEventM1(norm, filter) {
    const owner = norm.classRaw;

    if (owner === "Feiertag") return null;
    if (isInMemoryEvent(norm)) return null;

    if (!(filter === "ALLE" || owner === filter)) return null;

    let start = formatDate(norm.startTime, "DD.MM.YYYY HH:mm");
    let end   = formatDate(norm.endTime,   "HH:mm");

    if (norm.isFullDay) {
        start = formatDate(norm.startTime, "DD.MM.YYYY");
        end   = start;
    }

    let e = norm.event;
    if (norm.section) e += ": " + norm.section;

    return {
        img: norm.img,
        zeit: `${start} - ${end}`,
        ereignis: e,
        ort: norm.location
    };
}

async function loadICS(url) {
    try {
        const res = await axios.get(url);
        let txt = res.data;
        txt = txt.replace(/UNTIL=(\d{8})(?!T)/g, "UNTIL=$1T000000Z");

        const raw = ical.parseICS(txt);
        const events = [];

        const now        = new Date();
        const rangeStart = new Date(now.getTime() - C1_PAST_DAYS * 86400000);
        const rangeEnd   = new Date(now.getTime() + C1_FUTURE_DAYS * 86400000);

        for (const key in raw) {

            const e = raw[key];
            if (!e || e.type !== "VEVENT") continue;

            const summary    = e.summary || "";
            const isBirthday = /geburtstag/i.test(summary);
            const isInMemory = /in memory/i.test(summary) || /geb\.\s*opa/i.test(summary);

            if (isBirthday) {
                events.push({start: e.start, end: e.end, summary: e.summary, description: e.description, location: e.location, datetype: e.datetype});
                continue;
            }

            if (e.rrule &amp;&amp; !isInMemory) {
                const opts = e.rrule.origOptions || {};
                if (opts.freq === "YEARLY" || opts.freq === 1) {
                    events.push({start: e.start, end: e.end, summary: e.summary, description: e.description, location: e.location, datetype: e.datetype});
                    continue;
                }

                let freq = opts.freq;
                if (typeof freq === "string") freq = freq.toUpperCase();

                if (
                    freq === "WEEKLY" ||
                    freq === "DAILY" ||
                    freq === 2 ||
                    freq === 3
                ) {
                    const weekdayMap = {SU: 0, MO: 1, TU: 2, WE: 3, TH: 4, FR: 5, SA: 6};
                    let byweekday = [];
                    const rawWeekdays = opts.byweekday || opts.byDay || [];

                    if (Array.isArray(rawWeekdays)) {
                        byweekday = rawWeekdays
                            .map(w =&gt; {
                                if (typeof w === "number") return w;
                                if (typeof w === "string") return weekdayMap[w.toUpperCase()];
                                if (typeof w === "object" &amp;&amp; w.weekday !== undefined) return w.weekday;
                                return null;
                            })
                            .filter(v =&gt; v !== null &amp;&amp; v !== undefined);
                    }

                    const start = new Date(e.start);
                    const until = opts.until || rangeEnd;

                    let current = new Date(start);
                    while (current &lt;= until &amp;&amp; current &lt;= rangeEnd) {
                        const weekday = current.getDay();
                        if (byweekday.length &amp;&amp; !byweekday.includes(weekday)) {
                            current.setDate(current.getDate() + 1);
                            continue;
                        }

                        if (byweekday.length &amp;&amp; (opts.interval || 1) &gt; 1) {
                            const diffDays = Math.floor((current - start) / 86400000);
                            const currentWeek = Math.floor(diffDays / 7);

                            if (currentWeek % opts.interval !== 0) {
                                current.setDate(current.getDate() + 1);
                                continue;
                            }
                        }

                        if (current &gt;= rangeStart) {
                            const instStart = new Date(current);
                            const instEnd   = new Date(instStart.getTime() + (e.end - e.start));
                            const iso = instStart.getFullYear() + "-" + String(instStart.getMonth() + 1).padStart(2, "0") + "-" + String(instStart.getDate()).padStart(2, "0");

                            if (!(e.exdate &amp;&amp; e.exdate[iso])) {
                                events.push({start: instStart, end: instEnd, summary: e.summary, description: e.description, location: e.location, datetype: e.datetype});
                            }
                        }
                        current.setDate(current.getDate() + 1);
                    }
                    continue;
                }
            }
            events.push({start: e.start, end: e.end, summary: e.summary, description: e.description, location: e.location, datetype: e.datetype});
        }
        return events;
    } catch (err) {
        console.error("ICS Fehler &gt;&gt;&gt; " + err.message + " : " + err.stack);
        return null;
    }
}

async function loadAllICS() {
    let events = [];

    for (const cal of CALENDARS) {
        const list = await loadICS(cal.url);
        if (!list) continue;

        for (const evt of list) {
            const norm = normalizeEvent(evt, cal.owner, cal.color, cal.img);

            const ce = getKeywordColorEmoji(norm.event, norm.calColor);
            norm.calColor = ce.color;

            events.push(norm);
        }
    }

    const yearNow  = new Date().getFullYear();
    const yearNext = yearNow + 1;

    events.push(...createHolidayEvents(yearNow));
    events.push(...createHolidayEvents(yearNext));

    events.sort((a, b) =&gt; a.startTime - b.startTime);
    cachedEvents = events;
}

function applyFilter() {
    const now = new Date();

    const M1_START = new Date(now.getTime() - M1_PAST_DAYS * 86400000);
    const M1_END   = new Date(now.getTime() + M1_FUTURE_DAYS * 86400000);

    const filter = String(getState(DP_INHABER)?.val || "ALLE").trim();

    const m1 = cachedEvents
        .filter(e =&gt; e.endTime &gt;= M1_START &amp;&amp; e.startTime &lt;= M1_END)
        .map(e =&gt; renderEventM1(e, filter))
        .filter(Boolean);

    setStateIfChanged(DP_M1, m1);
}

function updateC1() {
    const now = new Date();

    const C1_START = new Date(now.getTime() - C1_PAST_DAYS * 86400000);
    const C1_END   = new Date(now.getTime() + C1_FUTURE_DAYS * 86400000);

    const c1 = cachedEvents
        .filter(e =&gt; e.endTime &gt;= C1_START &amp;&amp; e.startTime &lt;= C1_END)
        .map(e =&gt; renderEventC1(e));

    setStateIfChanged(DP_C1, c1);
}

async function main() {
    await initStates();
    await loadAllICS();
    updateC1();
    applyFilter();
}

main();

on({ id: DP_INHABER, change: "ne" }, () =&gt; applyFilter());

schedule("*/5 * * * *", () =&gt; main());
</code></pre>
<h2>Das Kalender-Widget (Scounger materialdesign 0.5.94)</h2>
<pre><code>[{"tpl":"tplVis-materialdesign-Calendar","data":{"oid":"0_userdata.0.calendar.c1","g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","calendarView":"month","vibrateOnMobilDevices":"50","calendarWeekdays":"1,2,3,4,5,6,0","calendarBorderColor":"#7fb5b5","calendarDayBackgroundColor":"#121212","calendarDayBackgroundOutsideColor":"#404040","calendarHeaderBackground":"#424242","calendarDayLabelFontSize":"14","calendarDayLabelFontFamily":"InterVariable","calendarDayLabelFontColor":"#efd01f","calendarDayLabelPreviousFontColor":"#12abab","calendarDayLabelTodayFontSize":"14","calendarDayLabelTodayFontFamily":"InterVariable","calendarDayLabelTodayFontColor":"#fa9300","calendarWeeksNumbersShow":true,"calendarWeeksNumbersBackground":"#12abab","calendarWeeksNumbersFontSize":"16","calendarWeeksNumbersFont":"InterVariable","calendarWeeksNumbersFontColor":"#ffffff","calendarDayButtonMonthViewGoTo":"week","calendarDayButtonWeekViewGoTo":"day","calendarDayButtonDayViewGoTo":"week","calendarDayButtonRippleEffectColor":"#mdwTheme:vis-materialdesign.0.colors.calendar.button_hover","calendarDayButtonColor":"#mdwTheme:vis-materialdesign.0.colors.calendar.button_background","calendarDayButtonFontSize":"16","calendarDayButtonFontFamily":"InterVariable","calendarDayButtonFontColor":"#ffffff","calendarDayButtonTodayColor":"#mdwTheme:vis-materialdesign.0.colors.calendar.button_background_today","calendarDayButtonTodayFontSize":"16","calendarDayButtonTodayFontFamily":"InterVariable","calendarDayButtonTodayFontColor":"#mdwTheme:vis-materialdesign.0.colors.calendar.button_text_today","controlShow":true,"controlButtonLayout":"outlined","controlPosition":"stretch","controlShowLabel":true,"controlButtonColor":"#a45119","controlButtonRippelEffectColor":"#mdwTheme:vis-materialdesign.0.colors.calendar.control_panel_hover","controlIconColor":"#ffffff","controlTextSize":"15","controlTextFont":"InterVariable","controlTextColor":"#ffffff","calendarTimeAxisBackgroundColor":"#424242","calendarTimeAxisShortIntervals":true,"calendarTimeAxisHeaderBackgroundColor":"#mdwTheme:vis-materialdesign.0.colors.calendar.time_axis_background_header","calendarTimeAxisFontSize":"#mdwTheme:vis-materialdesign.0.fontSizes.calendar.time_axis","calendarTimeAxisFont":"RobotoCondensed-Regular","calendarTimeAxisFontColor":"#fa9300","calendarEventOverlapMode":"stack","calendarEventFontSize":"14","calendarEventFont":"InterVariable","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"calendarShortWeekdays":false,"calendarTimeAxisStartTime":"4","calendarTimeAxisEndTime":"23","calendarTimeAxisIntervalMinutes":"","calendarEventHeight":"25","calendarTimeAxisWidth":"","controlIconSize":"30","g_calendarCustomFormats":false,"clickSoundVolume":"0.5"},"style":{"left":"0px","top":"100px","width":"1918px","height":"894px","z-index":"2","opacity":"{0_userdata.0.HardwareInfo.DashBoard.Opacity}%","text-shadow":"3px 3px 4px #000"},"widgetSet":"materialdesign"}]
</code></pre>
<p dir="auto">Das kleine Kalender-Widget (Scounger JSON / TABLE materialdesign 0.5.94)</p>
<pre><code>[{"tpl":"tplVis-materialdesign-Button-State","data":{"oid":"0_userdata.0.calendar.inhaber","g_fixed":false,"g_visibility":true,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":true,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"!=","visibility-val":"ALLE","visibility-groups-action":"hide","buttonStyle":"raised","vibrateOnMobilDevices":"50","buttontext":"","textFontFamily":"RobotoCondensed-Regular","textFontSize":"14","mdwButtonPrimaryColor":"rgba(31, 96, 196, 0.8)","mdwButtonSecondaryColor":"rgba(255,255,255,0.8)","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"value":"ALLE","g_lock":true,"autoLockAfter":"10","lockIconColor":"#mdwTheme:vis-materialdesign.0.colors.button.lock_icon","lockFilterGrayscale":"","labelWidth":"0","clickSoundVolume":"0.5","colorBgTrue":"","mdwButtonColorPress":"rgba(96, 22, 42, 0.8)","lockIconSize":"20","g_icon":true,"image":"/vis.0/Familie.png","iconPosition":"left","iconHeight":"42","visibility-oid":"0_userdata.0.calendar.inhaber"},"style":{"left":"1163px","top":"661px","z-index":"8","width":"44px","height":"44px","box-shadow":"3px 3px 8px 1px rgba(31, 96, 196, 0.45)","border-radius":"180px","border-width":"1px","border-color":"rgba(31, 96, 196, 0.8)","border-style":"solid"},"widgetSet":"materialdesign"},{"tpl":"tplVis-materialdesign-Button-State","data":{"oid":"0_userdata.0.calendar.inhaber","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":true,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"buttonStyle":"raised","vibrateOnMobilDevices":"50","mdwButtonPrimaryColor":"rgba(96, 22, 42, 0.8)","mdwButtonSecondaryColor":"rgba(255,255,255,0.8)","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"value":"Loreen","g_lock":true,"autoLockAfter":"10","lockIconColor":"#mdwTheme:vis-materialdesign.0.colors.button.lock_icon","lockFilterGrayscale":"","clickSoundVolume":"0.5","colorBgTrue":"","mdwButtonColorPress":"rgba(96, 22, 42, 0.8)","lockIconSize":"20","g_icon":true,"image":"/vis.0/Mama.png","iconPosition":"left","iconHeight":"40","visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","g_label":true,"buttontext":"","textFontFamily":"#mdwTheme:vis-materialdesign.0.fonts.button.default.text","textFontSize":"#mdwTheme:vis-materialdesign.0.fontSizes.button.default.text"},"style":{"left":"1220px","top":"661px","z-index":"8","width":"44px","height":"44px","box-shadow":"3px 3px 8px 1px rgba(96, 22, 42, 0.45)","border-radius":"180px","border-width":"1px","border-color":"rgba(96, 22, 42, 0.8)","border-style":"solid"},"widgetSet":"materialdesign"},{"tpl":"tplVis-materialdesign-Button-State","data":{"oid":"0_userdata.0.calendar.inhaber","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":true,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"buttonStyle":"raised","vibrateOnMobilDevices":"50","buttontext":"","textFontFamily":"RobotoCondensed-Regular","textFontSize":"14","mdwButtonPrimaryColor":"rgba(55, 135, 45, 0.8)","mdwButtonSecondaryColor":"rgba(255,255,255,0.8)","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"value":"Yasu","g_lock":true,"autoLockAfter":"10","lockIconColor":"#mdwTheme:vis-materialdesign.0.colors.button.lock_icon","lockFilterGrayscale":"","labelWidth":"0","clickSoundVolume":"0.5","colorBgTrue":"","mdwButtonColorPress":"rgba(96, 22, 42, 0.8)","lockIconSize":"20","g_icon":true,"image":"/vis.0/Kind2.png","iconPosition":"left","iconHeight":"40","visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide"},"style":{"left":"1277px","top":"661px","z-index":"8","width":"44px","height":"44px","box-shadow":"3px 3px 8px 1px rgba(55, 135, 45, 0.45)","border-radius":"180px","border-width":"1px","border-color":"rgba(55, 135, 45, 0.8)","border-style":"solid"},"widgetSet":"materialdesign"},{"tpl":"tplVis-materialdesign-Button-State","data":{"oid":"0_userdata.0.calendar.inhaber","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":true,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"buttonStyle":"raised","vibrateOnMobilDevices":"50","buttontext":"","textFontFamily":"RobotoCondensed-Regular","textFontSize":"14","mdwButtonPrimaryColor":"rgba(224, 180, 0, 0.8)","mdwButtonSecondaryColor":"rgba(255,255,255,0.8)","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"value":"Ronny","g_lock":true,"autoLockAfter":"10","lockIconColor":"#mdwTheme:vis-materialdesign.0.colors.button.lock_icon","lockFilterGrayscale":"","labelWidth":"0","clickSoundVolume":"0.5","colorBgTrue":"","mdwButtonColorPress":"rgba(96, 22, 42, 0.8)","lockIconSize":"20","g_icon":true,"image":"/vis.0/Papa.png","iconPosition":"left","iconHeight":"40","visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide"},"style":{"left":"1334px","top":"661px","z-index":"8","width":"44px","height":"44px","box-shadow":"3px 3px 8px 1px rgba(224, 180, 0, 0.45)","border-radius":"180px","border-width":"1px","border-color":"rgba(224, 180, 0, 0.8)","border-style":"solid"},"widgetSet":"materialdesign"},{"tpl":"tplVis-materialdesign-Table","data":{"oid":"0_userdata.0.calendar.m1","g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"countCols":"3","tableLayout":"card","showHeader":false,"roundBorder":"true","headerTextSize":"#mdwTheme:vis-materialdesign.0.fontSizes.table.header","headerFontFamily":"#mdwTheme:vis-materialdesign.0.fonts.table.header","colorBackground":"transparent","colorHeaderRowBackground":"","colorHeaderRowText":"","colorRowBackground":"transparent","colorRowBackgroundHover":"transparent","colorRowText":"rgba(255,255,255,0.8)","borderColor":"transparent","dividers":"rgba(110, 70, 62, 0.25)","showColumn0":"true","colType0":"image","textAlign0":"left","colTextSize0":"#mdwTheme:vis-materialdesign.0.fontSizes.table.row","fontFamily0":"#mdwTheme:vis-materialdesign.0.fonts.table.row","showColumn1":"true","colType1":"text","textAlign1":"left","colTextSize1":"14","fontFamily1":"RobotoCondensed-Regular","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"dataJson":"","showColumn2":"true","colType2":"text","textAlign2":"left","colTextSize2":"14","fontFamily2":"RobotoCondensed-Regular","showColumn3":"true","colType3":"text","textAlign3":"left","colTextSize3":"14","fontFamily3":"RobotoCondensed-Regular","showColumn4":"true","colType4":"text","textAlign4":"center","colTextSize4":"#mdwTheme:vis-materialdesign.0.fontSizes.table.row","fontFamily4":"#mdwTheme:vis-materialdesign.0.fonts.table.row","imageSize0":"40","label0":" ","colNoWrap1":false,"columnWidth0":"58","colNoWrap0":true,"fixedHeader":true,"columnWidth1":"110","rowHeight":"55","columnWidth2":"200","visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","padding_left2":"0","padding_right2":"0","padding_left1":"5","padding_right1":"5","padding_left3":"0","padding_right3":"5"},"style":{"left":"664px","top":"695px","width":"732px","height":"284px","z-index":"8","text-shadow":"3px 3px 4px #000"},"widgetSet":"materialdesign"},{"tpl":"tplFrame","data":{"g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":true,"g_css_shadow_padding":true,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","title":"Familien - Kalender","title_color":"#ffffff","title_top":"2","title_left":"5","header_height":"23","header_color":"rgba(60, 75, 100, 0.10)","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"title_back":"transparent","name":"Rahmen","locked":false,"comment":"","class":"","filterkey":"","title_font":""},"style":{"left":"654px","top":"666px","z-index":"1","width":"750px","height":"319px","border-width":"1px","border-style":"solid","border-color":"rgba(60, 75, 100, 0.10)","border-radius":"10px","opacity":"{0_userdata.0.HardwareInfo.DashBoard.Opacity}%","box-shadow":"15px 18px 62px 0px rgba(0, 0, 0, 0.35)","font-family":"RobotoCondensed-Regular","font-style":"normal","font-variant":"small-caps","font-weight":"lighter","font-size":"medium","background":"#202020","background-color":"#000000","cursor":"","transform":"","color":"","text-shadow":"","line-height":"","letter-spacing":"","word-spacing":""},"widgetSet":"basic"}]
</code></pre>
<p dir="auto">Ich wünsche Euch viel Spaß und Erfolg bei der Umsetzung des Projekts.</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/topic/85005/google-kalender-ics-für-material-design-mini-kalender</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 01:12:37 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/85005.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Jul 2026 10:40:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 21:35:54 GMT]]></title><description><![CDATA[<p dir="auto">Die Google Kalender hatten ein Problem. Bei <a class="plugin-mentions-user plugin-mentions-a" href="/user/nashra" aria-label="Profile: nashra">@<bdi>nashra</bdi></a> hat die Neuanlage geholfen.</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/post/1348852</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348852</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 21:35:54 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 17:04:07 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ro75" aria-label="Profile: Ro75">@<bdi>Ro75</bdi></a><br />
Habe jetzt nicht alles gelesen,  was ist der Fehler?</p>
]]></description><link>https://forum.iobroker.net/post/1348843</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348843</guid><dc:creator><![CDATA[sigi234]]></dc:creator><pubDate>Tue, 21 Jul 2026 17:04:07 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 14:55:31 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/nashra" aria-label="Profile: Nashra">@<bdi>Nashra</bdi></a> <a href="/post/1348834">sagte</a>:</p>
<p dir="auto">Die Hintergrundfarbe für "In Memory", wo finde ich die?</p>
</blockquote>
<p dir="auto">Wenn das jetzt keine separater Kalender ist, dann:</p>
<pre><code>function renderEventC1(norm) {
    if (isInMemoryEvent(norm)) {
        norm.calColor = "#808080";
        norm.event   += " 🕯️";
    }
</code></pre>
<p dir="auto">Wenn eigenständiger Kalender: dann auch in der Kalender-Konfig</p>
<pre><code>        color: "#a71b1b", // Standardfarbe des Kalenders - großer Kalender (materialdesign - Scrounger)
        img: BASE_URL + "Mama.png" // Icon für Darstellung - kleiner Kalender
    },
</code></pre>
<p dir="auto">schauen.</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/post/1348835</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348835</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 14:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 14:51:46 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ro75" aria-label="Profile: Ro75">@<bdi>Ro75</bdi></a> <a href="/post/1348833">sagte</a>:</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/nashra" aria-label="Profile: nashra">@<bdi>nashra</bdi></a> Ich danke Dir dafür!</p>
<p dir="auto">Ro75.</p>
</blockquote>
<p dir="auto">Nix zu danken, mir ist geholfen und Du weißt beim nächsten User woran es liegt.</p>
<p dir="auto">Aber einen habe ich noch...<br />
Die Hintergrundfarbe für "In Memory", wo finde ich die?</p>
]]></description><link>https://forum.iobroker.net/post/1348834</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348834</guid><dc:creator><![CDATA[Nashra]]></dc:creator><pubDate>Tue, 21 Jul 2026 14:51:46 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 14:35:14 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/nashra" aria-label="Profile: nashra">@<bdi>nashra</bdi></a> Ich danke Dir dafür!</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/post/1348833</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348833</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 14:35:14 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 14:34:17 GMT]]></title><description><![CDATA[<p dir="auto">Ist echt ein Witz. Jahrelang keine Probleme mit Anzeige und dann ändern die was ohne<br />
das man was mitbekommt. Naja, habe jetzt einige Termine in den jeweiligen Kalendern<br />
gelöscht und eben neu angelegt, jetzt klappt es.</p>
<p dir="auto">Vielen Dank an Dich für die Hilfe.</p>
]]></description><link>https://forum.iobroker.net/post/1348832</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348832</guid><dc:creator><![CDATA[Nashra]]></dc:creator><pubDate>Tue, 21 Jul 2026 14:34:17 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 14:20:29 GMT]]></title><description><![CDATA[<p dir="auto">Super, dass das Problem gefunden wurde. Google ändert hin und wieder was. Das letzte Mal vor ein paar Wochen. Da gab es Änderungen bei wiederkehrenden Terminen. Beim Google Kalender selbst kein Problem, aber es gab geänderte Infos in der ICS. Aber da ist bereits im Script berücksichtigt.</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/post/1348830</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348830</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 14:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 14:12:19 GMT]]></title><description><![CDATA[<p dir="auto">Fehler wohl gefunden, es liegt an den Einträgen bei Google.<br />
Habe mal einen Geburtstag komplett gelöscht und dann neu angelegt und wieder mit der Angabe jedes Jahr.<br />
Wird jetzt angezeigt, schwere Geburt bzw. keine Ahnung was Google da für ein Problem hatte.<br />
Werde jetzt alle Daten komplett löschen und neu eingeben.</p>
]]></description><link>https://forum.iobroker.net/post/1348829</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348829</guid><dc:creator><![CDATA[Nashra]]></dc:creator><pubDate>Tue, 21 Jul 2026 14:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 13:35:39 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ro75" aria-label="Profile: Ro75">@<bdi>Ro75</bdi></a> <a href="/post/1348818">sagte</a>:</p>
<p dir="auto">Ist für mich nicht nachvollziehbar. Habe ehrlich gesagt im Moment keine Idee mehr. Was passiert wenn du mal einen Geburtstag, wie beschrieben, in den "normalen Kalender" einträgst. Da die Aktualisierung aller 5 Minuten ist (15:35, 15:40), müsstest du ja dann relativ schnell was sehen.</p>
<p dir="auto">Ro75.</p>
</blockquote>
<p dir="auto">Hatte ich gerade schon gemacht <img src="https://forum.iobroker.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f601.png?v=ba16ebd4856" class="not-responsive emoji emoji-android emoji--grin" style="height:23px;width:auto;vertical-align:middle" title=":grin:" alt="😁" /><br />
Wird angezeigt.</p>
<p dir="auto">Ich lege die Kalender bei Google mal neu an, mal sehen ob es dann klappt.</p>
]]></description><link>https://forum.iobroker.net/post/1348820</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348820</guid><dc:creator><![CDATA[Nashra]]></dc:creator><pubDate>Tue, 21 Jul 2026 13:35:39 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 13:33:25 GMT]]></title><description><![CDATA[<p dir="auto">Ist für mich nicht nachvollziehbar. Habe ehrlich gesagt im Moment keine Idee mehr. Was passiert wenn du mal einen Geburtstag, wie beschrieben, in den "normalen Kalender" einträgst. Da die Aktualisierung aller 5 Minuten ist (15:35, 15:40), müsstest du ja dann relativ schnell was sehen.</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/post/1348818</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348818</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 13:33:25 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 13:32:10 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ro75" aria-label="Profile: Ro75">@<bdi>Ro75</bdi></a><br />
Vielen Dank für dein Skript.<br />
Die Integration hat bei mir geklappt und die DP werden befüllt.</p>
<p dir="auto">Leider nutze ich die VIS2 und muss jetzt schauen ob man dort sowas auch bauen kann, oder <a class="plugin-mentions-user plugin-mentions-a" href="/user/oliverio" aria-label="Profile: oliverio">@<bdi>oliverio</bdi></a> macht was hübsches <img src="https://forum.iobroker.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60a.png?v=ba16ebd4856" class="not-responsive emoji emoji-android emoji--blush" style="height:23px;width:auto;vertical-align:middle" title=":blush:" alt="😊" />.</p>
]]></description><link>https://forum.iobroker.net/post/1348817</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348817</guid><dc:creator><![CDATA[Eduard77]]></dc:creator><pubDate>Tue, 21 Jul 2026 13:32:10 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 13:29:26 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ro75" aria-label="Profile: Ro75">@<bdi>Ro75</bdi></a> <a href="/post/1348811">sagte</a>:</p>
<p dir="auto">Stehen denn in C1 überhaupt "frühere Termin drin"?</p>
</blockquote>
<p dir="auto">Ja</p>
<blockquote>
<p dir="auto">Und der Termin vom 11.8. steht in der ics Datei?</p>
</blockquote>
<p dir="auto">Ja</p>
]]></description><link>https://forum.iobroker.net/post/1348813</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348813</guid><dc:creator><![CDATA[Nashra]]></dc:creator><pubDate>Tue, 21 Jul 2026 13:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 13:26:03 GMT]]></title><description><![CDATA[<p dir="auto">Stehen denn in C1 überhaupt "frühere Termin drin"? Und der Termin vom 11.8. steht in der ics Datei?</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/post/1348811</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348811</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 13:26:03 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 13:20:42 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ro75" aria-label="Profile: Ro75">@<bdi>Ro75</bdi></a> <a href="/post/1348805">sagte</a>:</p>
<p dir="auto">Also die 180 Tage gelten für alle Kalender bei C1, 30 Tage bei M1, wobei dieser Termin ja nur am 15.07.26 war. von daher müsste er in C1 sein, aber nicht in M1. M1 nicht, weil da eine 0 bei vergangenen Tagen steht.</p>
<p dir="auto">Kannst du das bitte nochmal prüfen.</p>
<p dir="auto">Ro75.</p>
</blockquote>
<p dir="auto">m1 wird nicht genutzt.<br />
In C1 steht nichts drin mit 15.7.. Der nächste Geburtstag ist am 11.8. und auch der Eintrag fehlt.<br />
In der M1 fehlt auch der für den 11.8.</p>
]]></description><link>https://forum.iobroker.net/post/1348808</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348808</guid><dc:creator><![CDATA[Nashra]]></dc:creator><pubDate>Tue, 21 Jul 2026 13:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 13:14:17 GMT]]></title><description><![CDATA[<p dir="auto">Also die 180 Tage gelten für alle Kalender bei C1, 30 Tage bei M1, wobei dieser Termin ja nur am 15.07.26 war. von daher müsste er in C1 sein, aber nicht in M1. M1 nicht, weil da eine 0 bei vergangenen Tagen steht.</p>
<p dir="auto">Kannst du das bitte nochmal prüfen.</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/post/1348805</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348805</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 13:14:17 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 13:12:05 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ro75" aria-label="Profile: Ro75">@<bdi>Ro75</bdi></a> <a href="/post/1348802">sagte</a>:</p>
<p dir="auto">Wieviel Geburtstage müssten denn die nächsten 180Tage kommen (C1)?</p>
</blockquote>
<p dir="auto">Müßte ich jetzt zählen, die 180 sind eigentlich nur für die normalen Termine</p>
<blockquote>
<p dir="auto">Speichere doch mal die ics Datei und schaue mal mit dem Editor rein. Steht da was brauchbares drin? Wenn ja, wie sind diese Termine angelegt?</p>
<p dir="auto">Ro75.</p>
</blockquote>
<pre><code>BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Geburtstage
X-WR-TIMEZONE:Europe/Berlin
BEGIN:VEVENT
DTSTART;VALUE=DATE:20260715
DTEND;VALUE=DATE:20260716
DTSTAMP:20260721T130410Z
UID:xxxxxxx@google.com
RECURRENCE-ID;VALUE=DATE:20260715
CREATED:20230706T175253Z
DESCRIPTION:1952
LAST-MODIFIED:20260721T130210Z
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Geburtstag Reiner
TRANSP:TRANSPARENT
END:VEVENT
</code></pre>
]]></description><link>https://forum.iobroker.net/post/1348803</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348803</guid><dc:creator><![CDATA[Nashra]]></dc:creator><pubDate>Tue, 21 Jul 2026 13:12:05 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 13:00:00 GMT]]></title><description><![CDATA[<p dir="auto">Wieviel Geburtstage müssten denn die nächsten 180Tage kommen (C1)? Speichere doch mal die ics Datei und schaue mal mit dem Editor rein. Steht da was brauchbares drin? Wenn ja, wie sind diese Termine angelegt?</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/post/1348802</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348802</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 13:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 12:56:54 GMT]]></title><description><![CDATA[<p dir="auto">Bezeichnung geändert in Test1 und Test2, leider nein<br />
Seltsam ist ja auch das zwei funktionieren und die anderen zwei nicht</p>
<p dir="auto">EDIT: habe mal nur den Geburtstag genommen und die anderen gelöscht, zeigt nix an</p>
]]></description><link>https://forum.iobroker.net/post/1348799</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348799</guid><dc:creator><![CDATA[Nashra]]></dc:creator><pubDate>Tue, 21 Jul 2026 12:56:54 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 12:51:05 GMT]]></title><description><![CDATA[<p dir="auto">Bei mir laufen 3 Kalender seit über einem Jahr mit diesem Script.</p>
<p dir="auto">ABER ich habe keine separate Kalender für Geburts- und Todestage. Deine Bezeichner für Geburt und Tod sind interne Filter.</p>
<p dir="auto">Bei uns laufen diese Termine über den normalen Kalender.</p>
<p dir="auto">Also <strong>Geburtstag Else</strong> oder <strong>Geburtstag Bernd</strong>. Oder <strong>Todestag Opa</strong>.</p>
<p dir="auto">Versuche mal einfach die <strong>owner</strong> in "sinnfrei Bezeichnungen" zu ändern. Test1 und Test2.</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/post/1348797</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348797</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 12:51:05 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 12:43:58 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ro75" aria-label="Profile: Ro75">@<bdi>Ro75</bdi></a> <a href="/post/1348795">sagte</a>:</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/nashra" aria-label="Profile: nashra">@<bdi>nashra</bdi></a> In welche json hast du mal reingeschaut?</p>
<p dir="auto">Ro75.</p>
</blockquote>
<p dir="auto">Äh, nutze c1. Termine und Müll drin, nur nicht die anderen zwei</p>
]]></description><link>https://forum.iobroker.net/post/1348796</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348796</guid><dc:creator><![CDATA[Nashra]]></dc:creator><pubDate>Tue, 21 Jul 2026 12:43:58 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 12:38:34 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/nashra" aria-label="Profile: nashra">@<bdi>nashra</bdi></a> In welche json hast du mal reingeschaut?</p>
<p dir="auto">Ro75.</p>
]]></description><link>https://forum.iobroker.net/post/1348795</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348795</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 12:38:34 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 12:33:27 GMT]]></title><description><![CDATA[<p dir="auto">Nutze auch unterschiedliche Farben.</p>
]]></description><link>https://forum.iobroker.net/post/1348793</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348793</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 12:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 12:32:52 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ro75" aria-label="Profile: Ro75">@<bdi>Ro75</bdi></a> <a href="/post/1348791">sagte</a>:</p>
<p dir="auto">Sieht eigentlich gut aus. Lassen sich die URL's im Browser öffnen? Wenn ja, müsste ein "speichern unter" kommen.</p>
<p dir="auto">Ro75.</p>
</blockquote>
<p dir="auto">Lassen sich aufrufen und werden sofort gespeichert</p>
]]></description><link>https://forum.iobroker.net/post/1348792</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348792</guid><dc:creator><![CDATA[Nashra]]></dc:creator><pubDate>Tue, 21 Jul 2026 12:32:52 GMT</pubDate></item><item><title><![CDATA[Reply to Google Kalender (ICS) für Material Design &amp; Mini-Kalender on Tue, 21 Jul 2026 12:33:10 GMT]]></title><description><![CDATA[<p dir="auto">Sieht eigentlich gut aus. Lassen sich die URL's im Browser öffnen? Wenn ja, müsste ein "speichern unter" kommen.</p>
<p dir="auto">Ro75.</p>
<p dir="auto"><strong>EDIT: Nutze auch unterschiedliche Farben.</strong></p>
]]></description><link>https://forum.iobroker.net/post/1348791</link><guid isPermaLink="true">https://forum.iobroker.net/post/1348791</guid><dc:creator><![CDATA[Ro75]]></dc:creator><pubDate>Tue, 21 Jul 2026 12:33:10 GMT</pubDate></item></channel></rss>