NEWS
0_userdata.0.lovelace.showIcal.log0.markdown nicht aktuell
-
Hallo zusammen,
ich nutze den Adapter Ical.0 um einen Kalender von Google auszulesen.
Die Daten zeige ich über Lovelace UI auf meinem Dashboard an.
Nutze das um anzuzeigen wann die nächsten Mülltonnenentleerungen stattfinden.Jetzt habe ich das Problem, dass der Datenpunkt 0_userdata.0.lovelace.showIcal.log0.markdown das letze Mal am 17.10. aktualisiert wurde, daher werden mir nur noch alte Werte angezeigt und meine Daten sind nicht mehr aktuell.
Ich weiss aber nicht wieso der nicht aktualisiert wird bzw. von welchem Adapter wann der Datenpunkt aktualisiert wird.
Weiß das evlt. jemand?
-
Hallo zusammen,
ich nutze den Adapter Ical.0 um einen Kalender von Google auszulesen.
Die Daten zeige ich über Lovelace UI auf meinem Dashboard an.
Nutze das um anzuzeigen wann die nächsten Mülltonnenentleerungen stattfinden.Jetzt habe ich das Problem, dass der Datenpunkt 0_userdata.0.lovelace.showIcal.log0.markdown das letze Mal am 17.10. aktualisiert wurde, daher werden mir nur noch alte Werte angezeigt und meine Daten sind nicht mehr aktuell.
Ich weiss aber nicht wieso der nicht aktualisiert wird bzw. von welchem Adapter wann der Datenpunkt aktualisiert wird.
Weiß das evlt. jemand?
Hi, ich weiss zwar nicht warum das oben nicht mehr funktioniert, aber es spielt keine Rolle mehr.
Ich habe mit Hilfe von ChatGPT ein Script erstellt, das das macht was ich wollte.Falls einer ein Müllkalender Script möchte, das er mit Hilfe von LovelaceUI in einem Markdown-Fenster anzeigen kann.
Hier die funktionsweise.
Man benötigt nur den Adapter Ical (zum Auslesen eines Google Kalenders in dem die Müllabfuhrtermine hinterlegt sind).
Außerdem den Adapter LovelaceUI um das Lovelace Dashboard aufzubauen. Dort benötigt man dann noch ein Markdown-Karte für die Anzeige.
Am Ende sieht das dann so aus:
Das Script liest den Datenpunkt "ical.0.data.text" aus und schreibt die Daten um in den Datenpunkt "0_userdata.0.Abfallkalender.Abfalldaten_komprimiert".
Dieser Datenpunkt muss dann im Markdown-Karte als Quelle angegeben werden.
const TARGET_STATE = "0_userdata.0.Abfallkalender.Abfalldaten_komprimiert"; const SOURCE_STATE = "ical.0.data.text"; let updateTimeout = null; // Ziel-State erstellen, falls nicht vorhanden if (!existsState(TARGET_STATE)) { createState(TARGET_STATE, "", { name: "Komprimierte Abfalldaten (HTML, farbig, fett, 4 Zeilen)", type: "string", role: "text", read: true, write: false }, (err) => { if (err) log("Fehler beim Erstellen des Ziel-States: " + err, "error"); else scheduleUpdate(); }); } else { scheduleUpdate(); } // Hilfsfunktionen function formatDateGerman(date) { return `${String(date.getDate()).padStart(2,'0')}.${String(date.getMonth()+1).padStart(2,'0')}.${date.getFullYear()}`; } function parseRelativeDate(text) { const now = new Date(); const date = new Date(now); const relMatch = text.match(/(Heute|Morgen|Übermorgen|In (\d+) Tagen)/i); if (!relMatch) return text; const word = relMatch[1].toLowerCase(); if (word.includes("heute")) date.setDate(now.getDate()); else if (word.includes("morgen") && !word.includes("übermorgen")) date.setDate(now.getDate()+1); else if (word.includes("übermorgen")) date.setDate(now.getDate()+2); else if (word.includes("in")) { const num = parseInt(relMatch[2],10); if (!isNaN(num)) date.setDate(now.getDate()+num); } return formatDateGerman(date); } // Update-Trigger (Debounce) function scheduleUpdate() { if (updateTimeout) clearTimeout(updateTimeout); updateTimeout = setTimeout(() => { updateAbfallkalender(); updateTimeout = null; }, 500); } // Hauptfunktion function updateAbfallkalender() { try { if (!existsState(SOURCE_STATE)) return; const src = getState(SOURCE_STATE); if (!src || !src.val || typeof src.val !== "string" || src.val.trim() === "") return; const lines = src.val.split(/\r?\n/).filter(l => l.trim() !== ""); const top4 = lines.slice(0, 4); const colorMap = { "Biotonne":"green", "Blaue Tonne":"blue", "Gelbe Tonne":"gold", "Restabfalltonne":"black" }; const muellRegex = /(Biotonne|Blaue Tonne|Gelbe Tonne|Restabfalltonne)/i; const result = []; for (const line of top4) { if (!line) continue; const dateMatch = line.match(/^(Übermorgen|Morgen|Heute|In \d+ Tagen|\d{1,2}\.\d{1,2}\.\d{4})/i); const muellMatch = line.match(muellRegex); if (dateMatch && muellMatch) { const datum = parseRelativeDate(dateMatch[0]); const muell = muellMatch[1]; const farbe = colorMap[muell] || "black"; const muellColored = `<font color="${farbe}" size="5"><b>${muell}</b></font>`; // Schrift eine Stufe kleiner result.push(`<b><font size="5">${datum} – ${muellColored}</font></b>`); // Datum ebenfalls kleiner } } // Header: Abfallkalender rot, fett, unterstrichen, Schriftgröße eine Stufe kleiner const header = `<font color="red" size="6"><b><u>Abfallkalender</u></b></font><br><br>`; const body = result.join("<br>"); const output = header + body; if (existsState(TARGET_STATE)) setState(TARGET_STATE, output, {ack: true}); } catch(e) { log("Fehler in updateAbfallkalender(): " + e, "error"); } } // Trigger auf Änderungen der iCal-Daten if (existsState(SOURCE_STATE)) { on({id: SOURCE_STATE, change: "any"}, () => scheduleUpdate()); } // Einmal beim Start ausführen scheduleUpdate(); -
Der oben benannte datenpunkt wird wohl auch von einem Skript erzeugt, könntest ja mal mit der Suche im Skriptadapter nach dem datenpunkt in den Skripten suchen.
-
Der oben benannte datenpunkt wird wohl auch von einem Skript erzeugt, könntest ja mal mit der Suche im Skriptadapter nach dem datenpunkt in den Skripten suchen.
@ticaki Ja es war so, dass mehrere Adapter und Scripte ineinander griffen, deswegen hab ich es jetzt komplett vereinfacht.
Voher war es so, dass der Ical Adapter die Daten von Google Kalender ausgelesen hat.
Dann hat der TreasureShedule Adapter die Daten aus nem Ical Datenpunkt gelesen und diese unter 0_userdata.0.Abfallkalender gespeichert.
Dann hat ein Script die Daten genommen und in einen Datenpunkt zusammengefasst.
Dann hat ein anderes Script den Datenpunkt vom andern Script genommen und gekürzt, so dass von ca. 8 Abfallterminen nur noch 3 angezeigt werden, und das in einen neuen Datenpunkt geschrieben. Das war dann der Datenpunkt den ich in meinem LovelaceUI angezeigt hab.Jetzt macht das alles das eine Script. Es werden nur noch die Daten über Ical von Google gezogen und das Script liest alles und schreibt die neuen Daten in einen Datenpunkt, der dann über LovelaceUI angezeigt wird.
Alles möglich dank ChatGPT :)