NEWS
Tankerkönig - Extended Skript
-
Einleitung
Mir ist bewusst, dass es bereits den offiziellen ioBroker Tankerkönig Adapter (v3.4.0) gibt, der zuverlässig die aktuellen Spritpreise liefert. Mit meinem Extended-Skript möchte ich die Leistung des Adapters keinesfalls schmälern – im Gegenteil: Das Skript versteht sich als Ergänzung, die zusätzliche Funktionen wie Trends, Prognosen und Empfehlungen bereitstellt und die Daten für Visualisierungen und Automatisierungen im Smart Home noch aussagekräftiger macht. Das Skript setzt nicht auf die Daten des Adapters auf. Das Skript ist eine eigenständige Lösung.

Funktionelle Beschreibung
Das Skript bietet neben der Standard-Preisabfrage eine Vielzahl an Features:Preisabfrage & Speicherung für Benzin, E10 und Diesel
Historie & Trendberechnung über 48h, 14 Tage und 90 Tage
24h-Prognose mit Richtungspfeilen und projiziertem Preis
Durchschnitts- & Differenzwerte aller offenen Stationen
Top-3 Ranking nach Preis → Favorit → Entfernung
Handlungsempfehlungen („JETZT TANKEN“, „ABWARTEN“, „NICHT TANKEN“)
Konfigurierbare Schwellenwerte für Preisvorteile und Trends
Unicode-Hochzahlen für typografisch saubere Preisdarstellung
Geodaten & Distanzberechnung: Entfernung zur eigenen Position wird berechnet und in die Logik einbezogen
Favoriten: Stationen können als Favorit markiert werden, was bei Gleichstand den Ausschlag gibt
Stationen aktivieren/deaktivieren: Jede Station lässt sich einzeln steuern, auch „nur Daten abrufen“ ohne Auswertung ist möglich
Öffnungszeiten: Offene/geschlossene Stationen werden berücksichtigt, inkl. Feiertagslogik und Overrides
Reiner Datenabruf: Für Nutzer, die nur Rohdaten wollen, lässt sich die Auswertung pro Station abschalten
Vergleich: Adapter vs. Extended-Skript
Merkmal Tankerkönig Adapter 3.4.0 Extended-Skript Basisfunktion: Preise abrufen ✔️ ✔️ Stationen frei definierbar ✔️ ✔️ Historie ❌ ✔️ (48h, 14d, 90d) Trendberechnung ❌ ✔️ 24h-Prognose ❌ ✔️ Durchschnittspreise ❌ ✔️ Preis-Differenzen ❌ ✔️ Top-3 Ranking ❌ ✔️ Empfehlungen (JETZT/ NICHT TANKEN) ❌ ✔️ Konfigurierbare Schwellenwerte ❌ ✔️ Unicode-Hochzahlen für Preise ❌ ✔️ Visuelle JSON-Ausgaben für VIS ❌ ✔️ Geodaten / Distanzberechnung ❌ ✔️ Favoriten-Logik ❌ ✔️ Stationen aktivieren/deaktivieren ❌ ✔️ Reiner Datenabruf ohne Auswertung ❌ ✔️ Öffnungszeiten inkl. Feiertage ❌ ✔️ Fehler- und Info-Logging Basis Erweiterte Steuerung Besonderheiten
Geodaten: Entfernung zur Tankstelle wird berechnet und in Rankings berücksichtigt.Favoriten: Markierte Stationen haben Vorrang bei gleichen Preisen.
Stationen steuerbar: Jede Station kann einzeln aktiviert, deaktiviert oder auf „nur Daten“ gesetzt werden.
Öffnungszeiten: Berücksichtigung von Öffnungsstatus, Feiertagen und Overrides.
Reiner Datenabruf: Wer nur Rohdaten will, kann die Auswertung pro Station abschalten.
Visuelle JSON-Ausgaben: Alle Ergebnisse (Top-3, Durchschnitt, Empfehlungen) stehen als JSON für VIS oder andere Frontends bereit.
Praxisnähe: Handlungsempfehlungen und Trends sind direkt nutzbar für Automatisierungen.
Typografie: Preise mit Hochzahlen wirken sauberer und sind sofort unterscheidbar.
Manuelle Änderung der Stationsdaten: Nach dem ersten Datenabruf können die Stationsdaten manuell überschrieben, OHNE das diese beim Folgeabruf wieder überschieben werden. Das betrifft Name und Adressdaten.
Datenstruktur:
0_userdata.0.tankerkoenig ├── <stationId> │ ├── benzin (number, €) │ ├── e10 (number, €) │ ├── diesel (number, €) │ ├── benzin_str (string) │ ├── e10_str (string) │ ├── diesel_str (string) │ ├── name (string) │ ├── brand (string) │ ├── street (string) │ ├── postCode (string) │ ├── place (string) │ ├── isOpen (boolean) │ ├── isWholeDay (boolean) │ ├── openingTimes (string JSON) │ ├── overrides (string JSON) │ ├── distance (number, km) │ ├── lastPriceUpdate (string, Datum/Uhrzeit) │ ├── lastChecked (string, Datum/Uhrzeit) │ ├── prices (string JSON) │ ├── image (string, Pfad) │ ├── enabled (boolean) │ ├── dataonly (boolean) │ ├── status (string) │ ├── favorite (boolean) │ ├── svg (string) │ └── aspects │ ├── benzin │ │ ├── trend_48h / trend_48h_icon │ │ ├── trend_14d / trend_14d_icon │ │ ├── trend_90d / trend_90d_icon │ │ ├── trend_24h_proj / trend_24h_proj_icon │ │ ├── trend_24h_proj_price (number, €) │ │ ├── history (string JSON) │ │ └── json (string JSON) │ ├── e10 (analog zu benzin) │ ├── diesel (analog zu benzin) │ └── reset_history (boolean) │ ├── cheapest │ ├── benzin_price / benzin_price_str │ ├── benzin_station / benzin_station_name / benzin_image │ ├── benzin_top3_json │ ├── e10_price / e10_price_str │ ├── e10_station / e10_station_name / e10_image │ ├── e10_top3_json │ ├── diesel_price / diesel_price_str │ ├── diesel_station / diesel_station_name / diesel_image │ ├── diesel_top3_json │ └── cheapest_json (alle zusammen) │ ├── average │ ├── benzin / benzin_str │ ├── e10 / e10_str │ ├── diesel / diesel_str │ └── average_json │ ├── difference │ ├── benzin / e10 / diesel (Preisunterschiede) │ └── prices (JSON mit billigster/teuerster Station) │ ├── recommendation_json (Handlungsempfehlungen) ├── all_stations_full_info (JSON) ├── reset_all_trends (boolean) │ └── config ├── threshold_tanken (€/L unter Durchschnitt) ├── threshold_nicht_tanken (€/L über Durchschnitt) ├── trend_threshold_percent (% vom Durchschnitt) ├── use_superscript (boolean) ├── theme (string) ├── show_trend_symbols (boolean) ├── keep_last_price_if_closed (boolean)Fazit
Der Adapter ist ideal für den schnellen Einstieg. Das Extended-Skript richtet sich an alle, die mehr Kontext, mehr Intelligenz und mehr Kontrolle wollen. Es macht die Tankerkönig-Daten nicht nur sichtbar, sondern wirklich nutzbar – für Visualisierungen, Automatisierungen und smarte Entscheidungen im Alltag.Voraussetzungen
API‑Key: Den API‑Key bekommst du kostenlos auf der offiziellen Tankerkönig‑Seite.
Gehe auf tankerkoenig.de → oben rechts „API‑Key“ auswählen. Formular ausfüllen (Name, E‑Mail). Du erhältst per Mail deinen persönlichen Schlüssel.Der Key ist notwendig, um die API nutzen zu können. Ohne ihn gibt es keine Datenabfragen. Einschränkungen: Die API ist für private Projekte gedacht, nicht für Massendatenabfragen. Empfohlen sind maximal 10 Tankstellen und ein Abfrageintervall von mindestens 5 Minuten. Das Skript ruft bei mir aller 10 Minuten (bitte keine glatten Minuten nehmen) 12 Stationen ab.
Tankstellen‑UUIDs: Jede Tankstelle hat eine eindeutige UUID (Universally Unique Identifier). Über die Tankerkönig‑Webseite: Dort kannst du nach Tankstellen suchen (PLZ oder Ort eingeben). Diese UUIDs trägst du dann im Skrip ein, um genau die gewünschten Stationen abzufragen.
NPM-Modul: Damit die API‑Abfragen zuverlässig funktionieren, muss im JavaScript‑Adapter ein zusätzliches npm‑Modul eingetragen werden, das die HTTP‑Requests mit einem gültigen User‑Agent ausführt. Hintergrund: Die Tankerkönig‑API erwartet, dass jede Anfrage einen User‑Agent‑Header mitliefert. Ohne diesen kann es zu Ablehnungen oder Fehlern kommen.
Vorgehen: Den JavaScript‑Adapter öffnen. Unter „Zusätzliche npm‑Module“ das Modul user-agents eintragen.

Grafiken: Ich habe bereits einige Grafiken von Tankstellen und zusätzliche Grafiken für Auswertungen und Darstellung in VIS beigefügt. Es sind aber nicht alle Tankstellen dabei - da müsst ihr selber aktiv werden.
tanken.zipHINWEIS: Wenn ihr das Skript testen wollt, bitte Adapter und Skript nicht zur selben Zeit laufen lassen! Es besteht die Gefahr den Fehler 503 zu bekommen, ihr kommt sonst in das Ratelimit! Es ist zwar möglich mehr als 10 Stationen einzutragen, allerdings sollte es nicht übertrieben werden. Je mehr Stationen um so größer das Abrufinterval! Bei mir getestet und ohne Probleme 12 Stationen, aller 10 Miinuten.
WAS IST ZU MACHEN?
- API-Key besorgen
- UUIDs der Stationen besorgen
- Code einkopieren und anpassen
const apiKey = ""; // Tankerkoenig API-Schlüssel const base = "0_userdata.0.tankerkoenig"; // kann auch so belassen werden const image_base = "/vis.0/tanken/"; //hier wird der Standort für die Bilder eingetragen const myLocation = { lat: 51.18869225498527, lon: 14.44717724792715 }; // hier eure Geodaten const stations = [ { id: "51d4b70e-a095-1aa0-e100-80009459e03a", image: image_base+"jet.png" }, { id: "9bbf6e47-eafe-4072-a7b1-9bf7fee2ba44", image: image_base+"sb-tank.png" }, { id: "2c0a9194-7b4b-4590-bbae-8db8760598c4", image: image_base+"total.png" }, { id: "0cc33bda-3773-4b47-94d2-41142e9a97ad", image: image_base+"agip.png" }, { id: "0868c839-f0cd-4ceb-a53c-4a6de271b606", image: image_base+"marktkauf.png" }, { id: "53ad9d77-a259-40fc-b868-b79cb77086d8", image: image_base+"aral.png" }, { id: "1b008ee6-78ea-4485-ab1d-7212a393b471", image: image_base+"aral.png" }, { id: "4a92a231-3d68-4928-9155-5d3534583c57", image: image_base+"aral.png" }, { id: "c21f9238-c5e6-4a5b-985e-89d406166b2d", image: image_base+"esso.png" }, { id: "86f037d7-d8f8-4fad-9aac-f256857725f6", image: image_base+"sprint.png" }, { id: "28989f56-fe4c-4785-925d-cc0ee4e574e8", image: image_base+"greenline.png" }, { id: "005056ba-7cb6-1ed2-bceb-b72e2ef04d4a", image: image_base+"star.png" } ]; // hier eure StationenHier jetzt der Code:
// === Tankerkoenig Extended-Script === //Erst-Version 1.0.0 - 14.12.2025 //Version 1.1.1 - 22.06.2026 //Ersteller Ro75. //Voraussetzungen (Version 1.1.1 getestet mit) //NodeJS: 22.x //Javascript-Adapter: 9.0.18 //Admin-Adapter: 7.8.23 //JS-Controller: 7.2.2 // === Einstellungen & Konfiguration === const apiKey = ''; // Tankerkönig API-Schlüssel const base = "0_userdata.0.tankerkoenig"; // Basis-Pfad für alle States const image_base = "/vis.0/tanken/"; // Pfad zu lokalen Bildern const myLocation = { lat: 51.18869225498527, lon: 14.44717724792715 }; // Eigener Standort für Distanzberechnung const ENABLE_LOG = false; // Allgemeine Logs ein/aus const ENABLE_ERROR_LOG = true; // Fehlerlogs ein/aus // === Tankstellenliste === const stations = [ { id: "51d4b70e-a095-1aa0-e100-80009459e03a", image: image_base+"jet.png" }, { id: "9bbf6e47-eafe-4072-a7b1-9bf7fee2ba44", image: image_base+"sb-tank.png" }, { id: "2c0a9194-7b4b-4590-bbae-8db8760598c4", image: image_base+"total.png" }, { id: "0868c839-f0cd-4ceb-a53c-4a6de271b606", image: image_base+"marktkauf.png" }, { id: "53ad9d77-a259-40fc-b868-b79cb77086d8", image: image_base+"aral.png" }, { id: "1b008ee6-78ea-4485-ab1d-7212a393b471", image: image_base+"aral.png" }, { id: "4a92a231-3d68-4928-9155-5d3534583c57", image: image_base+"aral.png" }, { id: "c21f9238-c5e6-4a5b-985e-89d406166b2d", image: image_base+"esso.png" }, { id: "86f037d7-d8f8-4fad-9aac-f256857725f6", image: image_base+"sprint.png" }, { id: "28989f56-fe4c-4785-925d-cc0ee4e574e8", image: image_base+"greenline.png" }, { id: "005056ba-7cb6-1ed2-bceb-b72e2ef04d4a", image: image_base+"star.png" } ]; // ********** AB HIER NICHTS MEHR ÄNDERN !!! **********// const TANKSTELLEN_THEME_DP = `${base}.config.theme`; const UserAgent = require('user-agents'); async function smartCreateState(id, value, options = {}) { if (existsState(id)) return; await createState(id, value, options); } function setIfEmpty(id, value) { const current = getState(id)?.val; if (!current || current === "") { setStateIfChanged(id, value); } } function setStateIfChanged(id, value) { const state = getState(id); if (!state) return; const old = state.val; const isObject = v => v !== null && 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); } function formatDateTime(ts = null) { const d = ts ? new Date(ts) : new Date(); const t = String(d.getDate()).padStart(2, "0"); const m = String(d.getMonth() + 1).padStart(2, "0"); const y = d.getFullYear(); const h = String(d.getHours()).padStart(2, "0"); const mi = String(d.getMinutes()).padStart(2, "0"); const s = String(d.getSeconds()).padStart(2, "0"); return `${t}.${m}.${y} ${h}:${mi}:${s}`; } function sleepMs(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function logInfo(msg) { if (ENABLE_LOG) log(`[Tankerkoenig] ${msg}`,"info"); } function logError(msg) { if (ENABLE_ERROR_LOG) log(`[Tankerkoenig ERROR] ${msg}`,"error"); } function getDistance(lat1, lon1, lat2, lon2) { const R = 6371; const dLat = (lat2 - lat1) * Math.PI / 180; const dLon = (lon2 - lon1) * Math.PI / 180; const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2); return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); } function formatOpeningEntries(list, WEEKDAY_MAP) { return list.map(o => { let rawText = (typeof o.text === "string" && o.text.trim() !== "") ? o.text : "keine Angabe"; let text = rawText .replace(/\btäglich ausser Sonn- und Feiertagen\b/gi, "Mo-Sa") .replace( /\b(Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|Sonntag|Feiertag)\b/g, m => WEEKDAY_MAP[m] || m // Fallback: wenn Map-Eintrag fehlt, Original behalten ); const hours = (o.start && o.end) ? `${o.start.split(':')[0]}-${o.end.split(':')[0]}` : ""; return { text, hours }; }); } async function initStates() { stations.forEach((s) => { const path = `${base}.${s.id}`; ["benzin","e10","diesel"].forEach(fuel => { ["48h","14d","90d"].forEach(win => { smartCreateState(`${path}.aspects.${fuel}.trend_${win}`, "", { name: `Trend ${fuel} ${win}`, type: "string", read: true, write: true }); smartCreateState(`${path}.aspects.${fuel}.trend_${win}_icon`, "", { name: `Trend Icon ${fuel} ${win}`, type: "string", read: true, write: true }); }); smartCreateState(`${path}.aspects.${fuel}.trend_24h_proj`, "", { name: `Trend ${fuel} 24h Prognose`, type: "string", read: true, write: true }); smartCreateState(`${path}.aspects.${fuel}.trend_24h_proj_icon`, "", { name: `Trend Icon ${fuel} 24h Prognose`, type: "string", read: true, write: true }); smartCreateState(`${path}.aspects.${fuel}.trend_24h_proj_price`, 0, { name: `Trend ${fuel} 24h prognostizierter Preis`, type: "number", read: true, write: true, unit: "€" }); smartCreateState(`${path}.aspects.${fuel}.history`, "[]", { name: `Historie ${fuel}`, type: 'string', read: true, write: true }); //dient nur der Datenhaltung für Auswertung smartCreateState(`${path}.aspects.${fuel}.json`, "[]", { name: `JSON ${fuel}`, type: 'string', read: true, write: true }); }); smartCreateState(`${path}.image`, s.image, { name: 'Image', type: 'string', read: true, write: true }); smartCreateState(`${path}.enabled`, true, { name: 'Aktiv', type: 'boolean', read: true, write: true }); smartCreateState(`${path}.dataonly`, false, { name: 'Nur Daten abrufen, nicht auswerten', type: 'boolean', read: true, write: true }); smartCreateState(`${path}.status`, '', { name: 'Status', type: 'string', read: true, write: true }); smartCreateState(`${path}.benzin`, 0, { name: 'Benzin', type: 'number', read: true, write: true, unit: '€' }); smartCreateState(`${path}.e10`, 0, { name: 'E10', type: 'number', read: true, write: true, unit: '€' }); smartCreateState(`${path}.diesel`, 0, { name: 'Diesel', type: 'number', read: true, write: true, unit: '€' }); smartCreateState(`${path}.benzin_str`, '', { name: 'Benzin (String)', type: 'string', read: true, write: true }); smartCreateState(`${path}.e10_str`, '', { name: 'E10 (String)', type: 'string', read: true, write: true }); smartCreateState(`${path}.diesel_str`, '', { name: 'Diesel (String)', type: 'string', read: true, write: true }); smartCreateState(`${path}.name`, '', { name: 'Name', type: 'string', read: true, write: true }); smartCreateState(`${path}.brand`, '', { name: 'Marke', type: 'string', read: true, write: true }); smartCreateState(`${path}.street`, '', { name: 'Straße', type: 'string', read: true, write: true }); smartCreateState(`${path}.postCode`, '', { name: 'Postleitzahl', type: 'string', read: true, write: true }); smartCreateState(`${path}.place`, '', { name: 'Ort', type: 'string', read: true, write: true }); smartCreateState(`${path}.isOpen`, false, { name: 'Ist Offen', type: 'boolean', read: true, write: true }); smartCreateState(`${path}.isWholeDay`, false, { name: 'ganztägig', type: 'boolean', read: true, write: true }); smartCreateState(`${path}.openingTimes`, "[]", { name: 'Öffnungszeiten', type: 'string', read: true, write: true }); smartCreateState(`${path}.overrides`, "[]", { name: 'geänderte Öffnungszeiten', type: 'string', read: true, write: true }); smartCreateState(`${path}.distance`, 0, { name: 'Entfernung', type: 'number', read: true, write: true }); smartCreateState(`${path}.lastPriceUpdate`, formatDateTime(), { name: 'letzte Preisaktualisierung', type: 'string', read: true, write: true }); smartCreateState(`${path}.lastChecked`, formatDateTime(), { name: 'letzter Abruf', type: 'string', read: true, write: true }); smartCreateState(`${path}.prices`, "[]", { name: 'Preis JSON', type: 'string', read: true, write: true }); smartCreateState(`${path}.favorite`, false, { name: 'Favorit', type: 'boolean', read: true, write: true }); smartCreateState(`${path}.svg`, '', { name: 'SVG Image', type: 'string', read: true, write: true }); smartCreateState(`${path}.aspects.reset_history`, false, { name: "History & Trends zurücksetzen", type: "boolean", read: true, write: true }); }); ["benzin", "e10", "diesel"].forEach(fuel => { smartCreateState(`${base}.cheapest.${fuel}_price`, 0, { type: 'number', read: true, write: true, unit: '€' }); smartCreateState(`${base}.cheapest.${fuel}_price_str`, "", { type: 'string', read: true, write: true }); smartCreateState(`${base}.cheapest.${fuel}_station`, '', { type: 'string', read: true, write: true }); smartCreateState(`${base}.cheapest.${fuel}_station_name`, '', { type: 'string', read: true, write: true }); smartCreateState(`${base}.cheapest.${fuel}_image`, '', { type: 'string', read: true, write: true }); smartCreateState(`${base}.cheapest.${fuel}_top3_json`, "[]", { name: `Top 3 ${fuel}`, type: 'string', read: true, write: true }); smartCreateState(`${base}.average.${fuel}`, 0, { name: `${fuel}`, type: 'number', read: true, write: true, unit: '€' }); smartCreateState(`${base}.average.${fuel}_str`, "", { type: 'string', read: true, write: true }); smartCreateState(`${base}.difference.${fuel}`, 0, { name: `${fuel}`, type: 'number', read: true, write: true, unit: '€' }); }); smartCreateState(`${base}.recommendation.benzin_tanken_empfohlen`, false, { name: "Tanken empfohlen Benzin", type: "boolean", read: true, write: true }); smartCreateState(`${base}.recommendation.e10_tanken_empfohlen`, false, { name: "Tanken empfohlen E10", type: "boolean", read: true, write: true }); smartCreateState(`${base}.recommendation.diesel_tanken_empfohlen`, false, { name: "Tanken empfohlen Diesel", type: "boolean", read: true, write: true }); smartCreateState(`${base}.difference.prices`, "[]", { name: 'JSON', type: 'string', read: true, write: true }); smartCreateState(`${base}.cheapest.cheapest_json`, "[]", { name: 'JSON', type: 'string', read: true, write: true }); smartCreateState(`${base}.average.average_json`, "[]", { name: 'JSON', type: 'string', read: true, write: true }); smartCreateState(`${base}.recommendation_json`, "[]", { name: 'Empfehlungen JSON', type: 'string', read: true, write: true }); smartCreateState(`${base}.all_stations_full_info`, "[]", { name: 'JSON', type: 'string', read: true, write: true }); smartCreateState(`${base}.reset_all_trends`, false, { name: "ALLE Trends & Historien zurücksetzen", type: "boolean", read: true, write: true }); smartCreateState(`${base}.config.threshold_tanken`, 0.05, { name: "Schwelle JETZT_TANKEN (€/L unter Durchschnitt)", type: "number", read: true, write: true, unit: "€" }); smartCreateState(`${base}.config.threshold_nicht_tanken`, -0.05, { name: "Schwelle NICHT_TANKEN (€/L über Durchschnitt)", type: "number", read: true, write: true, unit: "€" }); smartCreateState(`${base}.config.trend_threshold_percent`, 0.2, { name: "Trend-Schwelle (% vom Durchschnitt)", type: "number", read: true, write: true, unit: "%" }); smartCreateState(`${base}.config.use_superscript`, true, { name: "Preise mit Hochzahl darstellen", type: "boolean", read: true, write: true }); smartCreateState(`${base}.config.show_trend_symbols`, false, { name: "Trend-/Forecast-Symbole im JSON anzeigen", type: "boolean", read: true, write: true }); smartCreateState(`${base}.config.keep_last_price_if_closed`, true, { name: "Letzten Preis bei geschlossenen Stationen behalten", type: "boolean", read: true, write: true }); smartCreateState(TANKSTELLEN_THEME_DP, "midnightBlue", { type: "mixed", read: true, write: true, name: "Tankstellen Theme", states: { "darkNeon": "Dark Neon", "flatModern": "Flat Modern", "floatingGlass": "Floating Glass", "graphiteGrid": "Graphite Grid", "liquidChrome": "Liquid Chrome", "materialDesign": "Material Design", "midnightBlue": "Midnight Blue", "midnightPanel": "Midnight Panel", "neonMesh": "Neon Mesh", "nightHorizon": "Night Horizon", "obsidianFluid": "Obsidian Fluid", "obsidianGold": "Obsidian Gold", "silverChrome": "Silver Chrome", "spotlightDark": "Spotlight Dark", "titanCore": "Titan Core", "transparent": "Transparent" } }); logInfo("States initialisiert."); } function httpGetAsync(url, options) { return new Promise((resolve, reject) => { httpGet(url, options, (error, response) => { if (error) reject(error); else resolve(response); }); }); } function calculateAveragePrices() { const fuels = ["benzin", "e10", "diesel"]; const averages = {}; fuels.forEach(fuel => { let sum = 0; let count = 0; stations .filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false && getState(`${base}.${s.id}.dataonly`)?.val !== true) .forEach(s => { const path = `${base}.${s.id}`; const isOpen = getState(`${path}.isOpen`)?.val; const price = getState(`${path}.${fuel}`)?.val; if (isOpen && typeof price === "number" && price > 0) { sum += price; count++; } }); averages[fuel] = count > 0 ? parseFloat((sum / count).toFixed(3)) : 0; }); fuels.forEach(fuel => { setStateIfChanged(`${base}.average.${fuel}`, averages[fuel]); setStateIfChanged(`${base}.average.${fuel}_str`, formatPriceUnicode(averages[fuel])); }); logInfo("Durchschnittspreise aktualisiert."); } function calculateFutureTrend(history, futureHours = 24) { const data = history.filter(h => typeof h.price === "number").sort((a,b) => a.ts - b.ts); if (data.length < 2) return { text: "kein Trend", icon: TREND_ICONS.none, projectedPrice: null }; const first = data[0]; const last = data[data.length - 1]; const hoursDiff = (last.ts - first.ts) / (1000 * 3600); if (hoursDiff === 0) return { text: "stabil", icon: TREND_ICONS.flat, projectedPrice: last.price }; const ratePerHour = (last.price - first.price) / hoursDiff; const projectedPrice = last.price + ratePerHour * futureHours; const avg = data.reduce((sum, d) => sum + d.price, 0) / data.length; const TH = avg * 0.002; const diff = projectedPrice - last.price; if (diff > TH) return { text: "steigend", icon: TREND_ICONS.up, projectedPrice }; if (diff < -TH) return { text: "fallend", icon: TREND_ICONS.down, projectedPrice }; return { text: "stabil", icon: TREND_ICONS.flat, projectedPrice }; } function updateAspectsJSON(stationId) { const path = `${base}.${stationId}`; ["benzin","e10","diesel"].forEach(fuel => { const trends = { trend_48h: getState(`${path}.aspects.${fuel}.trend_48h`)?.val || "", trend_14d: getState(`${path}.aspects.${fuel}.trend_14d`)?.val || "", trend_90d: getState(`${path}.aspects.${fuel}.trend_90d`)?.val || "", trend_24h_proj: getState(`${path}.aspects.${fuel}.trend_24h_proj`)?.val || "", trend_24h_proj_price: getState(`${path}.aspects.${fuel}.trend_24h_proj_price`)?.val || 0, trend_48h_icon: getState(`${path}.aspects.${fuel}.trend_48h_icon`)?.val || "", trend_14d_icon: getState(`${path}.aspects.${fuel}.trend_14d_icon`)?.val || "", trend_90d_icon: getState(`${path}.aspects.${fuel}.trend_90d_icon`)?.val || "", trend_24h_proj_icon: getState(`${path}.aspects.${fuel}.trend_24h_proj_icon`)?.val || "" }; setStateIfChanged(`${path}.aspects.${fuel}.json`, JSON.stringify(trends)); }); } const TREND_ICONS = { up: "↑", down: "↓", flat: "→", none: "–" }; const TREND_SYMBOLS = { up: "↑", down: "↓", flat: "→" }; const FORECAST_SYMBOLS = { up: "↗", down: "↘", flat: "→" }; const SUPERSCRIPT = ['⁰','¹','²','³','⁴','⁵','⁶','⁷','⁸','⁹']; function formatPriceUnicode(price) { if (price === null || price === undefined || isNaN(price)) return null; const p = Number(price).toFixed(3); const main = p.slice(0, -1).replace('.', ','); const lastDigit = p.slice(-1); const useSuperscript = getState(`${base}.config.use_superscript`)?.val ?? true; if (useSuperscript) { return main + SUPERSCRIPT[Number(lastDigit)]; } else { return (Number(price).toFixed(2)).replace('.', ','); } } function calculateDifferencesStates() { const fuels = [ { key: "benzin", label: "Benzin" }, { key: "e10", label: "E10" }, { key: "diesel", label: "Diesel" } ]; const openStations = stations.filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false && getState(`${base}.${s.id}.isOpen`)?.val === true && getState(`${base}.${s.id}.dataonly`)?.val !== true); const priceDiffArray = fuels.map(fuel => { const prices = openStations .map(s => { const price = getState(`${base}.${s.id}.${fuel.key}`)?.val; return (typeof price === "number" && price > 0) ? { name: getState(`${base}.${s.id}.name`)?.val || "", price, image: getState(`${base}.${s.id}.image`)?.val || "" } : null; }) .filter(Boolean); let diff = 0; let cheapestName = "---"; let teuersteName = "---"; let billigste_image = ""; let teuerste_image = ""; if (prices.length > 0) { const cheapest = prices.reduce((a, b) => a.price < b.price ? a : b); const expensive = prices.reduce((a, b) => a.price > b.price ? a : b); diff = parseFloat((expensive.price - cheapest.price).toFixed(2)); billigste_image = cheapest.image; teuerste_image = expensive.image; cheapestName = cheapest.name + " (" + cheapest.price.toFixed(2) + " €)"; teuersteName = expensive.name + " (" + expensive.price.toFixed(2) + " €)"; } setStateIfChanged(`${base}.difference.${fuel.key}`, diff); return {text: fuel.label, billigste_image, billigste: cheapestName, teuerste_image, teuerste: teuersteName, differenz: diff.toFixed(2)}; }); setStateIfChanged(`${base}.difference.prices`, JSON.stringify(priceDiffArray)); logInfo("Differenzen und Preise als JSON unter `${base}.difference` aktualisiert."); } function saveCheapestJSON() { const fuels = [ { key: "benzin", label: "Benzin", img: image_base+"blue.png" }, { key: "e10", label: "E10", img: image_base+"green.png" }, { key: "diesel", label: "Diesel", img: image_base+"red.png" } ]; const json = fuels.map(fuel => { const stationId = getState(`${base}.cheapest.${fuel.key}_station`)?.val; if (!stationId) { return {col_1: fuel.img, col_2: fuel.label, col_3: "", col_4: "---", col_5: "---"}; } const img = getState(`${base}.${stationId}.image`)?.val || ""; const isFav = getState(`${base}.${stationId}.favorite`)?.val === true; const brand = (getState(`${base}.${stationId}.name`)?.val || "") + (isFav ? " ★" : ""); const price = getState(`${base}.${stationId}.${fuel.key}`)?.val ?? null; return {col_1: fuel.img, col_2: fuel.label, col_3: img, col_4: brand.trim(), col_5: formatPriceUnicode(price)}; }); setStateIfChanged(`${base}.cheapest.cheapest_json`, JSON.stringify(json)); } function saveTop3JSON() { const fuels = ["benzin","e10","diesel"]; fuels.forEach(fuel => { const stationsWithPrices = stations.filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false && getState(`${base}.${s.id}.isOpen`)?.val === true && getState(`${base}.${s.id}.dataonly`)?.val !== true) .map(s => { const isFav = getState(`${base}.${s.id}.favorite`)?.val === true; return { name: getState(`${base}.${s.id}.name`)?.val || "", favorite: isFav, price: getState(`${base}.${s.id}.${fuel}`)?.val || 0, image: getState(`${base}.${s.id}.image`)?.val || "", distance: getState(`${base}.${s.id}.distance`)?.val || 0 }; }) .filter(s => typeof s.price === "number" && s.price > 0); stationsWithPrices.sort((a, b) => { if (a.price !== b.price) return a.price - b.price; if (a.favorite !== b.favorite) return a.favorite ? -1 : 1; return a.distance - b.distance; }); const top3 = stationsWithPrices.slice(0,3).map((s, index) => ({ rank: index + 1, image: s.image, name: s.name + (s.favorite ? " ★" : ""), price: formatPriceUnicode(s.price), // <-- hier Hochzahlen verwenden distance: parseFloat(s.distance.toFixed(2)) })); setStateIfChanged(`${base}.cheapest.${fuel}_top3_json`, JSON.stringify(top3)); }); } function saveAverageJSON() { const fuels = ["benzin","e10","diesel"]; const json = fuels.map(fuel => { const avg = getState(`${base}.average.${fuel}`)?.val ?? 0; return {fuel: fuel, price: formatPriceUnicode(avg)}; }); setStateIfChanged(`${base}.average.average_json`, JSON.stringify(json)); } function appendHistory(path, fuel, price) { if (typeof price !== "number" || price <= 0) return; const now = Date.now(); const cutoff90d = now - 90 * 24 * 3600 * 1000; // 90 Tage const cutoff48h = now - 48 * 3600 * 1000; // 48 Stunden const historyStr = getState(`${path}.aspects.${fuel}.history`)?.val || "[]"; let history = []; try { history = JSON.parse(historyStr); } catch {} history.push({ ts: now, price }); history = history.filter(h => h.ts >= cutoff90d); const shortTerm = history.filter(h => h.ts >= cutoff48h); const longTerm = history .filter(h => h.ts < cutoff48h) .reduce((acc, cur) => { const hour = Math.floor(cur.ts / (3600*1000)); // Stunde als Bucket if (!acc[hour]) acc[hour] = { ts: cur.ts, price: cur.price, count: 1 }; else { acc[hour].price = (acc[hour].price * acc[hour].count + cur.price) / (acc[hour].count + 1); acc[hour].count++; acc[hour].ts = cur.ts; // letzte Zeit der Stunde } return acc; }, {}); const longTermArray = Object.values(longTerm).map(h => ({ ts: h.ts, price: parseFloat(h.price.toFixed(3)) })); const newHistory = [...longTermArray, ...shortTerm]; setStateIfChanged(`${path}.aspects.${fuel}.history`, JSON.stringify(newHistory)); } function calculateTrend(history, hours) { const cutoff = Date.now() - (hours * 3600 * 1000); const data = history.filter(h => h.ts >= cutoff).sort((a,b) => a.ts - b.ts); if (data.length < 2) return { text: "kein Trend", icon: TREND_ICONS.none }; const first = data[0].price; const last = data[data.length - 1].price; const diff = last - first; const avg = data.reduce((sum,d) => sum+d.price,0) / data.length; const thresholdPercent = getState(`${base}.config.trend_threshold_percent`)?.val ?? 0.2; const TH = avg * (thresholdPercent / 100); if (diff > TH) return { text: "steigend", icon: TREND_ICONS.up }; if (diff < -TH) return { text: "fallend", icon: TREND_ICONS.down }; return { text: "stabil", icon: TREND_ICONS.flat }; } async function updateRecommendations() { const fuels = [ { key: "benzin", label: "BENZIN" }, { key: "e10", label: "E10" }, { key: "diesel", label: "DIESEL" } ]; const recommendations = []; const thresholdTanken = getState(`${base}.config.threshold_tanken`)?.val ?? 0.05; const thresholdNichtTanken = getState(`${base}.config.threshold_nicht_tanken`)?.val ?? -0.05; fuels.forEach(fuel => { const avg = getState(`${base}.average.${fuel.key}`)?.val; const cheapest = getState(`${base}.cheapest.${fuel.key}_price`)?.val; const stationId = getState(`${base}.cheapest.${fuel.key}_station`)?.val; const stationNm = getState(`${base}.cheapest.${fuel.key}_station_name`)?.val; if (typeof avg !== "number" || typeof cheapest !== "number" || !stationId) { return; } const diff = parseFloat((avg - cheapest).toFixed(2)); let action = "ABWARTEN"; let reason = "Kein Preisvorteil"; if (diff >= thresholdTanken) { action = "JETZT_TANKEN"; reason = `${diff.toFixed(2).replace('.', ',')} € unter Durchschnitt`; } else if (diff <= thresholdNichtTanken) { action = "NICHT_TANKEN"; reason = `${Math.abs(diff).toFixed(2).replace('.', ',')} € über Durchschnitt`; } const tanken_empfohlen = (action === "JETZT_TANKEN"); setStateIfChanged(`${base}.recommendation.${fuel.key}_tanken_empfohlen`, tanken_empfohlen); const trend48h = getState(`${base}.${stationId}.aspects.${fuel.key}.trend_48h_icon`)?.val || "–"; const trend14d = getState(`${base}.${stationId}.aspects.${fuel.key}.trend_14d_icon`)?.val || "–"; const trend90d = getState(`${base}.${stationId}.aspects.${fuel.key}.trend_90d_icon`)?.val || "–"; const projDir = getState(`${base}.${stationId}.aspects.${fuel.key}.trend_24h_proj_icon`)?.val || "–"; const projPrice = getState(`${base}.${stationId}.aspects.${fuel.key}.trend_24h_proj_price`)?.val || 0; recommendations.push({ fuel: fuel.label, action, reason, trend_48h: trend48h, trend_14d: trend14d, trend_90d: trend90d, forecast_dir: projDir, forecast_price: projPrice > 0 ? parseFloat(projPrice.toFixed(2)) : null, best_station_name: stationNm || "", best_station_price: formatPriceUnicode(cheapest) }); }); setStateIfChanged(`${base}.recommendation_json`, JSON.stringify(recommendations)); } async function loadData() { logInfo("Starte Datenabfrage ..."); function considerCheapest(cheapest, fuelKey, newPrice, dist, stationId, image, isFav) { if (typeof newPrice !== 'number') return; const current = cheapest[fuelKey]; if (!current) { cheapest[fuelKey] = { price: newPrice, station: stationId, image: image, distance: dist, favorite: !!isFav }; return; } if (newPrice < current.price) { cheapest[fuelKey] = { price: newPrice, station: stationId, image: image, distance: dist, favorite: !!isFav }; return; } if (newPrice === current.price) { const currentFav = !!current.favorite; if (isFav && !currentFav) { cheapest[fuelKey] = { price: newPrice, station: stationId, image: image, distance: dist, favorite: !!isFav }; return; } if ((isFav === currentFav) && dist < current.distance) { cheapest[fuelKey] = { price: newPrice, station: stationId, image: image, distance: dist, favorite: !!isFav }; return; } } } const listCleaner = (entry = '') => entry .toLowerCase() .split(' ') .map(word => word.replace(/oe/g, 'ö') .replace(/ae/g, 'ä') .replace(/ue/g, 'ü') .replace(/ss/g, 'ß') ) .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(' '); const cheapest = { benzin: null, e10: null, diesel: null }; const tasks = stations .filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false) .map(async (s) => { const url = `https://creativecommons.tankerkoenig.de/json/detail.php?id=${s.id}&apikey=${apiKey}`; try { const dynamicUA = new UserAgent().toString(); logInfo(`Abruf für Station ${s.id}`); const response = await httpGetAsync(url, {timeout: 15000, headers: { "User-Agent": dynamicUA }}); if (!response || response.statusCode !== 200) { logError(`HTTP Error Station ${s.id}: ${response?.statusCode}`); return; } const body = typeof response.data === "string" ? JSON.parse(response.data) : response.data; if (!body || !body.station) return; const p = body.station; const path = `${base}.${s.id}`; setStateIfChanged(`${path}.status`, p.isOpen ? "geöffnet" : "geschlossen"); setStateIfChanged(`${path}.image`, s.image); setIfEmpty(`${path}.name`, p.name); setIfEmpty(`${path}.brand`, p.brand); const streetWithHouse = p.houseNumber && p.houseNumber.trim() !== "" ? `${p.street} ${p.houseNumber}` : p.street; setIfEmpty(`${path}.street`, listCleaner(streetWithHouse)); setIfEmpty(`${path}.place`, listCleaner(p.place)); setIfEmpty(`${path}.postCode`, p.postCode ? p.postCode.toString().padStart(5, "0") : ""); setStateIfChanged(`${path}.isOpen`, p.isOpen); setStateIfChanged(`${path}.isWholeDay`, p.wholeDay); const WEEKDAY_MAP = { "Montag": "Mo", "Dienstag": "Di", "Mittwoch": "Mi", "Donnerstag": "Do", "Freitag": "Fr", "Samstag": "Sa", "Sonntag": "So", "Feiertag": "Ft" }; let rawOpeningTimes; if (p.wholeDay) { rawOpeningTimes = [{ text: "Mo-So", start: "00:00:00", end: "24:00:00" }]; } else { if (Array.isArray(p.openingTimes)) { rawOpeningTimes = p.openingTimes; } else if (typeof p.openingTimes === "string") { try { rawOpeningTimes = JSON.parse(p.openingTimes); } catch { rawOpeningTimes = []; } } else { rawOpeningTimes = []; } } const formattedOpening = formatOpeningEntries(rawOpeningTimes, WEEKDAY_MAP); setStateIfChanged(`${path}.openingTimes`, JSON.stringify(formattedOpening)); let rawOverrides; if (Array.isArray(p.overrides)) { rawOverrides = p.overrides; } else if (typeof p.overrides === "string") { try { rawOverrides = JSON.parse(p.overrides); } catch { rawOverrides = []; } } else { rawOverrides = []; } const formattedOverrides = formatOpeningEntries(rawOverrides, WEEKDAY_MAP); setStateIfChanged(`${path}.overrides`, JSON.stringify(formattedOverrides)); if (p.lat && p.lng) { const distance = getDistance(myLocation.lat, myLocation.lon, p.lat, p.lng); setStateIfChanged(`${path}.distance`, parseFloat(distance.toFixed(2))); } let priceChanged = false; const fuels = [ { api: "e5", dp: "benzin" }, { api: "e10", dp: "e10" }, { api: "diesel", dp: "diesel" } ]; const keepLastPriceIfClosed = getState(`${base}.config.keep_last_price_if_closed`)?.val ?? true; if (p.isOpen) { if (getState(`${path}.benzin`)?.val !== p.e5) { appendHistory(path, "benzin", p.e5); } if (getState(`${path}.e10`)?.val !== p.e10) { appendHistory(path, "e10", p.e10); } if (getState(`${path}.diesel`)?.val !== p.diesel) { appendHistory(path, "diesel", p.diesel); } fuels.forEach(f => { if (typeof p[f.api] === "number") { const oldVal = getState(`${path}.${f.dp}`)?.val; if (oldVal !== p[f.api]) priceChanged = true; setStateIfChanged(`${path}.${f.dp}`, p[f.api]); } }); if (priceChanged) { setStateIfChanged(`${path}.lastPriceUpdate`, formatDateTime()); } setStateIfChanged(`${path}.benzin_str`, formatPriceUnicode(getState(`${path}.benzin`)?.val)); setStateIfChanged(`${path}.e10_str`, formatPriceUnicode(getState(`${path}.e10`)?.val)); setStateIfChanged(`${path}.diesel_str`, formatPriceUnicode(getState(`${path}.diesel`)?.val)); } else if (!keepLastPriceIfClosed) { setStateIfChanged(`${path}.benzin`, 0.0); setStateIfChanged(`${path}.e10`, 0.0); setStateIfChanged(`${path}.diesel`, 0.0); setStateIfChanged(`${path}.benzin_str`, ""); setStateIfChanged(`${path}.e10_str`, ""); setStateIfChanged(`${path}.diesel_str`, ""); } ["benzin","e10","diesel"].forEach(fuel => { const historyStr = getState(`${path}.aspects.${fuel}.history`)?.val || "[]"; let history = []; try { history = JSON.parse(historyStr); } catch {} const trends = { "48h": calculateTrend(history, 48), "14d": calculateTrend(history, 24 * 14), "90d": calculateTrend(history, 24 * 90) }; Object.entries(trends).forEach(([win, result]) => { setStateIfChanged(`${path}.aspects.${fuel}.trend_${win}`, result.text); setStateIfChanged(`${path}.aspects.${fuel}.trend_${win}_icon`, result.icon); }); const futureTrend = calculateFutureTrend(history, 24); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj`, futureTrend.text); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_icon`, futureTrend.icon); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_price`, futureTrend.projectedPrice ? parseFloat(futureTrend.projectedPrice.toFixed(3)) : 0); }); function buildPriceEntry(fuelKey, label, image) { let priceStr = formatPriceUnicode(getState(`${path}.${fuelKey}`)?.val ?? null) || ""; const showTrendSymbols = getState(`${base}.config.show_trend_symbols`)?.val ?? false; if (showTrendSymbols && priceStr) { const trendIcon = getState(`${path}.aspects.${fuelKey}.trend_48h_icon`)?.val || TREND_SYMBOLS.flat; const forecastIcon = getState(`${path}.aspects.${fuelKey}.trend_24h_proj_icon`)?.val || FORECAST_SYMBOLS.flat; priceStr = `${priceStr} ${trendIcon} ${forecastIcon}`; } return { image, text: label, price: priceStr }; } const pricesJSON = [ buildPriceEntry("benzin", "Benzin", image_base + "blue.png"), buildPriceEntry("e10", "E10", image_base + "green.png"), buildPriceEntry("diesel", "Diesel", image_base + "red.png") ]; setStateIfChanged(`${path}.prices`, JSON.stringify(pricesJSON)); setStateIfChanged(`${path}.lastChecked`, formatDateTime()); const dist = getState(`${path}.distance`)?.val || 0; const isFav = getState(`${path}.favorite`)?.val === true; if (p.isOpen && getState(`${base}.${s.id}.dataonly`)?.val !== true) { considerCheapest(cheapest, 'benzin', p.e5, dist, s.id, s.image, isFav); considerCheapest(cheapest, 'e10', p.e10, dist, s.id, s.image, isFav); considerCheapest(cheapest, 'diesel', p.diesel, dist, s.id, s.image, isFav); } updateAspectsJSON(s.id); } catch (error) { logError(`Fehler bei Station ${s.id}: ${error}`); } }); await Promise.allSettled(tasks); logInfo("Auswertung abgeschlossen."); ["benzin", "e10", "diesel"].forEach(fuel => { if (cheapest[fuel]) { const stationId = cheapest[fuel].station; const stationName = getState(`${base}.${stationId}.name`)?.val || ""; setStateIfChanged(`${base}.cheapest.${fuel}_price`, cheapest[fuel].price); setStateIfChanged(`${base}.cheapest.${fuel}_price_str`, formatPriceUnicode(cheapest[fuel].price)); setStateIfChanged(`${base}.cheapest.${fuel}_station`, stationId); // ID bleibt für Pfad-Operationen setStateIfChanged(`${base}.cheapest.${fuel}_station_name`, stationName); setStateIfChanged(`${base}.cheapest.${fuel}_image`, cheapest[fuel].image); } else { setStateIfChanged(`${base}.cheapest.${fuel}_price`, 0); setStateIfChanged(`${base}.cheapest.${fuel}_price_str`, ""); setStateIfChanged(`${base}.cheapest.${fuel}_station`, ""); setStateIfChanged(`${base}.cheapest.${fuel}_station_name`, ""); setStateIfChanged(`${base}.cheapest.${fuel}_image`, ""); } }); saveCheapestJSON(); saveTop3JSON(); calculateAveragePrices(); calculateDifferencesStates(); saveAverageJSON(); const fullInfo = stations.filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false) .map(s => { const path = `${base}.${s.id}`; return { name: getState(`${path}.name`)?.val || "", brand: getState(`${path}.brand`)?.val || "", street: getState(`${path}.street`)?.val || "", postCode: getState(`${path}.postCode`)?.val || "", place: getState(`${path}.place`)?.val || "", distance: getState(`${path}.distance`)?.val || "", image: getState(`${path}.image`)?.val || "", benzin: getState(`${path}.benzin`)?.val ?? null, e10: getState(`${path}.e10`)?.val ?? null, diesel: getState(`${path}.diesel`)?.val ?? null, isOpen: getState(`${path}.isOpen`)?.val ?? false, lastPriceUpdate: getState(`${path}.lastPriceUpdate`)?.val || "", lastChecked: getState(`${path}.lastChecked`)?.val || "" }; }); setStateIfChanged(`${base}.all_stations_full_info`, JSON.stringify(fullInfo)); updateRecommendations(); TankRenderer(); } (async () => { try { if (await internetUndTankerkoenigOK()) { await initStates(); await sleepMs(5000); await loadData(); } } catch (err) { logError("Fehler beim Start: " + err); } })(); schedule('35 7,17,27,37,47,57 * * * *', async() => { try { if (await internetUndTankerkoenigOK()) { await initStates(); await sleepMs(5000); await loadData(); } } catch (err) { logError("Fehler beim Cron-Start: " + err); } }); async function internetUndTankerkoenigOK() { try { const net = await httpGetAsync("https://www.google.com/generate_204", { timeout: 5000 }); if (!net || net.statusCode !== 204) return false; const tk = await httpGetAsync("https://creativecommons.tankerkoenig.de/", { timeout: 5000 }); return (tk && tk.statusCode === 200); } catch { return false; } } stations.forEach(s => { const resetId = `${base}.${s.id}.aspects.reset_history`; on({ id: resetId, change: "ne" }, obj => { if (obj.state.val === true) { const path = `${base}.${s.id}`; ["benzin","e10","diesel"].forEach(fuel => { setStateIfChanged(`${path}.aspects.${fuel}.history`, "[]"); setStateIfChanged(`${path}.aspects.${fuel}.trend_48h`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_14d`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_90d`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_price`, 0); setStateIfChanged(`${path}.aspects.${fuel}.trend_48h_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_14d_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_90d_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_icon`, ""); }); setStateIfChanged(resetId, false); } }); }); on({ id: `${base}.reset_all_trends`, change: "ne" }, obj => { if (obj.state.val === true) { stations.forEach(s => { const path = `${base}.${s.id}`; ["benzin","e10","diesel"].forEach(fuel => { setStateIfChanged(`${path}.aspects.${fuel}.history`, "[]"); setStateIfChanged(`${path}.aspects.${fuel}.trend_48h`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_14d`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_90d`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_price`, 0); setStateIfChanged(`${path}.aspects.${fuel}.trend_48h_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_14d_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_90d_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_icon`, ""); }); }); setStateIfChanged(`${base}.reset_all_trends`, false); } }); // **** AB HIER DER SVG RENDERER MIT THEMEN-KONFIG **** const VisibleStatistik = true; // sichtbarkeit Statistik‑Badge inklusive Text const VisibleBorder = true; // Sichtbarkeit Rahmen / Border der SVG const minimalModeActiv = false; // Minimal‑Modus aktiv (ohne Kontrollkästchen, Statistik‑Badge) const useDotInsteadOfComma = true; // false = Komma | true = Punkt const TANKSTELLEN_THEMES = { // widgetBgTop = Farbe Widget-Hintergrund oben widgetBgBottom = Farbe Widget-Hintergrund unten headerTop = Farbe Header oben // headerBottom = Farbe Header unten footerTop = Farbe Footer oben footerBottom = Farbe Footer unten // footerStroke = Farbe Footer-Rahmen borderGradStart = Farbe Rahmenverlauf Start borderGradMid = Farbe Rahmenverlauf Mitte // borderGradEnd = Farbe Rahmenverlauf Ende lineSeparator = Farbe horizontale Trennlinie lineVertical = Farbe vertikale Trennlinie // textDefault = Farbe Standard-Text textName = Farbe Tankstellenname textStatus = Farbe Status-Text // textTime = Farbe Zeitangaben textFuel = Farbe Kraftstoff-Label textPrice = Farbe Preis-Text // textControl = Farbe Control-Text textStatistik = Farbe Statistik-Text textOpenTitle = Farbe Öffnungszeiten-Titel // textOpenTime = Farbe Öffnungszeiten-Zeiten statusOpenFill = Farbe Hintergrund geöffnet statusOpenStroke = Farbe Rahmen geöffnet // statusOpenText = Farbe Text geöffnet statusClosedFill = Farbe Hintergrund geschlossen statusClosedStroke = Farbe Rahmen geschlossen // statusClosedText = Farbe Text geschlossen statistikFill = Farbe Statistik-Hintergrund statistikStroke = Farbe Statistik-Rahmen // statistikText = Farbe Statistik-Text fuelBenzinStart = Farbe Benzin-Verlauf Start fuelBenzinEnd = Farbe Benzin-Verlauf Ende // fuelE10Start = Farbe E10-Verlauf Start fuelE10End = Farbe E10-Verlauf Ende fuelDieselStart = Farbe Diesel-Verlauf Start // fuelDieselEnd = Farbe Diesel-Verlauf Ende fuelBenzinBorder = Farbe Benzin-Rahmen fuelE10Border = Farbe E10-Rahmen // fuelDieselBorder = Farbe Diesel-Rahmen trendUp = Farbe Trend ↑ trendDown = Farbe Trend ↓ // trendStable = Farbe Trend → controlBoxFill = Farbe Control-Box Hintergrund controlBoxStroke = Farbe Control-Box Rahmen // controlBoxText = Farbe Control-Box Text midnightBlue:{widgetBgTop:"#0F172A",widgetBgBottom:"#020617",headerTop:"#1E293B",headerBottom:"#0F172A",footerTop:"#1E293B",footerBottom:"#0F172A",footerStroke:"#1E293B",borderGradStart:"#3B82F6",borderGradMid:"#1E293B",borderGradEnd:"#3B82F6",lineSeparator:"#334155",lineVertical:"#1E293B",textDefault:"#E2E8F0",textName:"#FFFFFF",textStatus:"#FFFFFF",textTime:"#E2E8F0",textFuel:"#FFFFFF",textPrice:"#FFFFFF",textControl:"#FFFFFF",textStatistik:"#FFFFFF",textOpenTitle:"#E2E8F0",textOpenTime:"#E2E8F0",statusOpenFill:"rgba(5,150,105,0.2)",statusOpenStroke:"#10B981",statusOpenText:"#34D399",statusClosedFill:"rgba(220,38,38,0.2)",statusClosedStroke:"#DC2626",statusClosedText:"#EF4444",statistikFill:"rgba(148,163,184,0.20)",statistikStroke:"#94A3B8",statistikText:"#FFFFFF",fuelBenzinStart:"#1A2742",fuelBenzinEnd:"#0F172A",fuelE10Start:"#0A2A22",fuelE10End:"#0F172A",fuelDieselStart:"#3F1515",fuelDieselEnd:"#0F172A",fuelBenzinBorder:"#1E3A8A",fuelE10Border:"#0F5F3A",fuelDieselBorder:"#8A1E1E",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#020617",controlBoxStroke:"#475569",controlBoxText:"#FFFFFF"}, silverChrome:{widgetBgTop:"#F8FAFC",widgetBgBottom:"#E2E8F0",headerTop:"#CBD5E1",headerBottom:"#94A3B8",footerTop:"#CBD5E1",footerBottom:"#94A3B8",footerStroke:"#64748B",borderGradStart:"#FFFFFF",borderGradMid:"#CBD5E1",borderGradEnd:"#FFFFFF",lineSeparator:"#94A3B8",lineVertical:"#94A3B8",textDefault:"#1E293B",textName:"#0F172A",textStatus:"#FFFFFF",textTime:"#334155",textFuel:"#0F172A",textPrice:"#0F172A",textControl:"#0F172A",textStatistik:"#0F172A",textOpenTitle:"#1E293B",textOpenTime:"#1E293B",statusOpenFill:"rgba(6,95,70,0.25)",statusOpenStroke:"#065F46",statusOpenText:"#065F46",statusClosedFill:"rgba(185,28,28,0.25)",statusClosedStroke:"#991B1B",statusClosedText:"#991B1B",statistikFill:"rgba(255,255,255,0.5)",statistikStroke:"#94A3B8",statistikText:"#1E293B",fuelBenzinStart:"#D9DEE5",fuelBenzinEnd:"#B8C0C9",fuelE10Start:"#D9DEE5",fuelE10End:"#B8C0C9",fuelDieselStart:"#D9DEE5",fuelDieselEnd:"#B8C0C9",fuelBenzinBorder:"#94A3B8",fuelE10Border:"#94A3B8",fuelDieselBorder:"#94A3B8",trendUp:"#B91C1C",trendDown:"#1D4ED8",trendStable:"#065F46",controlBoxFill:"#E5E7EB",controlBoxStroke:"#94A3B8",controlBoxText:"#1E293B"}, transparent:{widgetBgTop:"transparent",widgetBgBottom:"transparent",headerTop:"transparent",headerBottom:"transparent",footerTop:"transparent",footerBottom:"transparent",footerStroke:"#1E293B",borderGradStart:"#3B82F6",borderGradMid:"#1E293B",borderGradEnd:"#3B82F6",lineSeparator:"#334155",lineVertical:"#1E293B",textDefault:"#E2E8F0",textName:"#FFFFFF",textStatus:"#FFFFFF",textTime:"#E2E8F0",textFuel:"#FFFFFF",textPrice:"#FFFFFF",textControl:"#FFFFFF",textStatistik:"#FFFFFF",textOpenTitle:"#E2E8F0",textOpenTime:"#E2E8F0",statusOpenFill:"rgba(5,150,105,0.2)",statusOpenStroke:"#10B981",statusOpenText:"#34D399",statusClosedFill:"rgba(220,38,38,0.2)",statusClosedStroke:"#DC2626",statusClosedText:"#EF4444",statistikFill:"rgba(148,163,184,0.20)",statistikStroke:"#94A3B8",statistikText:"#FFFFFF",fuelBenzinStart:"#1A2742",fuelBenzinEnd:"#0F172A",fuelE10Start:"#0A2A22",fuelE10End:"#0F172A",fuelDieselStart:"#3F1515",fuelDieselEnd:"#0F172A",fuelBenzinBorder:"#1E3A8A",fuelE10Border:"#0F5F3A",fuelDieselBorder:"#8A1E1E",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#020617",controlBoxStroke:"#475569",controlBoxText:"#FFFFFF"}, flatModern:{widgetBgTop:"#FFFFFF",widgetBgBottom:"#F1F5F9",headerTop:"#E2E8F0",headerBottom:"#CBD5E1",footerTop:"#F1F5F9",footerBottom:"#E2E8F0",footerStroke:"#CBD5E1",borderGradStart:"#CBD5E1",borderGradMid:"#E2E8F0",borderGradEnd:"#CBD5E1",lineSeparator:"#CBD5E1",lineVertical:"#CBD5E1",textDefault:"#1E293B",textName:"#0F172A",textStatus:"#1E293B",textTime:"#475569",textFuel:"#1E293B",textPrice:"#0F172A",textControl:"#1E293B",textStatistik:"#1E293B",textOpenTitle:"#475569",textOpenTime:"#1E293B",statusOpenFill:"#DCFCE7",statusOpenStroke:"#22C55E",statusOpenText:"#166534",statusClosedFill:"#FEE2E2",statusClosedStroke:"#EF4444",statusClosedText:"#991B1B",statistikFill:"#F1F5F9",statistikStroke:"#CBD5E1",statistikText:"#1E293B",fuelBenzinStart:"#EFF6FF",fuelBenzinEnd:"#EFF6FF",fuelBenzinBorder:"#BFDBFE",fuelE10Start:"#F0FDF4",fuelE10End:"#F0FDF4",fuelE10Border:"#BBF7D0",fuelDieselStart:"#FEF2F2",fuelDieselEnd:"#FEF2F2",fuelDieselBorder:"#FECACA",trendUp:"#DC2626",trendDown:"#2563EB",trendStable:"#16A34A",controlBoxFill:"#F8FAFC",controlBoxStroke:"#CBD5E1",controlBoxText:"#1E293B"}, darkNeon:{widgetBgTop:"#0A0A0A",widgetBgBottom:"#171717",headerTop:"#171717",headerBottom:"#0A0A0A",footerTop:"#171717",footerBottom:"#0A0A0A",footerStroke:"#262626", borderGradStart:"#06B6D4",borderGradMid:"#000000",borderGradEnd:"#D946EF",lineSeparator:"#262626",lineVertical:"#262626",textDefault:"#A3A3A3",textName:"#FFFFFF",textStatus:"#FFFFFF",textTime:"#737373",textFuel:"#FFFFFF",textPrice:"#FFFFFF",textControl:"#A3A3A3",textStatistik:"#FFFFFF",textOpenTitle:"#A3A3A3",textOpenTime:"#FFFFFF",statusOpenFill:"rgba(34,197,94,0.1)",statusOpenStroke:"#22C55E",statusOpenText:"#4ADE80",statusClosedFill:"rgba(239,68,68,0.1)",statusClosedStroke:"#EF4444",statusClosedText:"#F87171",statistikFill:"#171717",statistikStroke:"#404040",statistikText:"#FFFFFF",fuelBenzinStart:"#1A2742",fuelBenzinEnd:"#000000",fuelE10Start:"#0A2A22",fuelE10End:"#000000",fuelDieselStart:"#3F1515",fuelDieselEnd:"#000000",fuelBenzinBorder:"#1E3A8A",fuelE10Border:"#0F5F3A",fuelDieselBorder:"#8A1E1E",trendUp:"#F43F5E",trendDown:"#38BDF8",trendStable:"#4ADE80",controlBoxFill:"#000000",controlBoxStroke:"#525252",controlBoxText:"#FFFFFF"}, materialDesign:{widgetBgTop:"#F5F5F5",widgetBgBottom:"#E0E0E0",headerTop:"#EEEEEE",headerBottom:"#E0E0E0",footerTop:"#EEEEEE",footerBottom:"#E0E0E0",footerStroke:"#BDBDBD",borderGradStart:"#E0E0E0",borderGradMid:"#9E9E9E",borderGradEnd:"#E0E0E0",lineSeparator:"#BDBDBD",lineVertical:"#BDBDBD",textDefault:"#424242",textName:"#212121",textStatus:"#212121",textTime:"#616161",textFuel:"#212121",textPrice:"#212121",textControl:"#424242",textStatistik:"#212121",textOpenTitle:"#616161",textOpenTime:"#212121",statusOpenFill:"#C8E6C9",statusOpenStroke:"#4CAF50",statusOpenText:"#2E7D32",statusClosedFill:"#FFCDD2",statusClosedStroke:"#F44336",statusClosedText:"#C62828",statistikFill:"#E0E0E0",statistikStroke:"#9E9E9E",statistikText:"#212121",fuelBenzinStart:"#E3F2FD",fuelBenzinEnd:"#E3F2FD",fuelBenzinBorder:"#2196F3",fuelE10Start:"#E8F5E9",fuelE10End:"#E8F5E9",fuelE10Border:"#4CAF50",fuelDieselStart:"#FFEBEE",fuelDieselEnd:"#FFEBEE",fuelDieselBorder:"#F44336",trendUp:"#D32F2F",trendDown:"#1976D2",trendStable:"#388E3C",controlBoxFill:"#F5F5F5",controlBoxStroke:"#9E9E9E",controlBoxText:"#212121"}, nightHorizon:{widgetBgTop:"#4C1D95",widgetBgBottom:"#991B1B",headerTop:"#2E1065",headerBottom:"#4C1D95",footerTop:"#7F1D1D",footerBottom:"#4C1D95",footerStroke:"#4C1D95",borderGradStart:"#F59E0B",borderGradMid:"#2E1065",borderGradEnd:"#F59E0B",lineSeparator:"rgba(255,255,255,0.2)",lineVertical:"rgba(255,255,255,0.2)",textDefault:"#FEE2E2",textName:"#FFFFFF",textStatus:"#FFFFFF",textTime:"#FDBA74",textFuel:"#FFFFFF",textPrice:"#FFFFFF",textControl:"#FFFFFF",textStatistik:"#FFFFFF",textOpenTitle:"#FDBA74",textOpenTime:"#FEE2E2",statusOpenFill:"rgba(34,197,94,0.3)",statusOpenStroke:"#22C55E",statusOpenText:"#86EFAC",statusClosedFill:"rgba(185,28,28,0.3)",statusClosedStroke:"#B91C1C",statusClosedText:"#FCA5A5",statistikFill:"rgba(255,255,255,0.1)",statistikStroke:"#FDBA74",statistikText:"#FFFFFF",fuelBenzinStart:"#312E81",fuelBenzinEnd:"#1E3A8A",fuelBenzinBorder:"#60A5FA",fuelE10Start:"#064E3B",fuelE10End:"#065F46",fuelE10Border:"#34D399",fuelDieselStart:"#7F1D1D",fuelDieselEnd:"#991B1B",fuelDieselBorder:"#F87171",trendUp:"#F87171",trendDown:"#60A5FA",trendStable:"#34D399",controlBoxFill:"#4C1D95",controlBoxStroke:"#FDBA74",controlBoxText:"#FFFFFF"}, obsidianGold:{widgetBgTop:"#171717",widgetBgBottom:"#0A0A0A",headerTop:"#262626",headerBottom:"#171717",footerTop:"#262626",footerBottom:"#171717",footerStroke:"#404040",borderGradStart:"#D4AF37",borderGradMid:"#171717",borderGradEnd:"#D4AF37",lineSeparator:"#404040",lineVertical:"#404040",textDefault:"#E5E5E5",textName:"#F5F5F5",textStatus:"#D4AF37",textTime:"#A3A3A3",textFuel:"#FFFFFF",textPrice:"#D4AF37",textControl:"#E5E5E5",textStatistik:"#D4AF37",textOpenTitle:"#A3A3A3",textOpenTime:"#E5E5E5",statusOpenFill:"rgba(212,175,55,0.15)",statusOpenStroke:"#D4AF37",statusOpenText:"#D4AF37",statusClosedFill:"rgba(64,64,64,0.3)",statusClosedStroke:"#525252",statusClosedText:"#A3A3A3",statistikFill:"rgba(212,175,55,0.1)",statistikStroke:"#D4AF37",statistikText:"#D4AF37",fuelBenzinStart:"#262626",fuelBenzinEnd:"#171717",fuelBenzinBorder:"#D4AF37",fuelE10Start:"#262626",fuelE10End:"#171717",fuelE10Border:"#D4AF37",fuelDieselStart:"#262626",fuelDieselEnd:"#171717",fuelDieselBorder:"#D4AF37",trendUp:"#D4AF37",trendDown:"#D4AF37",trendStable:"#D4AF37",controlBoxFill:"#171717",controlBoxStroke:"#404040",controlBoxText:"#D4AF37"}, spotlightDark: {widgetBgTop:"#020617", widgetBgBottom:"#020617",headerTop:"#020617", headerBottom:"#020617",footerTop:"#020617", footerBottom:"#020617",borderGradStart:"transparent", borderGradMid:"transparent", borderGradEnd:"transparent",lineSeparator:"#1e293b", lineVertical:"#1e293b",textDefault:"#e2e8f0", textName:"#ffffff", textStatus:"#ffffff",textTime:"#64748b", textFuel:"#94a3b8", textPrice:"#ffffff",textControl:"#64748b", textStatistik:"#64748b",textOpenTitle:"#94a3b8", textOpenTime:"#e2e8f0",statusOpenFill:"rgba(5,150,105,0.2)", statusOpenStroke:"#10b981", statusOpenText:"#34d399",statusClosedFill:"rgba(220,38,38,0.2)", statusClosedStroke:"#dc2626", statusClosedText:"#ef4444",statistikFill:"rgba(255,255,255,0.05)", statistikStroke:"#334155", statistikText:"#e2e8f0",fuelBenzinStart:"#1e293b", fuelBenzinEnd:"#020617",fuelE10Start:"#1e293b", fuelE10End:"#020617",fuelDieselStart:"#1e293b", fuelDieselEnd:"#020617",trendUp:"#ef4444", trendDown:"#3b82f6", trendStable:"#10b981",controlBoxFill:"#020617", controlBoxStroke:"#334155", controlBoxText:"#94a3b8"}, midnightPanel: {widgetBgTop:"#0F172A", widgetBgBottom:"#020617",headerTop:"#0F172A", headerBottom:"#0F172A",footerTop:"#020617", footerBottom:"#020617",borderGradStart:"#1E293B", borderGradMid:"#1E293B", borderGradEnd:"#1E293B",lineSeparator:"#1E293B", lineVertical:"#1E293B",textDefault:"#E2E8F0", textName:"#E2E8F0", textStatus:"#FEE2E2",textTime:"#64748B", textFuel:"#94A3B8", textPrice:"#FFFFFF",textControl:"#475569", textStatistik:"#64748B",textOpenTitle:"#64748B", textOpenTime:"#E2E8F0",statusOpenFill:"#065F46", statusOpenStroke:"#065F46", statusOpenText:"#D1FAE5",statusClosedFill:"#7F1D1D", statusClosedStroke:"#991B1B", statusClosedText:"#FEE2E2",statistikFill:"#020617", statistikStroke:"#1E293B", statistikText:"#64748B",fuelBenzinStart:"#0F172A", fuelBenzinEnd:"#020617",fuelE10Start:"#0F172A", fuelE10End:"#020617",fuelDieselStart:"#0F172A", fuelDieselEnd:"#020617",trendUp:"#B91C1C", trendDown:"#1D4ED8", trendStable:"#10B981",controlBoxFill:"#020617", controlBoxStroke:"#1E293B", controlBoxText:"#64748B"}, neonMesh: {widgetBgTop:"#1e1b4b", widgetBgBottom:"#0f172a",headerTop:"#1e1b4b", headerBottom:"#0f172a",footerTop:"#0f172a", footerBottom:"#0f172a",borderGradStart:"transparent", borderGradMid:"transparent", borderGradEnd:"transparent",lineSeparator:"#334155", lineVertical:"#334155",textDefault:"#f8fafc", textName:"#f8fafc", textStatus:"#f8fafc",textTime:"#94a3b8", textFuel:"#94a3b8", textPrice:"#ffffff",textControl:"#64748b", textStatistik:"#64748b",textOpenTitle:"#94a3b8", textOpenTime:"#f8fafc",statusOpenFill:"rgba(16,185,129,0.25)", statusOpenStroke:"#10b981", statusOpenText:"#34d399",statusClosedFill:"rgba(220,38,38,0.25)", statusClosedStroke:"#dc2626", statusClosedText:"#ef4444",statistikFill:"rgba(255,255,255,0.05)", statistikStroke:"#475569", statistikText:"#94a3b8",fuelBenzinStart:"#4f46e5", fuelBenzinEnd:"#0f172a",fuelE10Start:"#9d174d", fuelE10End:"#0f172a",fuelDieselStart:"#4f46e5", fuelDieselEnd:"#0f172a",trendUp:"#ef4444", trendDown:"#3b82f6", trendStable:"#10b981",controlBoxFill:"#0f172a", controlBoxStroke:"#334155", controlBoxText:"#94a3b8"}, obsidianFluid:{widgetBgTop:"#1e1b4b",widgetBgBottom:"#020617",headerTop:"#1e1b4b",headerBottom:"#020617",footerTop:"#020617",footerBottom:"#020617",borderGradStart:"rgba(255,255,255,0.05)",borderGradMid:"rgba(255,255,255,0.03)",borderGradEnd:"rgba(255,255,255,0.02)",lineSeparator:"#1e293b",lineVertical:"#1e293b",textDefault:"#f1f5f9",textName:"#f1f5f9",textStatus:"#eab308",textTime:"#94a3b8",textFuel:"#e2e8f0",textPrice:"#ffffff",textControl:"#64748b",textStatistik:"#94a3b8",textOpenTitle:"#eab308",textOpenTime:"#f1f5f9",statusOpenFill:"#065f46",statusOpenStroke:"#10b981",statusOpenText:"#34d399",statusClosedFill:"#7f1d1d",statusClosedStroke:"#991b1b",statusClosedText:"#fee2e2",statistikFill:"rgba(255,255,255,0.05)",statistikStroke:"#334155",statistikText:"#e2e8f0",fuelBenzinStart:"#1e1b4b",fuelBenzinEnd:"#020617",fuelE10Start:"#1e1b4b",fuelE10End:"#020617",fuelDieselStart:"#1e1b4b",fuelDieselEnd:"#020617",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#020617",controlBoxStroke:"#334155",controlBoxText:"#94a3b8"}, floatingGlass:{widgetBgTop:"#F0F9FF",widgetBgBottom:"#F0F9FF",headerTop:"#F0F9FF",headerBottom:"#F0F9FF",footerTop:"#F0F9FF",footerBottom:"#F0F9FF",borderGradStart:"#ffffff",borderGradMid:"#ffffff",borderGradEnd:"#ffffff",lineSeparator:"#bae6fd",lineVertical:"#bae6fd",textDefault:"#0F172A",textName:"#0369A1",textStatus:"#10B981",textTime:"#0369A1",textFuel:"#F0F9FF",textPrice:"#F0F9FF",textControl:"#0369A1",textStatistik:"#0369A1",textOpenTitle:"#075985",textOpenTime:"#0F172A",statusOpenFill:"#d1fae5",statusOpenStroke:"#10b981",statusOpenText:"#065f46",statusClosedFill:"#fee2e2",statusClosedStroke:"#dc2626",statusClosedText:"#b91c1c",statistikFill:"#ffffff",statistikStroke:"#bae6fd",statistikText:"#0369A1",fuelBenzinStart:"#0EA5E9",fuelBenzinEnd:"#0369A1",fuelE10Start:"#0EA5E9",fuelE10End:"#0369A1",fuelDieselStart:"#06B6D4",fuelDieselEnd:"#0369A1",trendUp:"#dc2626",trendDown:"#2563eb",trendStable:"#10b981",controlBoxFill:"#ffffff",controlBoxStroke:"#bae6fd",controlBoxText:"#0369A1"}, liquidChrome:{widgetBgTop:"#4B5563",widgetBgBottom:"#374151",headerTop:"#E5E7EB",headerBottom:"#9CA3AF",footerTop:"#9CA3AF",footerBottom:"#374151",borderGradStart:"rgba(255,255,255,0.25)",borderGradMid:"rgba(255,255,255,0.15)",borderGradEnd:"rgba(255,255,255,0.05)",lineSeparator:"#d1d5db",lineVertical:"#d1d5db",textDefault:"#f9fafb",textName:"#ffffff",textStatus:"#ffffff",textTime:"#e5e7eb",textFuel:"#f3f4f6",textPrice:"#ffffff",textControl:"#d1d5db",textStatistik:"#e5e7eb",textOpenTitle:"#e5e7eb",textOpenTime:"#ffffff",statusOpenFill:"#d1fae5",statusOpenStroke:"#10b981",statusOpenText:"#065f46",statusClosedFill:"#fee2e2",statusClosedStroke:"#dc2626",statusClosedText:"#b91c1c",statistikFill:"rgba(255,255,255,0.05)",statistikStroke:"#9ca3af",statistikText:"#e5e7eb",fuelBenzinStart:"#E5E7EB",fuelBenzinEnd:"#9CA3AF",fuelE10Start:"#E5E7EB",fuelE10End:"#9CA3AF",fuelDieselStart:"#E5E7EB",fuelDieselEnd:"#9CA3AF",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#4B5563",controlBoxStroke:"#9CA3AF",controlBoxText:"#e5e7eb"}, titanCore:{widgetBgTop:"#030712",widgetBgBottom:"#374151",headerTop:"#030712",headerBottom:"#374151",footerTop:"#374151",footerBottom:"#030712",borderGradStart:"rgba(255,255,255,0.1)",borderGradMid:"rgba(255,255,255,0.05)",borderGradEnd:"rgba(255,255,255,0.02)",lineSeparator:"#475569",lineVertical:"#475569",textDefault:"#f1f5f9",textName:"#f1f5f9",textStatus:"#f1f5f9",textTime:"#94a3b8",textFuel:"#cbd5e1",textPrice:"#ffffff",textControl:"#64748b",textStatistik:"#94a3b8",textOpenTitle:"#cbd5e1",textOpenTime:"#f1f5f9",statusOpenFill:"#065f46",statusOpenStroke:"#10b981",statusOpenText:"#34d399",statusClosedFill:"#7f1d1d",statusClosedStroke:"#991b1b",statusClosedText:"#fee2e2",statistikFill:"rgba(255,255,255,0.05)",statistikStroke:"#475569",statistikText:"#94a3b8",fuelBenzinStart:"#374151",fuelBenzinEnd:"#030712",fuelE10Start:"#374151",fuelE10End:"#030712",fuelDieselStart:"#374151",fuelDieselEnd:"#030712",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#030712",controlBoxStroke:"#475569",controlBoxText:"#94a3b8"}, graphiteGrid:{widgetBgTop:"#18181b",widgetBgBottom:"#09090b",headerTop:"#3f3f46",headerBottom:"#18181b",footerTop:"#18181b",footerBottom:"#09090b",borderGradStart:"rgba(255,255,255,0.1)",borderGradMid:"rgba(255,255,255,0.05)",borderGradEnd:"rgba(255,255,255,0.02)",lineSeparator:"#3f3f46",lineVertical:"#3f3f46",textDefault:"#f4f4f5",textName:"#ffffff",textStatus:"#ffffff",textTime:"#a1a1aa",textFuel:"#d4d4d8",textPrice:"#ffffff",textControl:"#71717a",textStatistik:"#a1a1aa",textOpenTitle:"#d4d4d8",textOpenTime:"#f4f4f5",statusOpenFill:"#065f46",statusOpenStroke:"#10b981",statusOpenText:"#34d399",statusClosedFill:"#7f1d1d",statusClosedStroke:"#991b1b",statusClosedText:"#fee2e2",statistikFill:"rgba(255,255,255,0.05)",statistikStroke:"#3f3f46",statistikText:"#a1a1aa",fuelBenzinStart:"#3f3f46",fuelBenzinEnd:"#18181b",fuelE10Start:"#3f3f46",fuelE10End:"#18181b",fuelDieselStart:"#3f3f46",fuelDieselEnd:"#18181b",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#18181b",controlBoxStroke:"#3f3f46",controlBoxText:"#a1a1aa"} }; function getTankstellenTheme() { const preset = getState(TANKSTELLEN_THEME_DP).val; return TANKSTELLEN_THEMES[preset] || TANKSTELLEN_THEMES.midnightBlue; } function createTankstellenSVG({stationName, stationState, distance, lastFetch, lastUpdate, openingHours, priceBenzin, priceE10, priceDiesel, logoUrl, trendBenzin, trendE10, trendDiesel, showStatistik = false, showBorder = true, minimalMode = false}) { const t = getTankstellenTheme(); const uid = `ts_${Math.random().toString(36).slice(2,7)}`; function esc(str) { return String(str) .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """); } const badgeH = minimalMode ? 27 : 18; const badgeY1 = minimalMode ? 0 : 0; const badgeY2 = minimalMode ? 34 : 24; const badgeY3 = minimalMode ? 68 : 48; const priceFont = minimalMode ? 14 : 12; const fuelFont = minimalMode ? 12 : 9.5; function trendIcon(type) { if (type === "steigend") { return `<text x="175" y="${minimalMode ? 17 : 12}" text-anchor="end" fill="${t.trendUp}">↗</text>`; } if (type === "fallend") { return `<text x="175" y="${minimalMode ? 17 : 12}" text-anchor="end" fill="${t.trendDown}">↘</text>`; } return `<path d="M167,${minimalMode ? 14 : 9} L174,${minimalMode ? 14 : 9} M172,${minimalMode ? 12 : 7} L174,${minimalMode ? 14 : 9} L172,${minimalMode ? 16 : 11}" stroke="${t.trendStable}" stroke-width="1.25" fill="none" stroke-linecap="round" stroke-linejoin="round"/>`; } function formatNumber(value) { if (useDotInsteadOfComma) { return value.replace(",", "."); } else { return value.replace(".", ","); } } return ` <svg viewBox="0 0 365 163" width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet"> <style> .txt { font-family:'InterVariable',sans-serif!important; font-feature-settings:"tnum"!important; fill:${t.textDefault}!important; } .txt-name { font-size:15px!important;font-weight:600!important;fill:${t.textName}!important;font-variant: small-caps; } .txt-status { font-size:8px!important;font-weight:600!important;fill:${t.textStatus}!important; } .txt-time { font-size:8px!important;fill:${t.textTime}!important; } .txt-opening-title { font-size:9px!important;font-weight:700!important;fill:${t.textOpenTitle}!important; } .txt-opening-time { font-size:10px!important;fill:${t.textOpenTime}!important; } .txt-fuel { font-size:${fuelFont}px!important; font-weight:700!important; fill:${t.textFuel}!important; } .txt-price { font-family:'Courier New',monospace!important; font-size:${priceFont}px!important; font-weight:700!important; fill:${t.textPrice}!important; } .txt-control { font-size:9px!important; font-weight:600!important; fill:${t.textControl}!important; } .txt-statistik { fill:${t.textStatistik}!important; font-size:8px!important; font-weight:600!important; } .txt-distance { font-size:12px!important; font-weight:600!important; fill:${t.textTime}!important; } </style> <defs> <linearGradient id="${uid}-widgetBg" x1="0" y1="0" x2="0" y2="1"> <stop offset="0%" stop-color="${t.widgetBgTop}" stop-opacity="0.95"/> <stop offset="100%" stop-color="${t.widgetBgBottom}" stop-opacity="0.98"/> </linearGradient> <linearGradient id="${uid}-headerGrad" x1="0" y1="0" x2="0" y2="1"> <stop offset="0%" stop-color="${t.headerTop}" stop-opacity="0.6"/> <stop offset="100%" stop-color="${t.headerBottom}" stop-opacity="0.95"/> </linearGradient> <linearGradient id="${uid}-footerGrad" x1="0" y1="0" x2="0" y2="1"> <stop offset="0%" stop-color="${t.footerTop}" stop-opacity="0.45"/> <stop offset="100%" stop-color="${t.footerBottom}" stop-opacity="0.75"/> </linearGradient> <linearGradient id="${uid}-borderGrad" x1="0" y1="0" x2="1" y2="1"> <stop offset="0%" stop-color="${t.borderGradStart}" stop-opacity="0.35"/> <stop offset="50%" stop-color="${t.borderGradMid}" stop-opacity="0.1"/> <stop offset="100%" stop-color="${t.borderGradEnd}" stop-opacity="0.2"/> </linearGradient> <linearGradient id="${uid}-bgBenzin" x1="0" y1="0" x2="1" y2="0"> <stop offset="0%" stop-color="${t.fuelBenzinStart}"/> <stop offset="100%" stop-color="${t.fuelBenzinEnd}"/> </linearGradient> <linearGradient id="${uid}-bgE10" x1="0" y1="0" x2="1" y2="0"> <stop offset="0%" stop-color="${t.fuelE10Start}"/> <stop offset="100%" stop-color="${t.fuelE10End}"/> </linearGradient> <linearGradient id="${uid}-bgDiesel" x1="0" y1="0" x2="1" y2="0"> <stop offset="0%" stop-color="${t.fuelDieselStart}"/> <stop offset="100%" stop-color="${t.fuelDieselEnd}"/> </linearGradient> </defs> <rect x="1.5" y="1.5" width="362" height="160" fill="url(#${uid}-widgetBg)" stroke="${showBorder ? `url(#${uid}-borderGrad)` : `none`}" stroke-width="1.25"/> <path d="M2.5,2.5H362.5V28H2.5Z" fill="url(#${uid}-headerGrad)"/> <image href="${logoUrl}" x="5" y="5" width="18" height="18" preserveAspectRatio="xMidYMid slice"/> <text class="txt txt-name" x="32" y="19">${esc(stationName)}</text> <g id="geoSymbol" transform="translate(345,7)"> <g transform="translate(0,0) scale(1.0)"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10m0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6" fill="${t.textTime}"/> </g> </g> <g id="geoDistance" transform="translate(287,5)"> <text class="txt txt-distance" x="55" y="14" text-anchor="end">${formatNumber(esc(distance))}</text> </g> <line x1="1.5" y1="28" x2="363.5" y2="28" stroke="${t.lineSeparator}" stroke-width="0.75"/> <g opacity="0.55" transform="translate(0,-2)"> <g transform="translate(15,41)"> <g stroke="#94A3B8" stroke-width="1" fill="none"> <path d="M0,0 A 4,4 0 1,1 4,4" /> <path d="M4,-2 L4,2 L0,2" /> </g> </g> <text class="txt txt-time" x="27" y="44" style="font-size:10px!important">${esc(lastUpdate)}</text> <g transform="translate(206,37)"> <g stroke="#94A3B8" stroke-width="1" fill="none"> <path d="M0,6 L0,0" /> <path d="M-3,3 L0,6 L3,3" /> <path d="M-5,7 L5,7" /> </g> </g> <text class="txt txt-time" x="216" y="44" style="font-size:10px!important">${esc(lastFetch)}</text> </g> <line x1="135" y1="52" x2="135" y2="${minimalMode ? 152 : 133.5}" stroke="${t.lineVertical}" stroke-width="0.75"/> <g transform="translate(12,54)"> <g transform="translate(15,0)"> <rect x="0" y="0" width="80" height="16" rx="3" fill="${stationState.includes("geschlossen") ? t.statusClosedFill : t.statusOpenFill}" stroke="${stationState.includes("geschlossen") ? t.statusClosedStroke : t.statusOpenStroke}" stroke-width="0.75"/> <text class="txt txt-status" x="40" y="11" text-anchor="middle" style="letter-spacing:1px;fill:${stationState.includes("geschlossen") ? t.statusClosedText : t.statusOpenText}">${esc(stationState.toUpperCase())}</text> </g> ${openingHours.map((o,i)=>` <text class="txt txt-opening-time" x="10" y="${32+i*16}">${esc(o.text)}</text> <text class="txt txt-opening-time" x="70" y="${32+i*16}">${esc(o.hours)}</text> `).join("")} </g> <g transform="translate(157,54)"> <g transform="translate(0,${badgeY1})"> <rect x="0" y="0" width="185" height="${badgeH}" rx="5" fill="url(#${uid}-bgBenzin)" stroke="${t.fuelBenzinBorder}" stroke-width="0.75"/> <circle cx="9" cy="${badgeH/2}" r="2.5" fill="#318CFF"/> <text class="txt txt-fuel" x="20" y="${badgeH/2 + (minimalMode ? 4.5 : 3.5)}">Benzin</text> <text class="txt txt-price" x="155" y="${badgeH/2+4.5}" text-anchor="end">${formatNumber(esc(priceBenzin.slice(0,-1)))}<tspan dy="-1">${esc(priceBenzin.slice(-1))}</tspan></text> ${trendIcon(trendBenzin)} </g> <g transform="translate(0,${badgeY2})"> <rect x="0" y="0" width="185" height="${badgeH}" rx="5" fill="url(#${uid}-bgE10)" stroke="${t.fuelE10Border}" stroke-width="0.75"/> <circle cx="9" cy="${badgeH/2}" r="2.5" fill="#4BBF31"/> <text class="txt txt-fuel" x="20" y="${badgeH/2 + (minimalMode ? 4.5 : 3.5)}">E10</text> <text class="txt txt-price" x="155" y="${badgeH/2+4.5}" text-anchor="end">${formatNumber(esc(priceE10.slice(0,-1)))}<tspan dy="-1">${esc(priceE10.slice(-1))}</tspan></text> ${trendIcon(trendE10)} </g> <g transform="translate(0,${badgeY3})"> <rect x="0" y="0" width="185" height="${badgeH}" rx="5" fill="url(#${uid}-bgDiesel)" stroke="${t.fuelDieselBorder}" stroke-width="0.75"/> <circle cx="9" cy="${badgeH/2}" r="2.5" fill="#E33232"/> <text class="txt txt-fuel" x="20" y="${badgeH/2 + (minimalMode ? 4.5 : 3.5)}">Diesel</text> <text class="txt txt-price" x="155" y="${badgeH/2+4.5}" text-anchor="end">${formatNumber(esc(priceDiesel.slice(0,-1)))}<tspan dy="-1">${esc(priceDiesel.slice(-1))}</tspan></text> ${trendIcon(trendDiesel)} </g> </g> ${minimalMode || !t.footerTop ? `` : `<path d="M1.5,133.5H363.5V161.5H1.5Z" fill="url(#${uid}-footerGrad)" stroke="${t.footerStroke || 'none'}" stroke-width="0.75"/>`} ${(!minimalMode && showStatistik) ? ` <g transform="translate(285,140)"> <rect x="0" y="0" width="70" height="16" rx="3" fill="${t.statistikFill}" stroke="${t.statistikStroke}" stroke-width="0.75"/> <text class="txt-statistik" x="35" y="11" text-anchor="middle">${esc("STATISTIK")}</text> </g> ` : ``} ${minimalMode ? `` : ` <g transform="translate(15,140.5)"> <rect x="0" y="0" width="15" height="15" rx="2" fill="${t.controlBoxFill}" stroke="${t.controlBoxStroke}" stroke-width="0.75"/> <text class="txt txt-control" x="20" y="11" fill="${t.controlBoxText}">${esc("NUR ABRUF")}</text> </g> <g transform="translate(100,140.5)"> <rect x="0" y="0" width="15" height="15" rx="2" fill="${t.controlBoxFill}" stroke="${t.controlBoxStroke}" stroke-width="0.75"/> <text class="txt txt-control" x="20" y="11" fill="${t.controlBoxText}">${esc("FAVORIT")}</text> </g> <g transform="translate(185,140.5)"> <rect x="0" y="0" width="15" height="15" rx="2" fill="${t.controlBoxFill}" stroke="${t.controlBoxStroke}" stroke-width="0.75"/> <text class="txt txt-control" x="20" y="11" fill="${t.controlBoxText}">${esc("AKTIV")}</text> </g> `} </svg> `; } async function TankRenderer() { const tasks = stations.filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false).map(async (s) => { const path = `${base}.${s.id}`; const svg = createTankstellenSVG({ stationName: getState(`${path}.name`)?.val, stationState: getState(`${path}.status`)?.val, distance: getState(`${path}.distance`)?.val + "Km", lastFetch: "Abruf: " + getState(`${path}.lastChecked`)?.val, lastUpdate: "Update: " + getState(`${path}.lastPriceUpdate`)?.val, openingHours: JSON.parse(getState(`${path}.openingTimes`)?.val), priceBenzin: getState(`${path}.benzin_str`)?.val, priceE10: getState(`${path}.e10_str`)?.val, priceDiesel: getState(`${path}.diesel_str`)?.val, logoUrl: getState(`${path}.image`)?.val, trendBenzin: getState(`${path}.aspects.benzin.trend_24h_proj`)?.val, trendE10: getState(`${path}.aspects.e10.trend_24h_proj`)?.val, trendDiesel: getState(`${path}.aspects.diesel.trend_24h_proj`)?.val, showStatistik: VisibleStatistik, showBorder: VisibleBorder, minimalMode: minimalModeActiv }); setStateIfChanged(`${path}.svg`, svg); }); await Promise.allSettled(tasks); } on({ id: TANKSTELLEN_THEME_DP, change: "ne" }, obj => { TankRenderer(); });Wenn alles richtig gemacht wurde, trudeln die Daten regelmäßig ein. Trend und Prognosen werden nicht sofort "brauchbare" Daten liefern. Es muss einfach etwas Zeit vertreichen. Ich habe bei mir alles in VIS1 visualisiert, sollte aber auch mit anderen Systemen funktionieren.
Viel Spaß und gutes Gelingen mit diesem Skript.
Ro75.
Neuerungen Version 1.1.0 - 21.06.2026
-
Dynamische Generierung und automatische Aktualisierung von SVG-Cards pro Tankstelle bei Wertänderung. Der Datenpunkt lautet "svg" und kann in VIS 1 via "String (unescaped)" dargestellt werden.

-
Zahlreiche Theme zur Ausahl. Der Datenpunkt lautet "theme" im Ordner "config". Bei Änderung erfolgt die automatische Neugenerierung.
-
Hinweise zum Update in Post #43.
Korrektur Version 1.1.1 - 22.06.2026
- Theme "Transparent" korrigiert.
- Hinweise zum Update in Post #47.
-
Mit welchen Widget visualisierst du die Werte? Hast du ein Beispiel? Das Script sieht vielversprechend aus.
@MartyBr die Basic-Widgets und ich nutze Json von Material-Design (vis-Materialdesign 0.5.94)
Hier mal eine Karte (Esso):
[{"tpl":"tplImage","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"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","refreshInterval":"0","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,"src":"/vis.0/tanken/esso.png","stretch":true},"style":{"left":"789px","top":"295px","width":"57px","height":"70px","z-index":"3"},"widgetSet":"basic"},{"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":"{0_userdata.0.tankerkoenig.c21f9238-c5e6-4a5b-985e-89d406166b2d.name}","title_color":"#ffffff","title_top":"2","title_left":"5","header_height":"23","header_color":"{alias.0.TK.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,"title_back":"transparent","name":"Rahmen","locked":false},"style":{"left":"779px","top":"274px","width":"361px","height":"165px","z-index":1,"border-width":"1px","border-style":"solid","border-color":"rgba(255, 255, 255, 0.2)","border-radius":"10px","opacity":"{0_userdata.0.HardwareInfo.DashBoard.Opacity}%","font-family":"RobotoCondensed-Regular","font-style":"normal","font-weight":"lighter","font-variant":"small-caps","font-size":"medium","text-shadow":"3px 3px 4px #000","box-shadow":"15px 18px 62px 0px rgba(0, 0, 0, 0.35)","background":"#202020","background-color":"#000000"},"widgetSet":"basic"},{"tpl":"tplVis-materialdesign-Icon-Button-State-Multi","data":{"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,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","countOids":"1","vibrateOnMobilDevices":"50","delayInMs0":"0","delayInMs1":"0","image":"chart-areaspline","imageColor":"#ffffff","colorBgFalse":"{alias.0.Switche.Tankstellen.9}","colorPress":"{alias.0.Switche.Tankstellen.9}","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,"g_lock":false,"autoLockAfter":"10","lockIconTop":"45","lockIconLeft":"55","lockIconSize":"20","lockIconColor":"#mdwTheme:vis-materialdesign.0.colors.button.icon.lock_icon","lockIconBackground":"#mdwTheme:vis-materialdesign.0.colors.button.icon.lock_icon_background","lockBackgroundSizeFactor":"1","lockFilterGrayscale":"30","oid0":"0_userdata.0.tankerkoenig.Statistik_Switch","value0":"9","oid1":"0_userdata.0.tankerkoenig.Grafana","value1":"http://192.168.10.99:3000/d-solo/bfcb8097-7090-45f9-84a3-44d67b2faea1/tanken?orgId=1&refresh=15m&panelId=9","clickSoundVolume":"0.5","g_buttonOids_§2":false,"delayInMs2":"0","g_buttonOids_§3":false,"delayInMs3":"0","g_buttonOids_§4":false,"delayInMs4":"0"},"style":{"left":"1078px","top":"374px","z-index":"4","border-style":"solid","border-radius":"","border-width":"2px","width":"50px","height":"50px","box-shadow":"3px 3px 8px 1px rgba(255, 255, 255, 0.65)"},"widgetSet":"materialdesign"},{"tpl":"tplValueString","data":{"oid":"0_userdata.0.tankerkoenig.c21f9238-c5e6-4a5b-985e-89d406166b2d.status","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","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,"html_prepend":""},"style":{"left":"1065px","top":"279px","color":"rgba(255,255,255,0.8)","z-index":"7","width":"64px","height":"14px","text-align":"right","text-shadow":"3px 3px 4px #000","font-family":"RobotoCondensed-Regular","font-style":"normal","font-variant":"normal","font-weight":"lighter","font-size":"small","line-height":"1"},"widgetSet":"basic"},{"tpl":"tplVis-materialdesign-Table","data":{"oid":"0_userdata.0.tankerkoenig.c21f9238-c5e6-4a5b-985e-89d406166b2d.openingTimes","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":"1","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(255,255,255,0.25)","showColumn0":"true","colType0":"text","textAlign0":"left","colTextSize0":"12","fontFamily0":"RobotoCondensed-Regular","showColumn1":"true","colType1":"text","textAlign1":"right","colTextSize1":"12","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":"","showColumn3":false,"colType3":"text","textAlign3":"right","colTextSize3":"12","fontFamily3":"RobotoCondensed-Regular","showColumn4":"true","colType4":"text","textAlign4":"right","colTextSize4":"#mdwTheme:vis-materialdesign.0.fontSizes.table.row","fontFamily4":"#mdwTheme:vis-materialdesign.0.fonts.table.row","imageSize0":"","label0":" ","colNoWrap1":true,"columnWidth0":"40","colNoWrap0":true,"fixedHeader":true,"columnWidth1":"30","rowHeight":"19","padding_left0":"5","columnWidth3":"","headerRowHeight":"0","visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","imageSize1":"","suffix3":" €","debug":false,"g_columnLayout_§2":false,"showColumn2":"true","colType2":"text","textAlign2":"center","colTextSize2":"#mdwTheme:vis-materialdesign.0.fontSizes.table.row","fontFamily2":"#mdwTheme:vis-materialdesign.0.fonts.table.row"},"style":{"left":"782px","top":"359px","width":"118px","height":"78px","z-index":"8","text-shadow":"3px 3px 4px #000","font-family":"RobotoCondensed-Regular","font-style":"normal","font-variant":"normal","font-weight":"lighter","font-size":""},"widgetSet":"materialdesign"},{"tpl":"tplVis-materialdesign-Table","data":{"oid":"0_userdata.0.tankerkoenig.c21f9238-c5e6-4a5b-985e-89d406166b2d.prices","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":"2","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(255,255,255,0.25)","showColumn0":"true","colType0":"image","textAlign0":"left","colTextSize0":"12","fontFamily0":"RobotoCondensed-Regular","showColumn1":"true","colType1":"text","textAlign1":"left","colTextSize1":"15","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":"","showColumn3":false,"colType3":"text","textAlign3":"right","colTextSize3":"12","fontFamily3":"RobotoCondensed-Regular","showColumn4":"true","colType4":"text","textAlign4":"right","colTextSize4":"#mdwTheme:vis-materialdesign.0.fontSizes.table.row","fontFamily4":"#mdwTheme:vis-materialdesign.0.fonts.table.row","imageSize0":"20","label0":" ","colNoWrap1":true,"columnWidth0":"35","colNoWrap0":true,"fixedHeader":true,"columnWidth1":"65","rowHeight":"32","padding_left0":"5","columnWidth3":"","headerRowHeight":"0","visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","imageSize1":"","suffix3":" €","debug":false,"g_columnLayout_§2":true,"showColumn2":"true","colType2":"text","textAlign2":"right","colTextSize2":"15","fontFamily2":"RobotoCondensed-Regular"},"style":{"left":"902px","top":"338px","width":"165px","height":"105px","z-index":"8","text-shadow":"3px 3px 4px #000","font-family":"RobotoCondensed-Regular","font-style":"normal","font-variant":"normal","font-weight":"lighter","font-size":""},"widgetSet":"materialdesign"},{"tpl":"tplVis-materialdesign-CheckBox","data":{"oid":"0_userdata.0.tankerkoenig.c21f9238-c5e6-4a5b-985e-89d406166b2d.enabled","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","toggleType":"boolean","stateIfNotTrueValue":"on","vibrateOnMobilDevices":"50","labelPosition":"right","labelClickActive":true,"valueFontFamily":"RobotoCondensed-Regular","valueFontSize":"15","colorCheckBox":"rgba(31, 97, 196, 0.25)","colorCheckBoxBorder":"rgba(31, 97, 196, 0.25)","colorCheckBoxHover":"#mdwTheme:vis-materialdesign.0.colors.checkbox.hover","labelColorFalse":"rgba(255,255,255,0.8)","labelColorTrue":"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,"valueOff":"false","valueOn":"true","labelFalse":"inaktiv","labelTrue":"aktiv","g_lock":false,"autoLockAfter":"10","lockIconTop":"5","lockIconLeft":"5","lockIconColor":"#mdwTheme:vis-materialdesign.0.colors.checkbox.lock_icon","lockFilterGrayscale":"30","clickSoundVolume":"0.5","generateHtmlControl":"true"},"style":{"left":"1062px","top":"321px","width":"76px","height":"20px","z-index":"10","text-shadow":"3px 3px 4px #000"},"widgetSet":"materialdesign"},{"tpl":"tplVis-materialdesign-CheckBox","data":{"oid":"0_userdata.0.tankerkoenig.c21f9238-c5e6-4a5b-985e-89d406166b2d.dataonly","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","toggleType":"boolean","stateIfNotTrueValue":"on","vibrateOnMobilDevices":"50","labelPosition":"right","labelClickActive":true,"valueFontFamily":"RobotoCondensed-Regular","valueFontSize":"14","colorCheckBox":"rgba(31, 97, 196, 0.25)","colorCheckBoxBorder":"rgba(31, 97, 196, 0.25)","colorCheckBoxHover":"#mdwTheme:vis-materialdesign.0.colors.checkbox.hover","labelColorFalse":"rgba(255,255,255,0.8)","labelColorTrue":"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,"valueOff":"false","valueOn":"true","labelFalse":"NUR Abruf","labelTrue":"NUR Abruf","g_lock":false,"autoLockAfter":"10","lockIconTop":"5","lockIconLeft":"5","lockIconColor":"#mdwTheme:vis-materialdesign.0.colors.checkbox.lock_icon","lockFilterGrayscale":"30","clickSoundVolume":"0.5","generateHtmlControl":"true"},"style":{"left":"862px","top":"321px","width":"108px","height":"20px","z-index":"10","text-shadow":"3px 3px 4px #000"},"widgetSet":"materialdesign"},{"tpl":"tplVis-materialdesign-CheckBox","data":{"oid":"0_userdata.0.tankerkoenig.c21f9238-c5e6-4a5b-985e-89d406166b2d.favorite","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","toggleType":"boolean","stateIfNotTrueValue":"on","vibrateOnMobilDevices":"50","labelPosition":"right","labelClickActive":true,"valueFontFamily":"RobotoCondensed-Regular","valueFontSize":"14","colorCheckBox":"rgba(31, 97, 196, 0.25)","colorCheckBoxBorder":"rgba(31, 97, 196, 0.25)","colorCheckBoxHover":"#mdwTheme:vis-materialdesign.0.colors.checkbox.hover","labelColorFalse":"rgba(255,255,255,0.8)","labelColorTrue":"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,"valueOff":"false","valueOn":"true","labelFalse":"Favorit","labelTrue":"Favorit","g_lock":false,"autoLockAfter":"10","lockIconTop":"5","lockIconLeft":"5","lockIconColor":"#mdwTheme:vis-materialdesign.0.colors.checkbox.lock_icon","lockFilterGrayscale":"30","clickSoundVolume":"0.5","generateHtmlControl":"true"},"style":{"left":"972px","top":"321px","width":"88px","height":"20px","z-index":"10","text-shadow":"3px 3px 4px #000"},"widgetSet":"materialdesign"},{"tpl":"tplValueString","data":{"oid":"0_userdata.0.tankerkoenig.c21f9238-c5e6-4a5b-985e-89d406166b2d.lastPriceUpdate","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","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,"html_prepend":"Update: "},"style":{"left":"1007px","top":"301px","z-index":"6","font-family":"RobotoCondensed-Regular","text-shadow":"3px 3px 4px #000","width":"130px","height":"11px","font-style":"normal","font-variant":"normal","font-weight":"lighter","font-size":"11px","color":"rgba(255,255,255,0.8)"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"0_userdata.0.tankerkoenig.c21f9238-c5e6-4a5b-985e-89d406166b2d.lastChecked","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","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,"html_prepend":"Abruf: "},"style":{"left":"862px","top":"301px","z-index":"6","font-family":"RobotoCondensed-Regular","text-shadow":"3px 3px 4px #000","width":"130px","height":"11px","font-style":"normal","font-variant":"normal","font-weight":"lighter","font-size":"11px","color":"rgba(255,255,255,0.8)"},"widgetSet":"basic"}]Ro75.
-
Moin @ro75 , klasse Skript, danke dafür.
Könntest Du noch bitte die Bilder red, green und blue hochladen, danke
Sorry übersehen tanken.zip -
Super, danke! Ich probier's demnächst.
Hinweis: im Bild ganz oben ist der genaue Standort verpixelt (vermutlich wg. Privatsphäre), im Code sind aber hoffentlich dann nicht Deine echten Geodaten ;-)
-
Einleitung
Mir ist bewusst, dass es bereits den offiziellen ioBroker Tankerkönig Adapter (v3.4.0) gibt, der zuverlässig die aktuellen Spritpreise liefert. Mit meinem Extended-Skript möchte ich die Leistung des Adapters keinesfalls schmälern – im Gegenteil: Das Skript versteht sich als Ergänzung, die zusätzliche Funktionen wie Trends, Prognosen und Empfehlungen bereitstellt und die Daten für Visualisierungen und Automatisierungen im Smart Home noch aussagekräftiger macht. Das Skript setzt nicht auf die Daten des Adapters auf. Das Skript ist eine eigenständige Lösung.

Funktionelle Beschreibung
Das Skript bietet neben der Standard-Preisabfrage eine Vielzahl an Features:Preisabfrage & Speicherung für Benzin, E10 und Diesel
Historie & Trendberechnung über 48h, 14 Tage und 90 Tage
24h-Prognose mit Richtungspfeilen und projiziertem Preis
Durchschnitts- & Differenzwerte aller offenen Stationen
Top-3 Ranking nach Preis → Favorit → Entfernung
Handlungsempfehlungen („JETZT TANKEN“, „ABWARTEN“, „NICHT TANKEN“)
Konfigurierbare Schwellenwerte für Preisvorteile und Trends
Unicode-Hochzahlen für typografisch saubere Preisdarstellung
Geodaten & Distanzberechnung: Entfernung zur eigenen Position wird berechnet und in die Logik einbezogen
Favoriten: Stationen können als Favorit markiert werden, was bei Gleichstand den Ausschlag gibt
Stationen aktivieren/deaktivieren: Jede Station lässt sich einzeln steuern, auch „nur Daten abrufen“ ohne Auswertung ist möglich
Öffnungszeiten: Offene/geschlossene Stationen werden berücksichtigt, inkl. Feiertagslogik und Overrides
Reiner Datenabruf: Für Nutzer, die nur Rohdaten wollen, lässt sich die Auswertung pro Station abschalten
Vergleich: Adapter vs. Extended-Skript
Merkmal Tankerkönig Adapter 3.4.0 Extended-Skript Basisfunktion: Preise abrufen ✔️ ✔️ Stationen frei definierbar ✔️ ✔️ Historie ❌ ✔️ (48h, 14d, 90d) Trendberechnung ❌ ✔️ 24h-Prognose ❌ ✔️ Durchschnittspreise ❌ ✔️ Preis-Differenzen ❌ ✔️ Top-3 Ranking ❌ ✔️ Empfehlungen (JETZT/ NICHT TANKEN) ❌ ✔️ Konfigurierbare Schwellenwerte ❌ ✔️ Unicode-Hochzahlen für Preise ❌ ✔️ Visuelle JSON-Ausgaben für VIS ❌ ✔️ Geodaten / Distanzberechnung ❌ ✔️ Favoriten-Logik ❌ ✔️ Stationen aktivieren/deaktivieren ❌ ✔️ Reiner Datenabruf ohne Auswertung ❌ ✔️ Öffnungszeiten inkl. Feiertage ❌ ✔️ Fehler- und Info-Logging Basis Erweiterte Steuerung Besonderheiten
Geodaten: Entfernung zur Tankstelle wird berechnet und in Rankings berücksichtigt.Favoriten: Markierte Stationen haben Vorrang bei gleichen Preisen.
Stationen steuerbar: Jede Station kann einzeln aktiviert, deaktiviert oder auf „nur Daten“ gesetzt werden.
Öffnungszeiten: Berücksichtigung von Öffnungsstatus, Feiertagen und Overrides.
Reiner Datenabruf: Wer nur Rohdaten will, kann die Auswertung pro Station abschalten.
Visuelle JSON-Ausgaben: Alle Ergebnisse (Top-3, Durchschnitt, Empfehlungen) stehen als JSON für VIS oder andere Frontends bereit.
Praxisnähe: Handlungsempfehlungen und Trends sind direkt nutzbar für Automatisierungen.
Typografie: Preise mit Hochzahlen wirken sauberer und sind sofort unterscheidbar.
Manuelle Änderung der Stationsdaten: Nach dem ersten Datenabruf können die Stationsdaten manuell überschrieben, OHNE das diese beim Folgeabruf wieder überschieben werden. Das betrifft Name und Adressdaten.
Datenstruktur:
0_userdata.0.tankerkoenig ├── <stationId> │ ├── benzin (number, €) │ ├── e10 (number, €) │ ├── diesel (number, €) │ ├── benzin_str (string) │ ├── e10_str (string) │ ├── diesel_str (string) │ ├── name (string) │ ├── brand (string) │ ├── street (string) │ ├── postCode (string) │ ├── place (string) │ ├── isOpen (boolean) │ ├── isWholeDay (boolean) │ ├── openingTimes (string JSON) │ ├── overrides (string JSON) │ ├── distance (number, km) │ ├── lastPriceUpdate (string, Datum/Uhrzeit) │ ├── lastChecked (string, Datum/Uhrzeit) │ ├── prices (string JSON) │ ├── image (string, Pfad) │ ├── enabled (boolean) │ ├── dataonly (boolean) │ ├── status (string) │ ├── favorite (boolean) │ ├── svg (string) │ └── aspects │ ├── benzin │ │ ├── trend_48h / trend_48h_icon │ │ ├── trend_14d / trend_14d_icon │ │ ├── trend_90d / trend_90d_icon │ │ ├── trend_24h_proj / trend_24h_proj_icon │ │ ├── trend_24h_proj_price (number, €) │ │ ├── history (string JSON) │ │ └── json (string JSON) │ ├── e10 (analog zu benzin) │ ├── diesel (analog zu benzin) │ └── reset_history (boolean) │ ├── cheapest │ ├── benzin_price / benzin_price_str │ ├── benzin_station / benzin_station_name / benzin_image │ ├── benzin_top3_json │ ├── e10_price / e10_price_str │ ├── e10_station / e10_station_name / e10_image │ ├── e10_top3_json │ ├── diesel_price / diesel_price_str │ ├── diesel_station / diesel_station_name / diesel_image │ ├── diesel_top3_json │ └── cheapest_json (alle zusammen) │ ├── average │ ├── benzin / benzin_str │ ├── e10 / e10_str │ ├── diesel / diesel_str │ └── average_json │ ├── difference │ ├── benzin / e10 / diesel (Preisunterschiede) │ └── prices (JSON mit billigster/teuerster Station) │ ├── recommendation_json (Handlungsempfehlungen) ├── all_stations_full_info (JSON) ├── reset_all_trends (boolean) │ └── config ├── threshold_tanken (€/L unter Durchschnitt) ├── threshold_nicht_tanken (€/L über Durchschnitt) ├── trend_threshold_percent (% vom Durchschnitt) ├── use_superscript (boolean) ├── theme (string) ├── show_trend_symbols (boolean) ├── keep_last_price_if_closed (boolean)Fazit
Der Adapter ist ideal für den schnellen Einstieg. Das Extended-Skript richtet sich an alle, die mehr Kontext, mehr Intelligenz und mehr Kontrolle wollen. Es macht die Tankerkönig-Daten nicht nur sichtbar, sondern wirklich nutzbar – für Visualisierungen, Automatisierungen und smarte Entscheidungen im Alltag.Voraussetzungen
API‑Key: Den API‑Key bekommst du kostenlos auf der offiziellen Tankerkönig‑Seite.
Gehe auf tankerkoenig.de → oben rechts „API‑Key“ auswählen. Formular ausfüllen (Name, E‑Mail). Du erhältst per Mail deinen persönlichen Schlüssel.Der Key ist notwendig, um die API nutzen zu können. Ohne ihn gibt es keine Datenabfragen. Einschränkungen: Die API ist für private Projekte gedacht, nicht für Massendatenabfragen. Empfohlen sind maximal 10 Tankstellen und ein Abfrageintervall von mindestens 5 Minuten. Das Skript ruft bei mir aller 10 Minuten (bitte keine glatten Minuten nehmen) 12 Stationen ab.
Tankstellen‑UUIDs: Jede Tankstelle hat eine eindeutige UUID (Universally Unique Identifier). Über die Tankerkönig‑Webseite: Dort kannst du nach Tankstellen suchen (PLZ oder Ort eingeben). Diese UUIDs trägst du dann im Skrip ein, um genau die gewünschten Stationen abzufragen.
NPM-Modul: Damit die API‑Abfragen zuverlässig funktionieren, muss im JavaScript‑Adapter ein zusätzliches npm‑Modul eingetragen werden, das die HTTP‑Requests mit einem gültigen User‑Agent ausführt. Hintergrund: Die Tankerkönig‑API erwartet, dass jede Anfrage einen User‑Agent‑Header mitliefert. Ohne diesen kann es zu Ablehnungen oder Fehlern kommen.
Vorgehen: Den JavaScript‑Adapter öffnen. Unter „Zusätzliche npm‑Module“ das Modul user-agents eintragen.

Grafiken: Ich habe bereits einige Grafiken von Tankstellen und zusätzliche Grafiken für Auswertungen und Darstellung in VIS beigefügt. Es sind aber nicht alle Tankstellen dabei - da müsst ihr selber aktiv werden.
tanken.zipHINWEIS: Wenn ihr das Skript testen wollt, bitte Adapter und Skript nicht zur selben Zeit laufen lassen! Es besteht die Gefahr den Fehler 503 zu bekommen, ihr kommt sonst in das Ratelimit! Es ist zwar möglich mehr als 10 Stationen einzutragen, allerdings sollte es nicht übertrieben werden. Je mehr Stationen um so größer das Abrufinterval! Bei mir getestet und ohne Probleme 12 Stationen, aller 10 Miinuten.
WAS IST ZU MACHEN?
- API-Key besorgen
- UUIDs der Stationen besorgen
- Code einkopieren und anpassen
const apiKey = ""; // Tankerkoenig API-Schlüssel const base = "0_userdata.0.tankerkoenig"; // kann auch so belassen werden const image_base = "/vis.0/tanken/"; //hier wird der Standort für die Bilder eingetragen const myLocation = { lat: 51.18869225498527, lon: 14.44717724792715 }; // hier eure Geodaten const stations = [ { id: "51d4b70e-a095-1aa0-e100-80009459e03a", image: image_base+"jet.png" }, { id: "9bbf6e47-eafe-4072-a7b1-9bf7fee2ba44", image: image_base+"sb-tank.png" }, { id: "2c0a9194-7b4b-4590-bbae-8db8760598c4", image: image_base+"total.png" }, { id: "0cc33bda-3773-4b47-94d2-41142e9a97ad", image: image_base+"agip.png" }, { id: "0868c839-f0cd-4ceb-a53c-4a6de271b606", image: image_base+"marktkauf.png" }, { id: "53ad9d77-a259-40fc-b868-b79cb77086d8", image: image_base+"aral.png" }, { id: "1b008ee6-78ea-4485-ab1d-7212a393b471", image: image_base+"aral.png" }, { id: "4a92a231-3d68-4928-9155-5d3534583c57", image: image_base+"aral.png" }, { id: "c21f9238-c5e6-4a5b-985e-89d406166b2d", image: image_base+"esso.png" }, { id: "86f037d7-d8f8-4fad-9aac-f256857725f6", image: image_base+"sprint.png" }, { id: "28989f56-fe4c-4785-925d-cc0ee4e574e8", image: image_base+"greenline.png" }, { id: "005056ba-7cb6-1ed2-bceb-b72e2ef04d4a", image: image_base+"star.png" } ]; // hier eure StationenHier jetzt der Code:
// === Tankerkoenig Extended-Script === //Erst-Version 1.0.0 - 14.12.2025 //Version 1.1.1 - 22.06.2026 //Ersteller Ro75. //Voraussetzungen (Version 1.1.1 getestet mit) //NodeJS: 22.x //Javascript-Adapter: 9.0.18 //Admin-Adapter: 7.8.23 //JS-Controller: 7.2.2 // === Einstellungen & Konfiguration === const apiKey = ''; // Tankerkönig API-Schlüssel const base = "0_userdata.0.tankerkoenig"; // Basis-Pfad für alle States const image_base = "/vis.0/tanken/"; // Pfad zu lokalen Bildern const myLocation = { lat: 51.18869225498527, lon: 14.44717724792715 }; // Eigener Standort für Distanzberechnung const ENABLE_LOG = false; // Allgemeine Logs ein/aus const ENABLE_ERROR_LOG = true; // Fehlerlogs ein/aus // === Tankstellenliste === const stations = [ { id: "51d4b70e-a095-1aa0-e100-80009459e03a", image: image_base+"jet.png" }, { id: "9bbf6e47-eafe-4072-a7b1-9bf7fee2ba44", image: image_base+"sb-tank.png" }, { id: "2c0a9194-7b4b-4590-bbae-8db8760598c4", image: image_base+"total.png" }, { id: "0868c839-f0cd-4ceb-a53c-4a6de271b606", image: image_base+"marktkauf.png" }, { id: "53ad9d77-a259-40fc-b868-b79cb77086d8", image: image_base+"aral.png" }, { id: "1b008ee6-78ea-4485-ab1d-7212a393b471", image: image_base+"aral.png" }, { id: "4a92a231-3d68-4928-9155-5d3534583c57", image: image_base+"aral.png" }, { id: "c21f9238-c5e6-4a5b-985e-89d406166b2d", image: image_base+"esso.png" }, { id: "86f037d7-d8f8-4fad-9aac-f256857725f6", image: image_base+"sprint.png" }, { id: "28989f56-fe4c-4785-925d-cc0ee4e574e8", image: image_base+"greenline.png" }, { id: "005056ba-7cb6-1ed2-bceb-b72e2ef04d4a", image: image_base+"star.png" } ]; // ********** AB HIER NICHTS MEHR ÄNDERN !!! **********// const TANKSTELLEN_THEME_DP = `${base}.config.theme`; const UserAgent = require('user-agents'); async function smartCreateState(id, value, options = {}) { if (existsState(id)) return; await createState(id, value, options); } function setIfEmpty(id, value) { const current = getState(id)?.val; if (!current || current === "") { setStateIfChanged(id, value); } } function setStateIfChanged(id, value) { const state = getState(id); if (!state) return; const old = state.val; const isObject = v => v !== null && 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); } function formatDateTime(ts = null) { const d = ts ? new Date(ts) : new Date(); const t = String(d.getDate()).padStart(2, "0"); const m = String(d.getMonth() + 1).padStart(2, "0"); const y = d.getFullYear(); const h = String(d.getHours()).padStart(2, "0"); const mi = String(d.getMinutes()).padStart(2, "0"); const s = String(d.getSeconds()).padStart(2, "0"); return `${t}.${m}.${y} ${h}:${mi}:${s}`; } function sleepMs(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function logInfo(msg) { if (ENABLE_LOG) log(`[Tankerkoenig] ${msg}`,"info"); } function logError(msg) { if (ENABLE_ERROR_LOG) log(`[Tankerkoenig ERROR] ${msg}`,"error"); } function getDistance(lat1, lon1, lat2, lon2) { const R = 6371; const dLat = (lat2 - lat1) * Math.PI / 180; const dLon = (lon2 - lon1) * Math.PI / 180; const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2); return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); } function formatOpeningEntries(list, WEEKDAY_MAP) { return list.map(o => { let rawText = (typeof o.text === "string" && o.text.trim() !== "") ? o.text : "keine Angabe"; let text = rawText .replace(/\btäglich ausser Sonn- und Feiertagen\b/gi, "Mo-Sa") .replace( /\b(Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|Sonntag|Feiertag)\b/g, m => WEEKDAY_MAP[m] || m // Fallback: wenn Map-Eintrag fehlt, Original behalten ); const hours = (o.start && o.end) ? `${o.start.split(':')[0]}-${o.end.split(':')[0]}` : ""; return { text, hours }; }); } async function initStates() { stations.forEach((s) => { const path = `${base}.${s.id}`; ["benzin","e10","diesel"].forEach(fuel => { ["48h","14d","90d"].forEach(win => { smartCreateState(`${path}.aspects.${fuel}.trend_${win}`, "", { name: `Trend ${fuel} ${win}`, type: "string", read: true, write: true }); smartCreateState(`${path}.aspects.${fuel}.trend_${win}_icon`, "", { name: `Trend Icon ${fuel} ${win}`, type: "string", read: true, write: true }); }); smartCreateState(`${path}.aspects.${fuel}.trend_24h_proj`, "", { name: `Trend ${fuel} 24h Prognose`, type: "string", read: true, write: true }); smartCreateState(`${path}.aspects.${fuel}.trend_24h_proj_icon`, "", { name: `Trend Icon ${fuel} 24h Prognose`, type: "string", read: true, write: true }); smartCreateState(`${path}.aspects.${fuel}.trend_24h_proj_price`, 0, { name: `Trend ${fuel} 24h prognostizierter Preis`, type: "number", read: true, write: true, unit: "€" }); smartCreateState(`${path}.aspects.${fuel}.history`, "[]", { name: `Historie ${fuel}`, type: 'string', read: true, write: true }); //dient nur der Datenhaltung für Auswertung smartCreateState(`${path}.aspects.${fuel}.json`, "[]", { name: `JSON ${fuel}`, type: 'string', read: true, write: true }); }); smartCreateState(`${path}.image`, s.image, { name: 'Image', type: 'string', read: true, write: true }); smartCreateState(`${path}.enabled`, true, { name: 'Aktiv', type: 'boolean', read: true, write: true }); smartCreateState(`${path}.dataonly`, false, { name: 'Nur Daten abrufen, nicht auswerten', type: 'boolean', read: true, write: true }); smartCreateState(`${path}.status`, '', { name: 'Status', type: 'string', read: true, write: true }); smartCreateState(`${path}.benzin`, 0, { name: 'Benzin', type: 'number', read: true, write: true, unit: '€' }); smartCreateState(`${path}.e10`, 0, { name: 'E10', type: 'number', read: true, write: true, unit: '€' }); smartCreateState(`${path}.diesel`, 0, { name: 'Diesel', type: 'number', read: true, write: true, unit: '€' }); smartCreateState(`${path}.benzin_str`, '', { name: 'Benzin (String)', type: 'string', read: true, write: true }); smartCreateState(`${path}.e10_str`, '', { name: 'E10 (String)', type: 'string', read: true, write: true }); smartCreateState(`${path}.diesel_str`, '', { name: 'Diesel (String)', type: 'string', read: true, write: true }); smartCreateState(`${path}.name`, '', { name: 'Name', type: 'string', read: true, write: true }); smartCreateState(`${path}.brand`, '', { name: 'Marke', type: 'string', read: true, write: true }); smartCreateState(`${path}.street`, '', { name: 'Straße', type: 'string', read: true, write: true }); smartCreateState(`${path}.postCode`, '', { name: 'Postleitzahl', type: 'string', read: true, write: true }); smartCreateState(`${path}.place`, '', { name: 'Ort', type: 'string', read: true, write: true }); smartCreateState(`${path}.isOpen`, false, { name: 'Ist Offen', type: 'boolean', read: true, write: true }); smartCreateState(`${path}.isWholeDay`, false, { name: 'ganztägig', type: 'boolean', read: true, write: true }); smartCreateState(`${path}.openingTimes`, "[]", { name: 'Öffnungszeiten', type: 'string', read: true, write: true }); smartCreateState(`${path}.overrides`, "[]", { name: 'geänderte Öffnungszeiten', type: 'string', read: true, write: true }); smartCreateState(`${path}.distance`, 0, { name: 'Entfernung', type: 'number', read: true, write: true }); smartCreateState(`${path}.lastPriceUpdate`, formatDateTime(), { name: 'letzte Preisaktualisierung', type: 'string', read: true, write: true }); smartCreateState(`${path}.lastChecked`, formatDateTime(), { name: 'letzter Abruf', type: 'string', read: true, write: true }); smartCreateState(`${path}.prices`, "[]", { name: 'Preis JSON', type: 'string', read: true, write: true }); smartCreateState(`${path}.favorite`, false, { name: 'Favorit', type: 'boolean', read: true, write: true }); smartCreateState(`${path}.svg`, '', { name: 'SVG Image', type: 'string', read: true, write: true }); smartCreateState(`${path}.aspects.reset_history`, false, { name: "History & Trends zurücksetzen", type: "boolean", read: true, write: true }); }); ["benzin", "e10", "diesel"].forEach(fuel => { smartCreateState(`${base}.cheapest.${fuel}_price`, 0, { type: 'number', read: true, write: true, unit: '€' }); smartCreateState(`${base}.cheapest.${fuel}_price_str`, "", { type: 'string', read: true, write: true }); smartCreateState(`${base}.cheapest.${fuel}_station`, '', { type: 'string', read: true, write: true }); smartCreateState(`${base}.cheapest.${fuel}_station_name`, '', { type: 'string', read: true, write: true }); smartCreateState(`${base}.cheapest.${fuel}_image`, '', { type: 'string', read: true, write: true }); smartCreateState(`${base}.cheapest.${fuel}_top3_json`, "[]", { name: `Top 3 ${fuel}`, type: 'string', read: true, write: true }); smartCreateState(`${base}.average.${fuel}`, 0, { name: `${fuel}`, type: 'number', read: true, write: true, unit: '€' }); smartCreateState(`${base}.average.${fuel}_str`, "", { type: 'string', read: true, write: true }); smartCreateState(`${base}.difference.${fuel}`, 0, { name: `${fuel}`, type: 'number', read: true, write: true, unit: '€' }); }); smartCreateState(`${base}.recommendation.benzin_tanken_empfohlen`, false, { name: "Tanken empfohlen Benzin", type: "boolean", read: true, write: true }); smartCreateState(`${base}.recommendation.e10_tanken_empfohlen`, false, { name: "Tanken empfohlen E10", type: "boolean", read: true, write: true }); smartCreateState(`${base}.recommendation.diesel_tanken_empfohlen`, false, { name: "Tanken empfohlen Diesel", type: "boolean", read: true, write: true }); smartCreateState(`${base}.difference.prices`, "[]", { name: 'JSON', type: 'string', read: true, write: true }); smartCreateState(`${base}.cheapest.cheapest_json`, "[]", { name: 'JSON', type: 'string', read: true, write: true }); smartCreateState(`${base}.average.average_json`, "[]", { name: 'JSON', type: 'string', read: true, write: true }); smartCreateState(`${base}.recommendation_json`, "[]", { name: 'Empfehlungen JSON', type: 'string', read: true, write: true }); smartCreateState(`${base}.all_stations_full_info`, "[]", { name: 'JSON', type: 'string', read: true, write: true }); smartCreateState(`${base}.reset_all_trends`, false, { name: "ALLE Trends & Historien zurücksetzen", type: "boolean", read: true, write: true }); smartCreateState(`${base}.config.threshold_tanken`, 0.05, { name: "Schwelle JETZT_TANKEN (€/L unter Durchschnitt)", type: "number", read: true, write: true, unit: "€" }); smartCreateState(`${base}.config.threshold_nicht_tanken`, -0.05, { name: "Schwelle NICHT_TANKEN (€/L über Durchschnitt)", type: "number", read: true, write: true, unit: "€" }); smartCreateState(`${base}.config.trend_threshold_percent`, 0.2, { name: "Trend-Schwelle (% vom Durchschnitt)", type: "number", read: true, write: true, unit: "%" }); smartCreateState(`${base}.config.use_superscript`, true, { name: "Preise mit Hochzahl darstellen", type: "boolean", read: true, write: true }); smartCreateState(`${base}.config.show_trend_symbols`, false, { name: "Trend-/Forecast-Symbole im JSON anzeigen", type: "boolean", read: true, write: true }); smartCreateState(`${base}.config.keep_last_price_if_closed`, true, { name: "Letzten Preis bei geschlossenen Stationen behalten", type: "boolean", read: true, write: true }); smartCreateState(TANKSTELLEN_THEME_DP, "midnightBlue", { type: "mixed", read: true, write: true, name: "Tankstellen Theme", states: { "darkNeon": "Dark Neon", "flatModern": "Flat Modern", "floatingGlass": "Floating Glass", "graphiteGrid": "Graphite Grid", "liquidChrome": "Liquid Chrome", "materialDesign": "Material Design", "midnightBlue": "Midnight Blue", "midnightPanel": "Midnight Panel", "neonMesh": "Neon Mesh", "nightHorizon": "Night Horizon", "obsidianFluid": "Obsidian Fluid", "obsidianGold": "Obsidian Gold", "silverChrome": "Silver Chrome", "spotlightDark": "Spotlight Dark", "titanCore": "Titan Core", "transparent": "Transparent" } }); logInfo("States initialisiert."); } function httpGetAsync(url, options) { return new Promise((resolve, reject) => { httpGet(url, options, (error, response) => { if (error) reject(error); else resolve(response); }); }); } function calculateAveragePrices() { const fuels = ["benzin", "e10", "diesel"]; const averages = {}; fuels.forEach(fuel => { let sum = 0; let count = 0; stations .filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false && getState(`${base}.${s.id}.dataonly`)?.val !== true) .forEach(s => { const path = `${base}.${s.id}`; const isOpen = getState(`${path}.isOpen`)?.val; const price = getState(`${path}.${fuel}`)?.val; if (isOpen && typeof price === "number" && price > 0) { sum += price; count++; } }); averages[fuel] = count > 0 ? parseFloat((sum / count).toFixed(3)) : 0; }); fuels.forEach(fuel => { setStateIfChanged(`${base}.average.${fuel}`, averages[fuel]); setStateIfChanged(`${base}.average.${fuel}_str`, formatPriceUnicode(averages[fuel])); }); logInfo("Durchschnittspreise aktualisiert."); } function calculateFutureTrend(history, futureHours = 24) { const data = history.filter(h => typeof h.price === "number").sort((a,b) => a.ts - b.ts); if (data.length < 2) return { text: "kein Trend", icon: TREND_ICONS.none, projectedPrice: null }; const first = data[0]; const last = data[data.length - 1]; const hoursDiff = (last.ts - first.ts) / (1000 * 3600); if (hoursDiff === 0) return { text: "stabil", icon: TREND_ICONS.flat, projectedPrice: last.price }; const ratePerHour = (last.price - first.price) / hoursDiff; const projectedPrice = last.price + ratePerHour * futureHours; const avg = data.reduce((sum, d) => sum + d.price, 0) / data.length; const TH = avg * 0.002; const diff = projectedPrice - last.price; if (diff > TH) return { text: "steigend", icon: TREND_ICONS.up, projectedPrice }; if (diff < -TH) return { text: "fallend", icon: TREND_ICONS.down, projectedPrice }; return { text: "stabil", icon: TREND_ICONS.flat, projectedPrice }; } function updateAspectsJSON(stationId) { const path = `${base}.${stationId}`; ["benzin","e10","diesel"].forEach(fuel => { const trends = { trend_48h: getState(`${path}.aspects.${fuel}.trend_48h`)?.val || "", trend_14d: getState(`${path}.aspects.${fuel}.trend_14d`)?.val || "", trend_90d: getState(`${path}.aspects.${fuel}.trend_90d`)?.val || "", trend_24h_proj: getState(`${path}.aspects.${fuel}.trend_24h_proj`)?.val || "", trend_24h_proj_price: getState(`${path}.aspects.${fuel}.trend_24h_proj_price`)?.val || 0, trend_48h_icon: getState(`${path}.aspects.${fuel}.trend_48h_icon`)?.val || "", trend_14d_icon: getState(`${path}.aspects.${fuel}.trend_14d_icon`)?.val || "", trend_90d_icon: getState(`${path}.aspects.${fuel}.trend_90d_icon`)?.val || "", trend_24h_proj_icon: getState(`${path}.aspects.${fuel}.trend_24h_proj_icon`)?.val || "" }; setStateIfChanged(`${path}.aspects.${fuel}.json`, JSON.stringify(trends)); }); } const TREND_ICONS = { up: "↑", down: "↓", flat: "→", none: "–" }; const TREND_SYMBOLS = { up: "↑", down: "↓", flat: "→" }; const FORECAST_SYMBOLS = { up: "↗", down: "↘", flat: "→" }; const SUPERSCRIPT = ['⁰','¹','²','³','⁴','⁵','⁶','⁷','⁸','⁹']; function formatPriceUnicode(price) { if (price === null || price === undefined || isNaN(price)) return null; const p = Number(price).toFixed(3); const main = p.slice(0, -1).replace('.', ','); const lastDigit = p.slice(-1); const useSuperscript = getState(`${base}.config.use_superscript`)?.val ?? true; if (useSuperscript) { return main + SUPERSCRIPT[Number(lastDigit)]; } else { return (Number(price).toFixed(2)).replace('.', ','); } } function calculateDifferencesStates() { const fuels = [ { key: "benzin", label: "Benzin" }, { key: "e10", label: "E10" }, { key: "diesel", label: "Diesel" } ]; const openStations = stations.filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false && getState(`${base}.${s.id}.isOpen`)?.val === true && getState(`${base}.${s.id}.dataonly`)?.val !== true); const priceDiffArray = fuels.map(fuel => { const prices = openStations .map(s => { const price = getState(`${base}.${s.id}.${fuel.key}`)?.val; return (typeof price === "number" && price > 0) ? { name: getState(`${base}.${s.id}.name`)?.val || "", price, image: getState(`${base}.${s.id}.image`)?.val || "" } : null; }) .filter(Boolean); let diff = 0; let cheapestName = "---"; let teuersteName = "---"; let billigste_image = ""; let teuerste_image = ""; if (prices.length > 0) { const cheapest = prices.reduce((a, b) => a.price < b.price ? a : b); const expensive = prices.reduce((a, b) => a.price > b.price ? a : b); diff = parseFloat((expensive.price - cheapest.price).toFixed(2)); billigste_image = cheapest.image; teuerste_image = expensive.image; cheapestName = cheapest.name + " (" + cheapest.price.toFixed(2) + " €)"; teuersteName = expensive.name + " (" + expensive.price.toFixed(2) + " €)"; } setStateIfChanged(`${base}.difference.${fuel.key}`, diff); return {text: fuel.label, billigste_image, billigste: cheapestName, teuerste_image, teuerste: teuersteName, differenz: diff.toFixed(2)}; }); setStateIfChanged(`${base}.difference.prices`, JSON.stringify(priceDiffArray)); logInfo("Differenzen und Preise als JSON unter `${base}.difference` aktualisiert."); } function saveCheapestJSON() { const fuels = [ { key: "benzin", label: "Benzin", img: image_base+"blue.png" }, { key: "e10", label: "E10", img: image_base+"green.png" }, { key: "diesel", label: "Diesel", img: image_base+"red.png" } ]; const json = fuels.map(fuel => { const stationId = getState(`${base}.cheapest.${fuel.key}_station`)?.val; if (!stationId) { return {col_1: fuel.img, col_2: fuel.label, col_3: "", col_4: "---", col_5: "---"}; } const img = getState(`${base}.${stationId}.image`)?.val || ""; const isFav = getState(`${base}.${stationId}.favorite`)?.val === true; const brand = (getState(`${base}.${stationId}.name`)?.val || "") + (isFav ? " ★" : ""); const price = getState(`${base}.${stationId}.${fuel.key}`)?.val ?? null; return {col_1: fuel.img, col_2: fuel.label, col_3: img, col_4: brand.trim(), col_5: formatPriceUnicode(price)}; }); setStateIfChanged(`${base}.cheapest.cheapest_json`, JSON.stringify(json)); } function saveTop3JSON() { const fuels = ["benzin","e10","diesel"]; fuels.forEach(fuel => { const stationsWithPrices = stations.filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false && getState(`${base}.${s.id}.isOpen`)?.val === true && getState(`${base}.${s.id}.dataonly`)?.val !== true) .map(s => { const isFav = getState(`${base}.${s.id}.favorite`)?.val === true; return { name: getState(`${base}.${s.id}.name`)?.val || "", favorite: isFav, price: getState(`${base}.${s.id}.${fuel}`)?.val || 0, image: getState(`${base}.${s.id}.image`)?.val || "", distance: getState(`${base}.${s.id}.distance`)?.val || 0 }; }) .filter(s => typeof s.price === "number" && s.price > 0); stationsWithPrices.sort((a, b) => { if (a.price !== b.price) return a.price - b.price; if (a.favorite !== b.favorite) return a.favorite ? -1 : 1; return a.distance - b.distance; }); const top3 = stationsWithPrices.slice(0,3).map((s, index) => ({ rank: index + 1, image: s.image, name: s.name + (s.favorite ? " ★" : ""), price: formatPriceUnicode(s.price), // <-- hier Hochzahlen verwenden distance: parseFloat(s.distance.toFixed(2)) })); setStateIfChanged(`${base}.cheapest.${fuel}_top3_json`, JSON.stringify(top3)); }); } function saveAverageJSON() { const fuels = ["benzin","e10","diesel"]; const json = fuels.map(fuel => { const avg = getState(`${base}.average.${fuel}`)?.val ?? 0; return {fuel: fuel, price: formatPriceUnicode(avg)}; }); setStateIfChanged(`${base}.average.average_json`, JSON.stringify(json)); } function appendHistory(path, fuel, price) { if (typeof price !== "number" || price <= 0) return; const now = Date.now(); const cutoff90d = now - 90 * 24 * 3600 * 1000; // 90 Tage const cutoff48h = now - 48 * 3600 * 1000; // 48 Stunden const historyStr = getState(`${path}.aspects.${fuel}.history`)?.val || "[]"; let history = []; try { history = JSON.parse(historyStr); } catch {} history.push({ ts: now, price }); history = history.filter(h => h.ts >= cutoff90d); const shortTerm = history.filter(h => h.ts >= cutoff48h); const longTerm = history .filter(h => h.ts < cutoff48h) .reduce((acc, cur) => { const hour = Math.floor(cur.ts / (3600*1000)); // Stunde als Bucket if (!acc[hour]) acc[hour] = { ts: cur.ts, price: cur.price, count: 1 }; else { acc[hour].price = (acc[hour].price * acc[hour].count + cur.price) / (acc[hour].count + 1); acc[hour].count++; acc[hour].ts = cur.ts; // letzte Zeit der Stunde } return acc; }, {}); const longTermArray = Object.values(longTerm).map(h => ({ ts: h.ts, price: parseFloat(h.price.toFixed(3)) })); const newHistory = [...longTermArray, ...shortTerm]; setStateIfChanged(`${path}.aspects.${fuel}.history`, JSON.stringify(newHistory)); } function calculateTrend(history, hours) { const cutoff = Date.now() - (hours * 3600 * 1000); const data = history.filter(h => h.ts >= cutoff).sort((a,b) => a.ts - b.ts); if (data.length < 2) return { text: "kein Trend", icon: TREND_ICONS.none }; const first = data[0].price; const last = data[data.length - 1].price; const diff = last - first; const avg = data.reduce((sum,d) => sum+d.price,0) / data.length; const thresholdPercent = getState(`${base}.config.trend_threshold_percent`)?.val ?? 0.2; const TH = avg * (thresholdPercent / 100); if (diff > TH) return { text: "steigend", icon: TREND_ICONS.up }; if (diff < -TH) return { text: "fallend", icon: TREND_ICONS.down }; return { text: "stabil", icon: TREND_ICONS.flat }; } async function updateRecommendations() { const fuels = [ { key: "benzin", label: "BENZIN" }, { key: "e10", label: "E10" }, { key: "diesel", label: "DIESEL" } ]; const recommendations = []; const thresholdTanken = getState(`${base}.config.threshold_tanken`)?.val ?? 0.05; const thresholdNichtTanken = getState(`${base}.config.threshold_nicht_tanken`)?.val ?? -0.05; fuels.forEach(fuel => { const avg = getState(`${base}.average.${fuel.key}`)?.val; const cheapest = getState(`${base}.cheapest.${fuel.key}_price`)?.val; const stationId = getState(`${base}.cheapest.${fuel.key}_station`)?.val; const stationNm = getState(`${base}.cheapest.${fuel.key}_station_name`)?.val; if (typeof avg !== "number" || typeof cheapest !== "number" || !stationId) { return; } const diff = parseFloat((avg - cheapest).toFixed(2)); let action = "ABWARTEN"; let reason = "Kein Preisvorteil"; if (diff >= thresholdTanken) { action = "JETZT_TANKEN"; reason = `${diff.toFixed(2).replace('.', ',')} € unter Durchschnitt`; } else if (diff <= thresholdNichtTanken) { action = "NICHT_TANKEN"; reason = `${Math.abs(diff).toFixed(2).replace('.', ',')} € über Durchschnitt`; } const tanken_empfohlen = (action === "JETZT_TANKEN"); setStateIfChanged(`${base}.recommendation.${fuel.key}_tanken_empfohlen`, tanken_empfohlen); const trend48h = getState(`${base}.${stationId}.aspects.${fuel.key}.trend_48h_icon`)?.val || "–"; const trend14d = getState(`${base}.${stationId}.aspects.${fuel.key}.trend_14d_icon`)?.val || "–"; const trend90d = getState(`${base}.${stationId}.aspects.${fuel.key}.trend_90d_icon`)?.val || "–"; const projDir = getState(`${base}.${stationId}.aspects.${fuel.key}.trend_24h_proj_icon`)?.val || "–"; const projPrice = getState(`${base}.${stationId}.aspects.${fuel.key}.trend_24h_proj_price`)?.val || 0; recommendations.push({ fuel: fuel.label, action, reason, trend_48h: trend48h, trend_14d: trend14d, trend_90d: trend90d, forecast_dir: projDir, forecast_price: projPrice > 0 ? parseFloat(projPrice.toFixed(2)) : null, best_station_name: stationNm || "", best_station_price: formatPriceUnicode(cheapest) }); }); setStateIfChanged(`${base}.recommendation_json`, JSON.stringify(recommendations)); } async function loadData() { logInfo("Starte Datenabfrage ..."); function considerCheapest(cheapest, fuelKey, newPrice, dist, stationId, image, isFav) { if (typeof newPrice !== 'number') return; const current = cheapest[fuelKey]; if (!current) { cheapest[fuelKey] = { price: newPrice, station: stationId, image: image, distance: dist, favorite: !!isFav }; return; } if (newPrice < current.price) { cheapest[fuelKey] = { price: newPrice, station: stationId, image: image, distance: dist, favorite: !!isFav }; return; } if (newPrice === current.price) { const currentFav = !!current.favorite; if (isFav && !currentFav) { cheapest[fuelKey] = { price: newPrice, station: stationId, image: image, distance: dist, favorite: !!isFav }; return; } if ((isFav === currentFav) && dist < current.distance) { cheapest[fuelKey] = { price: newPrice, station: stationId, image: image, distance: dist, favorite: !!isFav }; return; } } } const listCleaner = (entry = '') => entry .toLowerCase() .split(' ') .map(word => word.replace(/oe/g, 'ö') .replace(/ae/g, 'ä') .replace(/ue/g, 'ü') .replace(/ss/g, 'ß') ) .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(' '); const cheapest = { benzin: null, e10: null, diesel: null }; const tasks = stations .filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false) .map(async (s) => { const url = `https://creativecommons.tankerkoenig.de/json/detail.php?id=${s.id}&apikey=${apiKey}`; try { const dynamicUA = new UserAgent().toString(); logInfo(`Abruf für Station ${s.id}`); const response = await httpGetAsync(url, {timeout: 15000, headers: { "User-Agent": dynamicUA }}); if (!response || response.statusCode !== 200) { logError(`HTTP Error Station ${s.id}: ${response?.statusCode}`); return; } const body = typeof response.data === "string" ? JSON.parse(response.data) : response.data; if (!body || !body.station) return; const p = body.station; const path = `${base}.${s.id}`; setStateIfChanged(`${path}.status`, p.isOpen ? "geöffnet" : "geschlossen"); setStateIfChanged(`${path}.image`, s.image); setIfEmpty(`${path}.name`, p.name); setIfEmpty(`${path}.brand`, p.brand); const streetWithHouse = p.houseNumber && p.houseNumber.trim() !== "" ? `${p.street} ${p.houseNumber}` : p.street; setIfEmpty(`${path}.street`, listCleaner(streetWithHouse)); setIfEmpty(`${path}.place`, listCleaner(p.place)); setIfEmpty(`${path}.postCode`, p.postCode ? p.postCode.toString().padStart(5, "0") : ""); setStateIfChanged(`${path}.isOpen`, p.isOpen); setStateIfChanged(`${path}.isWholeDay`, p.wholeDay); const WEEKDAY_MAP = { "Montag": "Mo", "Dienstag": "Di", "Mittwoch": "Mi", "Donnerstag": "Do", "Freitag": "Fr", "Samstag": "Sa", "Sonntag": "So", "Feiertag": "Ft" }; let rawOpeningTimes; if (p.wholeDay) { rawOpeningTimes = [{ text: "Mo-So", start: "00:00:00", end: "24:00:00" }]; } else { if (Array.isArray(p.openingTimes)) { rawOpeningTimes = p.openingTimes; } else if (typeof p.openingTimes === "string") { try { rawOpeningTimes = JSON.parse(p.openingTimes); } catch { rawOpeningTimes = []; } } else { rawOpeningTimes = []; } } const formattedOpening = formatOpeningEntries(rawOpeningTimes, WEEKDAY_MAP); setStateIfChanged(`${path}.openingTimes`, JSON.stringify(formattedOpening)); let rawOverrides; if (Array.isArray(p.overrides)) { rawOverrides = p.overrides; } else if (typeof p.overrides === "string") { try { rawOverrides = JSON.parse(p.overrides); } catch { rawOverrides = []; } } else { rawOverrides = []; } const formattedOverrides = formatOpeningEntries(rawOverrides, WEEKDAY_MAP); setStateIfChanged(`${path}.overrides`, JSON.stringify(formattedOverrides)); if (p.lat && p.lng) { const distance = getDistance(myLocation.lat, myLocation.lon, p.lat, p.lng); setStateIfChanged(`${path}.distance`, parseFloat(distance.toFixed(2))); } let priceChanged = false; const fuels = [ { api: "e5", dp: "benzin" }, { api: "e10", dp: "e10" }, { api: "diesel", dp: "diesel" } ]; const keepLastPriceIfClosed = getState(`${base}.config.keep_last_price_if_closed`)?.val ?? true; if (p.isOpen) { if (getState(`${path}.benzin`)?.val !== p.e5) { appendHistory(path, "benzin", p.e5); } if (getState(`${path}.e10`)?.val !== p.e10) { appendHistory(path, "e10", p.e10); } if (getState(`${path}.diesel`)?.val !== p.diesel) { appendHistory(path, "diesel", p.diesel); } fuels.forEach(f => { if (typeof p[f.api] === "number") { const oldVal = getState(`${path}.${f.dp}`)?.val; if (oldVal !== p[f.api]) priceChanged = true; setStateIfChanged(`${path}.${f.dp}`, p[f.api]); } }); if (priceChanged) { setStateIfChanged(`${path}.lastPriceUpdate`, formatDateTime()); } setStateIfChanged(`${path}.benzin_str`, formatPriceUnicode(getState(`${path}.benzin`)?.val)); setStateIfChanged(`${path}.e10_str`, formatPriceUnicode(getState(`${path}.e10`)?.val)); setStateIfChanged(`${path}.diesel_str`, formatPriceUnicode(getState(`${path}.diesel`)?.val)); } else if (!keepLastPriceIfClosed) { setStateIfChanged(`${path}.benzin`, 0.0); setStateIfChanged(`${path}.e10`, 0.0); setStateIfChanged(`${path}.diesel`, 0.0); setStateIfChanged(`${path}.benzin_str`, ""); setStateIfChanged(`${path}.e10_str`, ""); setStateIfChanged(`${path}.diesel_str`, ""); } ["benzin","e10","diesel"].forEach(fuel => { const historyStr = getState(`${path}.aspects.${fuel}.history`)?.val || "[]"; let history = []; try { history = JSON.parse(historyStr); } catch {} const trends = { "48h": calculateTrend(history, 48), "14d": calculateTrend(history, 24 * 14), "90d": calculateTrend(history, 24 * 90) }; Object.entries(trends).forEach(([win, result]) => { setStateIfChanged(`${path}.aspects.${fuel}.trend_${win}`, result.text); setStateIfChanged(`${path}.aspects.${fuel}.trend_${win}_icon`, result.icon); }); const futureTrend = calculateFutureTrend(history, 24); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj`, futureTrend.text); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_icon`, futureTrend.icon); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_price`, futureTrend.projectedPrice ? parseFloat(futureTrend.projectedPrice.toFixed(3)) : 0); }); function buildPriceEntry(fuelKey, label, image) { let priceStr = formatPriceUnicode(getState(`${path}.${fuelKey}`)?.val ?? null) || ""; const showTrendSymbols = getState(`${base}.config.show_trend_symbols`)?.val ?? false; if (showTrendSymbols && priceStr) { const trendIcon = getState(`${path}.aspects.${fuelKey}.trend_48h_icon`)?.val || TREND_SYMBOLS.flat; const forecastIcon = getState(`${path}.aspects.${fuelKey}.trend_24h_proj_icon`)?.val || FORECAST_SYMBOLS.flat; priceStr = `${priceStr} ${trendIcon} ${forecastIcon}`; } return { image, text: label, price: priceStr }; } const pricesJSON = [ buildPriceEntry("benzin", "Benzin", image_base + "blue.png"), buildPriceEntry("e10", "E10", image_base + "green.png"), buildPriceEntry("diesel", "Diesel", image_base + "red.png") ]; setStateIfChanged(`${path}.prices`, JSON.stringify(pricesJSON)); setStateIfChanged(`${path}.lastChecked`, formatDateTime()); const dist = getState(`${path}.distance`)?.val || 0; const isFav = getState(`${path}.favorite`)?.val === true; if (p.isOpen && getState(`${base}.${s.id}.dataonly`)?.val !== true) { considerCheapest(cheapest, 'benzin', p.e5, dist, s.id, s.image, isFav); considerCheapest(cheapest, 'e10', p.e10, dist, s.id, s.image, isFav); considerCheapest(cheapest, 'diesel', p.diesel, dist, s.id, s.image, isFav); } updateAspectsJSON(s.id); } catch (error) { logError(`Fehler bei Station ${s.id}: ${error}`); } }); await Promise.allSettled(tasks); logInfo("Auswertung abgeschlossen."); ["benzin", "e10", "diesel"].forEach(fuel => { if (cheapest[fuel]) { const stationId = cheapest[fuel].station; const stationName = getState(`${base}.${stationId}.name`)?.val || ""; setStateIfChanged(`${base}.cheapest.${fuel}_price`, cheapest[fuel].price); setStateIfChanged(`${base}.cheapest.${fuel}_price_str`, formatPriceUnicode(cheapest[fuel].price)); setStateIfChanged(`${base}.cheapest.${fuel}_station`, stationId); // ID bleibt für Pfad-Operationen setStateIfChanged(`${base}.cheapest.${fuel}_station_name`, stationName); setStateIfChanged(`${base}.cheapest.${fuel}_image`, cheapest[fuel].image); } else { setStateIfChanged(`${base}.cheapest.${fuel}_price`, 0); setStateIfChanged(`${base}.cheapest.${fuel}_price_str`, ""); setStateIfChanged(`${base}.cheapest.${fuel}_station`, ""); setStateIfChanged(`${base}.cheapest.${fuel}_station_name`, ""); setStateIfChanged(`${base}.cheapest.${fuel}_image`, ""); } }); saveCheapestJSON(); saveTop3JSON(); calculateAveragePrices(); calculateDifferencesStates(); saveAverageJSON(); const fullInfo = stations.filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false) .map(s => { const path = `${base}.${s.id}`; return { name: getState(`${path}.name`)?.val || "", brand: getState(`${path}.brand`)?.val || "", street: getState(`${path}.street`)?.val || "", postCode: getState(`${path}.postCode`)?.val || "", place: getState(`${path}.place`)?.val || "", distance: getState(`${path}.distance`)?.val || "", image: getState(`${path}.image`)?.val || "", benzin: getState(`${path}.benzin`)?.val ?? null, e10: getState(`${path}.e10`)?.val ?? null, diesel: getState(`${path}.diesel`)?.val ?? null, isOpen: getState(`${path}.isOpen`)?.val ?? false, lastPriceUpdate: getState(`${path}.lastPriceUpdate`)?.val || "", lastChecked: getState(`${path}.lastChecked`)?.val || "" }; }); setStateIfChanged(`${base}.all_stations_full_info`, JSON.stringify(fullInfo)); updateRecommendations(); TankRenderer(); } (async () => { try { if (await internetUndTankerkoenigOK()) { await initStates(); await sleepMs(5000); await loadData(); } } catch (err) { logError("Fehler beim Start: " + err); } })(); schedule('35 7,17,27,37,47,57 * * * *', async() => { try { if (await internetUndTankerkoenigOK()) { await initStates(); await sleepMs(5000); await loadData(); } } catch (err) { logError("Fehler beim Cron-Start: " + err); } }); async function internetUndTankerkoenigOK() { try { const net = await httpGetAsync("https://www.google.com/generate_204", { timeout: 5000 }); if (!net || net.statusCode !== 204) return false; const tk = await httpGetAsync("https://creativecommons.tankerkoenig.de/", { timeout: 5000 }); return (tk && tk.statusCode === 200); } catch { return false; } } stations.forEach(s => { const resetId = `${base}.${s.id}.aspects.reset_history`; on({ id: resetId, change: "ne" }, obj => { if (obj.state.val === true) { const path = `${base}.${s.id}`; ["benzin","e10","diesel"].forEach(fuel => { setStateIfChanged(`${path}.aspects.${fuel}.history`, "[]"); setStateIfChanged(`${path}.aspects.${fuel}.trend_48h`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_14d`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_90d`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_price`, 0); setStateIfChanged(`${path}.aspects.${fuel}.trend_48h_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_14d_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_90d_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_icon`, ""); }); setStateIfChanged(resetId, false); } }); }); on({ id: `${base}.reset_all_trends`, change: "ne" }, obj => { if (obj.state.val === true) { stations.forEach(s => { const path = `${base}.${s.id}`; ["benzin","e10","diesel"].forEach(fuel => { setStateIfChanged(`${path}.aspects.${fuel}.history`, "[]"); setStateIfChanged(`${path}.aspects.${fuel}.trend_48h`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_14d`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_90d`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_price`, 0); setStateIfChanged(`${path}.aspects.${fuel}.trend_48h_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_14d_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_90d_icon`, ""); setStateIfChanged(`${path}.aspects.${fuel}.trend_24h_proj_icon`, ""); }); }); setStateIfChanged(`${base}.reset_all_trends`, false); } }); // **** AB HIER DER SVG RENDERER MIT THEMEN-KONFIG **** const VisibleStatistik = true; // sichtbarkeit Statistik‑Badge inklusive Text const VisibleBorder = true; // Sichtbarkeit Rahmen / Border der SVG const minimalModeActiv = false; // Minimal‑Modus aktiv (ohne Kontrollkästchen, Statistik‑Badge) const useDotInsteadOfComma = true; // false = Komma | true = Punkt const TANKSTELLEN_THEMES = { // widgetBgTop = Farbe Widget-Hintergrund oben widgetBgBottom = Farbe Widget-Hintergrund unten headerTop = Farbe Header oben // headerBottom = Farbe Header unten footerTop = Farbe Footer oben footerBottom = Farbe Footer unten // footerStroke = Farbe Footer-Rahmen borderGradStart = Farbe Rahmenverlauf Start borderGradMid = Farbe Rahmenverlauf Mitte // borderGradEnd = Farbe Rahmenverlauf Ende lineSeparator = Farbe horizontale Trennlinie lineVertical = Farbe vertikale Trennlinie // textDefault = Farbe Standard-Text textName = Farbe Tankstellenname textStatus = Farbe Status-Text // textTime = Farbe Zeitangaben textFuel = Farbe Kraftstoff-Label textPrice = Farbe Preis-Text // textControl = Farbe Control-Text textStatistik = Farbe Statistik-Text textOpenTitle = Farbe Öffnungszeiten-Titel // textOpenTime = Farbe Öffnungszeiten-Zeiten statusOpenFill = Farbe Hintergrund geöffnet statusOpenStroke = Farbe Rahmen geöffnet // statusOpenText = Farbe Text geöffnet statusClosedFill = Farbe Hintergrund geschlossen statusClosedStroke = Farbe Rahmen geschlossen // statusClosedText = Farbe Text geschlossen statistikFill = Farbe Statistik-Hintergrund statistikStroke = Farbe Statistik-Rahmen // statistikText = Farbe Statistik-Text fuelBenzinStart = Farbe Benzin-Verlauf Start fuelBenzinEnd = Farbe Benzin-Verlauf Ende // fuelE10Start = Farbe E10-Verlauf Start fuelE10End = Farbe E10-Verlauf Ende fuelDieselStart = Farbe Diesel-Verlauf Start // fuelDieselEnd = Farbe Diesel-Verlauf Ende fuelBenzinBorder = Farbe Benzin-Rahmen fuelE10Border = Farbe E10-Rahmen // fuelDieselBorder = Farbe Diesel-Rahmen trendUp = Farbe Trend ↑ trendDown = Farbe Trend ↓ // trendStable = Farbe Trend → controlBoxFill = Farbe Control-Box Hintergrund controlBoxStroke = Farbe Control-Box Rahmen // controlBoxText = Farbe Control-Box Text midnightBlue:{widgetBgTop:"#0F172A",widgetBgBottom:"#020617",headerTop:"#1E293B",headerBottom:"#0F172A",footerTop:"#1E293B",footerBottom:"#0F172A",footerStroke:"#1E293B",borderGradStart:"#3B82F6",borderGradMid:"#1E293B",borderGradEnd:"#3B82F6",lineSeparator:"#334155",lineVertical:"#1E293B",textDefault:"#E2E8F0",textName:"#FFFFFF",textStatus:"#FFFFFF",textTime:"#E2E8F0",textFuel:"#FFFFFF",textPrice:"#FFFFFF",textControl:"#FFFFFF",textStatistik:"#FFFFFF",textOpenTitle:"#E2E8F0",textOpenTime:"#E2E8F0",statusOpenFill:"rgba(5,150,105,0.2)",statusOpenStroke:"#10B981",statusOpenText:"#34D399",statusClosedFill:"rgba(220,38,38,0.2)",statusClosedStroke:"#DC2626",statusClosedText:"#EF4444",statistikFill:"rgba(148,163,184,0.20)",statistikStroke:"#94A3B8",statistikText:"#FFFFFF",fuelBenzinStart:"#1A2742",fuelBenzinEnd:"#0F172A",fuelE10Start:"#0A2A22",fuelE10End:"#0F172A",fuelDieselStart:"#3F1515",fuelDieselEnd:"#0F172A",fuelBenzinBorder:"#1E3A8A",fuelE10Border:"#0F5F3A",fuelDieselBorder:"#8A1E1E",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#020617",controlBoxStroke:"#475569",controlBoxText:"#FFFFFF"}, silverChrome:{widgetBgTop:"#F8FAFC",widgetBgBottom:"#E2E8F0",headerTop:"#CBD5E1",headerBottom:"#94A3B8",footerTop:"#CBD5E1",footerBottom:"#94A3B8",footerStroke:"#64748B",borderGradStart:"#FFFFFF",borderGradMid:"#CBD5E1",borderGradEnd:"#FFFFFF",lineSeparator:"#94A3B8",lineVertical:"#94A3B8",textDefault:"#1E293B",textName:"#0F172A",textStatus:"#FFFFFF",textTime:"#334155",textFuel:"#0F172A",textPrice:"#0F172A",textControl:"#0F172A",textStatistik:"#0F172A",textOpenTitle:"#1E293B",textOpenTime:"#1E293B",statusOpenFill:"rgba(6,95,70,0.25)",statusOpenStroke:"#065F46",statusOpenText:"#065F46",statusClosedFill:"rgba(185,28,28,0.25)",statusClosedStroke:"#991B1B",statusClosedText:"#991B1B",statistikFill:"rgba(255,255,255,0.5)",statistikStroke:"#94A3B8",statistikText:"#1E293B",fuelBenzinStart:"#D9DEE5",fuelBenzinEnd:"#B8C0C9",fuelE10Start:"#D9DEE5",fuelE10End:"#B8C0C9",fuelDieselStart:"#D9DEE5",fuelDieselEnd:"#B8C0C9",fuelBenzinBorder:"#94A3B8",fuelE10Border:"#94A3B8",fuelDieselBorder:"#94A3B8",trendUp:"#B91C1C",trendDown:"#1D4ED8",trendStable:"#065F46",controlBoxFill:"#E5E7EB",controlBoxStroke:"#94A3B8",controlBoxText:"#1E293B"}, transparent:{widgetBgTop:"transparent",widgetBgBottom:"transparent",headerTop:"transparent",headerBottom:"transparent",footerTop:"transparent",footerBottom:"transparent",footerStroke:"#1E293B",borderGradStart:"#3B82F6",borderGradMid:"#1E293B",borderGradEnd:"#3B82F6",lineSeparator:"#334155",lineVertical:"#1E293B",textDefault:"#E2E8F0",textName:"#FFFFFF",textStatus:"#FFFFFF",textTime:"#E2E8F0",textFuel:"#FFFFFF",textPrice:"#FFFFFF",textControl:"#FFFFFF",textStatistik:"#FFFFFF",textOpenTitle:"#E2E8F0",textOpenTime:"#E2E8F0",statusOpenFill:"rgba(5,150,105,0.2)",statusOpenStroke:"#10B981",statusOpenText:"#34D399",statusClosedFill:"rgba(220,38,38,0.2)",statusClosedStroke:"#DC2626",statusClosedText:"#EF4444",statistikFill:"rgba(148,163,184,0.20)",statistikStroke:"#94A3B8",statistikText:"#FFFFFF",fuelBenzinStart:"#1A2742",fuelBenzinEnd:"#0F172A",fuelE10Start:"#0A2A22",fuelE10End:"#0F172A",fuelDieselStart:"#3F1515",fuelDieselEnd:"#0F172A",fuelBenzinBorder:"#1E3A8A",fuelE10Border:"#0F5F3A",fuelDieselBorder:"#8A1E1E",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#020617",controlBoxStroke:"#475569",controlBoxText:"#FFFFFF"}, flatModern:{widgetBgTop:"#FFFFFF",widgetBgBottom:"#F1F5F9",headerTop:"#E2E8F0",headerBottom:"#CBD5E1",footerTop:"#F1F5F9",footerBottom:"#E2E8F0",footerStroke:"#CBD5E1",borderGradStart:"#CBD5E1",borderGradMid:"#E2E8F0",borderGradEnd:"#CBD5E1",lineSeparator:"#CBD5E1",lineVertical:"#CBD5E1",textDefault:"#1E293B",textName:"#0F172A",textStatus:"#1E293B",textTime:"#475569",textFuel:"#1E293B",textPrice:"#0F172A",textControl:"#1E293B",textStatistik:"#1E293B",textOpenTitle:"#475569",textOpenTime:"#1E293B",statusOpenFill:"#DCFCE7",statusOpenStroke:"#22C55E",statusOpenText:"#166534",statusClosedFill:"#FEE2E2",statusClosedStroke:"#EF4444",statusClosedText:"#991B1B",statistikFill:"#F1F5F9",statistikStroke:"#CBD5E1",statistikText:"#1E293B",fuelBenzinStart:"#EFF6FF",fuelBenzinEnd:"#EFF6FF",fuelBenzinBorder:"#BFDBFE",fuelE10Start:"#F0FDF4",fuelE10End:"#F0FDF4",fuelE10Border:"#BBF7D0",fuelDieselStart:"#FEF2F2",fuelDieselEnd:"#FEF2F2",fuelDieselBorder:"#FECACA",trendUp:"#DC2626",trendDown:"#2563EB",trendStable:"#16A34A",controlBoxFill:"#F8FAFC",controlBoxStroke:"#CBD5E1",controlBoxText:"#1E293B"}, darkNeon:{widgetBgTop:"#0A0A0A",widgetBgBottom:"#171717",headerTop:"#171717",headerBottom:"#0A0A0A",footerTop:"#171717",footerBottom:"#0A0A0A",footerStroke:"#262626", borderGradStart:"#06B6D4",borderGradMid:"#000000",borderGradEnd:"#D946EF",lineSeparator:"#262626",lineVertical:"#262626",textDefault:"#A3A3A3",textName:"#FFFFFF",textStatus:"#FFFFFF",textTime:"#737373",textFuel:"#FFFFFF",textPrice:"#FFFFFF",textControl:"#A3A3A3",textStatistik:"#FFFFFF",textOpenTitle:"#A3A3A3",textOpenTime:"#FFFFFF",statusOpenFill:"rgba(34,197,94,0.1)",statusOpenStroke:"#22C55E",statusOpenText:"#4ADE80",statusClosedFill:"rgba(239,68,68,0.1)",statusClosedStroke:"#EF4444",statusClosedText:"#F87171",statistikFill:"#171717",statistikStroke:"#404040",statistikText:"#FFFFFF",fuelBenzinStart:"#1A2742",fuelBenzinEnd:"#000000",fuelE10Start:"#0A2A22",fuelE10End:"#000000",fuelDieselStart:"#3F1515",fuelDieselEnd:"#000000",fuelBenzinBorder:"#1E3A8A",fuelE10Border:"#0F5F3A",fuelDieselBorder:"#8A1E1E",trendUp:"#F43F5E",trendDown:"#38BDF8",trendStable:"#4ADE80",controlBoxFill:"#000000",controlBoxStroke:"#525252",controlBoxText:"#FFFFFF"}, materialDesign:{widgetBgTop:"#F5F5F5",widgetBgBottom:"#E0E0E0",headerTop:"#EEEEEE",headerBottom:"#E0E0E0",footerTop:"#EEEEEE",footerBottom:"#E0E0E0",footerStroke:"#BDBDBD",borderGradStart:"#E0E0E0",borderGradMid:"#9E9E9E",borderGradEnd:"#E0E0E0",lineSeparator:"#BDBDBD",lineVertical:"#BDBDBD",textDefault:"#424242",textName:"#212121",textStatus:"#212121",textTime:"#616161",textFuel:"#212121",textPrice:"#212121",textControl:"#424242",textStatistik:"#212121",textOpenTitle:"#616161",textOpenTime:"#212121",statusOpenFill:"#C8E6C9",statusOpenStroke:"#4CAF50",statusOpenText:"#2E7D32",statusClosedFill:"#FFCDD2",statusClosedStroke:"#F44336",statusClosedText:"#C62828",statistikFill:"#E0E0E0",statistikStroke:"#9E9E9E",statistikText:"#212121",fuelBenzinStart:"#E3F2FD",fuelBenzinEnd:"#E3F2FD",fuelBenzinBorder:"#2196F3",fuelE10Start:"#E8F5E9",fuelE10End:"#E8F5E9",fuelE10Border:"#4CAF50",fuelDieselStart:"#FFEBEE",fuelDieselEnd:"#FFEBEE",fuelDieselBorder:"#F44336",trendUp:"#D32F2F",trendDown:"#1976D2",trendStable:"#388E3C",controlBoxFill:"#F5F5F5",controlBoxStroke:"#9E9E9E",controlBoxText:"#212121"}, nightHorizon:{widgetBgTop:"#4C1D95",widgetBgBottom:"#991B1B",headerTop:"#2E1065",headerBottom:"#4C1D95",footerTop:"#7F1D1D",footerBottom:"#4C1D95",footerStroke:"#4C1D95",borderGradStart:"#F59E0B",borderGradMid:"#2E1065",borderGradEnd:"#F59E0B",lineSeparator:"rgba(255,255,255,0.2)",lineVertical:"rgba(255,255,255,0.2)",textDefault:"#FEE2E2",textName:"#FFFFFF",textStatus:"#FFFFFF",textTime:"#FDBA74",textFuel:"#FFFFFF",textPrice:"#FFFFFF",textControl:"#FFFFFF",textStatistik:"#FFFFFF",textOpenTitle:"#FDBA74",textOpenTime:"#FEE2E2",statusOpenFill:"rgba(34,197,94,0.3)",statusOpenStroke:"#22C55E",statusOpenText:"#86EFAC",statusClosedFill:"rgba(185,28,28,0.3)",statusClosedStroke:"#B91C1C",statusClosedText:"#FCA5A5",statistikFill:"rgba(255,255,255,0.1)",statistikStroke:"#FDBA74",statistikText:"#FFFFFF",fuelBenzinStart:"#312E81",fuelBenzinEnd:"#1E3A8A",fuelBenzinBorder:"#60A5FA",fuelE10Start:"#064E3B",fuelE10End:"#065F46",fuelE10Border:"#34D399",fuelDieselStart:"#7F1D1D",fuelDieselEnd:"#991B1B",fuelDieselBorder:"#F87171",trendUp:"#F87171",trendDown:"#60A5FA",trendStable:"#34D399",controlBoxFill:"#4C1D95",controlBoxStroke:"#FDBA74",controlBoxText:"#FFFFFF"}, obsidianGold:{widgetBgTop:"#171717",widgetBgBottom:"#0A0A0A",headerTop:"#262626",headerBottom:"#171717",footerTop:"#262626",footerBottom:"#171717",footerStroke:"#404040",borderGradStart:"#D4AF37",borderGradMid:"#171717",borderGradEnd:"#D4AF37",lineSeparator:"#404040",lineVertical:"#404040",textDefault:"#E5E5E5",textName:"#F5F5F5",textStatus:"#D4AF37",textTime:"#A3A3A3",textFuel:"#FFFFFF",textPrice:"#D4AF37",textControl:"#E5E5E5",textStatistik:"#D4AF37",textOpenTitle:"#A3A3A3",textOpenTime:"#E5E5E5",statusOpenFill:"rgba(212,175,55,0.15)",statusOpenStroke:"#D4AF37",statusOpenText:"#D4AF37",statusClosedFill:"rgba(64,64,64,0.3)",statusClosedStroke:"#525252",statusClosedText:"#A3A3A3",statistikFill:"rgba(212,175,55,0.1)",statistikStroke:"#D4AF37",statistikText:"#D4AF37",fuelBenzinStart:"#262626",fuelBenzinEnd:"#171717",fuelBenzinBorder:"#D4AF37",fuelE10Start:"#262626",fuelE10End:"#171717",fuelE10Border:"#D4AF37",fuelDieselStart:"#262626",fuelDieselEnd:"#171717",fuelDieselBorder:"#D4AF37",trendUp:"#D4AF37",trendDown:"#D4AF37",trendStable:"#D4AF37",controlBoxFill:"#171717",controlBoxStroke:"#404040",controlBoxText:"#D4AF37"}, spotlightDark: {widgetBgTop:"#020617", widgetBgBottom:"#020617",headerTop:"#020617", headerBottom:"#020617",footerTop:"#020617", footerBottom:"#020617",borderGradStart:"transparent", borderGradMid:"transparent", borderGradEnd:"transparent",lineSeparator:"#1e293b", lineVertical:"#1e293b",textDefault:"#e2e8f0", textName:"#ffffff", textStatus:"#ffffff",textTime:"#64748b", textFuel:"#94a3b8", textPrice:"#ffffff",textControl:"#64748b", textStatistik:"#64748b",textOpenTitle:"#94a3b8", textOpenTime:"#e2e8f0",statusOpenFill:"rgba(5,150,105,0.2)", statusOpenStroke:"#10b981", statusOpenText:"#34d399",statusClosedFill:"rgba(220,38,38,0.2)", statusClosedStroke:"#dc2626", statusClosedText:"#ef4444",statistikFill:"rgba(255,255,255,0.05)", statistikStroke:"#334155", statistikText:"#e2e8f0",fuelBenzinStart:"#1e293b", fuelBenzinEnd:"#020617",fuelE10Start:"#1e293b", fuelE10End:"#020617",fuelDieselStart:"#1e293b", fuelDieselEnd:"#020617",trendUp:"#ef4444", trendDown:"#3b82f6", trendStable:"#10b981",controlBoxFill:"#020617", controlBoxStroke:"#334155", controlBoxText:"#94a3b8"}, midnightPanel: {widgetBgTop:"#0F172A", widgetBgBottom:"#020617",headerTop:"#0F172A", headerBottom:"#0F172A",footerTop:"#020617", footerBottom:"#020617",borderGradStart:"#1E293B", borderGradMid:"#1E293B", borderGradEnd:"#1E293B",lineSeparator:"#1E293B", lineVertical:"#1E293B",textDefault:"#E2E8F0", textName:"#E2E8F0", textStatus:"#FEE2E2",textTime:"#64748B", textFuel:"#94A3B8", textPrice:"#FFFFFF",textControl:"#475569", textStatistik:"#64748B",textOpenTitle:"#64748B", textOpenTime:"#E2E8F0",statusOpenFill:"#065F46", statusOpenStroke:"#065F46", statusOpenText:"#D1FAE5",statusClosedFill:"#7F1D1D", statusClosedStroke:"#991B1B", statusClosedText:"#FEE2E2",statistikFill:"#020617", statistikStroke:"#1E293B", statistikText:"#64748B",fuelBenzinStart:"#0F172A", fuelBenzinEnd:"#020617",fuelE10Start:"#0F172A", fuelE10End:"#020617",fuelDieselStart:"#0F172A", fuelDieselEnd:"#020617",trendUp:"#B91C1C", trendDown:"#1D4ED8", trendStable:"#10B981",controlBoxFill:"#020617", controlBoxStroke:"#1E293B", controlBoxText:"#64748B"}, neonMesh: {widgetBgTop:"#1e1b4b", widgetBgBottom:"#0f172a",headerTop:"#1e1b4b", headerBottom:"#0f172a",footerTop:"#0f172a", footerBottom:"#0f172a",borderGradStart:"transparent", borderGradMid:"transparent", borderGradEnd:"transparent",lineSeparator:"#334155", lineVertical:"#334155",textDefault:"#f8fafc", textName:"#f8fafc", textStatus:"#f8fafc",textTime:"#94a3b8", textFuel:"#94a3b8", textPrice:"#ffffff",textControl:"#64748b", textStatistik:"#64748b",textOpenTitle:"#94a3b8", textOpenTime:"#f8fafc",statusOpenFill:"rgba(16,185,129,0.25)", statusOpenStroke:"#10b981", statusOpenText:"#34d399",statusClosedFill:"rgba(220,38,38,0.25)", statusClosedStroke:"#dc2626", statusClosedText:"#ef4444",statistikFill:"rgba(255,255,255,0.05)", statistikStroke:"#475569", statistikText:"#94a3b8",fuelBenzinStart:"#4f46e5", fuelBenzinEnd:"#0f172a",fuelE10Start:"#9d174d", fuelE10End:"#0f172a",fuelDieselStart:"#4f46e5", fuelDieselEnd:"#0f172a",trendUp:"#ef4444", trendDown:"#3b82f6", trendStable:"#10b981",controlBoxFill:"#0f172a", controlBoxStroke:"#334155", controlBoxText:"#94a3b8"}, obsidianFluid:{widgetBgTop:"#1e1b4b",widgetBgBottom:"#020617",headerTop:"#1e1b4b",headerBottom:"#020617",footerTop:"#020617",footerBottom:"#020617",borderGradStart:"rgba(255,255,255,0.05)",borderGradMid:"rgba(255,255,255,0.03)",borderGradEnd:"rgba(255,255,255,0.02)",lineSeparator:"#1e293b",lineVertical:"#1e293b",textDefault:"#f1f5f9",textName:"#f1f5f9",textStatus:"#eab308",textTime:"#94a3b8",textFuel:"#e2e8f0",textPrice:"#ffffff",textControl:"#64748b",textStatistik:"#94a3b8",textOpenTitle:"#eab308",textOpenTime:"#f1f5f9",statusOpenFill:"#065f46",statusOpenStroke:"#10b981",statusOpenText:"#34d399",statusClosedFill:"#7f1d1d",statusClosedStroke:"#991b1b",statusClosedText:"#fee2e2",statistikFill:"rgba(255,255,255,0.05)",statistikStroke:"#334155",statistikText:"#e2e8f0",fuelBenzinStart:"#1e1b4b",fuelBenzinEnd:"#020617",fuelE10Start:"#1e1b4b",fuelE10End:"#020617",fuelDieselStart:"#1e1b4b",fuelDieselEnd:"#020617",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#020617",controlBoxStroke:"#334155",controlBoxText:"#94a3b8"}, floatingGlass:{widgetBgTop:"#F0F9FF",widgetBgBottom:"#F0F9FF",headerTop:"#F0F9FF",headerBottom:"#F0F9FF",footerTop:"#F0F9FF",footerBottom:"#F0F9FF",borderGradStart:"#ffffff",borderGradMid:"#ffffff",borderGradEnd:"#ffffff",lineSeparator:"#bae6fd",lineVertical:"#bae6fd",textDefault:"#0F172A",textName:"#0369A1",textStatus:"#10B981",textTime:"#0369A1",textFuel:"#F0F9FF",textPrice:"#F0F9FF",textControl:"#0369A1",textStatistik:"#0369A1",textOpenTitle:"#075985",textOpenTime:"#0F172A",statusOpenFill:"#d1fae5",statusOpenStroke:"#10b981",statusOpenText:"#065f46",statusClosedFill:"#fee2e2",statusClosedStroke:"#dc2626",statusClosedText:"#b91c1c",statistikFill:"#ffffff",statistikStroke:"#bae6fd",statistikText:"#0369A1",fuelBenzinStart:"#0EA5E9",fuelBenzinEnd:"#0369A1",fuelE10Start:"#0EA5E9",fuelE10End:"#0369A1",fuelDieselStart:"#06B6D4",fuelDieselEnd:"#0369A1",trendUp:"#dc2626",trendDown:"#2563eb",trendStable:"#10b981",controlBoxFill:"#ffffff",controlBoxStroke:"#bae6fd",controlBoxText:"#0369A1"}, liquidChrome:{widgetBgTop:"#4B5563",widgetBgBottom:"#374151",headerTop:"#E5E7EB",headerBottom:"#9CA3AF",footerTop:"#9CA3AF",footerBottom:"#374151",borderGradStart:"rgba(255,255,255,0.25)",borderGradMid:"rgba(255,255,255,0.15)",borderGradEnd:"rgba(255,255,255,0.05)",lineSeparator:"#d1d5db",lineVertical:"#d1d5db",textDefault:"#f9fafb",textName:"#ffffff",textStatus:"#ffffff",textTime:"#e5e7eb",textFuel:"#f3f4f6",textPrice:"#ffffff",textControl:"#d1d5db",textStatistik:"#e5e7eb",textOpenTitle:"#e5e7eb",textOpenTime:"#ffffff",statusOpenFill:"#d1fae5",statusOpenStroke:"#10b981",statusOpenText:"#065f46",statusClosedFill:"#fee2e2",statusClosedStroke:"#dc2626",statusClosedText:"#b91c1c",statistikFill:"rgba(255,255,255,0.05)",statistikStroke:"#9ca3af",statistikText:"#e5e7eb",fuelBenzinStart:"#E5E7EB",fuelBenzinEnd:"#9CA3AF",fuelE10Start:"#E5E7EB",fuelE10End:"#9CA3AF",fuelDieselStart:"#E5E7EB",fuelDieselEnd:"#9CA3AF",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#4B5563",controlBoxStroke:"#9CA3AF",controlBoxText:"#e5e7eb"}, titanCore:{widgetBgTop:"#030712",widgetBgBottom:"#374151",headerTop:"#030712",headerBottom:"#374151",footerTop:"#374151",footerBottom:"#030712",borderGradStart:"rgba(255,255,255,0.1)",borderGradMid:"rgba(255,255,255,0.05)",borderGradEnd:"rgba(255,255,255,0.02)",lineSeparator:"#475569",lineVertical:"#475569",textDefault:"#f1f5f9",textName:"#f1f5f9",textStatus:"#f1f5f9",textTime:"#94a3b8",textFuel:"#cbd5e1",textPrice:"#ffffff",textControl:"#64748b",textStatistik:"#94a3b8",textOpenTitle:"#cbd5e1",textOpenTime:"#f1f5f9",statusOpenFill:"#065f46",statusOpenStroke:"#10b981",statusOpenText:"#34d399",statusClosedFill:"#7f1d1d",statusClosedStroke:"#991b1b",statusClosedText:"#fee2e2",statistikFill:"rgba(255,255,255,0.05)",statistikStroke:"#475569",statistikText:"#94a3b8",fuelBenzinStart:"#374151",fuelBenzinEnd:"#030712",fuelE10Start:"#374151",fuelE10End:"#030712",fuelDieselStart:"#374151",fuelDieselEnd:"#030712",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#030712",controlBoxStroke:"#475569",controlBoxText:"#94a3b8"}, graphiteGrid:{widgetBgTop:"#18181b",widgetBgBottom:"#09090b",headerTop:"#3f3f46",headerBottom:"#18181b",footerTop:"#18181b",footerBottom:"#09090b",borderGradStart:"rgba(255,255,255,0.1)",borderGradMid:"rgba(255,255,255,0.05)",borderGradEnd:"rgba(255,255,255,0.02)",lineSeparator:"#3f3f46",lineVertical:"#3f3f46",textDefault:"#f4f4f5",textName:"#ffffff",textStatus:"#ffffff",textTime:"#a1a1aa",textFuel:"#d4d4d8",textPrice:"#ffffff",textControl:"#71717a",textStatistik:"#a1a1aa",textOpenTitle:"#d4d4d8",textOpenTime:"#f4f4f5",statusOpenFill:"#065f46",statusOpenStroke:"#10b981",statusOpenText:"#34d399",statusClosedFill:"#7f1d1d",statusClosedStroke:"#991b1b",statusClosedText:"#fee2e2",statistikFill:"rgba(255,255,255,0.05)",statistikStroke:"#3f3f46",statistikText:"#a1a1aa",fuelBenzinStart:"#3f3f46",fuelBenzinEnd:"#18181b",fuelE10Start:"#3f3f46",fuelE10End:"#18181b",fuelDieselStart:"#3f3f46",fuelDieselEnd:"#18181b",trendUp:"#ef4444",trendDown:"#3b82f6",trendStable:"#10b981",controlBoxFill:"#18181b",controlBoxStroke:"#3f3f46",controlBoxText:"#a1a1aa"} }; function getTankstellenTheme() { const preset = getState(TANKSTELLEN_THEME_DP).val; return TANKSTELLEN_THEMES[preset] || TANKSTELLEN_THEMES.midnightBlue; } function createTankstellenSVG({stationName, stationState, distance, lastFetch, lastUpdate, openingHours, priceBenzin, priceE10, priceDiesel, logoUrl, trendBenzin, trendE10, trendDiesel, showStatistik = false, showBorder = true, minimalMode = false}) { const t = getTankstellenTheme(); const uid = `ts_${Math.random().toString(36).slice(2,7)}`; function esc(str) { return String(str) .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """); } const badgeH = minimalMode ? 27 : 18; const badgeY1 = minimalMode ? 0 : 0; const badgeY2 = minimalMode ? 34 : 24; const badgeY3 = minimalMode ? 68 : 48; const priceFont = minimalMode ? 14 : 12; const fuelFont = minimalMode ? 12 : 9.5; function trendIcon(type) { if (type === "steigend") { return `<text x="175" y="${minimalMode ? 17 : 12}" text-anchor="end" fill="${t.trendUp}">↗</text>`; } if (type === "fallend") { return `<text x="175" y="${minimalMode ? 17 : 12}" text-anchor="end" fill="${t.trendDown}">↘</text>`; } return `<path d="M167,${minimalMode ? 14 : 9} L174,${minimalMode ? 14 : 9} M172,${minimalMode ? 12 : 7} L174,${minimalMode ? 14 : 9} L172,${minimalMode ? 16 : 11}" stroke="${t.trendStable}" stroke-width="1.25" fill="none" stroke-linecap="round" stroke-linejoin="round"/>`; } function formatNumber(value) { if (useDotInsteadOfComma) { return value.replace(",", "."); } else { return value.replace(".", ","); } } return ` <svg viewBox="0 0 365 163" width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet"> <style> .txt { font-family:'InterVariable',sans-serif!important; font-feature-settings:"tnum"!important; fill:${t.textDefault}!important; } .txt-name { font-size:15px!important;font-weight:600!important;fill:${t.textName}!important;font-variant: small-caps; } .txt-status { font-size:8px!important;font-weight:600!important;fill:${t.textStatus}!important; } .txt-time { font-size:8px!important;fill:${t.textTime}!important; } .txt-opening-title { font-size:9px!important;font-weight:700!important;fill:${t.textOpenTitle}!important; } .txt-opening-time { font-size:10px!important;fill:${t.textOpenTime}!important; } .txt-fuel { font-size:${fuelFont}px!important; font-weight:700!important; fill:${t.textFuel}!important; } .txt-price { font-family:'Courier New',monospace!important; font-size:${priceFont}px!important; font-weight:700!important; fill:${t.textPrice}!important; } .txt-control { font-size:9px!important; font-weight:600!important; fill:${t.textControl}!important; } .txt-statistik { fill:${t.textStatistik}!important; font-size:8px!important; font-weight:600!important; } .txt-distance { font-size:12px!important; font-weight:600!important; fill:${t.textTime}!important; } </style> <defs> <linearGradient id="${uid}-widgetBg" x1="0" y1="0" x2="0" y2="1"> <stop offset="0%" stop-color="${t.widgetBgTop}" stop-opacity="0.95"/> <stop offset="100%" stop-color="${t.widgetBgBottom}" stop-opacity="0.98"/> </linearGradient> <linearGradient id="${uid}-headerGrad" x1="0" y1="0" x2="0" y2="1"> <stop offset="0%" stop-color="${t.headerTop}" stop-opacity="0.6"/> <stop offset="100%" stop-color="${t.headerBottom}" stop-opacity="0.95"/> </linearGradient> <linearGradient id="${uid}-footerGrad" x1="0" y1="0" x2="0" y2="1"> <stop offset="0%" stop-color="${t.footerTop}" stop-opacity="0.45"/> <stop offset="100%" stop-color="${t.footerBottom}" stop-opacity="0.75"/> </linearGradient> <linearGradient id="${uid}-borderGrad" x1="0" y1="0" x2="1" y2="1"> <stop offset="0%" stop-color="${t.borderGradStart}" stop-opacity="0.35"/> <stop offset="50%" stop-color="${t.borderGradMid}" stop-opacity="0.1"/> <stop offset="100%" stop-color="${t.borderGradEnd}" stop-opacity="0.2"/> </linearGradient> <linearGradient id="${uid}-bgBenzin" x1="0" y1="0" x2="1" y2="0"> <stop offset="0%" stop-color="${t.fuelBenzinStart}"/> <stop offset="100%" stop-color="${t.fuelBenzinEnd}"/> </linearGradient> <linearGradient id="${uid}-bgE10" x1="0" y1="0" x2="1" y2="0"> <stop offset="0%" stop-color="${t.fuelE10Start}"/> <stop offset="100%" stop-color="${t.fuelE10End}"/> </linearGradient> <linearGradient id="${uid}-bgDiesel" x1="0" y1="0" x2="1" y2="0"> <stop offset="0%" stop-color="${t.fuelDieselStart}"/> <stop offset="100%" stop-color="${t.fuelDieselEnd}"/> </linearGradient> </defs> <rect x="1.5" y="1.5" width="362" height="160" fill="url(#${uid}-widgetBg)" stroke="${showBorder ? `url(#${uid}-borderGrad)` : `none`}" stroke-width="1.25"/> <path d="M2.5,2.5H362.5V28H2.5Z" fill="url(#${uid}-headerGrad)"/> <image href="${logoUrl}" x="5" y="5" width="18" height="18" preserveAspectRatio="xMidYMid slice"/> <text class="txt txt-name" x="32" y="19">${esc(stationName)}</text> <g id="geoSymbol" transform="translate(345,7)"> <g transform="translate(0,0) scale(1.0)"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10m0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6" fill="${t.textTime}"/> </g> </g> <g id="geoDistance" transform="translate(287,5)"> <text class="txt txt-distance" x="55" y="14" text-anchor="end">${formatNumber(esc(distance))}</text> </g> <line x1="1.5" y1="28" x2="363.5" y2="28" stroke="${t.lineSeparator}" stroke-width="0.75"/> <g opacity="0.55" transform="translate(0,-2)"> <g transform="translate(15,41)"> <g stroke="#94A3B8" stroke-width="1" fill="none"> <path d="M0,0 A 4,4 0 1,1 4,4" /> <path d="M4,-2 L4,2 L0,2" /> </g> </g> <text class="txt txt-time" x="27" y="44" style="font-size:10px!important">${esc(lastUpdate)}</text> <g transform="translate(206,37)"> <g stroke="#94A3B8" stroke-width="1" fill="none"> <path d="M0,6 L0,0" /> <path d="M-3,3 L0,6 L3,3" /> <path d="M-5,7 L5,7" /> </g> </g> <text class="txt txt-time" x="216" y="44" style="font-size:10px!important">${esc(lastFetch)}</text> </g> <line x1="135" y1="52" x2="135" y2="${minimalMode ? 152 : 133.5}" stroke="${t.lineVertical}" stroke-width="0.75"/> <g transform="translate(12,54)"> <g transform="translate(15,0)"> <rect x="0" y="0" width="80" height="16" rx="3" fill="${stationState.includes("geschlossen") ? t.statusClosedFill : t.statusOpenFill}" stroke="${stationState.includes("geschlossen") ? t.statusClosedStroke : t.statusOpenStroke}" stroke-width="0.75"/> <text class="txt txt-status" x="40" y="11" text-anchor="middle" style="letter-spacing:1px;fill:${stationState.includes("geschlossen") ? t.statusClosedText : t.statusOpenText}">${esc(stationState.toUpperCase())}</text> </g> ${openingHours.map((o,i)=>` <text class="txt txt-opening-time" x="10" y="${32+i*16}">${esc(o.text)}</text> <text class="txt txt-opening-time" x="70" y="${32+i*16}">${esc(o.hours)}</text> `).join("")} </g> <g transform="translate(157,54)"> <g transform="translate(0,${badgeY1})"> <rect x="0" y="0" width="185" height="${badgeH}" rx="5" fill="url(#${uid}-bgBenzin)" stroke="${t.fuelBenzinBorder}" stroke-width="0.75"/> <circle cx="9" cy="${badgeH/2}" r="2.5" fill="#318CFF"/> <text class="txt txt-fuel" x="20" y="${badgeH/2 + (minimalMode ? 4.5 : 3.5)}">Benzin</text> <text class="txt txt-price" x="155" y="${badgeH/2+4.5}" text-anchor="end">${formatNumber(esc(priceBenzin.slice(0,-1)))}<tspan dy="-1">${esc(priceBenzin.slice(-1))}</tspan></text> ${trendIcon(trendBenzin)} </g> <g transform="translate(0,${badgeY2})"> <rect x="0" y="0" width="185" height="${badgeH}" rx="5" fill="url(#${uid}-bgE10)" stroke="${t.fuelE10Border}" stroke-width="0.75"/> <circle cx="9" cy="${badgeH/2}" r="2.5" fill="#4BBF31"/> <text class="txt txt-fuel" x="20" y="${badgeH/2 + (minimalMode ? 4.5 : 3.5)}">E10</text> <text class="txt txt-price" x="155" y="${badgeH/2+4.5}" text-anchor="end">${formatNumber(esc(priceE10.slice(0,-1)))}<tspan dy="-1">${esc(priceE10.slice(-1))}</tspan></text> ${trendIcon(trendE10)} </g> <g transform="translate(0,${badgeY3})"> <rect x="0" y="0" width="185" height="${badgeH}" rx="5" fill="url(#${uid}-bgDiesel)" stroke="${t.fuelDieselBorder}" stroke-width="0.75"/> <circle cx="9" cy="${badgeH/2}" r="2.5" fill="#E33232"/> <text class="txt txt-fuel" x="20" y="${badgeH/2 + (minimalMode ? 4.5 : 3.5)}">Diesel</text> <text class="txt txt-price" x="155" y="${badgeH/2+4.5}" text-anchor="end">${formatNumber(esc(priceDiesel.slice(0,-1)))}<tspan dy="-1">${esc(priceDiesel.slice(-1))}</tspan></text> ${trendIcon(trendDiesel)} </g> </g> ${minimalMode || !t.footerTop ? `` : `<path d="M1.5,133.5H363.5V161.5H1.5Z" fill="url(#${uid}-footerGrad)" stroke="${t.footerStroke || 'none'}" stroke-width="0.75"/>`} ${(!minimalMode && showStatistik) ? ` <g transform="translate(285,140)"> <rect x="0" y="0" width="70" height="16" rx="3" fill="${t.statistikFill}" stroke="${t.statistikStroke}" stroke-width="0.75"/> <text class="txt-statistik" x="35" y="11" text-anchor="middle">${esc("STATISTIK")}</text> </g> ` : ``} ${minimalMode ? `` : ` <g transform="translate(15,140.5)"> <rect x="0" y="0" width="15" height="15" rx="2" fill="${t.controlBoxFill}" stroke="${t.controlBoxStroke}" stroke-width="0.75"/> <text class="txt txt-control" x="20" y="11" fill="${t.controlBoxText}">${esc("NUR ABRUF")}</text> </g> <g transform="translate(100,140.5)"> <rect x="0" y="0" width="15" height="15" rx="2" fill="${t.controlBoxFill}" stroke="${t.controlBoxStroke}" stroke-width="0.75"/> <text class="txt txt-control" x="20" y="11" fill="${t.controlBoxText}">${esc("FAVORIT")}</text> </g> <g transform="translate(185,140.5)"> <rect x="0" y="0" width="15" height="15" rx="2" fill="${t.controlBoxFill}" stroke="${t.controlBoxStroke}" stroke-width="0.75"/> <text class="txt txt-control" x="20" y="11" fill="${t.controlBoxText}">${esc("AKTIV")}</text> </g> `} </svg> `; } async function TankRenderer() { const tasks = stations.filter(s => getState(`${base}.${s.id}.enabled`)?.val !== false).map(async (s) => { const path = `${base}.${s.id}`; const svg = createTankstellenSVG({ stationName: getState(`${path}.name`)?.val, stationState: getState(`${path}.status`)?.val, distance: getState(`${path}.distance`)?.val + "Km", lastFetch: "Abruf: " + getState(`${path}.lastChecked`)?.val, lastUpdate: "Update: " + getState(`${path}.lastPriceUpdate`)?.val, openingHours: JSON.parse(getState(`${path}.openingTimes`)?.val), priceBenzin: getState(`${path}.benzin_str`)?.val, priceE10: getState(`${path}.e10_str`)?.val, priceDiesel: getState(`${path}.diesel_str`)?.val, logoUrl: getState(`${path}.image`)?.val, trendBenzin: getState(`${path}.aspects.benzin.trend_24h_proj`)?.val, trendE10: getState(`${path}.aspects.e10.trend_24h_proj`)?.val, trendDiesel: getState(`${path}.aspects.diesel.trend_24h_proj`)?.val, showStatistik: VisibleStatistik, showBorder: VisibleBorder, minimalMode: minimalModeActiv }); setStateIfChanged(`${path}.svg`, svg); }); await Promise.allSettled(tasks); } on({ id: TANKSTELLEN_THEME_DP, change: "ne" }, obj => { TankRenderer(); });Wenn alles richtig gemacht wurde, trudeln die Daten regelmäßig ein. Trend und Prognosen werden nicht sofort "brauchbare" Daten liefern. Es muss einfach etwas Zeit vertreichen. Ich habe bei mir alles in VIS1 visualisiert, sollte aber auch mit anderen Systemen funktionieren.
Viel Spaß und gutes Gelingen mit diesem Skript.
Ro75.
Neuerungen Version 1.1.0 - 21.06.2026
-
Dynamische Generierung und automatische Aktualisierung von SVG-Cards pro Tankstelle bei Wertänderung. Der Datenpunkt lautet "svg" und kann in VIS 1 via "String (unescaped)" dargestellt werden.

-
Zahlreiche Theme zur Ausahl. Der Datenpunkt lautet "theme" im Ordner "config". Bei Änderung erfolgt die automatische Neugenerierung.
-
Hinweise zum Update in Post #43.
Korrektur Version 1.1.1 - 22.06.2026
- Theme "Transparent" korrigiert.
- Hinweise zum Update in Post #47.
@Ro75 sagte in Tankerkönig - Extended Skript:
Viel Spaß und gutes Gelingen mit diesem Skript.
Servus
Könnte man sowas auch für Österreich machen?
Adapter gibt es zwar, aber so wie deins wäre hübscher. ;) -
Super, danke! Ich probier's demnächst.
Hinweis: im Bild ganz oben ist der genaue Standort verpixelt (vermutlich wg. Privatsphäre), im Code sind aber hoffentlich dann nicht Deine echten Geodaten ;-)
@Thomas-Maul sagte in Tankerkönig - Extended Skript:
Deine echten Geodaten ;-)
Nein, steht aber auch als Kommentar dahinter :-)
Ro75.
-
@Ro75 sagte in Tankerkönig - Extended Skript:
Viel Spaß und gutes Gelingen mit diesem Skript.
Servus
Könnte man sowas auch für Österreich machen?
Adapter gibt es zwar, aber so wie deins wäre hübscher. ;) -
Hallo, erstmal besten Dank für Deine Arbeit. Der Tankerkoenig läuft bei mir. Ich habe nun Dein Skript angepasst und bekomme dann allerdings beim Import unter VIS1 folgenden Fehler:

Danke für die Hilfe@joalexa sagte in Tankerkönig - Extended Skript:
Der Tankerkoenig läuft bei mir. Ich habe nun Dein Skript angepasst und bekomme dann allerdings beim Import unter VIS1 folgenden Fehler:
das ist ein Javascript.
Musst du in Scripte anlegen. Nicht in VIS importieren.Den Tankerkoenig Adapter brauchst du dann nicht mehr.
-
@joalexa sagte in Tankerkönig - Extended Skript:
Der Tankerkoenig läuft bei mir. Ich habe nun Dein Skript angepasst und bekomme dann allerdings beim Import unter VIS1 folgenden Fehler:
das ist ein Javascript.
Musst du in Scripte anlegen. Nicht in VIS importieren.Den Tankerkoenig Adapter brauchst du dann nicht mehr.
-
Hier habe ich mal etwas für die Vis 2 gebastelt.
Im Editor einfach die Zahlen durch die Zahlen eurer Tankstelle ersetzen und importieren. Funktioniert hervorragend.
[ { "tpl": "tplMaterial2Switches", "data": { "actual1": null, "actual10": null, "actual11": null, "actual12": null, "actual2": null, "actual3": null, "actual4": null, "actual5": null, "actual6": null, "actual7": null, "actual8": null, "actual9": null, "allSwitch": false, "bindings": [ "widgetTitle", "icon2", "icon10", "infoActiveIcon1", "icon1" ], "blue1": null, "blue10": null, "blue11": null, "blue12": null, "blue2": null, "blue3": null, "blue4": null, "blue5": null, "blue6": null, "blue7": null, "blue8": null, "blue9": null, "boost1": null, "boost10": null, "boost11": null, "boost12": null, "boost2": null, "boost3": null, "boost4": null, "boost5": null, "boost6": null, "boost7": null, "boost8": null, "boost9": null, "brightness1": null, "brightness10": null, "brightness11": null, "brightness12": null, "brightness2": null, "brightness3": null, "brightness4": null, "brightness5": null, "brightness6": null, "brightness7": null, "brightness8": null, "brightness9": null, "buttonIcon1": null, "buttonIcon10": null, "buttonIcon11": null, "buttonIcon12": null, "buttonIcon2": null, "buttonIcon3": null, "buttonIcon4": null, "buttonIcon5": null, "buttonIcon6": null, "buttonIcon7": null, "buttonIcon8": null, "buttonIcon9": null, "buttonIconActive1": null, "buttonIconActive10": null, "buttonIconActive11": null, "buttonIconActive12": null, "buttonIconActive2": null, "buttonIconActive3": null, "buttonIconActive4": null, "buttonIconActive5": null, "buttonIconActive6": null, "buttonIconActive7": null, "buttonIconActive8": null, "buttonIconActive9": null, "buttonImage1": null, "buttonImage10": null, "buttonImage11": null, "buttonImage12": null, "buttonImage2": null, "buttonImage3": null, "buttonImage4": null, "buttonImage5": null, "buttonImage6": null, "buttonImage7": null, "buttonImage8": null, "buttonImage9": null, "buttonImageActive1": null, "buttonImageActive10": null, "buttonImageActive11": null, "buttonImageActive12": null, "buttonImageActive2": null, "buttonImageActive3": null, "buttonImageActive4": null, "buttonImageActive5": null, "buttonImageActive6": null, "buttonImageActive7": null, "buttonImageActive8": null, "buttonImageActive9": null, "buttonText1": null, "buttonText10": null, "buttonText11": null, "buttonText12": null, "buttonText2": null, "buttonText3": null, "buttonText4": null, "buttonText5": null, "buttonText6": null, "buttonText7": null, "buttonText8": null, "buttonText9": null, "buttonsWidth": 120, "chartPeriod1": 60, "chartPeriod10": 60, "chartPeriod11": 60, "chartPeriod12": 60, "chartPeriod2": 60, "chartPeriod3": 10080, "chartPeriod4": 60, "chartPeriod5": 60, "chartPeriod6": 60, "chartPeriod7": 60, "chartPeriod8": 60, "chartPeriod9": 60, "color1": null, "color10": null, "color11": null, "color12": null, "color2": null, "color3": "#ffffff", "color4": null, "color5": null, "color6": null, "color7": null, "color8": null, "color9": "#ffffff", "colorEnabled1": null, "colorEnabled10": null, "colorEnabled11": null, "colorEnabled12": null, "colorEnabled2": null, "colorEnabled3": "#ffffff", "colorEnabled4": null, "colorEnabled5": null, "colorEnabled6": null, "colorEnabled7": null, "colorEnabled8": null, "colorEnabled9": "#ffffff", "color_temperature1": null, "color_temperature10": null, "color_temperature11": null, "color_temperature12": null, "color_temperature2": null, "color_temperature3": null, "color_temperature4": null, "color_temperature5": null, "color_temperature6": null, "color_temperature7": null, "color_temperature8": null, "color_temperature9": null, "count": 13, "ct_max1": null, "ct_max10": null, "ct_max11": null, "ct_max12": null, "ct_max2": null, "ct_max3": null, "ct_max4": null, "ct_max5": null, "ct_max6": null, "ct_max7": null, "ct_max8": null, "ct_max9": null, "ct_min1": null, "ct_min10": null, "ct_min11": null, "ct_min12": null, "ct_min2": null, "ct_min3": null, "ct_min4": null, "ct_min5": null, "ct_min6": null, "ct_min7": null, "ct_min8": null, "ct_min9": null, "doNotConfirm1": null, "doNotConfirm10": null, "doNotConfirm11": null, "doNotConfirm12": null, "doNotConfirm2": null, "doNotConfirm3": null, "doNotConfirm4": null, "doNotConfirm5": null, "doNotConfirm6": null, "doNotConfirm7": null, "doNotConfirm8": null, "doNotConfirm9": null, "doNotWantIncludeWidgets": false, "g_common": true, "g_switch-1": true, "g_switch-10": true, "g_switch-11": true, "g_switch-12": true, "g_switch-2": true, "g_switch-3": true, "g_switch-4": true, "g_switch-5": true, "g_switch-6": true, "g_switch-7": true, "g_switch-8": true, "g_switch-9": true, "green1": null, "green10": null, "green11": null, "green12": null, "green2": null, "green3": null, "green4": null, "green5": null, "green6": null, "green7": null, "green8": null, "green9": null, "height1": null, "height10": null, "height11": null, "height12": null, "height2": null, "height3": null, "height4": null, "height5": null, "height6": null, "height7": null, "height8": null, "height9": null, "hide1": null, "hide10": null, "hide11": null, "hide12": null, "hide2": null, "hide3": null, "hide4": null, "hide5": null, "hide6": null, "hide7": null, "hide8": null, "hide9": null, "hideBrightness1": null, "hideBrightness10": null, "hideBrightness11": null, "hideBrightness12": null, "hideBrightness2": null, "hideBrightness3": null, "hideBrightness4": null, "hideBrightness5": null, "hideBrightness6": null, "hideBrightness7": null, "hideBrightness8": null, "hideBrightness9": null, "hideChart1": true, "hideChart10": true, "hideChart11": true, "hideChart12": true, "hideChart2": true, "hideChart3": true, "hideChart4": true, "hideChart5": true, "hideChart6": true, "hideChart7": true, "hideChart8": true, "hideChart9": true, "hue1": null, "hue10": null, "hue11": null, "hue12": null, "hue2": null, "hue3": null, "hue4": null, "hue5": null, "hue6": null, "hue7": null, "hue8": null, "hue9": null, "icon1": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.image}", "icon10": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.benzin.trend_24h_proj_icon}", "icon11": null, "icon12": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.image}", "icon2": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.image}", "icon3": "../vis-2.0/tanken/blue.png", "icon4": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.benzin.trend_24h_proj_icon}", "icon5": null, "icon6": "../vis-2.0/tanken/green.png", "icon7": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.benzin.trend_24h_proj_icon}", "icon8": null, "icon9": "../vis-2.0/tanken/red.png", "iconEnabled1": null, "iconEnabled10": null, "iconEnabled11": null, "iconEnabled12": null, "iconEnabled2": null, "iconEnabled3": "../vis-2.0/tanken/blue.png", "iconEnabled4": null, "iconEnabled5": null, "iconEnabled6": "../vis-2.0/tanken/green.png", "iconEnabled7": null, "iconEnabled8": null, "iconEnabled9": "../vis-2.0/tanken/red.png", "iconEnabledSmall1": null, "iconEnabledSmall10": null, "iconEnabledSmall11": null, "iconEnabledSmall12": null, "iconEnabledSmall2": null, "iconEnabledSmall3": null, "iconEnabledSmall4": null, "iconEnabledSmall5": null, "iconEnabledSmall6": null, "iconEnabledSmall7": null, "iconEnabledSmall8": null, "iconEnabledSmall9": null, "iconSmall1": null, "iconSmall10": null, "iconSmall11": null, "iconSmall12": null, "iconSmall2": null, "iconSmall3": null, "iconSmall4": null, "iconSmall5": null, "iconSmall6": null, "iconSmall7": null, "iconSmall8": null, "iconSmall9": null, "infoActiveColor1": null, "infoActiveColor10": null, "infoActiveColor11": null, "infoActiveColor12": null, "infoActiveColor2": null, "infoActiveColor3": null, "infoActiveColor4": null, "infoActiveColor5": null, "infoActiveColor6": null, "infoActiveColor7": null, "infoActiveColor8": null, "infoActiveColor9": null, "infoActiveIcon1": null, "infoActiveIcon10": null, "infoActiveIcon11": null, "infoActiveIcon12": null, "infoActiveIcon2": null, "infoActiveIcon3": null, "infoActiveIcon4": null, "infoActiveIcon5": null, "infoActiveIcon6": null, "infoActiveIcon7": null, "infoActiveIcon8": null, "infoActiveIcon9": null, "infoActiveImage1": null, "infoActiveImage10": null, "infoActiveImage11": null, "infoActiveImage12": null, "infoActiveImage2": null, "infoActiveImage3": null, "infoActiveImage4": null, "infoActiveImage5": null, "infoActiveImage6": null, "infoActiveImage7": null, "infoActiveImage8": null, "infoActiveImage9": null, "infoActiveText1": null, "infoActiveText10": null, "infoActiveText11": null, "infoActiveText12": null, "infoActiveText2": null, "infoActiveText3": null, "infoActiveText4": null, "infoActiveText5": null, "infoActiveText6": null, "infoActiveText7": null, "infoActiveText8": null, "infoActiveText9": null, "infoInactiveColor1": null, "infoInactiveColor10": null, "infoInactiveColor11": null, "infoInactiveColor12": null, "infoInactiveColor2": null, "infoInactiveColor3": null, "infoInactiveColor4": null, "infoInactiveColor5": null, "infoInactiveColor6": null, "infoInactiveColor7": null, "infoInactiveColor8": null, "infoInactiveColor9": null, "infoInactiveIcon1": null, "infoInactiveIcon10": null, "infoInactiveIcon11": null, "infoInactiveIcon12": null, "infoInactiveIcon2": null, "infoInactiveIcon3": null, "infoInactiveIcon4": null, "infoInactiveIcon5": null, "infoInactiveIcon6": null, "infoInactiveIcon7": null, "infoInactiveIcon8": null, "infoInactiveIcon9": null, "infoInactiveImage1": null, "infoInactiveImage10": null, "infoInactiveImage11": null, "infoInactiveImage12": null, "infoInactiveImage2": null, "infoInactiveImage3": null, "infoInactiveImage4": null, "infoInactiveImage5": null, "infoInactiveImage6": null, "infoInactiveImage7": null, "infoInactiveImage8": null, "infoInactiveImage9": null, "infoInactiveText1": null, "infoInactiveText10": null, "infoInactiveText11": null, "infoInactiveText12": null, "infoInactiveText2": null, "infoInactiveText3": null, "infoInactiveText4": null, "infoInactiveText5": null, "infoInactiveText6": null, "infoInactiveText7": null, "infoInactiveText8": null, "infoInactiveText9": null, "lockColor1": null, "lockColor10": null, "lockColor11": null, "lockColor12": null, "lockColor2": null, "lockColor3": null, "lockColor4": null, "lockColor5": null, "lockColor6": null, "lockColor7": null, "lockColor8": null, "lockColor9": null, "luminance1": null, "luminance10": null, "luminance11": null, "luminance12": null, "luminance2": null, "luminance3": null, "luminance4": null, "luminance5": null, "luminance6": null, "luminance7": null, "luminance8": null, "luminance9": null, "noIcon1": false, "noIcon10": true, "noIcon11": true, "noIcon12": true, "noIcon2": true, "noIcon3": null, "noIcon4": true, "noIcon5": true, "noIcon6": null, "noIcon7": true, "noIcon8": true, "noIcon9": null, "noLockAnimation1": null, "noLockAnimation10": null, "noLockAnimation11": null, "noLockAnimation12": null, "noLockAnimation2": null, "noLockAnimation3": null, "noLockAnimation4": null, "noLockAnimation5": null, "noLockAnimation6": null, "noLockAnimation7": null, "noLockAnimation8": null, "noLockAnimation9": null, "noRgbPalette1": null, "noRgbPalette10": null, "noRgbPalette11": null, "noRgbPalette12": null, "noRgbPalette2": null, "noRgbPalette3": null, "noRgbPalette4": null, "noRgbPalette5": null, "noRgbPalette6": null, "noRgbPalette7": null, "noRgbPalette8": null, "noRgbPalette9": null, "oid-pincode1": null, "oid-pincode10": null, "oid-pincode11": null, "oid-pincode12": null, "oid-pincode2": null, "oid-pincode3": null, "oid-pincode4": null, "oid-pincode5": null, "oid-pincode6": null, "oid-pincode7": null, "oid-pincode8": null, "oid-pincode9": null, "oid1": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.street", "oid10": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.diesel.trend_24h_proj", "oid11": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.diesel.trend_24h_proj_price", "oid12": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.lastChecked", "oid2": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.place", "oid3": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.benzin_str", "oid4": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.benzin.trend_24h_proj", "oid5": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.benzin.trend_24h_proj_price", "oid6": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.e10_str", "oid7": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.e10.trend_24h_proj", "oid8": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.e10.trend_24h_proj_price", "oid9": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.diesel_str", "open1": null, "open10": null, "open11": null, "open12": null, "open2": null, "open3": null, "open4": null, "open5": null, "open6": null, "open7": null, "open8": null, "open9": null, "orientation": "horizontal", "party1": null, "party10": null, "party11": null, "party12": null, "party2": null, "party3": null, "party4": null, "party5": null, "party6": null, "party7": null, "party8": null, "party9": null, "pincode1": null, "pincode10": null, "pincode11": null, "pincode12": null, "pincode2": null, "pincode3": null, "pincode4": null, "pincode5": null, "pincode6": null, "pincode7": null, "pincode8": null, "pincode9": null, "pincodeReturnButton1": "submit", "pincodeReturnButton10": "submit", "pincodeReturnButton11": "submit", "pincodeReturnButton12": "submit", "pincodeReturnButton2": "submit", "pincodeReturnButton3": "submit", "pincodeReturnButton4": "submit", "pincodeReturnButton5": "submit", "pincodeReturnButton6": "submit", "pincodeReturnButton7": "submit", "pincodeReturnButton8": "submit", "pincodeReturnButton9": "submit", "position1": null, "position10": null, "position11": null, "position12": null, "position2": null, "position3": null, "position4": null, "position5": null, "position6": null, "position7": null, "position8": null, "position9": null, "red1": null, "red10": null, "red11": null, "red12": null, "red2": null, "red3": null, "red4": null, "red5": null, "red6": null, "red7": null, "red8": null, "red9": null, "rgbType1": null, "rgbType10": null, "rgbType11": null, "rgbType12": null, "rgbType2": null, "rgbType3": null, "rgbType4": null, "rgbType5": null, "rgbType6": null, "rgbType7": null, "rgbType8": null, "rgbType9": null, "saturation1": null, "saturation10": null, "saturation11": null, "saturation12": null, "saturation2": null, "saturation3": null, "saturation4": null, "saturation5": null, "saturation6": null, "saturation7": null, "saturation8": null, "saturation9": null, "sensor1": null, "sensor10": null, "sensor11": null, "sensor12": null, "sensor2": null, "sensor3": null, "sensor4": null, "sensor5": null, "sensor6": null, "sensor7": null, "sensor8": null, "sensor9": null, "slideInvert1": null, "slideInvert10": null, "slideInvert11": null, "slideInvert12": null, "slideInvert2": null, "slideInvert3": null, "slideInvert4": null, "slideInvert5": null, "slideInvert6": null, "slideInvert7": null, "slideInvert8": null, "slideInvert9": null, "step1": null, "step10": null, "step11": null, "step12": null, "step2": null, "step3": null, "step4": null, "step5": null, "step6": null, "step7": null, "step8": null, "step9": null, "switch1": null, "switch10": null, "switch11": null, "switch12": null, "switch2": null, "switch3": null, "switch4": null, "switch5": null, "switch6": null, "switch7": null, "switch8": null, "switch9": null, "timeout1": 500, "timeout10": 500, "timeout11": 500, "timeout12": 500, "timeout2": 500, "timeout3": 500, "timeout4": 500, "timeout5": 500, "timeout6": 500, "timeout7": 500, "timeout8": 500, "timeout9": 500, "title1": "Straße", "title10": "Prognose 24h", "title11": "Preisprognose 24h", "title12": null, "title2": "Ort", "title3": "Super 95", "title4": "Prognose 24h", "title5": "Preisprognose 24h", "title6": "E10", "title7": "Prognose 24h", "title8": "Preisprognose 24h", "title9": "Diesel", "type": "lines", "type1": "info", "type10": "info", "type11": "info", "type12": "info", "type2": "info", "type3": "info", "type4": "info", "type5": "info", "type6": "info", "type7": "info", "type8": "info", "type9": "info", "undefined1": null, "undefined10": null, "undefined11": null, "undefined12": null, "undefined2": null, "undefined3": null, "undefined4": null, "undefined5": null, "undefined6": null, "undefined7": null, "undefined8": null, "undefined9": null, "unit1": null, "unit10": null, "unit11": "€", "unit12": null, "unit2": null, "unit3": "€", "unit4": null, "unit5": "€", "unit6": "€", "unit7": null, "unit8": "€", "unit9": "€", "vacuum-battery-oid1": null, "vacuum-battery-oid10": null, "vacuum-battery-oid11": null, "vacuum-battery-oid12": null, "vacuum-battery-oid2": null, "vacuum-battery-oid3": null, "vacuum-battery-oid4": null, "vacuum-battery-oid5": null, "vacuum-battery-oid6": null, "vacuum-battery-oid7": null, "vacuum-battery-oid8": null, "vacuum-battery-oid9": null, "vacuum-cleaning-count-oid1": null, "vacuum-cleaning-count-oid10": null, "vacuum-cleaning-count-oid11": null, "vacuum-cleaning-count-oid12": null, "vacuum-cleaning-count-oid2": null, "vacuum-cleaning-count-oid3": null, "vacuum-cleaning-count-oid4": null, "vacuum-cleaning-count-oid5": null, "vacuum-cleaning-count-oid6": null, "vacuum-cleaning-count-oid7": null, "vacuum-cleaning-count-oid8": null, "vacuum-cleaning-count-oid9": null, "vacuum-fan-speed-oid1": null, "vacuum-fan-speed-oid10": null, "vacuum-fan-speed-oid11": null, "vacuum-fan-speed-oid12": null, "vacuum-fan-speed-oid2": null, "vacuum-fan-speed-oid3": null, "vacuum-fan-speed-oid4": null, "vacuum-fan-speed-oid5": null, "vacuum-fan-speed-oid6": null, "vacuum-fan-speed-oid7": null, "vacuum-fan-speed-oid8": null, "vacuum-fan-speed-oid9": null, "vacuum-filter-left-oid1": null, "vacuum-filter-left-oid10": null, "vacuum-filter-left-oid11": null, "vacuum-filter-left-oid12": null, "vacuum-filter-left-oid2": null, "vacuum-filter-left-oid3": null, "vacuum-filter-left-oid4": null, "vacuum-filter-left-oid5": null, "vacuum-filter-left-oid6": null, "vacuum-filter-left-oid7": null, "vacuum-filter-left-oid8": null, "vacuum-filter-left-oid9": null, "vacuum-home-oid1": null, "vacuum-home-oid10": null, "vacuum-home-oid11": null, "vacuum-home-oid12": null, "vacuum-home-oid2": null, "vacuum-home-oid3": null, "vacuum-home-oid4": null, "vacuum-home-oid5": null, "vacuum-home-oid6": null, "vacuum-home-oid7": null, "vacuum-home-oid8": null, "vacuum-home-oid9": null, "vacuum-is-charging-oid1": null, "vacuum-is-charging-oid10": null, "vacuum-is-charging-oid11": null, "vacuum-is-charging-oid12": null, "vacuum-is-charging-oid2": null, "vacuum-is-charging-oid3": null, "vacuum-is-charging-oid4": null, "vacuum-is-charging-oid5": null, "vacuum-is-charging-oid6": null, "vacuum-is-charging-oid7": null, "vacuum-is-charging-oid8": null, "vacuum-is-charging-oid9": null, "vacuum-main-brush-left-oid1": null, "vacuum-main-brush-left-oid10": null, "vacuum-main-brush-left-oid11": null, "vacuum-main-brush-left-oid12": null, "vacuum-main-brush-left-oid2": null, "vacuum-main-brush-left-oid3": null, "vacuum-main-brush-left-oid4": null, "vacuum-main-brush-left-oid5": null, "vacuum-main-brush-left-oid6": null, "vacuum-main-brush-left-oid7": null, "vacuum-main-brush-left-oid8": null, "vacuum-main-brush-left-oid9": null, "vacuum-map64-oid1": null, "vacuum-map64-oid10": null, "vacuum-map64-oid11": null, "vacuum-map64-oid12": null, "vacuum-map64-oid2": null, "vacuum-map64-oid3": null, "vacuum-map64-oid4": null, "vacuum-map64-oid5": null, "vacuum-map64-oid6": null, "vacuum-map64-oid7": null, "vacuum-map64-oid8": null, "vacuum-map64-oid9": null, "vacuum-own-image1": null, "vacuum-own-image10": null, "vacuum-own-image11": null, "vacuum-own-image12": null, "vacuum-own-image2": null, "vacuum-own-image3": null, "vacuum-own-image4": null, "vacuum-own-image5": null, "vacuum-own-image6": null, "vacuum-own-image7": null, "vacuum-own-image8": null, "vacuum-own-image9": null, "vacuum-pause-oid1": null, "vacuum-pause-oid10": null, "vacuum-pause-oid11": null, "vacuum-pause-oid12": null, "vacuum-pause-oid2": null, "vacuum-pause-oid3": null, "vacuum-pause-oid4": null, "vacuum-pause-oid5": null, "vacuum-pause-oid6": null, "vacuum-pause-oid7": null, "vacuum-pause-oid8": null, "vacuum-pause-oid9": null, "vacuum-sensors-left-oid1": null, "vacuum-sensors-left-oid10": null, "vacuum-sensors-left-oid11": null, "vacuum-sensors-left-oid12": null, "vacuum-sensors-left-oid2": null, "vacuum-sensors-left-oid3": null, "vacuum-sensors-left-oid4": null, "vacuum-sensors-left-oid5": null, "vacuum-sensors-left-oid6": null, "vacuum-sensors-left-oid7": null, "vacuum-sensors-left-oid8": null, "vacuum-sensors-left-oid9": null, "vacuum-side-brush-left-oid1": null, "vacuum-side-brush-left-oid10": null, "vacuum-side-brush-left-oid11": null, "vacuum-side-brush-left-oid12": null, "vacuum-side-brush-left-oid2": null, "vacuum-side-brush-left-oid3": null, "vacuum-side-brush-left-oid4": null, "vacuum-side-brush-left-oid5": null, "vacuum-side-brush-left-oid6": null, "vacuum-side-brush-left-oid7": null, "vacuum-side-brush-left-oid8": null, "vacuum-side-brush-left-oid9": null, "vacuum-start-oid1": null, "vacuum-start-oid10": null, "vacuum-start-oid11": null, "vacuum-start-oid12": null, "vacuum-start-oid2": null, "vacuum-start-oid3": null, "vacuum-start-oid4": null, "vacuum-start-oid5": null, "vacuum-start-oid6": null, "vacuum-start-oid7": null, "vacuum-start-oid8": null, "vacuum-start-oid9": null, "vacuum-status-oid1": null, "vacuum-status-oid10": null, "vacuum-status-oid11": null, "vacuum-status-oid12": null, "vacuum-status-oid2": null, "vacuum-status-oid3": null, "vacuum-status-oid4": null, "vacuum-status-oid5": null, "vacuum-status-oid6": null, "vacuum-status-oid7": null, "vacuum-status-oid8": null, "vacuum-status-oid9": null, "vacuum-use-default-picture1": true, "vacuum-use-default-picture10": true, "vacuum-use-default-picture11": true, "vacuum-use-default-picture12": true, "vacuum-use-default-picture2": true, "vacuum-use-default-picture3": true, "vacuum-use-default-picture4": true, "vacuum-use-default-picture5": true, "vacuum-use-default-picture6": true, "vacuum-use-default-picture7": true, "vacuum-use-default-picture8": true, "vacuum-use-default-picture9": true, "vacuum-use-rooms1": null, "vacuum-use-rooms10": null, "vacuum-use-rooms11": null, "vacuum-use-rooms12": null, "vacuum-use-rooms2": null, "vacuum-use-rooms3": null, "vacuum-use-rooms4": null, "vacuum-use-rooms5": null, "vacuum-use-rooms6": null, "vacuum-use-rooms7": null, "vacuum-use-rooms8": null, "vacuum-use-rooms9": null, "visibility-cond1": "==", "visibility-cond10": "==", "visibility-cond11": "==", "visibility-cond12": "==", "visibility-cond2": "==", "visibility-cond3": "==", "visibility-cond4": "==", "visibility-cond5": "==", "visibility-cond6": "==", "visibility-cond7": "==", "visibility-cond8": "==", "visibility-cond9": "==", "visibility-oid1": null, "visibility-oid10": null, "visibility-oid11": null, "visibility-oid12": null, "visibility-oid2": null, "visibility-oid3": null, "visibility-oid4": null, "visibility-oid5": null, "visibility-oid6": null, "visibility-oid7": null, "visibility-oid8": null, "visibility-oid9": null, "visibility-val1": "1", "visibility-val10": "1", "visibility-val11": "1", "visibility-val12": "1", "visibility-val2": "1", "visibility-val3": "1", "visibility-val4": "1", "visibility-val5": "1", "visibility-val6": "1", "visibility-val7": "1", "visibility-val8": "1", "visibility-val9": "1", "white1": null, "white10": null, "white11": null, "white12": null, "white2": null, "white3": null, "white4": null, "white5": null, "white6": null, "white7": null, "white8": null, "white9": null, "whiteMode1": null, "whiteMode10": null, "whiteMode11": null, "whiteMode12": null, "whiteMode2": null, "whiteMode3": null, "whiteMode4": null, "whiteMode5": null, "whiteMode6": null, "whiteMode7": null, "whiteMode8": null, "whiteMode9": null, "widget1": null, "widget10": null, "widget11": null, "widget12": null, "widget2": null, "widget3": null, "widget4": null, "widget5": null, "widget6": null, "widget7": null, "widget8": null, "widget9": null, "widgetTitle": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.name}", "working1": null, "working10": null, "working11": null, "working12": null, "working2": null, "working3": null, "working4": null, "working5": null, "working6": null, "working7": null, "working8": null, "working9": null, "oid13": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.lastPriceUpdate", "type13": "info", "noIcon13": true, "icon13": "", "iconSmall13": null, "iconEnabled13": null, "iconEnabledSmall13": null, "color13": null, "colorEnabled13": null, "slideInvert13": null, "title13": null, "unit13": null, "step13": null, "hideChart13": true, "chartPeriod13": 60, "buttonText13": null, "buttonIcon13": null, "buttonImage13": null, "buttonIconActive13": null, "buttonImageActive13": null, "infoInactiveText13": null, "infoActiveText13": null, "infoInactiveIcon13": null, "infoActiveIcon13": null, "infoInactiveImage13": null, "infoActiveImage13": null, "infoInactiveColor13": null, "infoActiveColor13": null, "widget13": null, "height13": null, "position13": null, "hide13": null, "actual13": null, "boost13": null, "party13": null, "switch13": null, "brightness13": null, "rgbType13": null, "red13": null, "green13": null, "blue13": null, "white13": null, "color_temperature13": null, "ct_min13": null, "ct_max13": null, "hue13": null, "saturation13": null, "luminance13": null, "hideBrightness13": null, "whiteMode13": null, "noRgbPalette13": null, "open13": null, "working13": null, "sensor13": null, "pincode13": null, "oid-pincode13": null, "doNotConfirm13": null, "noLockAnimation13": null, "lockColor13": null, "pincodeReturnButton13": "submit", "timeout13": 500, "vacuum-status-oid13": null, "vacuum-battery-oid13": null, "vacuum-is-charging-oid13": null, "vacuum-fan-speed-oid13": null, "vacuum-sensors-left-oid13": null, "vacuum-filter-left-oid13": null, "vacuum-main-brush-left-oid13": null, "vacuum-side-brush-left-oid13": null, "vacuum-cleaning-count-oid13": null, "vacuum-use-rooms13": null, "vacuum-map64-oid13": null, "vacuum-use-default-picture13": true, "vacuum-own-image13": null, "vacuum-start-oid13": null, "vacuum-home-oid13": null, "vacuum-pause-oid13": null, "undefined13": null, "visibility-oid13": null, "visibility-cond13": "==", "visibility-val13": "1", "g_switch-13": true, "visibility-oid": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.isOpen", "visibility-cond": "==", "visibility-val": "false", "visibility-groups": null, "visibility-groups-action": "hide", "g_visibility": true }, "style": { "bindings": [], "left": -6, "top": 14, "width": "100%", "height": "588px", "position": "relative" }, "widgetSet": "vis-2-widgets-material", "_id": "i000001" } ] -
Hier habe ich mal etwas für die Vis 2 gebastelt.
Im Editor einfach die Zahlen durch die Zahlen eurer Tankstelle ersetzen und importieren. Funktioniert hervorragend.
[ { "tpl": "tplMaterial2Switches", "data": { "actual1": null, "actual10": null, "actual11": null, "actual12": null, "actual2": null, "actual3": null, "actual4": null, "actual5": null, "actual6": null, "actual7": null, "actual8": null, "actual9": null, "allSwitch": false, "bindings": [ "widgetTitle", "icon2", "icon10", "infoActiveIcon1", "icon1" ], "blue1": null, "blue10": null, "blue11": null, "blue12": null, "blue2": null, "blue3": null, "blue4": null, "blue5": null, "blue6": null, "blue7": null, "blue8": null, "blue9": null, "boost1": null, "boost10": null, "boost11": null, "boost12": null, "boost2": null, "boost3": null, "boost4": null, "boost5": null, "boost6": null, "boost7": null, "boost8": null, "boost9": null, "brightness1": null, "brightness10": null, "brightness11": null, "brightness12": null, "brightness2": null, "brightness3": null, "brightness4": null, "brightness5": null, "brightness6": null, "brightness7": null, "brightness8": null, "brightness9": null, "buttonIcon1": null, "buttonIcon10": null, "buttonIcon11": null, "buttonIcon12": null, "buttonIcon2": null, "buttonIcon3": null, "buttonIcon4": null, "buttonIcon5": null, "buttonIcon6": null, "buttonIcon7": null, "buttonIcon8": null, "buttonIcon9": null, "buttonIconActive1": null, "buttonIconActive10": null, "buttonIconActive11": null, "buttonIconActive12": null, "buttonIconActive2": null, "buttonIconActive3": null, "buttonIconActive4": null, "buttonIconActive5": null, "buttonIconActive6": null, "buttonIconActive7": null, "buttonIconActive8": null, "buttonIconActive9": null, "buttonImage1": null, "buttonImage10": null, "buttonImage11": null, "buttonImage12": null, "buttonImage2": null, "buttonImage3": null, "buttonImage4": null, "buttonImage5": null, "buttonImage6": null, "buttonImage7": null, "buttonImage8": null, "buttonImage9": null, "buttonImageActive1": null, "buttonImageActive10": null, "buttonImageActive11": null, "buttonImageActive12": null, "buttonImageActive2": null, "buttonImageActive3": null, "buttonImageActive4": null, "buttonImageActive5": null, "buttonImageActive6": null, "buttonImageActive7": null, "buttonImageActive8": null, "buttonImageActive9": null, "buttonText1": null, "buttonText10": null, "buttonText11": null, "buttonText12": null, "buttonText2": null, "buttonText3": null, "buttonText4": null, "buttonText5": null, "buttonText6": null, "buttonText7": null, "buttonText8": null, "buttonText9": null, "buttonsWidth": 120, "chartPeriod1": 60, "chartPeriod10": 60, "chartPeriod11": 60, "chartPeriod12": 60, "chartPeriod2": 60, "chartPeriod3": 10080, "chartPeriod4": 60, "chartPeriod5": 60, "chartPeriod6": 60, "chartPeriod7": 60, "chartPeriod8": 60, "chartPeriod9": 60, "color1": null, "color10": null, "color11": null, "color12": null, "color2": null, "color3": "#ffffff", "color4": null, "color5": null, "color6": null, "color7": null, "color8": null, "color9": "#ffffff", "colorEnabled1": null, "colorEnabled10": null, "colorEnabled11": null, "colorEnabled12": null, "colorEnabled2": null, "colorEnabled3": "#ffffff", "colorEnabled4": null, "colorEnabled5": null, "colorEnabled6": null, "colorEnabled7": null, "colorEnabled8": null, "colorEnabled9": "#ffffff", "color_temperature1": null, "color_temperature10": null, "color_temperature11": null, "color_temperature12": null, "color_temperature2": null, "color_temperature3": null, "color_temperature4": null, "color_temperature5": null, "color_temperature6": null, "color_temperature7": null, "color_temperature8": null, "color_temperature9": null, "count": 13, "ct_max1": null, "ct_max10": null, "ct_max11": null, "ct_max12": null, "ct_max2": null, "ct_max3": null, "ct_max4": null, "ct_max5": null, "ct_max6": null, "ct_max7": null, "ct_max8": null, "ct_max9": null, "ct_min1": null, "ct_min10": null, "ct_min11": null, "ct_min12": null, "ct_min2": null, "ct_min3": null, "ct_min4": null, "ct_min5": null, "ct_min6": null, "ct_min7": null, "ct_min8": null, "ct_min9": null, "doNotConfirm1": null, "doNotConfirm10": null, "doNotConfirm11": null, "doNotConfirm12": null, "doNotConfirm2": null, "doNotConfirm3": null, "doNotConfirm4": null, "doNotConfirm5": null, "doNotConfirm6": null, "doNotConfirm7": null, "doNotConfirm8": null, "doNotConfirm9": null, "doNotWantIncludeWidgets": false, "g_common": true, "g_switch-1": true, "g_switch-10": true, "g_switch-11": true, "g_switch-12": true, "g_switch-2": true, "g_switch-3": true, "g_switch-4": true, "g_switch-5": true, "g_switch-6": true, "g_switch-7": true, "g_switch-8": true, "g_switch-9": true, "green1": null, "green10": null, "green11": null, "green12": null, "green2": null, "green3": null, "green4": null, "green5": null, "green6": null, "green7": null, "green8": null, "green9": null, "height1": null, "height10": null, "height11": null, "height12": null, "height2": null, "height3": null, "height4": null, "height5": null, "height6": null, "height7": null, "height8": null, "height9": null, "hide1": null, "hide10": null, "hide11": null, "hide12": null, "hide2": null, "hide3": null, "hide4": null, "hide5": null, "hide6": null, "hide7": null, "hide8": null, "hide9": null, "hideBrightness1": null, "hideBrightness10": null, "hideBrightness11": null, "hideBrightness12": null, "hideBrightness2": null, "hideBrightness3": null, "hideBrightness4": null, "hideBrightness5": null, "hideBrightness6": null, "hideBrightness7": null, "hideBrightness8": null, "hideBrightness9": null, "hideChart1": true, "hideChart10": true, "hideChart11": true, "hideChart12": true, "hideChart2": true, "hideChart3": true, "hideChart4": true, "hideChart5": true, "hideChart6": true, "hideChart7": true, "hideChart8": true, "hideChart9": true, "hue1": null, "hue10": null, "hue11": null, "hue12": null, "hue2": null, "hue3": null, "hue4": null, "hue5": null, "hue6": null, "hue7": null, "hue8": null, "hue9": null, "icon1": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.image}", "icon10": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.benzin.trend_24h_proj_icon}", "icon11": null, "icon12": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.image}", "icon2": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.image}", "icon3": "../vis-2.0/tanken/blue.png", "icon4": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.benzin.trend_24h_proj_icon}", "icon5": null, "icon6": "../vis-2.0/tanken/green.png", "icon7": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.benzin.trend_24h_proj_icon}", "icon8": null, "icon9": "../vis-2.0/tanken/red.png", "iconEnabled1": null, "iconEnabled10": null, "iconEnabled11": null, "iconEnabled12": null, "iconEnabled2": null, "iconEnabled3": "../vis-2.0/tanken/blue.png", "iconEnabled4": null, "iconEnabled5": null, "iconEnabled6": "../vis-2.0/tanken/green.png", "iconEnabled7": null, "iconEnabled8": null, "iconEnabled9": "../vis-2.0/tanken/red.png", "iconEnabledSmall1": null, "iconEnabledSmall10": null, "iconEnabledSmall11": null, "iconEnabledSmall12": null, "iconEnabledSmall2": null, "iconEnabledSmall3": null, "iconEnabledSmall4": null, "iconEnabledSmall5": null, "iconEnabledSmall6": null, "iconEnabledSmall7": null, "iconEnabledSmall8": null, "iconEnabledSmall9": null, "iconSmall1": null, "iconSmall10": null, "iconSmall11": null, "iconSmall12": null, "iconSmall2": null, "iconSmall3": null, "iconSmall4": null, "iconSmall5": null, "iconSmall6": null, "iconSmall7": null, "iconSmall8": null, "iconSmall9": null, "infoActiveColor1": null, "infoActiveColor10": null, "infoActiveColor11": null, "infoActiveColor12": null, "infoActiveColor2": null, "infoActiveColor3": null, "infoActiveColor4": null, "infoActiveColor5": null, "infoActiveColor6": null, "infoActiveColor7": null, "infoActiveColor8": null, "infoActiveColor9": null, "infoActiveIcon1": null, "infoActiveIcon10": null, "infoActiveIcon11": null, "infoActiveIcon12": null, "infoActiveIcon2": null, "infoActiveIcon3": null, "infoActiveIcon4": null, "infoActiveIcon5": null, "infoActiveIcon6": null, "infoActiveIcon7": null, "infoActiveIcon8": null, "infoActiveIcon9": null, "infoActiveImage1": null, "infoActiveImage10": null, "infoActiveImage11": null, "infoActiveImage12": null, "infoActiveImage2": null, "infoActiveImage3": null, "infoActiveImage4": null, "infoActiveImage5": null, "infoActiveImage6": null, "infoActiveImage7": null, "infoActiveImage8": null, "infoActiveImage9": null, "infoActiveText1": null, "infoActiveText10": null, "infoActiveText11": null, "infoActiveText12": null, "infoActiveText2": null, "infoActiveText3": null, "infoActiveText4": null, "infoActiveText5": null, "infoActiveText6": null, "infoActiveText7": null, "infoActiveText8": null, "infoActiveText9": null, "infoInactiveColor1": null, "infoInactiveColor10": null, "infoInactiveColor11": null, "infoInactiveColor12": null, "infoInactiveColor2": null, "infoInactiveColor3": null, "infoInactiveColor4": null, "infoInactiveColor5": null, "infoInactiveColor6": null, "infoInactiveColor7": null, "infoInactiveColor8": null, "infoInactiveColor9": null, "infoInactiveIcon1": null, "infoInactiveIcon10": null, "infoInactiveIcon11": null, "infoInactiveIcon12": null, "infoInactiveIcon2": null, "infoInactiveIcon3": null, "infoInactiveIcon4": null, "infoInactiveIcon5": null, "infoInactiveIcon6": null, "infoInactiveIcon7": null, "infoInactiveIcon8": null, "infoInactiveIcon9": null, "infoInactiveImage1": null, "infoInactiveImage10": null, "infoInactiveImage11": null, "infoInactiveImage12": null, "infoInactiveImage2": null, "infoInactiveImage3": null, "infoInactiveImage4": null, "infoInactiveImage5": null, "infoInactiveImage6": null, "infoInactiveImage7": null, "infoInactiveImage8": null, "infoInactiveImage9": null, "infoInactiveText1": null, "infoInactiveText10": null, "infoInactiveText11": null, "infoInactiveText12": null, "infoInactiveText2": null, "infoInactiveText3": null, "infoInactiveText4": null, "infoInactiveText5": null, "infoInactiveText6": null, "infoInactiveText7": null, "infoInactiveText8": null, "infoInactiveText9": null, "lockColor1": null, "lockColor10": null, "lockColor11": null, "lockColor12": null, "lockColor2": null, "lockColor3": null, "lockColor4": null, "lockColor5": null, "lockColor6": null, "lockColor7": null, "lockColor8": null, "lockColor9": null, "luminance1": null, "luminance10": null, "luminance11": null, "luminance12": null, "luminance2": null, "luminance3": null, "luminance4": null, "luminance5": null, "luminance6": null, "luminance7": null, "luminance8": null, "luminance9": null, "noIcon1": false, "noIcon10": true, "noIcon11": true, "noIcon12": true, "noIcon2": true, "noIcon3": null, "noIcon4": true, "noIcon5": true, "noIcon6": null, "noIcon7": true, "noIcon8": true, "noIcon9": null, "noLockAnimation1": null, "noLockAnimation10": null, "noLockAnimation11": null, "noLockAnimation12": null, "noLockAnimation2": null, "noLockAnimation3": null, "noLockAnimation4": null, "noLockAnimation5": null, "noLockAnimation6": null, "noLockAnimation7": null, "noLockAnimation8": null, "noLockAnimation9": null, "noRgbPalette1": null, "noRgbPalette10": null, "noRgbPalette11": null, "noRgbPalette12": null, "noRgbPalette2": null, "noRgbPalette3": null, "noRgbPalette4": null, "noRgbPalette5": null, "noRgbPalette6": null, "noRgbPalette7": null, "noRgbPalette8": null, "noRgbPalette9": null, "oid-pincode1": null, "oid-pincode10": null, "oid-pincode11": null, "oid-pincode12": null, "oid-pincode2": null, "oid-pincode3": null, "oid-pincode4": null, "oid-pincode5": null, "oid-pincode6": null, "oid-pincode7": null, "oid-pincode8": null, "oid-pincode9": null, "oid1": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.street", "oid10": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.diesel.trend_24h_proj", "oid11": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.diesel.trend_24h_proj_price", "oid12": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.lastChecked", "oid2": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.place", "oid3": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.benzin_str", "oid4": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.benzin.trend_24h_proj", "oid5": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.benzin.trend_24h_proj_price", "oid6": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.e10_str", "oid7": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.e10.trend_24h_proj", "oid8": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.aspects.e10.trend_24h_proj_price", "oid9": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.diesel_str", "open1": null, "open10": null, "open11": null, "open12": null, "open2": null, "open3": null, "open4": null, "open5": null, "open6": null, "open7": null, "open8": null, "open9": null, "orientation": "horizontal", "party1": null, "party10": null, "party11": null, "party12": null, "party2": null, "party3": null, "party4": null, "party5": null, "party6": null, "party7": null, "party8": null, "party9": null, "pincode1": null, "pincode10": null, "pincode11": null, "pincode12": null, "pincode2": null, "pincode3": null, "pincode4": null, "pincode5": null, "pincode6": null, "pincode7": null, "pincode8": null, "pincode9": null, "pincodeReturnButton1": "submit", "pincodeReturnButton10": "submit", "pincodeReturnButton11": "submit", "pincodeReturnButton12": "submit", "pincodeReturnButton2": "submit", "pincodeReturnButton3": "submit", "pincodeReturnButton4": "submit", "pincodeReturnButton5": "submit", "pincodeReturnButton6": "submit", "pincodeReturnButton7": "submit", "pincodeReturnButton8": "submit", "pincodeReturnButton9": "submit", "position1": null, "position10": null, "position11": null, "position12": null, "position2": null, "position3": null, "position4": null, "position5": null, "position6": null, "position7": null, "position8": null, "position9": null, "red1": null, "red10": null, "red11": null, "red12": null, "red2": null, "red3": null, "red4": null, "red5": null, "red6": null, "red7": null, "red8": null, "red9": null, "rgbType1": null, "rgbType10": null, "rgbType11": null, "rgbType12": null, "rgbType2": null, "rgbType3": null, "rgbType4": null, "rgbType5": null, "rgbType6": null, "rgbType7": null, "rgbType8": null, "rgbType9": null, "saturation1": null, "saturation10": null, "saturation11": null, "saturation12": null, "saturation2": null, "saturation3": null, "saturation4": null, "saturation5": null, "saturation6": null, "saturation7": null, "saturation8": null, "saturation9": null, "sensor1": null, "sensor10": null, "sensor11": null, "sensor12": null, "sensor2": null, "sensor3": null, "sensor4": null, "sensor5": null, "sensor6": null, "sensor7": null, "sensor8": null, "sensor9": null, "slideInvert1": null, "slideInvert10": null, "slideInvert11": null, "slideInvert12": null, "slideInvert2": null, "slideInvert3": null, "slideInvert4": null, "slideInvert5": null, "slideInvert6": null, "slideInvert7": null, "slideInvert8": null, "slideInvert9": null, "step1": null, "step10": null, "step11": null, "step12": null, "step2": null, "step3": null, "step4": null, "step5": null, "step6": null, "step7": null, "step8": null, "step9": null, "switch1": null, "switch10": null, "switch11": null, "switch12": null, "switch2": null, "switch3": null, "switch4": null, "switch5": null, "switch6": null, "switch7": null, "switch8": null, "switch9": null, "timeout1": 500, "timeout10": 500, "timeout11": 500, "timeout12": 500, "timeout2": 500, "timeout3": 500, "timeout4": 500, "timeout5": 500, "timeout6": 500, "timeout7": 500, "timeout8": 500, "timeout9": 500, "title1": "Straße", "title10": "Prognose 24h", "title11": "Preisprognose 24h", "title12": null, "title2": "Ort", "title3": "Super 95", "title4": "Prognose 24h", "title5": "Preisprognose 24h", "title6": "E10", "title7": "Prognose 24h", "title8": "Preisprognose 24h", "title9": "Diesel", "type": "lines", "type1": "info", "type10": "info", "type11": "info", "type12": "info", "type2": "info", "type3": "info", "type4": "info", "type5": "info", "type6": "info", "type7": "info", "type8": "info", "type9": "info", "undefined1": null, "undefined10": null, "undefined11": null, "undefined12": null, "undefined2": null, "undefined3": null, "undefined4": null, "undefined5": null, "undefined6": null, "undefined7": null, "undefined8": null, "undefined9": null, "unit1": null, "unit10": null, "unit11": "€", "unit12": null, "unit2": null, "unit3": "€", "unit4": null, "unit5": "€", "unit6": "€", "unit7": null, "unit8": "€", "unit9": "€", "vacuum-battery-oid1": null, "vacuum-battery-oid10": null, "vacuum-battery-oid11": null, "vacuum-battery-oid12": null, "vacuum-battery-oid2": null, "vacuum-battery-oid3": null, "vacuum-battery-oid4": null, "vacuum-battery-oid5": null, "vacuum-battery-oid6": null, "vacuum-battery-oid7": null, "vacuum-battery-oid8": null, "vacuum-battery-oid9": null, "vacuum-cleaning-count-oid1": null, "vacuum-cleaning-count-oid10": null, "vacuum-cleaning-count-oid11": null, "vacuum-cleaning-count-oid12": null, "vacuum-cleaning-count-oid2": null, "vacuum-cleaning-count-oid3": null, "vacuum-cleaning-count-oid4": null, "vacuum-cleaning-count-oid5": null, "vacuum-cleaning-count-oid6": null, "vacuum-cleaning-count-oid7": null, "vacuum-cleaning-count-oid8": null, "vacuum-cleaning-count-oid9": null, "vacuum-fan-speed-oid1": null, "vacuum-fan-speed-oid10": null, "vacuum-fan-speed-oid11": null, "vacuum-fan-speed-oid12": null, "vacuum-fan-speed-oid2": null, "vacuum-fan-speed-oid3": null, "vacuum-fan-speed-oid4": null, "vacuum-fan-speed-oid5": null, "vacuum-fan-speed-oid6": null, "vacuum-fan-speed-oid7": null, "vacuum-fan-speed-oid8": null, "vacuum-fan-speed-oid9": null, "vacuum-filter-left-oid1": null, "vacuum-filter-left-oid10": null, "vacuum-filter-left-oid11": null, "vacuum-filter-left-oid12": null, "vacuum-filter-left-oid2": null, "vacuum-filter-left-oid3": null, "vacuum-filter-left-oid4": null, "vacuum-filter-left-oid5": null, "vacuum-filter-left-oid6": null, "vacuum-filter-left-oid7": null, "vacuum-filter-left-oid8": null, "vacuum-filter-left-oid9": null, "vacuum-home-oid1": null, "vacuum-home-oid10": null, "vacuum-home-oid11": null, "vacuum-home-oid12": null, "vacuum-home-oid2": null, "vacuum-home-oid3": null, "vacuum-home-oid4": null, "vacuum-home-oid5": null, "vacuum-home-oid6": null, "vacuum-home-oid7": null, "vacuum-home-oid8": null, "vacuum-home-oid9": null, "vacuum-is-charging-oid1": null, "vacuum-is-charging-oid10": null, "vacuum-is-charging-oid11": null, "vacuum-is-charging-oid12": null, "vacuum-is-charging-oid2": null, "vacuum-is-charging-oid3": null, "vacuum-is-charging-oid4": null, "vacuum-is-charging-oid5": null, "vacuum-is-charging-oid6": null, "vacuum-is-charging-oid7": null, "vacuum-is-charging-oid8": null, "vacuum-is-charging-oid9": null, "vacuum-main-brush-left-oid1": null, "vacuum-main-brush-left-oid10": null, "vacuum-main-brush-left-oid11": null, "vacuum-main-brush-left-oid12": null, "vacuum-main-brush-left-oid2": null, "vacuum-main-brush-left-oid3": null, "vacuum-main-brush-left-oid4": null, "vacuum-main-brush-left-oid5": null, "vacuum-main-brush-left-oid6": null, "vacuum-main-brush-left-oid7": null, "vacuum-main-brush-left-oid8": null, "vacuum-main-brush-left-oid9": null, "vacuum-map64-oid1": null, "vacuum-map64-oid10": null, "vacuum-map64-oid11": null, "vacuum-map64-oid12": null, "vacuum-map64-oid2": null, "vacuum-map64-oid3": null, "vacuum-map64-oid4": null, "vacuum-map64-oid5": null, "vacuum-map64-oid6": null, "vacuum-map64-oid7": null, "vacuum-map64-oid8": null, "vacuum-map64-oid9": null, "vacuum-own-image1": null, "vacuum-own-image10": null, "vacuum-own-image11": null, "vacuum-own-image12": null, "vacuum-own-image2": null, "vacuum-own-image3": null, "vacuum-own-image4": null, "vacuum-own-image5": null, "vacuum-own-image6": null, "vacuum-own-image7": null, "vacuum-own-image8": null, "vacuum-own-image9": null, "vacuum-pause-oid1": null, "vacuum-pause-oid10": null, "vacuum-pause-oid11": null, "vacuum-pause-oid12": null, "vacuum-pause-oid2": null, "vacuum-pause-oid3": null, "vacuum-pause-oid4": null, "vacuum-pause-oid5": null, "vacuum-pause-oid6": null, "vacuum-pause-oid7": null, "vacuum-pause-oid8": null, "vacuum-pause-oid9": null, "vacuum-sensors-left-oid1": null, "vacuum-sensors-left-oid10": null, "vacuum-sensors-left-oid11": null, "vacuum-sensors-left-oid12": null, "vacuum-sensors-left-oid2": null, "vacuum-sensors-left-oid3": null, "vacuum-sensors-left-oid4": null, "vacuum-sensors-left-oid5": null, "vacuum-sensors-left-oid6": null, "vacuum-sensors-left-oid7": null, "vacuum-sensors-left-oid8": null, "vacuum-sensors-left-oid9": null, "vacuum-side-brush-left-oid1": null, "vacuum-side-brush-left-oid10": null, "vacuum-side-brush-left-oid11": null, "vacuum-side-brush-left-oid12": null, "vacuum-side-brush-left-oid2": null, "vacuum-side-brush-left-oid3": null, "vacuum-side-brush-left-oid4": null, "vacuum-side-brush-left-oid5": null, "vacuum-side-brush-left-oid6": null, "vacuum-side-brush-left-oid7": null, "vacuum-side-brush-left-oid8": null, "vacuum-side-brush-left-oid9": null, "vacuum-start-oid1": null, "vacuum-start-oid10": null, "vacuum-start-oid11": null, "vacuum-start-oid12": null, "vacuum-start-oid2": null, "vacuum-start-oid3": null, "vacuum-start-oid4": null, "vacuum-start-oid5": null, "vacuum-start-oid6": null, "vacuum-start-oid7": null, "vacuum-start-oid8": null, "vacuum-start-oid9": null, "vacuum-status-oid1": null, "vacuum-status-oid10": null, "vacuum-status-oid11": null, "vacuum-status-oid12": null, "vacuum-status-oid2": null, "vacuum-status-oid3": null, "vacuum-status-oid4": null, "vacuum-status-oid5": null, "vacuum-status-oid6": null, "vacuum-status-oid7": null, "vacuum-status-oid8": null, "vacuum-status-oid9": null, "vacuum-use-default-picture1": true, "vacuum-use-default-picture10": true, "vacuum-use-default-picture11": true, "vacuum-use-default-picture12": true, "vacuum-use-default-picture2": true, "vacuum-use-default-picture3": true, "vacuum-use-default-picture4": true, "vacuum-use-default-picture5": true, "vacuum-use-default-picture6": true, "vacuum-use-default-picture7": true, "vacuum-use-default-picture8": true, "vacuum-use-default-picture9": true, "vacuum-use-rooms1": null, "vacuum-use-rooms10": null, "vacuum-use-rooms11": null, "vacuum-use-rooms12": null, "vacuum-use-rooms2": null, "vacuum-use-rooms3": null, "vacuum-use-rooms4": null, "vacuum-use-rooms5": null, "vacuum-use-rooms6": null, "vacuum-use-rooms7": null, "vacuum-use-rooms8": null, "vacuum-use-rooms9": null, "visibility-cond1": "==", "visibility-cond10": "==", "visibility-cond11": "==", "visibility-cond12": "==", "visibility-cond2": "==", "visibility-cond3": "==", "visibility-cond4": "==", "visibility-cond5": "==", "visibility-cond6": "==", "visibility-cond7": "==", "visibility-cond8": "==", "visibility-cond9": "==", "visibility-oid1": null, "visibility-oid10": null, "visibility-oid11": null, "visibility-oid12": null, "visibility-oid2": null, "visibility-oid3": null, "visibility-oid4": null, "visibility-oid5": null, "visibility-oid6": null, "visibility-oid7": null, "visibility-oid8": null, "visibility-oid9": null, "visibility-val1": "1", "visibility-val10": "1", "visibility-val11": "1", "visibility-val12": "1", "visibility-val2": "1", "visibility-val3": "1", "visibility-val4": "1", "visibility-val5": "1", "visibility-val6": "1", "visibility-val7": "1", "visibility-val8": "1", "visibility-val9": "1", "white1": null, "white10": null, "white11": null, "white12": null, "white2": null, "white3": null, "white4": null, "white5": null, "white6": null, "white7": null, "white8": null, "white9": null, "whiteMode1": null, "whiteMode10": null, "whiteMode11": null, "whiteMode12": null, "whiteMode2": null, "whiteMode3": null, "whiteMode4": null, "whiteMode5": null, "whiteMode6": null, "whiteMode7": null, "whiteMode8": null, "whiteMode9": null, "widget1": null, "widget10": null, "widget11": null, "widget12": null, "widget2": null, "widget3": null, "widget4": null, "widget5": null, "widget6": null, "widget7": null, "widget8": null, "widget9": null, "widgetTitle": "{0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.name}", "working1": null, "working10": null, "working11": null, "working12": null, "working2": null, "working3": null, "working4": null, "working5": null, "working6": null, "working7": null, "working8": null, "working9": null, "oid13": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.lastPriceUpdate", "type13": "info", "noIcon13": true, "icon13": "", "iconSmall13": null, "iconEnabled13": null, "iconEnabledSmall13": null, "color13": null, "colorEnabled13": null, "slideInvert13": null, "title13": null, "unit13": null, "step13": null, "hideChart13": true, "chartPeriod13": 60, "buttonText13": null, "buttonIcon13": null, "buttonImage13": null, "buttonIconActive13": null, "buttonImageActive13": null, "infoInactiveText13": null, "infoActiveText13": null, "infoInactiveIcon13": null, "infoActiveIcon13": null, "infoInactiveImage13": null, "infoActiveImage13": null, "infoInactiveColor13": null, "infoActiveColor13": null, "widget13": null, "height13": null, "position13": null, "hide13": null, "actual13": null, "boost13": null, "party13": null, "switch13": null, "brightness13": null, "rgbType13": null, "red13": null, "green13": null, "blue13": null, "white13": null, "color_temperature13": null, "ct_min13": null, "ct_max13": null, "hue13": null, "saturation13": null, "luminance13": null, "hideBrightness13": null, "whiteMode13": null, "noRgbPalette13": null, "open13": null, "working13": null, "sensor13": null, "pincode13": null, "oid-pincode13": null, "doNotConfirm13": null, "noLockAnimation13": null, "lockColor13": null, "pincodeReturnButton13": "submit", "timeout13": 500, "vacuum-status-oid13": null, "vacuum-battery-oid13": null, "vacuum-is-charging-oid13": null, "vacuum-fan-speed-oid13": null, "vacuum-sensors-left-oid13": null, "vacuum-filter-left-oid13": null, "vacuum-main-brush-left-oid13": null, "vacuum-side-brush-left-oid13": null, "vacuum-cleaning-count-oid13": null, "vacuum-use-rooms13": null, "vacuum-map64-oid13": null, "vacuum-use-default-picture13": true, "vacuum-own-image13": null, "vacuum-start-oid13": null, "vacuum-home-oid13": null, "vacuum-pause-oid13": null, "undefined13": null, "visibility-oid13": null, "visibility-cond13": "==", "visibility-val13": "1", "g_switch-13": true, "visibility-oid": "0_userdata.0.tankerkoenig.aa7ec0ed-f087-48e5-95c1-bcb47affa5cf.isOpen", "visibility-cond": "==", "visibility-val": "false", "visibility-groups": null, "visibility-groups-action": "hide", "g_visibility": true }, "style": { "bindings": [], "left": -6, "top": 14, "width": "100%", "height": "588px", "position": "relative" }, "widgetSet": "vis-2-widgets-material", "_id": "i000001" } ] -

[ { "tpl": "tplMaterial2Switches", "data": { "actual1": null, "actual2": null, "actual3": null, "actual4": null, "actual5": null, "actual6": null, "allSwitch": false, "bindings": [ "icon10", "infoActiveIcon1", "oid2" ], "blue1": null, "blue2": null, "blue3": null, "blue4": null, "blue5": null, "blue6": null, "boost1": null, "boost2": null, "boost3": null, "boost4": null, "boost5": null, "boost6": null, "brightness1": null, "brightness2": null, "brightness3": null, "brightness4": null, "brightness5": null, "brightness6": null, "buttonIcon1": null, "buttonIcon2": null, "buttonIcon3": null, "buttonIcon4": null, "buttonIcon5": null, "buttonIcon6": null, "buttonIconActive1": null, "buttonIconActive2": null, "buttonIconActive3": null, "buttonIconActive4": null, "buttonIconActive5": null, "buttonIconActive6": null, "buttonImage1": null, "buttonImage2": null, "buttonImage3": null, "buttonImage4": null, "buttonImage5": null, "buttonImage6": null, "buttonImageActive1": null, "buttonImageActive2": null, "buttonImageActive3": null, "buttonImageActive4": null, "buttonImageActive5": null, "buttonImageActive6": null, "buttonText1": null, "buttonText2": null, "buttonText3": null, "buttonText4": null, "buttonText5": null, "buttonText6": null, "buttonsWidth": 120, "chartPeriod1": 60, "chartPeriod2": 60, "chartPeriod3": 60, "chartPeriod4": 60, "chartPeriod5": 60, "chartPeriod6": 60, "color1": null, "color2": null, "color3": null, "color4": null, "color5": null, "color6": null, "colorEnabled1": null, "colorEnabled2": null, "colorEnabled3": null, "colorEnabled4": null, "colorEnabled5": null, "colorEnabled6": null, "color_temperature1": null, "color_temperature2": null, "color_temperature3": null, "color_temperature4": null, "color_temperature5": null, "color_temperature6": null, "count": 12, "ct_max1": null, "ct_max2": null, "ct_max3": null, "ct_max4": null, "ct_max5": null, "ct_max6": null, "ct_min1": null, "ct_min2": null, "ct_min3": null, "ct_min4": null, "ct_min5": null, "ct_min6": null, "doNotConfirm1": null, "doNotConfirm2": null, "doNotConfirm3": null, "doNotConfirm4": null, "doNotConfirm5": null, "doNotConfirm6": null, "doNotWantIncludeWidgets": false, "g_common": true, "g_switch-1": true, "g_switch-2": true, "g_switch-3": true, "g_switch-4": true, "g_switch-5": true, "g_switch-6": true, "green1": null, "green2": null, "green3": null, "green4": null, "green5": null, "green6": null, "height1": null, "height2": null, "height3": null, "height4": null, "height5": null, "height6": null, "hide1": null, "hide2": null, "hide3": null, "hide4": null, "hide5": null, "hide6": null, "hideBrightness1": null, "hideBrightness2": null, "hideBrightness3": null, "hideBrightness4": null, "hideBrightness5": null, "hideBrightness6": null, "hideChart1": true, "hideChart2": true, "hideChart3": true, "hideChart4": true, "hideChart5": true, "hideChart6": true, "hue1": null, "hue2": null, "hue3": null, "hue4": null, "hue5": null, "hue6": null, "icon1": "../vis-2.0/tanken/blue.png", "icon2": "{0_userdata.0.tankerkoenig.bfbd3c8e-78af-486e-94f0-5b99f37dfe76.image}", "icon3": "{0_userdata.0.tankerkoenig.bfbd3c8e-78af-486e-94f0-5b99f37dfe76.image}", "icon4": "{0_userdata.0.tankerkoenig.bfbd3c8e-78af-486e-94f0-5b99f37dfe76.image}", "icon5": "../vis-2.0/tanken/red.png", "icon6": "{0_userdata.0.tankerkoenig.bfbd3c8e-78af-486e-94f0-5b99f37dfe76.image}", "iconEnabled1": "../vis-2.0/tanken/blue.png", "iconEnabled2": null, "iconEnabled3": null, "iconEnabled4": null, "iconEnabled5": "../vis-2.0/tanken/red.png", "iconEnabled6": null, "iconEnabledSmall1": null, "iconEnabledSmall2": null, "iconEnabledSmall3": null, "iconEnabledSmall4": null, "iconEnabledSmall5": null, "iconEnabledSmall6": null, "iconSmall1": null, "iconSmall2": null, "iconSmall3": null, "iconSmall4": null, "iconSmall5": null, "iconSmall6": null, "infoActiveColor1": null, "infoActiveColor2": null, "infoActiveColor3": null, "infoActiveColor4": null, "infoActiveColor5": null, "infoActiveColor6": null, "infoActiveIcon1": null, "infoActiveIcon2": null, "infoActiveIcon3": null, "infoActiveIcon4": null, "infoActiveIcon5": null, "infoActiveIcon6": null, "infoActiveImage1": null, "infoActiveImage2": null, "infoActiveImage3": null, "infoActiveImage4": null, "infoActiveImage5": null, "infoActiveImage6": null, "infoActiveText1": null, "infoActiveText2": null, "infoActiveText3": null, "infoActiveText4": null, "infoActiveText5": null, "infoActiveText6": null, "infoInactiveColor1": null, "infoInactiveColor2": null, "infoInactiveColor3": null, "infoInactiveColor4": null, "infoInactiveColor5": null, "infoInactiveColor6": null, "infoInactiveIcon1": null, "infoInactiveIcon2": null, "infoInactiveIcon3": null, "infoInactiveIcon4": null, "infoInactiveIcon5": null, "infoInactiveIcon6": null, "infoInactiveImage1": null, "infoInactiveImage2": null, "infoInactiveImage3": null, "infoInactiveImage4": null, "infoInactiveImage5": null, "infoInactiveImage6": null, "infoInactiveText1": null, "infoInactiveText2": null, "infoInactiveText3": null, "infoInactiveText4": null, "infoInactiveText5": null, "infoInactiveText6": null, "lockColor1": null, "lockColor2": null, "lockColor3": null, "lockColor4": null, "lockColor5": null, "lockColor6": null, "luminance1": null, "luminance2": null, "luminance3": null, "luminance4": null, "luminance5": null, "luminance6": null, "noIcon1": false, "noIcon2": true, "noIcon3": true, "noIcon4": true, "noIcon5": false, "noIcon6": true, "noLockAnimation1": null, "noLockAnimation2": null, "noLockAnimation3": null, "noLockAnimation4": null, "noLockAnimation5": null, "noLockAnimation6": null, "noRgbPalette1": null, "noRgbPalette2": null, "noRgbPalette3": null, "noRgbPalette4": null, "noRgbPalette5": null, "noRgbPalette6": null, "oid-pincode1": null, "oid-pincode2": null, "oid-pincode3": null, "oid-pincode4": null, "oid-pincode5": null, "oid-pincode6": null, "oid1": "0_userdata.0.tankerkoenig.cheapest.benzin_station_name", "oid2": "0_userdata.0.tankerkoenig.cheapest.benzin_price_str", "oid3": "0_userdata.0.tankerkoenig.difference.benzin", "oid4": "0_userdata.0.tankerkoenig.average.benzin_str", "oid5": "0_userdata.0.tankerkoenig.cheapest.diesel_station_name", "oid6": "0_userdata.0.tankerkoenig.cheapest.diesel_price_str", "open1": null, "open2": null, "open3": null, "open4": null, "open5": null, "open6": null, "orientation": "horizontal", "party1": null, "party2": null, "party3": null, "party4": null, "party5": null, "party6": null, "pincode1": null, "pincode2": null, "pincode3": null, "pincode4": null, "pincode5": null, "pincode6": null, "pincodeReturnButton1": "submit", "pincodeReturnButton2": "submit", "pincodeReturnButton3": "submit", "pincodeReturnButton4": "submit", "pincodeReturnButton5": "submit", "pincodeReturnButton6": "submit", "position1": null, "position2": null, "position3": null, "position4": null, "position5": null, "position6": null, "red1": null, "red2": null, "red3": null, "red4": null, "red5": null, "red6": null, "rgbType1": null, "rgbType2": null, "rgbType3": null, "rgbType4": null, "rgbType5": null, "rgbType6": null, "saturation1": null, "saturation2": null, "saturation3": null, "saturation4": null, "saturation5": null, "saturation6": null, "sensor1": null, "sensor2": null, "sensor3": null, "sensor4": null, "sensor5": null, "sensor6": null, "slideInvert1": null, "slideInvert2": null, "slideInvert3": null, "slideInvert4": null, "slideInvert5": null, "slideInvert6": null, "step1": null, "step2": null, "step3": null, "step4": null, "step5": null, "step6": null, "switch1": null, "switch2": null, "switch3": null, "switch4": null, "switch5": null, "switch6": null, "timeout1": 500, "timeout2": 500, "timeout3": 500, "timeout4": 500, "timeout5": 500, "timeout6": 500, "title1": " ", "title2": "Super", "title3": "Differenz", "title4": "Durchschnitt", "title5": " ", "title6": "Diesel", "type": "lines", "type1": "info", "type2": "info", "type3": "info", "type4": "info", "type5": "info", "type6": "info", "undefined1": null, "undefined2": null, "undefined3": null, "undefined4": null, "undefined5": null, "undefined6": null, "unit1": null, "unit2": "€", "unit3": "€", "unit4": "€", "unit5": null, "unit6": "€", "vacuum-battery-oid1": null, "vacuum-battery-oid2": null, "vacuum-battery-oid3": null, "vacuum-battery-oid4": null, "vacuum-battery-oid5": null, "vacuum-battery-oid6": null, "vacuum-cleaning-count-oid1": null, "vacuum-cleaning-count-oid2": null, "vacuum-cleaning-count-oid3": null, "vacuum-cleaning-count-oid4": null, "vacuum-cleaning-count-oid5": null, "vacuum-cleaning-count-oid6": null, "vacuum-fan-speed-oid1": null, "vacuum-fan-speed-oid2": null, "vacuum-fan-speed-oid3": null, "vacuum-fan-speed-oid4": null, "vacuum-fan-speed-oid5": null, "vacuum-fan-speed-oid6": null, "vacuum-filter-left-oid1": null, "vacuum-filter-left-oid2": null, "vacuum-filter-left-oid3": null, "vacuum-filter-left-oid4": null, "vacuum-filter-left-oid5": null, "vacuum-filter-left-oid6": null, "vacuum-home-oid1": null, "vacuum-home-oid2": null, "vacuum-home-oid3": null, "vacuum-home-oid4": null, "vacuum-home-oid5": null, "vacuum-home-oid6": null, "vacuum-is-charging-oid1": null, "vacuum-is-charging-oid2": null, "vacuum-is-charging-oid3": null, "vacuum-is-charging-oid4": null, "vacuum-is-charging-oid5": null, "vacuum-is-charging-oid6": null, "vacuum-main-brush-left-oid1": null, "vacuum-main-brush-left-oid2": null, "vacuum-main-brush-left-oid3": null, "vacuum-main-brush-left-oid4": null, "vacuum-main-brush-left-oid5": null, "vacuum-main-brush-left-oid6": null, "vacuum-map64-oid1": null, "vacuum-map64-oid2": null, "vacuum-map64-oid3": null, "vacuum-map64-oid4": null, "vacuum-map64-oid5": null, "vacuum-map64-oid6": null, "vacuum-own-image1": null, "vacuum-own-image2": null, "vacuum-own-image3": null, "vacuum-own-image4": null, "vacuum-own-image5": null, "vacuum-own-image6": null, "vacuum-pause-oid1": null, "vacuum-pause-oid2": null, "vacuum-pause-oid3": null, "vacuum-pause-oid4": null, "vacuum-pause-oid5": null, "vacuum-pause-oid6": null, "vacuum-sensors-left-oid1": null, "vacuum-sensors-left-oid2": null, "vacuum-sensors-left-oid3": null, "vacuum-sensors-left-oid4": null, "vacuum-sensors-left-oid5": null, "vacuum-sensors-left-oid6": null, "vacuum-side-brush-left-oid1": null, "vacuum-side-brush-left-oid2": null, "vacuum-side-brush-left-oid3": null, "vacuum-side-brush-left-oid4": null, "vacuum-side-brush-left-oid5": null, "vacuum-side-brush-left-oid6": null, "vacuum-start-oid1": null, "vacuum-start-oid2": null, "vacuum-start-oid3": null, "vacuum-start-oid4": null, "vacuum-start-oid5": null, "vacuum-start-oid6": null, "vacuum-status-oid1": null, "vacuum-status-oid2": null, "vacuum-status-oid3": null, "vacuum-status-oid4": null, "vacuum-status-oid5": null, "vacuum-status-oid6": null, "vacuum-use-default-picture1": true, "vacuum-use-default-picture2": true, "vacuum-use-default-picture3": true, "vacuum-use-default-picture4": true, "vacuum-use-default-picture5": true, "vacuum-use-default-picture6": true, "vacuum-use-rooms1": null, "vacuum-use-rooms2": null, "vacuum-use-rooms3": null, "vacuum-use-rooms4": null, "vacuum-use-rooms5": null, "vacuum-use-rooms6": null, "visibility-cond1": "==", "visibility-cond2": "==", "visibility-cond3": "==", "visibility-cond4": "==", "visibility-cond5": "==", "visibility-cond6": "==", "visibility-oid1": null, "visibility-oid2": null, "visibility-oid3": null, "visibility-oid4": null, "visibility-oid5": null, "visibility-oid6": null, "visibility-val1": "1", "visibility-val2": "1", "visibility-val3": "1", "visibility-val4": "1", "visibility-val5": "1", "visibility-val6": "1", "white1": null, "white2": null, "white3": null, "white4": null, "white5": null, "white6": null, "whiteMode1": null, "whiteMode2": null, "whiteMode3": null, "whiteMode4": null, "whiteMode5": null, "whiteMode6": null, "widget1": null, "widget2": null, "widget3": null, "widget4": null, "widget5": null, "widget6": null, "widgetTitle": "Günstigster Preis", "working1": null, "working2": null, "working3": null, "working4": null, "working5": null, "working6": null, "oid7": "0_userdata.0.tankerkoenig.difference.diesel", "type7": "info", "noIcon7": true, "icon7": "{0_userdata.0.tankerkoenig.bfbd3c8e-78af-486e-94f0-5b99f37dfe76.image}", "iconSmall7": null, "iconEnabled7": null, "iconEnabledSmall7": null, "color7": null, "colorEnabled7": null, "slideInvert7": null, "title7": "Differenz", "unit7": "€", "step7": null, "hideChart7": true, "chartPeriod7": 60, "buttonText7": null, "buttonIcon7": null, "buttonImage7": null, "buttonIconActive7": null, "buttonImageActive7": null, "infoInactiveText7": null, "infoActiveText7": null, "infoInactiveIcon7": null, "infoActiveIcon7": null, "infoInactiveImage7": null, "infoActiveImage7": null, "infoInactiveColor7": null, "infoActiveColor7": null, "widget7": null, "height7": null, "position7": null, "hide7": null, "actual7": null, "boost7": null, "party7": null, "switch7": null, "brightness7": null, "rgbType7": null, "red7": null, "green7": null, "blue7": null, "white7": null, "color_temperature7": null, "ct_min7": null, "ct_max7": null, "hue7": null, "saturation7": null, "luminance7": null, "hideBrightness7": null, "whiteMode7": null, "noRgbPalette7": null, "open7": null, "working7": null, "sensor7": null, "pincode7": null, "oid-pincode7": null, "doNotConfirm7": null, "noLockAnimation7": null, "lockColor7": null, "pincodeReturnButton7": "submit", "timeout7": 500, "vacuum-status-oid7": null, "vacuum-battery-oid7": null, "vacuum-is-charging-oid7": null, "vacuum-fan-speed-oid7": null, "vacuum-sensors-left-oid7": null, "vacuum-filter-left-oid7": null, "vacuum-main-brush-left-oid7": null, "vacuum-side-brush-left-oid7": null, "vacuum-cleaning-count-oid7": null, "vacuum-use-rooms7": null, "vacuum-map64-oid7": null, "vacuum-use-default-picture7": true, "vacuum-own-image7": null, "vacuum-start-oid7": null, "vacuum-home-oid7": null, "vacuum-pause-oid7": null, "undefined7": null, "visibility-oid7": null, "visibility-cond7": "==", "visibility-val7": "1", "g_switch-7": true, "oid8": "0_userdata.0.tankerkoenig.average.diesel_str", "type8": "info", "noIcon8": true, "icon8": "{0_userdata.0.tankerkoenig.bfbd3c8e-78af-486e-94f0-5b99f37dfe76.image}", "iconSmall8": null, "iconEnabled8": null, "iconEnabledSmall8": null, "color8": null, "colorEnabled8": null, "slideInvert8": null, "title8": "Durchschnitt", "unit8": "€", "step8": null, "hideChart8": true, "chartPeriod8": 60, "buttonText8": null, "buttonIcon8": null, "buttonImage8": null, "buttonIconActive8": null, "buttonImageActive8": null, "infoInactiveText8": null, "infoActiveText8": null, "infoInactiveIcon8": null, "infoActiveIcon8": null, "infoInactiveImage8": null, "infoActiveImage8": null, "infoInactiveColor8": null, "infoActiveColor8": null, "widget8": null, "height8": null, "position8": null, "hide8": null, "actual8": null, "boost8": null, "party8": null, "switch8": null, "brightness8": null, "rgbType8": null, "red8": null, "green8": null, "blue8": null, "white8": null, "color_temperature8": null, "ct_min8": null, "ct_max8": null, "hue8": null, "saturation8": null, "luminance8": null, "hideBrightness8": null, "whiteMode8": null, "noRgbPalette8": null, "open8": null, "working8": null, "sensor8": null, "pincode8": null, "oid-pincode8": null, "doNotConfirm8": null, "noLockAnimation8": null, "lockColor8": null, "pincodeReturnButton8": "submit", "timeout8": 500, "vacuum-status-oid8": null, "vacuum-battery-oid8": null, "vacuum-is-charging-oid8": null, "vacuum-fan-speed-oid8": null, "vacuum-sensors-left-oid8": null, "vacuum-filter-left-oid8": null, "vacuum-main-brush-left-oid8": null, "vacuum-side-brush-left-oid8": null, "vacuum-cleaning-count-oid8": null, "vacuum-use-rooms8": null, "vacuum-map64-oid8": null, "vacuum-use-default-picture8": true, "vacuum-own-image8": null, "vacuum-start-oid8": null, "vacuum-home-oid8": null, "vacuum-pause-oid8": null, "undefined8": null, "visibility-oid8": null, "visibility-cond8": "==", "visibility-val8": "1", "g_switch-8": true, "oid9": "0_userdata.0.tankerkoenig.cheapest.e10_station_name", "type9": "info", "noIcon9": false, "icon9": "../vis-2.0/tanken/green.png", "iconSmall9": null, "iconEnabled9": "../vis-2.0/tanken/green.png", "iconEnabledSmall9": null, "color9": null, "colorEnabled9": null, "slideInvert9": null, "title9": " ", "unit9": null, "step9": null, "hideChart9": true, "chartPeriod9": 60, "buttonText9": null, "buttonIcon9": null, "buttonImage9": null, "buttonIconActive9": null, "buttonImageActive9": null, "infoInactiveText9": null, "infoActiveText9": null, "infoInactiveIcon9": null, "infoActiveIcon9": null, "infoInactiveImage9": null, "infoActiveImage9": null, "infoInactiveColor9": null, "infoActiveColor9": null, "widget9": null, "height9": null, "position9": null, "hide9": null, "actual9": null, "boost9": null, "party9": null, "switch9": null, "brightness9": null, "rgbType9": null, "red9": null, "green9": null, "blue9": null, "white9": null, "color_temperature9": null, "ct_min9": null, "ct_max9": null, "hue9": null, "saturation9": null, "luminance9": null, "hideBrightness9": null, "whiteMode9": null, "noRgbPalette9": null, "open9": null, "working9": null, "sensor9": null, "pincode9": null, "oid-pincode9": null, "doNotConfirm9": null, "noLockAnimation9": null, "lockColor9": null, "pincodeReturnButton9": "submit", "timeout9": 500, "vacuum-status-oid9": null, "vacuum-battery-oid9": null, "vacuum-is-charging-oid9": null, "vacuum-fan-speed-oid9": null, "vacuum-sensors-left-oid9": null, "vacuum-filter-left-oid9": null, "vacuum-main-brush-left-oid9": null, "vacuum-side-brush-left-oid9": null, "vacuum-cleaning-count-oid9": null, "vacuum-use-rooms9": null, "vacuum-map64-oid9": null, "vacuum-use-default-picture9": true, "vacuum-own-image9": null, "vacuum-start-oid9": null, "vacuum-home-oid9": null, "vacuum-pause-oid9": null, "undefined9": null, "visibility-oid9": null, "visibility-cond9": "==", "visibility-val9": "1", "g_switch-9": true, "oid10": "0_userdata.0.tankerkoenig.cheapest.e10_price_str", "type10": "info", "noIcon10": true, "icon10": "{0_userdata.0.tankerkoenig.bfbd3c8e-78af-486e-94f0-5b99f37dfe76.image}", "iconSmall10": null, "iconEnabled10": null, "iconEnabledSmall10": null, "color10": null, "colorEnabled10": null, "slideInvert10": null, "title10": "E10", "unit10": "€", "step10": null, "hideChart10": true, "chartPeriod10": 60, "buttonText10": null, "buttonIcon10": null, "buttonImage10": null, "buttonIconActive10": null, "buttonImageActive10": null, "infoInactiveText10": null, "infoActiveText10": null, "infoInactiveIcon10": null, "infoActiveIcon10": null, "infoInactiveImage10": null, "infoActiveImage10": null, "infoInactiveColor10": null, "infoActiveColor10": null, "widget10": null, "height10": null, "position10": null, "hide10": null, "actual10": null, "boost10": null, "party10": null, "switch10": null, "brightness10": null, "rgbType10": null, "red10": null, "green10": null, "blue10": null, "white10": null, "color_temperature10": null, "ct_min10": null, "ct_max10": null, "hue10": null, "saturation10": null, "luminance10": null, "hideBrightness10": null, "whiteMode10": null, "noRgbPalette10": null, "open10": null, "working10": null, "sensor10": null, "pincode10": null, "oid-pincode10": null, "doNotConfirm10": null, "noLockAnimation10": null, "lockColor10": null, "pincodeReturnButton10": "submit", "timeout10": 500, "vacuum-status-oid10": null, "vacuum-battery-oid10": null, "vacuum-is-charging-oid10": null, "vacuum-fan-speed-oid10": null, "vacuum-sensors-left-oid10": null, "vacuum-filter-left-oid10": null, "vacuum-main-brush-left-oid10": null, "vacuum-side-brush-left-oid10": null, "vacuum-cleaning-count-oid10": null, "vacuum-use-rooms10": null, "vacuum-map64-oid10": null, "vacuum-use-default-picture10": true, "vacuum-own-image10": null, "vacuum-start-oid10": null, "vacuum-home-oid10": null, "vacuum-pause-oid10": null, "undefined10": null, "visibility-oid10": null, "visibility-cond10": "==", "visibility-val10": "1", "g_switch-10": true, "oid11": "0_userdata.0.tankerkoenig.difference.e10", "type11": "info", "noIcon11": true, "icon11": "{0_userdata.0.tankerkoenig.bfbd3c8e-78af-486e-94f0-5b99f37dfe76.image}", "iconSmall11": null, "iconEnabled11": null, "iconEnabledSmall11": null, "color11": null, "colorEnabled11": null, "slideInvert11": null, "title11": "Differenz", "unit11": "€", "step11": null, "hideChart11": true, "chartPeriod11": 60, "buttonText11": null, "buttonIcon11": null, "buttonImage11": null, "buttonIconActive11": null, "buttonImageActive11": null, "infoInactiveText11": null, "infoActiveText11": null, "infoInactiveIcon11": null, "infoActiveIcon11": null, "infoInactiveImage11": null, "infoActiveImage11": null, "infoInactiveColor11": null, "infoActiveColor11": null, "widget11": null, "height11": null, "position11": null, "hide11": null, "actual11": null, "boost11": null, "party11": null, "switch11": null, "brightness11": null, "rgbType11": null, "red11": null, "green11": null, "blue11": null, "white11": null, "color_temperature11": null, "ct_min11": null, "ct_max11": null, "hue11": null, "saturation11": null, "luminance11": null, "hideBrightness11": null, "whiteMode11": null, "noRgbPalette11": null, "open11": null, "working11": null, "sensor11": null, "pincode11": null, "oid-pincode11": null, "doNotConfirm11": null, "noLockAnimation11": null, "lockColor11": null, "pincodeReturnButton11": "submit", "timeout11": 500, "vacuum-status-oid11": null, "vacuum-battery-oid11": null, "vacuum-is-charging-oid11": null, "vacuum-fan-speed-oid11": null, "vacuum-sensors-left-oid11": null, "vacuum-filter-left-oid11": null, "vacuum-main-brush-left-oid11": null, "vacuum-side-brush-left-oid11": null, "vacuum-cleaning-count-oid11": null, "vacuum-use-rooms11": null, "vacuum-map64-oid11": null, "vacuum-use-default-picture11": true, "vacuum-own-image11": null, "vacuum-start-oid11": null, "vacuum-home-oid11": null, "vacuum-pause-oid11": null, "undefined11": null, "visibility-oid11": null, "visibility-cond11": "==", "visibility-val11": "1", "g_switch-11": true, "oid12": "0_userdata.0.tankerkoenig.average.e10_str", "type12": "info", "noIcon12": true, "icon12": "{0_userdata.0.tankerkoenig.bfbd3c8e-78af-486e-94f0-5b99f37dfe76.image}", "iconSmall12": null, "iconEnabled12": null, "iconEnabledSmall12": null, "color12": null, "colorEnabled12": null, "slideInvert12": null, "title12": "Durchschnitt", "unit12": "€", "step12": null, "hideChart12": true, "chartPeriod12": 60, "buttonText12": null, "buttonIcon12": null, "buttonImage12": null, "buttonIconActive12": null, "buttonImageActive12": null, "infoInactiveText12": null, "infoActiveText12": null, "infoInactiveIcon12": null, "infoActiveIcon12": null, "infoInactiveImage12": null, "infoActiveImage12": null, "infoInactiveColor12": null, "infoActiveColor12": null, "widget12": null, "height12": null, "position12": null, "hide12": null, "actual12": null, "boost12": null, "party12": null, "switch12": null, "brightness12": null, "rgbType12": null, "red12": null, "green12": null, "blue12": null, "white12": null, "color_temperature12": null, "ct_min12": null, "ct_max12": null, "hue12": null, "saturation12": null, "luminance12": null, "hideBrightness12": null, "whiteMode12": null, "noRgbPalette12": null, "open12": null, "working12": null, "sensor12": null, "pincode12": null, "oid-pincode12": null, "doNotConfirm12": null, "noLockAnimation12": null, "lockColor12": null, "pincodeReturnButton12": "submit", "timeout12": 500, "vacuum-status-oid12": null, "vacuum-battery-oid12": null, "vacuum-is-charging-oid12": null, "vacuum-fan-speed-oid12": null, "vacuum-sensors-left-oid12": null, "vacuum-filter-left-oid12": null, "vacuum-main-brush-left-oid12": null, "vacuum-side-brush-left-oid12": null, "vacuum-cleaning-count-oid12": null, "vacuum-use-rooms12": null, "vacuum-map64-oid12": null, "vacuum-use-default-picture12": true, "vacuum-own-image12": null, "vacuum-start-oid12": null, "vacuum-home-oid12": null, "vacuum-pause-oid12": null, "undefined12": null, "visibility-oid12": null, "visibility-cond12": "==", "visibility-val12": "1", "g_switch-12": true }, "style": { "bindings": [], "left": -6, "top": 14, "width": "100%", "height": "588px", "position": "relative" }, "widgetSet": "vis-2-widgets-material", "_id": "i000001" } ] -
@ro75
Als erste mal ein herzliches Dankeschön für dieses super Skript.
Könntest du evtl die Empfehlungen aus der Json in boolsche Datenpunkte integrieren. Sodass man es nutzen kann. Die Tabelle mit dem JSON passt nicht auf meine Visaulisierung.
Die Entfernung zu mir, wär auch toll wenn es in einem Datenpunkt stehen könnte. -
[ { "tpl": "tplMaterial2Switches", "data": { "actual1": null, "actual10": null, "actual11": null, "actual12": null, "actual2": null, "actual3": null, "actual4": null, "actual5": null, "actual6": null, "actual7": null, "actual8": null, "actual9": null, "allSwitch": false, "bindings": [ "widgetTitle", "icon2", "icon10", "infoActiveIcon1", "icon1", "buttonImage9", "buttonImage3", "buttonImageActive3", "buttonImage6", "buttonImageActive6", "buttonImageActive9" ], "blue1": null, "blue10": null, "blue11": null, "blue12": null, "blue2": null, "blue3": null, "blue4": null, "blue5": null, "blue6": null, "blue7": null, "blue8": null, "blue9": null, "boost1": null, "boost10": null, "boost11": null, "boost12": null, "boost2": null, "boost3": null, "boost4": null, "boost5": null, "boost6": null, "boost7": null, "boost8": null, "boost9": null, "brightness1": null, "brightness10": null, "brightness11": null, "brightness12": null, "brightness2": null, "brightness3": null, "brightness4": null, "brightness5": null, "brightness6": null, "brightness7": null, "brightness8": null, "brightness9": null, "buttonIcon1": null, "buttonIcon10": null, "buttonIcon11": null, "buttonIcon12": null, "buttonIcon2": null, "buttonIcon3": null, "buttonIcon4": null, "buttonIcon5": null, "buttonIcon6": "", "buttonIcon7": null, "buttonIcon8": null, "buttonIcon9": null, "buttonIconActive1": null, "buttonIconActive10": null, "buttonIconActive11": null, "buttonIconActive12": null, "buttonIconActive2": null, "buttonIconActive3": "", "buttonIconActive4": null, "buttonIconActive5": null, "buttonIconActive6": "", "buttonIconActive7": null, "buttonIconActive8": null, "buttonIconActive9": "", "buttonImage1": null, "buttonImage10": null, "buttonImage11": null, "buttonImage12": null, "buttonImage2": null, "buttonImage3": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.benzin.trend_24h_proj_icon}", "buttonImage4": null, "buttonImage5": null, "buttonImage6": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.e10.trend_24h_proj_icon}", "buttonImage7": null, "buttonImage8": null, "buttonImage9": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.diesel.trend_24h_proj_icon}", "buttonImageActive1": null, "buttonImageActive10": null, "buttonImageActive11": null, "buttonImageActive12": null, "buttonImageActive2": null, "buttonImageActive3": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.benzin.trend_24h_proj_icon}", "buttonImageActive4": null, "buttonImageActive5": null, "buttonImageActive6": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.e10.trend_24h_proj_icon}", "buttonImageActive7": null, "buttonImageActive8": null, "buttonImageActive9": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.diesel.trend_24h_proj_icon}", "buttonText1": null, "buttonText10": null, "buttonText11": null, "buttonText12": null, "buttonText2": null, "buttonText3": null, "buttonText4": null, "buttonText5": null, "buttonText6": null, "buttonText7": null, "buttonText8": null, "buttonText9": null, "buttonsWidth": 120, "chartPeriod1": 60, "chartPeriod10": 60, "chartPeriod11": 60, "chartPeriod12": 60, "chartPeriod2": 10080, "chartPeriod3": 60, "chartPeriod4": 60, "chartPeriod5": 60, "chartPeriod6": 60, "chartPeriod7": 60, "chartPeriod8": 60, "chartPeriod9": 60, "color1": null, "color10": null, "color11": null, "color12": null, "color2": "#ffffff", "color3": null, "color4": null, "color5": null, "color6": null, "color7": null, "color8": "#ffffff", "color9": null, "colorEnabled1": null, "colorEnabled10": null, "colorEnabled11": null, "colorEnabled12": null, "colorEnabled2": "#ffffff", "colorEnabled3": null, "colorEnabled4": null, "colorEnabled5": null, "colorEnabled6": null, "colorEnabled7": null, "colorEnabled8": "#ffffff", "colorEnabled9": null, "color_temperature1": null, "color_temperature10": null, "color_temperature11": null, "color_temperature12": null, "color_temperature2": null, "color_temperature3": null, "color_temperature4": null, "color_temperature5": null, "color_temperature6": null, "color_temperature7": null, "color_temperature8": null, "color_temperature9": null, "count": 12, "ct_max1": null, "ct_max10": null, "ct_max11": null, "ct_max12": null, "ct_max2": null, "ct_max3": null, "ct_max4": null, "ct_max5": null, "ct_max6": null, "ct_max7": null, "ct_max8": null, "ct_max9": null, "ct_min1": null, "ct_min10": null, "ct_min11": null, "ct_min12": null, "ct_min2": null, "ct_min3": null, "ct_min4": null, "ct_min5": null, "ct_min6": null, "ct_min7": null, "ct_min8": null, "ct_min9": null, "doNotConfirm1": null, "doNotConfirm10": null, "doNotConfirm11": null, "doNotConfirm12": null, "doNotConfirm2": null, "doNotConfirm3": null, "doNotConfirm4": null, "doNotConfirm5": null, "doNotConfirm6": null, "doNotConfirm7": null, "doNotConfirm8": null, "doNotConfirm9": null, "doNotWantIncludeWidgets": false, "g_common": true, "g_switch-1": true, "g_switch-10": true, "g_switch-11": true, "g_switch-12": true, "g_switch-2": true, "g_switch-3": true, "g_switch-4": true, "g_switch-5": true, "g_switch-6": true, "g_switch-7": true, "g_switch-8": true, "g_switch-9": true, "green1": null, "green10": null, "green11": null, "green12": null, "green2": null, "green3": null, "green4": null, "green5": null, "green6": null, "green7": null, "green8": null, "green9": null, "height1": null, "height10": null, "height11": null, "height12": null, "height2": null, "height3": null, "height4": null, "height5": null, "height6": null, "height7": null, "height8": null, "height9": null, "hide1": null, "hide10": null, "hide11": null, "hide12": null, "hide2": null, "hide3": null, "hide4": null, "hide5": null, "hide6": null, "hide7": null, "hide8": null, "hide9": null, "hideBrightness1": null, "hideBrightness10": null, "hideBrightness11": null, "hideBrightness12": null, "hideBrightness2": null, "hideBrightness3": null, "hideBrightness4": null, "hideBrightness5": null, "hideBrightness6": null, "hideBrightness7": null, "hideBrightness8": null, "hideBrightness9": null, "hideChart1": true, "hideChart10": true, "hideChart11": true, "hideChart12": true, "hideChart2": true, "hideChart3": true, "hideChart4": true, "hideChart5": true, "hideChart6": true, "hideChart7": true, "hideChart8": true, "hideChart9": true, "hue1": null, "hue10": null, "hue11": null, "hue12": null, "hue2": null, "hue3": null, "hue4": null, "hue5": null, "hue6": null, "hue7": null, "hue8": null, "hue9": null, "icon1": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.image}", "icon10": null, "icon11": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.image}", "icon12": "", "icon2": "../vis-2.0/tanken/blue.png", "icon3": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.benzin.trend_24h_proj_icon}", "icon4": null, "icon5": "../vis-2.0/tanken/green.png", "icon6": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.benzin.trend_24h_proj_icon}", "icon7": null, "icon8": "../vis-2.0/tanken/red.png", "icon9": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.benzin.trend_24h_proj_icon}", "iconEnabled1": null, "iconEnabled10": null, "iconEnabled11": null, "iconEnabled12": null, "iconEnabled2": "../vis-2.0/tanken/blue.png", "iconEnabled3": null, "iconEnabled4": null, "iconEnabled5": "../vis-2.0/tanken/green.png", "iconEnabled6": null, "iconEnabled7": null, "iconEnabled8": "../vis-2.0/tanken/red.png", "iconEnabled9": null, "iconEnabledSmall1": null, "iconEnabledSmall10": null, "iconEnabledSmall11": null, "iconEnabledSmall12": null, "iconEnabledSmall2": null, "iconEnabledSmall3": null, "iconEnabledSmall4": null, "iconEnabledSmall5": null, "iconEnabledSmall6": null, "iconEnabledSmall7": null, "iconEnabledSmall8": null, "iconEnabledSmall9": null, "iconSmall1": null, "iconSmall10": null, "iconSmall11": null, "iconSmall12": null, "iconSmall2": null, "iconSmall3": null, "iconSmall4": null, "iconSmall5": null, "iconSmall6": null, "iconSmall7": null, "iconSmall8": null, "iconSmall9": null, "infoActiveColor1": null, "infoActiveColor10": null, "infoActiveColor11": null, "infoActiveColor12": null, "infoActiveColor2": null, "infoActiveColor3": null, "infoActiveColor4": null, "infoActiveColor5": null, "infoActiveColor6": null, "infoActiveColor7": null, "infoActiveColor8": null, "infoActiveColor9": null, "infoActiveIcon1": null, "infoActiveIcon10": null, "infoActiveIcon11": null, "infoActiveIcon12": null, "infoActiveIcon2": null, "infoActiveIcon3": null, "infoActiveIcon4": null, "infoActiveIcon5": null, "infoActiveIcon6": null, "infoActiveIcon7": null, "infoActiveIcon8": null, "infoActiveIcon9": null, "infoActiveImage1": null, "infoActiveImage10": null, "infoActiveImage11": null, "infoActiveImage12": null, "infoActiveImage2": null, "infoActiveImage3": null, "infoActiveImage4": null, "infoActiveImage5": null, "infoActiveImage6": null, "infoActiveImage7": null, "infoActiveImage8": null, "infoActiveImage9": null, "infoActiveText1": null, "infoActiveText10": null, "infoActiveText11": null, "infoActiveText12": null, "infoActiveText2": null, "infoActiveText3": null, "infoActiveText4": null, "infoActiveText5": null, "infoActiveText6": null, "infoActiveText7": null, "infoActiveText8": null, "infoActiveText9": null, "infoInactiveColor1": null, "infoInactiveColor10": null, "infoInactiveColor11": null, "infoInactiveColor12": null, "infoInactiveColor2": null, "infoInactiveColor3": null, "infoInactiveColor4": null, "infoInactiveColor5": null, "infoInactiveColor6": null, "infoInactiveColor7": null, "infoInactiveColor8": null, "infoInactiveColor9": null, "infoInactiveIcon1": null, "infoInactiveIcon10": null, "infoInactiveIcon11": null, "infoInactiveIcon12": null, "infoInactiveIcon2": null, "infoInactiveIcon3": null, "infoInactiveIcon4": null, "infoInactiveIcon5": null, "infoInactiveIcon6": null, "infoInactiveIcon7": null, "infoInactiveIcon8": null, "infoInactiveIcon9": null, "infoInactiveImage1": null, "infoInactiveImage10": null, "infoInactiveImage11": null, "infoInactiveImage12": null, "infoInactiveImage2": null, "infoInactiveImage3": null, "infoInactiveImage4": null, "infoInactiveImage5": null, "infoInactiveImage6": null, "infoInactiveImage7": null, "infoInactiveImage8": null, "infoInactiveImage9": null, "infoInactiveText1": null, "infoInactiveText10": null, "infoInactiveText11": null, "infoInactiveText12": null, "infoInactiveText2": null, "infoInactiveText3": null, "infoInactiveText4": null, "infoInactiveText5": null, "infoInactiveText6": null, "infoInactiveText7": null, "infoInactiveText8": null, "infoInactiveText9": null, "lockColor1": null, "lockColor10": null, "lockColor11": null, "lockColor12": null, "lockColor2": null, "lockColor3": null, "lockColor4": null, "lockColor5": null, "lockColor6": null, "lockColor7": null, "lockColor8": null, "lockColor9": null, "luminance1": null, "luminance10": null, "luminance11": null, "luminance12": null, "luminance2": null, "luminance3": null, "luminance4": null, "luminance5": null, "luminance6": null, "luminance7": null, "luminance8": null, "luminance9": null, "noIcon1": false, "noIcon10": true, "noIcon11": true, "noIcon12": true, "noIcon2": null, "noIcon3": true, "noIcon4": true, "noIcon5": null, "noIcon6": true, "noIcon7": true, "noIcon8": null, "noIcon9": true, "noLockAnimation1": null, "noLockAnimation10": null, "noLockAnimation11": null, "noLockAnimation12": null, "noLockAnimation2": null, "noLockAnimation3": null, "noLockAnimation4": null, "noLockAnimation5": null, "noLockAnimation6": null, "noLockAnimation7": null, "noLockAnimation8": null, "noLockAnimation9": null, "noRgbPalette1": null, "noRgbPalette10": null, "noRgbPalette11": null, "noRgbPalette12": null, "noRgbPalette2": null, "noRgbPalette3": null, "noRgbPalette4": null, "noRgbPalette5": null, "noRgbPalette6": null, "noRgbPalette7": null, "noRgbPalette8": null, "noRgbPalette9": null, "oid-pincode1": null, "oid-pincode10": null, "oid-pincode11": null, "oid-pincode12": null, "oid-pincode2": null, "oid-pincode3": null, "oid-pincode4": null, "oid-pincode5": null, "oid-pincode6": null, "oid-pincode7": null, "oid-pincode8": null, "oid-pincode9": null, "oid1": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.street", "oid10": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.diesel.trend_24h_proj_price", "oid11": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.lastChecked", "oid12": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.lastPriceUpdate", "oid2": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.benzin_str", "oid3": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.benzin.trend_24h_proj", "oid4": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.benzin.trend_24h_proj_price", "oid5": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.e10_str", "oid6": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.e10.trend_24h_proj", "oid7": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.e10.trend_24h_proj_price", "oid8": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.diesel_str", "oid9": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.aspects.diesel.trend_24h_proj", "open1": null, "open10": null, "open11": null, "open12": null, "open2": null, "open3": null, "open4": null, "open5": null, "open6": null, "open7": null, "open8": null, "open9": null, "orientation": "horizontal", "party1": null, "party10": null, "party11": null, "party12": null, "party2": null, "party3": null, "party4": null, "party5": null, "party6": null, "party7": null, "party8": null, "party9": null, "pincode1": null, "pincode10": null, "pincode11": null, "pincode12": null, "pincode2": null, "pincode3": null, "pincode4": null, "pincode5": null, "pincode6": null, "pincode7": null, "pincode8": null, "pincode9": null, "pincodeReturnButton1": "submit", "pincodeReturnButton10": "submit", "pincodeReturnButton11": "submit", "pincodeReturnButton12": "submit", "pincodeReturnButton2": "submit", "pincodeReturnButton3": "submit", "pincodeReturnButton4": "submit", "pincodeReturnButton5": "submit", "pincodeReturnButton6": "submit", "pincodeReturnButton7": "submit", "pincodeReturnButton8": "submit", "pincodeReturnButton9": "submit", "position1": null, "position10": null, "position11": null, "position12": null, "position2": null, "position3": null, "position4": null, "position5": null, "position6": null, "position7": null, "position8": null, "position9": null, "red1": null, "red10": null, "red11": null, "red12": null, "red2": null, "red3": null, "red4": null, "red5": null, "red6": null, "red7": null, "red8": null, "red9": null, "rgbType1": null, "rgbType10": null, "rgbType11": null, "rgbType12": null, "rgbType2": null, "rgbType3": null, "rgbType4": null, "rgbType5": null, "rgbType6": null, "rgbType7": null, "rgbType8": null, "rgbType9": null, "saturation1": null, "saturation10": null, "saturation11": null, "saturation12": null, "saturation2": null, "saturation3": null, "saturation4": null, "saturation5": null, "saturation6": null, "saturation7": null, "saturation8": null, "saturation9": null, "sensor1": null, "sensor10": null, "sensor11": null, "sensor12": null, "sensor2": null, "sensor3": null, "sensor4": null, "sensor5": null, "sensor6": null, "sensor7": null, "sensor8": null, "sensor9": null, "slideInvert1": null, "slideInvert10": null, "slideInvert11": null, "slideInvert12": null, "slideInvert2": null, "slideInvert3": null, "slideInvert4": null, "slideInvert5": null, "slideInvert6": null, "slideInvert7": null, "slideInvert8": null, "slideInvert9": null, "step1": null, "step10": null, "step11": null, "step12": null, "step2": null, "step3": null, "step4": null, "step5": null, "step6": null, "step7": null, "step8": null, "step9": null, "switch1": null, "switch10": null, "switch11": null, "switch12": null, "switch2": null, "switch3": null, "switch4": null, "switch5": null, "switch6": null, "switch7": null, "switch8": null, "switch9": null, "timeout1": 500, "timeout10": 500, "timeout11": 500, "timeout12": 500, "timeout2": 500, "timeout3": 500, "timeout4": 500, "timeout5": 500, "timeout6": 500, "timeout7": 500, "timeout8": 500, "timeout9": 500, "title1": "Straße", "title10": "Preisprognose 24h", "title11": null, "title12": null, "title2": "Super 95", "title3": "Prognose 24h", "title4": "Preisprognose 24h", "title5": "E10", "title6": "Prognose 24h", "title7": "Preisprognose 24h", "title8": "Diesel", "title9": "Prognose 24h", "type": "lines", "type1": "info", "type10": "info", "type11": "info", "type12": "info", "type2": "info", "type3": "button", "type4": "info", "type5": "info", "type6": "button", "type7": "info", "type8": "info", "type9": "button", "undefined1": null, "undefined10": null, "undefined11": null, "undefined12": null, "undefined2": null, "undefined3": null, "undefined4": null, "undefined5": null, "undefined6": null, "undefined7": null, "undefined8": null, "undefined9": null, "unit1": null, "unit10": "€", "unit11": null, "unit12": null, "unit2": "€", "unit3": null, "unit4": "€", "unit5": "€", "unit6": null, "unit7": "€", "unit8": "€", "unit9": null, "vacuum-battery-oid1": null, "vacuum-battery-oid10": null, "vacuum-battery-oid11": null, "vacuum-battery-oid12": null, "vacuum-battery-oid2": null, "vacuum-battery-oid3": null, "vacuum-battery-oid4": null, "vacuum-battery-oid5": null, "vacuum-battery-oid6": null, "vacuum-battery-oid7": null, "vacuum-battery-oid8": null, "vacuum-battery-oid9": null, "vacuum-cleaning-count-oid1": null, "vacuum-cleaning-count-oid10": null, "vacuum-cleaning-count-oid11": null, "vacuum-cleaning-count-oid12": null, "vacuum-cleaning-count-oid2": null, "vacuum-cleaning-count-oid3": null, "vacuum-cleaning-count-oid4": null, "vacuum-cleaning-count-oid5": null, "vacuum-cleaning-count-oid6": null, "vacuum-cleaning-count-oid7": null, "vacuum-cleaning-count-oid8": null, "vacuum-cleaning-count-oid9": null, "vacuum-fan-speed-oid1": null, "vacuum-fan-speed-oid10": null, "vacuum-fan-speed-oid11": null, "vacuum-fan-speed-oid12": null, "vacuum-fan-speed-oid2": null, "vacuum-fan-speed-oid3": null, "vacuum-fan-speed-oid4": null, "vacuum-fan-speed-oid5": null, "vacuum-fan-speed-oid6": null, "vacuum-fan-speed-oid7": null, "vacuum-fan-speed-oid8": null, "vacuum-fan-speed-oid9": null, "vacuum-filter-left-oid1": null, "vacuum-filter-left-oid10": null, "vacuum-filter-left-oid11": null, "vacuum-filter-left-oid12": null, "vacuum-filter-left-oid2": null, "vacuum-filter-left-oid3": null, "vacuum-filter-left-oid4": null, "vacuum-filter-left-oid5": null, "vacuum-filter-left-oid6": null, "vacuum-filter-left-oid7": null, "vacuum-filter-left-oid8": null, "vacuum-filter-left-oid9": null, "vacuum-home-oid1": null, "vacuum-home-oid10": null, "vacuum-home-oid11": null, "vacuum-home-oid12": null, "vacuum-home-oid2": null, "vacuum-home-oid3": null, "vacuum-home-oid4": null, "vacuum-home-oid5": null, "vacuum-home-oid6": null, "vacuum-home-oid7": null, "vacuum-home-oid8": null, "vacuum-home-oid9": null, "vacuum-is-charging-oid1": null, "vacuum-is-charging-oid10": null, "vacuum-is-charging-oid11": null, "vacuum-is-charging-oid12": null, "vacuum-is-charging-oid2": null, "vacuum-is-charging-oid3": null, "vacuum-is-charging-oid4": null, "vacuum-is-charging-oid5": null, "vacuum-is-charging-oid6": null, "vacuum-is-charging-oid7": null, "vacuum-is-charging-oid8": null, "vacuum-is-charging-oid9": null, "vacuum-main-brush-left-oid1": null, "vacuum-main-brush-left-oid10": null, "vacuum-main-brush-left-oid11": null, "vacuum-main-brush-left-oid12": null, "vacuum-main-brush-left-oid2": null, "vacuum-main-brush-left-oid3": null, "vacuum-main-brush-left-oid4": null, "vacuum-main-brush-left-oid5": null, "vacuum-main-brush-left-oid6": null, "vacuum-main-brush-left-oid7": null, "vacuum-main-brush-left-oid8": null, "vacuum-main-brush-left-oid9": null, "vacuum-map64-oid1": null, "vacuum-map64-oid10": null, "vacuum-map64-oid11": null, "vacuum-map64-oid12": null, "vacuum-map64-oid2": null, "vacuum-map64-oid3": null, "vacuum-map64-oid4": null, "vacuum-map64-oid5": null, "vacuum-map64-oid6": null, "vacuum-map64-oid7": null, "vacuum-map64-oid8": null, "vacuum-map64-oid9": null, "vacuum-own-image1": null, "vacuum-own-image10": null, "vacuum-own-image11": null, "vacuum-own-image12": null, "vacuum-own-image2": null, "vacuum-own-image3": null, "vacuum-own-image4": null, "vacuum-own-image5": null, "vacuum-own-image6": null, "vacuum-own-image7": null, "vacuum-own-image8": null, "vacuum-own-image9": null, "vacuum-pause-oid1": null, "vacuum-pause-oid10": null, "vacuum-pause-oid11": null, "vacuum-pause-oid12": null, "vacuum-pause-oid2": null, "vacuum-pause-oid3": null, "vacuum-pause-oid4": null, "vacuum-pause-oid5": null, "vacuum-pause-oid6": null, "vacuum-pause-oid7": null, "vacuum-pause-oid8": null, "vacuum-pause-oid9": null, "vacuum-sensors-left-oid1": null, "vacuum-sensors-left-oid10": null, "vacuum-sensors-left-oid11": null, "vacuum-sensors-left-oid12": null, "vacuum-sensors-left-oid2": null, "vacuum-sensors-left-oid3": null, "vacuum-sensors-left-oid4": null, "vacuum-sensors-left-oid5": null, "vacuum-sensors-left-oid6": null, "vacuum-sensors-left-oid7": null, "vacuum-sensors-left-oid8": null, "vacuum-sensors-left-oid9": null, "vacuum-side-brush-left-oid1": null, "vacuum-side-brush-left-oid10": null, "vacuum-side-brush-left-oid11": null, "vacuum-side-brush-left-oid12": null, "vacuum-side-brush-left-oid2": null, "vacuum-side-brush-left-oid3": null, "vacuum-side-brush-left-oid4": null, "vacuum-side-brush-left-oid5": null, "vacuum-side-brush-left-oid6": null, "vacuum-side-brush-left-oid7": null, "vacuum-side-brush-left-oid8": null, "vacuum-side-brush-left-oid9": null, "vacuum-start-oid1": null, "vacuum-start-oid10": null, "vacuum-start-oid11": null, "vacuum-start-oid12": null, "vacuum-start-oid2": null, "vacuum-start-oid3": null, "vacuum-start-oid4": null, "vacuum-start-oid5": null, "vacuum-start-oid6": null, "vacuum-start-oid7": null, "vacuum-start-oid8": null, "vacuum-start-oid9": null, "vacuum-status-oid1": null, "vacuum-status-oid10": null, "vacuum-status-oid11": null, "vacuum-status-oid12": null, "vacuum-status-oid2": null, "vacuum-status-oid3": null, "vacuum-status-oid4": null, "vacuum-status-oid5": null, "vacuum-status-oid6": null, "vacuum-status-oid7": null, "vacuum-status-oid8": null, "vacuum-status-oid9": null, "vacuum-use-default-picture1": true, "vacuum-use-default-picture10": true, "vacuum-use-default-picture11": true, "vacuum-use-default-picture12": true, "vacuum-use-default-picture2": true, "vacuum-use-default-picture3": true, "vacuum-use-default-picture4": true, "vacuum-use-default-picture5": true, "vacuum-use-default-picture6": true, "vacuum-use-default-picture7": true, "vacuum-use-default-picture8": true, "vacuum-use-default-picture9": true, "vacuum-use-rooms1": null, "vacuum-use-rooms10": null, "vacuum-use-rooms11": null, "vacuum-use-rooms12": null, "vacuum-use-rooms2": null, "vacuum-use-rooms3": null, "vacuum-use-rooms4": null, "vacuum-use-rooms5": null, "vacuum-use-rooms6": null, "vacuum-use-rooms7": null, "vacuum-use-rooms8": null, "vacuum-use-rooms9": null, "visibility-cond1": "==", "visibility-cond10": "==", "visibility-cond11": "==", "visibility-cond12": "==", "visibility-cond2": "==", "visibility-cond3": "==", "visibility-cond4": "==", "visibility-cond5": "==", "visibility-cond6": "==", "visibility-cond7": "==", "visibility-cond8": "==", "visibility-cond9": "==", "visibility-oid1": null, "visibility-oid10": null, "visibility-oid11": null, "visibility-oid12": null, "visibility-oid2": null, "visibility-oid3": null, "visibility-oid4": null, "visibility-oid5": null, "visibility-oid6": null, "visibility-oid7": null, "visibility-oid8": null, "visibility-oid9": null, "visibility-val1": "1", "visibility-val10": "1", "visibility-val11": "1", "visibility-val12": "1", "visibility-val2": "1", "visibility-val3": "1", "visibility-val4": "1", "visibility-val5": "1", "visibility-val6": "1", "visibility-val7": "1", "visibility-val8": "1", "visibility-val9": "1", "white1": null, "white10": null, "white11": null, "white12": null, "white2": null, "white3": null, "white4": null, "white5": null, "white6": null, "white7": null, "white8": null, "white9": null, "whiteMode1": null, "whiteMode10": null, "whiteMode11": null, "whiteMode12": null, "whiteMode2": null, "whiteMode3": null, "whiteMode4": null, "whiteMode5": null, "whiteMode6": null, "whiteMode7": null, "whiteMode8": null, "whiteMode9": null, "widget1": null, "widget10": null, "widget11": null, "widget12": null, "widget2": null, "widget3": null, "widget4": null, "widget5": null, "widget6": null, "widget7": null, "widget8": null, "widget9": null, "widgetTitle": "{0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.name}", "working1": null, "working10": null, "working11": null, "working12": null, "working2": null, "working3": null, "working4": null, "working5": null, "working6": null, "working7": null, "working8": null, "working9": null, "visibility-oid": "0_userdata.0.tankerkoenig.005056ba-7cb6-1ed2-bceb-865970388d30.isOpen", "visibility-cond": "==", "visibility-val": "true", "visibility-groups": null, "visibility-groups-action": "hide", "g_visibility": true }, "style": { "bindings": [], "left": -6, "top": 14, "width": "100%", "height": "588px", "position": "relative" }, "widgetSet": "vis-2-widgets-material", "_id": "i000001" } ]
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden
