Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Visualisierung
  4. Wetterdiagramm mit Icons in VIS (Chart.js + Wetter.com)

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

Wetterdiagramm mit Icons in VIS (Chart.js + Wetter.com)

Geplant Angeheftet Gesperrt Verschoben Visualisierung
39 Beiträge 5 Kommentatoren 1.2k Aufrufe 9 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • T Offline
    T Offline
    Tino 0
    schrieb am zuletzt editiert von Tino 0
    #1

    Hallo,
    jahrelang hatte ich in FHEM ein Wetterdiagramm mit Icons über das FTUI Widget Chart – FHEMWiki im Einsatz.
    Nach dem Wechsel zu ioBroker fand ich keine vergleichbare Möglichkeit, ein solches Diagramm mit Icons darzustellen. Mit Hilfe von ChatGPT habe ich schließlich eine funktionierende Lösung entwickelt.

    Hier ist das Ergebnis.
    Screenshot 2025-11-25 151709.png Screenshot 2025-11-25 151723.png
    Screenshot 2025-11-25 171101.png Screenshot 2025-11-25 160239.png

    Voraussetzungen und Setup

    1. Aktive ioBroker-API
    Am einfachsten über den Adapter „Simple API“.

    2. Wetterdatenquelle
    Die Daten stammen aus dem „Wetter.com“-Adapter.
    Dieser kann zusätzlich über GitHub installiert werden.

    Screenshot 2025-11-25 164848.png

    Danke an eifel-tech für den Adapter.

    3. JScript zur Aufbereitung der Wetterdaten
    Dieses Script schreibt die Daten des Wetter.com-Adapters in einen Datenpunkt im JSON-Format.

    • Im oberen Teil des Scripts können grundlegende Parameter angepasst werden (z. B. IP-Adresse und Port des ioBroker).

    • Diese Angaben sind notwendig, damit die Icons korrekt geladen werden.

    • Die Icons selbst werden mit dem Wetter.com-Adapter installiert.

    • Das Script erzeugt den Datenpunkt: 0_userdata.0.wetter.chartdata, in dem die Daten für das Chart abgelegt werden.

    Hier der Script-Code.

    /************************************************************
    *  Wetter JSON Generator für ChartJS
    *  Läuft bei Neustart + täglich um 02:10 Uhr
    *  Schreibt nach: 0_userdata.0.wetter.chartdata
    ************************************************************/
    
    const TARGET = '0_userdata.0.wetter.chartdata';
    
    // Anzahl der Tage (Day_01 … Day_14)
    const DAYS = 16;
    
    // Basis-Pfad Wettercom
    const BASE = 'wettercom.0.Day_';
    
    // Icon-Pfad
    const ICON_BASE = "http://192.168.16.10:8082";
    
    /************************************************************
    *  Funktion: JSON erzeugen
    ************************************************************/
    async function buildWeatherJson() {
    
       const labels = [];
       const maxData = [];
       const minData = [];
       const rainData = [];
       const snowData = [];
       const maxIcons = [];
    
       for (let i = 1; i <= DAYS; i++) {
    
           const dayId = i.toString().padStart(2, "0"); // 01, 02, …
           const prefix = `${BASE}${dayId}.`;
    
           // Label bauen: [Wochentag, TT.MM]
           const dateStr = getState(`${prefix}date`)?.val; // z.B. "28.11.2025"
           let label = ["", ""];
           if (dateStr) {
               const parts = dateStr.split("."); // ["28","11","2025"]
               const day = parseInt(parts[0], 10);
               const month = parseInt(parts[1], 10) - 1; // JS-Monate 0-11
               const year = parseInt(parts[2], 10);
    
               const dateObj = new Date(year, month, day);
               const weekdays = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"];
               const dayName = weekdays[dateObj.getDay()];
    
               //label = [dayName, `${parts[0]}.${parts[1]}`]; // Wochentag + TT.MM
               label = [`${dayName} - ${parts[0]}.${parts[1]}.`];
           }
    
           const tempMax   = getState(`${prefix}tempMax`)?.val || 0;
           const tempMin   = getState(`${prefix}tempMin`)?.val || 0;
           const rain      = getState(`${prefix}rain`)?.val || 0;
           const rainRounded = Math.round(rain * 10) / 10;
           const snow      = getState(`${prefix}freshSnow`)?.val || 0;
           const snowRounded = Math.round(snow * 10) / 10;
           const iconCode  = getState(`${prefix}weatherIcon`)?.val || "n_e_0";
    
           labels.push(label);
           maxData.push(tempMax);
           minData.push(tempMin);
           rainData.push(rainRounded);
           snowData.push(snowRounded);
    
           // Icon URL bauen
           maxIcons.push(`${ICON_BASE}${iconCode}`);
       }
    
       const json = {
           labels: labels,
           datasets: [
               {
                   label: "Regen",
                   data: rainData
               },
               {
                   label: "Neuschnee",
                   data: snowData
               },
               {
                   label: "Max Temperatur",
                   data: maxData,
                   pointStyle: maxIcons
               },
               {
                   label: "Min Temperatur",
                   data: minData
               }
           ]
       };
    
       console.log("Wetter-JSON aktualisiert");
       setState(TARGET, JSON.stringify(json), true);
    }
    
    /************************************************************
    *  Trigger: täglich um 02:10 Uhr
    ************************************************************/
    schedule("10 2 * * *", () => buildWeatherJson());
    
    /************************************************************
    *  Trigger: Skriptstart
    ************************************************************/
    buildWeatherJson();
    
    

    4. Chart.js lokal bereitstellen
    Für die Darstellung wird Chart.js (chart.umd.min.js) benötigt:
    cdn.jsdelivr.net/npm/chart.js@4.5.1/dist/chart.umd.min.js
    Die Datei sollte lokal unter /vis.0/www/ gespeichert werden (z. B. neben weatherchart.html).
    Bei mir funktionierte das Laden nur zuverlässig, wenn die Datei lokal vorlag.

    5. HTML-Seite für das Diagramm
    Die HTML-Datei wird idealerweise unter /vis.0/www/weatherchart.html abgelegt.

    Hier der HTML-Code.

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8"/>
    <title>Weather Chart — Gradient + Icons + Full Scales</title>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <script src="chart.umd.min.js"></script>
    
    <style>
    html, body { height:100%; margin:0; background:transparent; }
    #container { width:100%; height:100%; display:flex; align-items:stretch; }
    #chartbox { flex:1; position:relative; }
    canvas { width:100%; height:100%; display:block; }
    </style>
    </head>
    <body>
    <div id="container">
     <div id="chartbox">
       <canvas id="weatherChart"></canvas>
     </div>
    </div>
    
    <script>
    const SIMPLE_API_BASE = 'http://192.168.16.10:8087/get/';
    const DP_ID = '0_userdata.0.wetter.chartdata';
    
    // Fetch helper
    function fetchIoBrokerState(id) {
     return fetch(SIMPLE_API_BASE + encodeURIComponent(id))
       .then(r => { if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); })
       .then(obj => obj.val);
    }
    
    // ---------- Gradient ----------
    function createFixedGradient(ctx, area) {
     const g = ctx.createLinearGradient(0, area.bottom, 0, area.top);
     g.addColorStop(0.0, 'rgba(0,161,222,1.0)');
     g.addColorStop(0.49, 'rgba(0,161,222,0.1)');
     g.addColorStop(0.50, 'rgba(186,74,0,0.1)');
     g.addColorStop(1.0, 'rgba(186,74,0,1.0)');
     return g;
    }
    
    // ---------- Image preloader (caches on chart object) ----------
    function ensureImageCache(chart, datasets) {
     // initialize cache on chart instance
     if (!chart._imageCache) chart._imageCache = { images: {}, pending: 0 };
    
     const cache = chart._imageCache;
     const urls = new Set();
    
     // collect unique URLs from datasets' pointStyle arrays
     datasets.forEach(ds => {
       if (!Array.isArray(ds.pointStyle)) return;
       ds.pointStyle.forEach(url => { if (url) urls.add(url); });
     });
    
     urls.forEach(url => {
       if (cache.images[url]) return; // already created or loading
       cache.pending++;
       const img = new Image();
       // If images served cross-origin and need to be used in canvas, consider: img.crossOrigin = 'anonymous';
       img.onload = () => {
         cache.images[url] = img;
         cache.pending--;
         // when each image loads, trigger a redraw so plugin can draw it synchronously
         // chart may be destroyed in the meantime; guard it
         try { if (chart && chart.ctx) chart.draw(); } catch(e) { /* ignore */ }
       };
       img.onerror = () => {
         // mark as null to avoid retry loops
         cache.images[url] = null;
         cache.pending--;
         try { if (chart && chart.ctx) chart.draw(); } catch(e) { /* ignore */ }
       };
       img.src = url;
       // store a placeholder until onload replaces it
       cache.images[url] = cache.images[url] || null;
     });
    }
    
    // ---------- Plugins ----------
    
    // Gradient plugin: set backgroundColor for the min-dataset after layout
    const tempGradientPlugin = {
     id: "tempGradientPlugin",
     afterLayout(chart) {
       const {ctx, chartArea} = chart;
       if (!chartArea || !chartArea.height) return;
       const g = createFixedGradient(ctx, chartArea);
       const ds = chart.data.datasets.find(d => d.label && d.label.toLowerCase().includes("min"));
       if (ds) ds.backgroundColor = g;
     }
    };
    
    // Icon drawing plugin: uses chart._imageCache.images to draw cached images
    const drawIconsPlugin = {
     id: "drawIconsPlugin",
     afterDatasetsDraw(chart) {
       const cache = chart._imageCache && chart._imageCache.images ? chart._imageCache.images : {};
       const {ctx} = chart;
    
       chart.data.datasets.forEach((dataset, dsIndex) => {
         if (!Array.isArray(dataset.pointStyle)) return;
         const meta = chart.getDatasetMeta(dsIndex);
         meta.data.forEach((point, i) => {
           const url = dataset.pointStyle[i];
           if (!url) return;
           const img = cache[url];
           if (!img) return; // not loaded or errored
           // draw centered above point (adjust size/offset to taste)
           const w = 60, h = 50;
           ctx.drawImage(img, point.x - w/2, point.y - h - 3, w, h);
         });
       });
     }
    };
    
    // ---------- Chart lifecycle ----------
    let weatherChart = null;
    
    function renderChartFromJson(json) {
     if (!json) return;
     let data;
     try { data = JSON.parse(json); } catch (e) { console.error('Invalid JSON', e); return; }
    
     const labels = data.labels || [];
     const maxDatasetRaw = data.datasets.find(ds => ds.label && ds.label.toLowerCase().includes('max'));
     const minDatasetRaw = data.datasets.find(ds => ds.label && ds.label.toLowerCase().includes('min'));
     const rainDatasetRaw = data.datasets.find(ds => ds.label && ds.label.toLowerCase().includes('regen'));
     const snowDatasetRaw = data.datasets.find(ds => ds.label && ds.label.toLowerCase().includes('neuschnee'));
    
     if (!maxDatasetRaw || !minDatasetRaw) { console.warn('missing max/min datasets'); return; }
    
     const ctx = document.getElementById('weatherChart').getContext('2d');
    
     // compute y axis min/max robustly (handle empty arrays)
     const maxTemp = (Array.isArray(maxDatasetRaw.data) && maxDatasetRaw.data.length) ? Math.max(...maxDatasetRaw.data) : 30;
     const minTemp = (Array.isArray(minDatasetRaw.data) && minDatasetRaw.data.length) ? Math.min(...minDatasetRaw.data) : 10;
     const yMax = maxTemp + 5;
     const yMin = minTemp - 2;
    
     // destroy old
     if (weatherChart) {
       try { weatherChart.destroy(); } catch(e) { /* ignore */ }
       weatherChart = null;
     }
    
     // build datasets (keep pointStyle arrays as-is)
     const datasets = [
       {
         type: 'bar',
         label: 'Regen',
         data: rainDatasetRaw ? rainDatasetRaw.data : [],
         backgroundColor: 'rgba(0, 120, 255, 0.4)',
         borderColor: 'rgba(0, 120, 255, 1)',
         borderWidth: 1,
         yAxisID: 'y2',
         order: 0
       },
       {
         type: 'bar',
         label: 'Neuschnee',
         data: snowDatasetRaw ? snowDatasetRaw.data : [],
         backgroundColor: 'rgba(102, 153, 255, 0.4)',
         borderColor: 'rgba(102, 153, 255, 1)',
         borderWidth: 1,
         yAxisID: 'y2',
         order: 1
       },
       {
         label: maxDatasetRaw.label,
         data: maxDatasetRaw.data,
         borderColor: '#cdcdcd50',
         borderWidth: 1,
         fill: false,
         tension: 0.3,
         pointRadius: 0,
         backgroundColor: 'transparent',
         pointStyle: maxDatasetRaw.pointStyle || [],
         order: 2
       },
       {
         label: minDatasetRaw.label,
         data: minDatasetRaw.data,
         borderColor: '#cdcdcd50',
         borderWidth: 1,
         fill: { target: 2 },
         tension: 0.3,
         pointRadius: 0,
         backgroundColor: 'transparent', // gradient plugin will set this
         pointStyle: minDatasetRaw.pointStyle || [],
         order: 3
       }
     ];
    
     // create chart instance
     weatherChart = new Chart(ctx, {
       type: 'line',
       data: { labels, datasets },
       options: {
         responsive: true,
         maintainAspectRatio: false,
         color: "#cdcdcd",
         interaction: { mode: 'nearest', intersect: false },
         plugins: {
           legend: { display: false, position: 'top' },
           tooltip: {
             callbacks: {
               label: ctx => {
                 const label = ctx.dataset.label || '';
                 const value = ctx.raw;
                 const unit = label.toLowerCase().includes('regen') ? 'l/m²' : label.toLowerCase().includes('neuschnee') ? 'cm' : '°C';
                 return `${label}: ${value} ${unit}`;
               }
             }
           }
         },
         scales: {
           x: {
             display: true,
             ticks: { color: '#cdcdcd' },         // Label-Farbe
             grid: { color: '#334e6670' }         // Grid-Linien leicht transparent
           },
           y: {
             display: true,
             beginAtZero: false,
             position: 'left',
             ticks: { color: '#cdcdcd' },
             grid: { color: '#334e6670' },
             min: yMin,
             max: yMax,
             title: { display: true, text: 'Temperatur (°C)', color: '#cdcdcd' } // Achsentitel
           },
           y2: {
             display: true,
             beginAtZero: true,
             position: 'right',
             ticks: { color: '#cdcdcd' },
             grid: { drawOnChartArea: false },
             min: 0,
             max: 80,
             title: { display: true, text: 'Niederschlag (l/m²)', color: '#cdcdcd' }
           }
         }
       },
       plugins: [tempGradientPlugin, drawIconsPlugin]
     });
    
     // ensure images are preloaded and cached on chart instance
     ensureImageCache(weatherChart, datasets);
    }
    
    // ---------- Update loop ----------
    function update() {
     fetchIoBrokerState(DP_ID)
       .then(val => renderChartFromJson(val))
       .catch(err => console.error('fetch error', err));
    }
    
    // initial run
    update();
    setInterval(update, 600000);
    </script>
    </body>
    </html>
    
    

    • In der HTML-Datei muss die SIMPLE_API_BASE angepasst werden.

    • Falls der Datenpunkt im Script geändert wurde, muss auch DP_ID entsprechend angepasst werden.

    6. Einbindung in VIS
    In VIS eine neue View anlegen, ein Basic iFrame einfügen und bei Quelle folgendes eintragen: /vis.0/www/weatherchart.html

    Ich hoffe ich habe nichts vergessen.
    Gruß Tino

    C 1 Antwort Letzte Antwort
    4
    • T Tino 0

      Hallo,
      jahrelang hatte ich in FHEM ein Wetterdiagramm mit Icons über das FTUI Widget Chart – FHEMWiki im Einsatz.
      Nach dem Wechsel zu ioBroker fand ich keine vergleichbare Möglichkeit, ein solches Diagramm mit Icons darzustellen. Mit Hilfe von ChatGPT habe ich schließlich eine funktionierende Lösung entwickelt.

      Hier ist das Ergebnis.
      Screenshot 2025-11-25 151709.png Screenshot 2025-11-25 151723.png
      Screenshot 2025-11-25 171101.png Screenshot 2025-11-25 160239.png

      Voraussetzungen und Setup

      1. Aktive ioBroker-API
      Am einfachsten über den Adapter „Simple API“.

      2. Wetterdatenquelle
      Die Daten stammen aus dem „Wetter.com“-Adapter.
      Dieser kann zusätzlich über GitHub installiert werden.

      Screenshot 2025-11-25 164848.png

      Danke an eifel-tech für den Adapter.

      3. JScript zur Aufbereitung der Wetterdaten
      Dieses Script schreibt die Daten des Wetter.com-Adapters in einen Datenpunkt im JSON-Format.

      • Im oberen Teil des Scripts können grundlegende Parameter angepasst werden (z. B. IP-Adresse und Port des ioBroker).

      • Diese Angaben sind notwendig, damit die Icons korrekt geladen werden.

      • Die Icons selbst werden mit dem Wetter.com-Adapter installiert.

      • Das Script erzeugt den Datenpunkt: 0_userdata.0.wetter.chartdata, in dem die Daten für das Chart abgelegt werden.

      Hier der Script-Code.

      /************************************************************
      *  Wetter JSON Generator für ChartJS
      *  Läuft bei Neustart + täglich um 02:10 Uhr
      *  Schreibt nach: 0_userdata.0.wetter.chartdata
      ************************************************************/
      
      const TARGET = '0_userdata.0.wetter.chartdata';
      
      // Anzahl der Tage (Day_01 … Day_14)
      const DAYS = 16;
      
      // Basis-Pfad Wettercom
      const BASE = 'wettercom.0.Day_';
      
      // Icon-Pfad
      const ICON_BASE = "http://192.168.16.10:8082";
      
      /************************************************************
      *  Funktion: JSON erzeugen
      ************************************************************/
      async function buildWeatherJson() {
      
         const labels = [];
         const maxData = [];
         const minData = [];
         const rainData = [];
         const snowData = [];
         const maxIcons = [];
      
         for (let i = 1; i <= DAYS; i++) {
      
             const dayId = i.toString().padStart(2, "0"); // 01, 02, …
             const prefix = `${BASE}${dayId}.`;
      
             // Label bauen: [Wochentag, TT.MM]
             const dateStr = getState(`${prefix}date`)?.val; // z.B. "28.11.2025"
             let label = ["", ""];
             if (dateStr) {
                 const parts = dateStr.split("."); // ["28","11","2025"]
                 const day = parseInt(parts[0], 10);
                 const month = parseInt(parts[1], 10) - 1; // JS-Monate 0-11
                 const year = parseInt(parts[2], 10);
      
                 const dateObj = new Date(year, month, day);
                 const weekdays = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"];
                 const dayName = weekdays[dateObj.getDay()];
      
                 //label = [dayName, `${parts[0]}.${parts[1]}`]; // Wochentag + TT.MM
                 label = [`${dayName} - ${parts[0]}.${parts[1]}.`];
             }
      
             const tempMax   = getState(`${prefix}tempMax`)?.val || 0;
             const tempMin   = getState(`${prefix}tempMin`)?.val || 0;
             const rain      = getState(`${prefix}rain`)?.val || 0;
             const rainRounded = Math.round(rain * 10) / 10;
             const snow      = getState(`${prefix}freshSnow`)?.val || 0;
             const snowRounded = Math.round(snow * 10) / 10;
             const iconCode  = getState(`${prefix}weatherIcon`)?.val || "n_e_0";
      
             labels.push(label);
             maxData.push(tempMax);
             minData.push(tempMin);
             rainData.push(rainRounded);
             snowData.push(snowRounded);
      
             // Icon URL bauen
             maxIcons.push(`${ICON_BASE}${iconCode}`);
         }
      
         const json = {
             labels: labels,
             datasets: [
                 {
                     label: "Regen",
                     data: rainData
                 },
                 {
                     label: "Neuschnee",
                     data: snowData
                 },
                 {
                     label: "Max Temperatur",
                     data: maxData,
                     pointStyle: maxIcons
                 },
                 {
                     label: "Min Temperatur",
                     data: minData
                 }
             ]
         };
      
         console.log("Wetter-JSON aktualisiert");
         setState(TARGET, JSON.stringify(json), true);
      }
      
      /************************************************************
      *  Trigger: täglich um 02:10 Uhr
      ************************************************************/
      schedule("10 2 * * *", () => buildWeatherJson());
      
      /************************************************************
      *  Trigger: Skriptstart
      ************************************************************/
      buildWeatherJson();
      
      

      4. Chart.js lokal bereitstellen
      Für die Darstellung wird Chart.js (chart.umd.min.js) benötigt:
      cdn.jsdelivr.net/npm/chart.js@4.5.1/dist/chart.umd.min.js
      Die Datei sollte lokal unter /vis.0/www/ gespeichert werden (z. B. neben weatherchart.html).
      Bei mir funktionierte das Laden nur zuverlässig, wenn die Datei lokal vorlag.

      5. HTML-Seite für das Diagramm
      Die HTML-Datei wird idealerweise unter /vis.0/www/weatherchart.html abgelegt.

      Hier der HTML-Code.

      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8"/>
      <title>Weather Chart — Gradient + Icons + Full Scales</title>
      <meta name="viewport" content="width=device-width, initial-scale=1"/>
      <script src="chart.umd.min.js"></script>
      
      <style>
      html, body { height:100%; margin:0; background:transparent; }
      #container { width:100%; height:100%; display:flex; align-items:stretch; }
      #chartbox { flex:1; position:relative; }
      canvas { width:100%; height:100%; display:block; }
      </style>
      </head>
      <body>
      <div id="container">
       <div id="chartbox">
         <canvas id="weatherChart"></canvas>
       </div>
      </div>
      
      <script>
      const SIMPLE_API_BASE = 'http://192.168.16.10:8087/get/';
      const DP_ID = '0_userdata.0.wetter.chartdata';
      
      // Fetch helper
      function fetchIoBrokerState(id) {
       return fetch(SIMPLE_API_BASE + encodeURIComponent(id))
         .then(r => { if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); })
         .then(obj => obj.val);
      }
      
      // ---------- Gradient ----------
      function createFixedGradient(ctx, area) {
       const g = ctx.createLinearGradient(0, area.bottom, 0, area.top);
       g.addColorStop(0.0, 'rgba(0,161,222,1.0)');
       g.addColorStop(0.49, 'rgba(0,161,222,0.1)');
       g.addColorStop(0.50, 'rgba(186,74,0,0.1)');
       g.addColorStop(1.0, 'rgba(186,74,0,1.0)');
       return g;
      }
      
      // ---------- Image preloader (caches on chart object) ----------
      function ensureImageCache(chart, datasets) {
       // initialize cache on chart instance
       if (!chart._imageCache) chart._imageCache = { images: {}, pending: 0 };
      
       const cache = chart._imageCache;
       const urls = new Set();
      
       // collect unique URLs from datasets' pointStyle arrays
       datasets.forEach(ds => {
         if (!Array.isArray(ds.pointStyle)) return;
         ds.pointStyle.forEach(url => { if (url) urls.add(url); });
       });
      
       urls.forEach(url => {
         if (cache.images[url]) return; // already created or loading
         cache.pending++;
         const img = new Image();
         // If images served cross-origin and need to be used in canvas, consider: img.crossOrigin = 'anonymous';
         img.onload = () => {
           cache.images[url] = img;
           cache.pending--;
           // when each image loads, trigger a redraw so plugin can draw it synchronously
           // chart may be destroyed in the meantime; guard it
           try { if (chart && chart.ctx) chart.draw(); } catch(e) { /* ignore */ }
         };
         img.onerror = () => {
           // mark as null to avoid retry loops
           cache.images[url] = null;
           cache.pending--;
           try { if (chart && chart.ctx) chart.draw(); } catch(e) { /* ignore */ }
         };
         img.src = url;
         // store a placeholder until onload replaces it
         cache.images[url] = cache.images[url] || null;
       });
      }
      
      // ---------- Plugins ----------
      
      // Gradient plugin: set backgroundColor for the min-dataset after layout
      const tempGradientPlugin = {
       id: "tempGradientPlugin",
       afterLayout(chart) {
         const {ctx, chartArea} = chart;
         if (!chartArea || !chartArea.height) return;
         const g = createFixedGradient(ctx, chartArea);
         const ds = chart.data.datasets.find(d => d.label && d.label.toLowerCase().includes("min"));
         if (ds) ds.backgroundColor = g;
       }
      };
      
      // Icon drawing plugin: uses chart._imageCache.images to draw cached images
      const drawIconsPlugin = {
       id: "drawIconsPlugin",
       afterDatasetsDraw(chart) {
         const cache = chart._imageCache && chart._imageCache.images ? chart._imageCache.images : {};
         const {ctx} = chart;
      
         chart.data.datasets.forEach((dataset, dsIndex) => {
           if (!Array.isArray(dataset.pointStyle)) return;
           const meta = chart.getDatasetMeta(dsIndex);
           meta.data.forEach((point, i) => {
             const url = dataset.pointStyle[i];
             if (!url) return;
             const img = cache[url];
             if (!img) return; // not loaded or errored
             // draw centered above point (adjust size/offset to taste)
             const w = 60, h = 50;
             ctx.drawImage(img, point.x - w/2, point.y - h - 3, w, h);
           });
         });
       }
      };
      
      // ---------- Chart lifecycle ----------
      let weatherChart = null;
      
      function renderChartFromJson(json) {
       if (!json) return;
       let data;
       try { data = JSON.parse(json); } catch (e) { console.error('Invalid JSON', e); return; }
      
       const labels = data.labels || [];
       const maxDatasetRaw = data.datasets.find(ds => ds.label && ds.label.toLowerCase().includes('max'));
       const minDatasetRaw = data.datasets.find(ds => ds.label && ds.label.toLowerCase().includes('min'));
       const rainDatasetRaw = data.datasets.find(ds => ds.label && ds.label.toLowerCase().includes('regen'));
       const snowDatasetRaw = data.datasets.find(ds => ds.label && ds.label.toLowerCase().includes('neuschnee'));
      
       if (!maxDatasetRaw || !minDatasetRaw) { console.warn('missing max/min datasets'); return; }
      
       const ctx = document.getElementById('weatherChart').getContext('2d');
      
       // compute y axis min/max robustly (handle empty arrays)
       const maxTemp = (Array.isArray(maxDatasetRaw.data) && maxDatasetRaw.data.length) ? Math.max(...maxDatasetRaw.data) : 30;
       const minTemp = (Array.isArray(minDatasetRaw.data) && minDatasetRaw.data.length) ? Math.min(...minDatasetRaw.data) : 10;
       const yMax = maxTemp + 5;
       const yMin = minTemp - 2;
      
       // destroy old
       if (weatherChart) {
         try { weatherChart.destroy(); } catch(e) { /* ignore */ }
         weatherChart = null;
       }
      
       // build datasets (keep pointStyle arrays as-is)
       const datasets = [
         {
           type: 'bar',
           label: 'Regen',
           data: rainDatasetRaw ? rainDatasetRaw.data : [],
           backgroundColor: 'rgba(0, 120, 255, 0.4)',
           borderColor: 'rgba(0, 120, 255, 1)',
           borderWidth: 1,
           yAxisID: 'y2',
           order: 0
         },
         {
           type: 'bar',
           label: 'Neuschnee',
           data: snowDatasetRaw ? snowDatasetRaw.data : [],
           backgroundColor: 'rgba(102, 153, 255, 0.4)',
           borderColor: 'rgba(102, 153, 255, 1)',
           borderWidth: 1,
           yAxisID: 'y2',
           order: 1
         },
         {
           label: maxDatasetRaw.label,
           data: maxDatasetRaw.data,
           borderColor: '#cdcdcd50',
           borderWidth: 1,
           fill: false,
           tension: 0.3,
           pointRadius: 0,
           backgroundColor: 'transparent',
           pointStyle: maxDatasetRaw.pointStyle || [],
           order: 2
         },
         {
           label: minDatasetRaw.label,
           data: minDatasetRaw.data,
           borderColor: '#cdcdcd50',
           borderWidth: 1,
           fill: { target: 2 },
           tension: 0.3,
           pointRadius: 0,
           backgroundColor: 'transparent', // gradient plugin will set this
           pointStyle: minDatasetRaw.pointStyle || [],
           order: 3
         }
       ];
      
       // create chart instance
       weatherChart = new Chart(ctx, {
         type: 'line',
         data: { labels, datasets },
         options: {
           responsive: true,
           maintainAspectRatio: false,
           color: "#cdcdcd",
           interaction: { mode: 'nearest', intersect: false },
           plugins: {
             legend: { display: false, position: 'top' },
             tooltip: {
               callbacks: {
                 label: ctx => {
                   const label = ctx.dataset.label || '';
                   const value = ctx.raw;
                   const unit = label.toLowerCase().includes('regen') ? 'l/m²' : label.toLowerCase().includes('neuschnee') ? 'cm' : '°C';
                   return `${label}: ${value} ${unit}`;
                 }
               }
             }
           },
           scales: {
             x: {
               display: true,
               ticks: { color: '#cdcdcd' },         // Label-Farbe
               grid: { color: '#334e6670' }         // Grid-Linien leicht transparent
             },
             y: {
               display: true,
               beginAtZero: false,
               position: 'left',
               ticks: { color: '#cdcdcd' },
               grid: { color: '#334e6670' },
               min: yMin,
               max: yMax,
               title: { display: true, text: 'Temperatur (°C)', color: '#cdcdcd' } // Achsentitel
             },
             y2: {
               display: true,
               beginAtZero: true,
               position: 'right',
               ticks: { color: '#cdcdcd' },
               grid: { drawOnChartArea: false },
               min: 0,
               max: 80,
               title: { display: true, text: 'Niederschlag (l/m²)', color: '#cdcdcd' }
             }
           }
         },
         plugins: [tempGradientPlugin, drawIconsPlugin]
       });
      
       // ensure images are preloaded and cached on chart instance
       ensureImageCache(weatherChart, datasets);
      }
      
      // ---------- Update loop ----------
      function update() {
       fetchIoBrokerState(DP_ID)
         .then(val => renderChartFromJson(val))
         .catch(err => console.error('fetch error', err));
      }
      
      // initial run
      update();
      setInterval(update, 600000);
      </script>
      </body>
      </html>
      
      

      • In der HTML-Datei muss die SIMPLE_API_BASE angepasst werden.

      • Falls der Datenpunkt im Script geändert wurde, muss auch DP_ID entsprechend angepasst werden.

      6. Einbindung in VIS
      In VIS eine neue View anlegen, ein Basic iFrame einfügen und bei Quelle folgendes eintragen: /vis.0/www/weatherchart.html

      Ich hoffe ich habe nichts vergessen.
      Gruß Tino

      C Offline
      C Offline
      claus1993
      schrieb am zuletzt editiert von
      #2

      Hi,

      vielen Dank das du deinen Skript hier zu Verfügung stellst. So eine Ansicht habe ich für meine VIS geplant und du ersparst mir dann doch einiges an Arbeit.

      Habe den Skript bei mir angelegt, bekomme jedoch die Meldungen das die Wetterdaten nicht gefunden wurden. Von daher habe ich zu den Basiseinstellungen Frage.

      @Tino-0 sagte in Wetterdiagramm mit Icons in VIS (Chart.js + Wetter.com):

      // Basis-Pfad Wettercom
      const BASE = 'wettercom.0.Day_';

      // Icon-Pfad
      const ICON_BASE = "http://192.168.16.10:8082";

      Woher kommen die Basisdaten? Du hast dort den Pfad "Wettercom.0.Day_" angegeben. Wie ich es sehe beziehst du die Daten aus dem Adapter "Wetter.com". Der Pfad ist bei mir jedoch "daswetter.0.....". Muss ich eventuell an meinem Adaptereinstellungen etwas anpassen?

      Die Icon werden mit dem Wetter Adapter installiert. Muss ich dort als Pfad den Port vom ioBroker angeben oder von der VIS?

      T 1 Antwort Letzte Antwort
      0
      • C claus1993

        Hi,

        vielen Dank das du deinen Skript hier zu Verfügung stellst. So eine Ansicht habe ich für meine VIS geplant und du ersparst mir dann doch einiges an Arbeit.

        Habe den Skript bei mir angelegt, bekomme jedoch die Meldungen das die Wetterdaten nicht gefunden wurden. Von daher habe ich zu den Basiseinstellungen Frage.

        @Tino-0 sagte in Wetterdiagramm mit Icons in VIS (Chart.js + Wetter.com):

        // Basis-Pfad Wettercom
        const BASE = 'wettercom.0.Day_';

        // Icon-Pfad
        const ICON_BASE = "http://192.168.16.10:8082";

        Woher kommen die Basisdaten? Du hast dort den Pfad "Wettercom.0.Day_" angegeben. Wie ich es sehe beziehst du die Daten aus dem Adapter "Wetter.com". Der Pfad ist bei mir jedoch "daswetter.0.....". Muss ich eventuell an meinem Adaptereinstellungen etwas anpassen?

        Die Icon werden mit dem Wetter Adapter installiert. Muss ich dort als Pfad den Port vom ioBroker angeben oder von der VIS?

        T Offline
        T Offline
        Tino 0
        schrieb am zuletzt editiert von
        #3

        @claus1993
        Hallo, ich habe kein daswetter.com da es keine neuen API Zugänge gibt, das ganze ist auf dem neuen Adapter wetter.com ausgelegt. Was alles für daswetter.com angepasst werden muss kann ich nicht sagen.

        Der Icon-Pfad ist die IP-Adresse und Port deines ioBroker.

        Gruß Tino

        1 Antwort Letzte Antwort
        0
        • C Offline
          C Offline
          claus1993
          schrieb am zuletzt editiert von
          #4

          @tino-0

          Hallo Tino,

          Danke schon mal für deine Rückmeldung.

          Mir ist nicht ganz klar welchen Adapter du nutzt. Dein Link für wetter.com verweist auf die Internetseite von Wetter.com.
          Laut Google kann ich nur den folgenden Adapter finden, https://github.com/eifel-tech/ioBroker.wettercom.
          Ist das der von dir genutzte Adapter?

          Grüße, Claus

          T 1 Antwort Letzte Antwort
          0
          • C claus1993

            @tino-0

            Hallo Tino,

            Danke schon mal für deine Rückmeldung.

            Mir ist nicht ganz klar welchen Adapter du nutzt. Dein Link für wetter.com verweist auf die Internetseite von Wetter.com.
            Laut Google kann ich nur den folgenden Adapter finden, https://github.com/eifel-tech/ioBroker.wettercom.
            Ist das der von dir genutzte Adapter?

            Grüße, Claus

            T Offline
            T Offline
            Tino 0
            schrieb am zuletzt editiert von Tino 0
            #5

            @claus1993
            Moin Claus,
            ja das ist der Adapter, den kann man auch über den Expertenmodus installieren.

            Screenshot 2025-12-08 091412.png

            PS: Dazu brauchst du noch den API Key "Light Air"

            Gruß Tino

            1 Antwort Letzte Antwort
            1
            • C Offline
              C Offline
              claus1993
              schrieb am zuletzt editiert von
              #6

              Cool....jetzt hat es funktioniert :-)

              Vielen Dank!

              1 Antwort Letzte Antwort
              0
              • LongbowL Online
                LongbowL Online
                Longbow
                schrieb am zuletzt editiert von
                #7

                sieht echt super aus, wie wäre es unter der VIS-2?

                Und wie passte die Hmtl Datei die Api an? Wo müsste ich da was einragen.

                T 1 Antwort Letzte Antwort
                0
                • LongbowL Longbow

                  sieht echt super aus, wie wäre es unter der VIS-2?

                  Und wie passte die Hmtl Datei die Api an? Wo müsste ich da was einragen.

                  T Offline
                  T Offline
                  Tino 0
                  schrieb am zuletzt editiert von
                  #8

                  @Longbow

                  Hallo, in VIS 2 sollte es so aussehen.

                  b86dc294-7bcf-486c-9442-8b36a4b30ac5-image.png

                  Und die API in der HTML Seite dort ändern.

                  aea8e965-802b-4a4c-936a-b5c18784cb11-image.png

                  Gruß Tino

                  1 Antwort Letzte Antwort
                  0
                  • NashraN Offline
                    NashraN Offline
                    Nashra
                    Most Active Forum Testing
                    schrieb am zuletzt editiert von
                    #9

                    Irgendwas stimmt da nicht mit dem Datum, nur komme ich nicht dahinter
                    Screenshot 2025-12-09 195049.png
                    An was könnte es liegen?

                    Gruß Ralf
                    Mir egal, wer Dein Vater ist! Wenn ich hier angel, wird nicht übers Wasser gelaufen!!

                    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                    T 1 Antwort Letzte Antwort
                    0
                    • LongbowL Online
                      LongbowL Online
                      Longbow
                      schrieb am zuletzt editiert von
                      #10

                      @tino-0
                      Danke für den Tip, aber bei mir sieht es so aus. Was mache ich falsch? Muss es auch bei vis.0, es auch so heißen? hab es dort aber abgespeichert nur leider auch das bringt kein erfolg. Wo liegt mi nun de Fehler?

                      Greenshot 2025-12-09 19.16.57.png

                      1 Antwort Letzte Antwort
                      0
                      • NashraN Nashra

                        Irgendwas stimmt da nicht mit dem Datum, nur komme ich nicht dahinter
                        Screenshot 2025-12-09 195049.png
                        An was könnte es liegen?

                        T Offline
                        T Offline
                        Tino 0
                        schrieb am zuletzt editiert von Tino 0
                        #11

                        @Nashra

                        Hallo, was steht bei dir in dem Datenpunkt 0_userdata.0.wetter.chartdata drin?

                        03b18787-9da3-4656-905e-9a136525f1a3-image.png

                        und da drin wettercom.0.Day_01.date so? 9.12.2025

                        wenn nicht dann stimmt wohl das hier nicht

                        ed03f9a4-24ba-419e-8c97-d67d708c65f2-image.png

                        @longbow
                        Hast du auch alle Punkte oben so erledigt?

                        Gruß Tino

                        NashraN 1 Antwort Letzte Antwort
                        0
                        • LongbowL Online
                          LongbowL Online
                          Longbow
                          schrieb am zuletzt editiert von
                          #12

                          @tino-0

                          ja, ich bin da so nach gegangen, wie du es beschrieben hast

                          T 1 Antwort Letzte Antwort
                          0
                          • LongbowL Longbow

                            @tino-0

                            ja, ich bin da so nach gegangen, wie du es beschrieben hast

                            T Offline
                            T Offline
                            Tino 0
                            schrieb am zuletzt editiert von
                            #13

                            @Longbow

                            was steht in dem Datenpunkt 0_userdata.0.wetter.chartdata drin?

                            1 Antwort Letzte Antwort
                            0
                            • LongbowL Online
                              LongbowL Online
                              Longbow
                              schrieb am zuletzt editiert von
                              #14

                              @tino-0

                              Was Nashra geschrieben hat, ist bei mir auch wenn ich das öffnen mi Wert schreiben. Da steht das Datum auch so.

                              hier der Inhalt des Datenpunkt.

                              {"labels":[["undefined - 12/9/2025.undefined"],["undefined - 12/10/2025.undefined"],["undefined - 12/11/2025.undefined"],["undefined - 12/12/2025.undefined"],["undefined - 12/13/2025.undefined"]],"datasets":[{"label":"Regen","data":[3.5,0.6,0,0,0.7]},{"label":"Neuschnee","data":[0,0,0,0,0]},{"label":"Max Temperatur","data":[12,11,10,7,7],"pointStyle":["http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_60.svg","http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_3.svg","http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_3.svg","http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_3.svg","http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_0.svg"]},{"label":"Min Temperatur","data":[10,8,7,2,1]}]}
                              
                              T 1 Antwort Letzte Antwort
                              0
                              • LongbowL Longbow

                                @tino-0

                                Was Nashra geschrieben hat, ist bei mir auch wenn ich das öffnen mi Wert schreiben. Da steht das Datum auch so.

                                hier der Inhalt des Datenpunkt.

                                {"labels":[["undefined - 12/9/2025.undefined"],["undefined - 12/10/2025.undefined"],["undefined - 12/11/2025.undefined"],["undefined - 12/12/2025.undefined"],["undefined - 12/13/2025.undefined"]],"datasets":[{"label":"Regen","data":[3.5,0.6,0,0,0.7]},{"label":"Neuschnee","data":[0,0,0,0,0]},{"label":"Max Temperatur","data":[12,11,10,7,7],"pointStyle":["http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_60.svg","http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_3.svg","http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_3.svg","http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_3.svg","http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_0.svg"]},{"label":"Min Temperatur","data":[10,8,7,2,1]}]}
                                
                                T Offline
                                T Offline
                                Tino 0
                                schrieb am zuletzt editiert von Tino 0
                                #15

                                @Longbow sagte in Wetterdiagramm mit Icons in VIS (Chart.js + Wetter.com):

                                1. http://192.168.7.249:8082/adapter/wettercom/icons/weather/svg/d_60.svg
                                  kannst du das aufrufen, kommt da ein Icon?

                                2. in der HTML hast du da den Port von Simple AIP drin? Sollte default 8087 sein also
                                  bei dir 'http://192.168.7.249:8087/get/' dann sollte bei dir unter http://192.168.7.249:8087/get/0_userdata.0.wetter.chartdata der json auftauchen.

                                3. Das Datum sind die Systemsettings unter
                                  f6e20529-da00-4b9f-80b6-3f924d24178d-image.png

                                Gruß Tino

                                1 Antwort Letzte Antwort
                                0
                                • LongbowL Online
                                  LongbowL Online
                                  Longbow
                                  schrieb am zuletzt editiert von
                                  #16

                                  @tino-0

                                  Hab dir mal von den links Bildausdrücke gemacht.
                                  Vielleicht kannst du di dann ein bild machen....

                                  Greenshot 2025-12-10 07.33.22.png Greenshot 2025-12-10 07.28.29.png Greenshot 2025-12-10 07.27.51.png Greenshot 2025-12-10 07.27.00.png

                                  Im übigen finde ich deine Seite mit den ganzen Daten sehr schön übersichtlich, vllt könntest du Sie uns mal bereitstellen.

                                  Danke im übrigen sehr für deine Bemühungen.

                                  1 Antwort Letzte Antwort
                                  0
                                  • T Tino 0

                                    @Nashra

                                    Hallo, was steht bei dir in dem Datenpunkt 0_userdata.0.wetter.chartdata drin?

                                    03b18787-9da3-4656-905e-9a136525f1a3-image.png

                                    und da drin wettercom.0.Day_01.date so? 9.12.2025

                                    wenn nicht dann stimmt wohl das hier nicht

                                    ed03f9a4-24ba-419e-8c97-d67d708c65f2-image.png

                                    @longbow
                                    Hast du auch alle Punkte oben so erledigt?

                                    Gruß Tino

                                    NashraN Offline
                                    NashraN Offline
                                    Nashra
                                    Most Active Forum Testing
                                    schrieb am zuletzt editiert von Nashra
                                    #17

                                    @Tino-0 sagte in Wetterdiagramm mit Icons in VIS (Chart.js + Wetter.com):

                                    @Nashra

                                    Hallo, was steht bei dir in dem Datenpunkt 0_userdata.0.wetter.chartdata drin?

                                    03b18787-9da3-4656-905e-9a136525f1a3-image.png

                                    Das selbe wie @longbow schon als Bild eingestellt hat s.o.

                                    und da drin wettercom.0.Day_01.date so? 9.12.2025

                                    Ja, Datum ist so drin

                                    wenn nicht dann stimmt wohl das hier nicht

                                    ed03f9a4-24ba-419e-8c97-d67d708c65f2-image.png

                                    Nö, da ist allles sauber, Angaben stimmen.

                                    Gruß Ralf
                                    Mir egal, wer Dein Vater ist! Wenn ich hier angel, wird nicht übers Wasser gelaufen!!

                                    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                    T 2 Antworten Letzte Antwort
                                    0
                                    • NashraN Nashra

                                      @Tino-0 sagte in Wetterdiagramm mit Icons in VIS (Chart.js + Wetter.com):

                                      @Nashra

                                      Hallo, was steht bei dir in dem Datenpunkt 0_userdata.0.wetter.chartdata drin?

                                      03b18787-9da3-4656-905e-9a136525f1a3-image.png

                                      Das selbe wie @longbow schon als Bild eingestellt hat s.o.

                                      und da drin wettercom.0.Day_01.date so? 9.12.2025

                                      Ja, Datum ist so drin

                                      wenn nicht dann stimmt wohl das hier nicht

                                      ed03f9a4-24ba-419e-8c97-d67d708c65f2-image.png

                                      Nö, da ist allles sauber, Angaben stimmen.

                                      T Offline
                                      T Offline
                                      Tino 0
                                      schrieb am zuletzt editiert von
                                      #18

                                      @Nashra
                                      moin,
                                      was passiert wenn du http://192.168.7.249:8082/vis.0/www/weatherchart.html aufrufst?

                                      das vis.0/www sieht so aus
                                      225878e8-9664-4207-8dc9-486b6b4adf51-image.png

                                      1 Antwort Letzte Antwort
                                      0
                                      • LongbowL Online
                                        LongbowL Online
                                        Longbow
                                        schrieb am zuletzt editiert von
                                        #19

                                        Achtung @tino-0 und @nashra, das ist die IP von meinem Iobroker, die muss bei Nashra nicht stimmen.

                                        1 Antwort Letzte Antwort
                                        0
                                        • NashraN Nashra

                                          @Tino-0 sagte in Wetterdiagramm mit Icons in VIS (Chart.js + Wetter.com):

                                          @Nashra

                                          Hallo, was steht bei dir in dem Datenpunkt 0_userdata.0.wetter.chartdata drin?

                                          03b18787-9da3-4656-905e-9a136525f1a3-image.png

                                          Das selbe wie @longbow schon als Bild eingestellt hat s.o.

                                          und da drin wettercom.0.Day_01.date so? 9.12.2025

                                          Ja, Datum ist so drin

                                          wenn nicht dann stimmt wohl das hier nicht

                                          ed03f9a4-24ba-419e-8c97-d67d708c65f2-image.png

                                          Nö, da ist allles sauber, Angaben stimmen.

                                          T Offline
                                          T Offline
                                          Tino 0
                                          schrieb am zuletzt editiert von
                                          #20

                                          @Nashra

                                          ich habe es mal getestet bei euch warum auch immer steht das Datum mit / drin

                                          ba5ad40e-6a64-4ff3-a8ef-c1c4c09ebb67-image.png

                                          wenn ich ein Datum so ändere kommt genau euerm Format in den Json

                                          fec3280b-5c69-43e4-980c-522dfa587ad1-image.png

                                          ihr könnt jetzt die Zeile 39 im JScript

                                          von

                                                      const parts = dateStr.split("."); // ["28","11","2025"]
                                          

                                          in

                                                      const parts = dateStr.split("/"); // ["28","11","2025"]
                                          

                                          ändern, dann sollte es passen.

                                          Gruß Tino

                                          1 Antwort Letzte Antwort
                                          1
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          644

                                          Online

                                          32.7k

                                          Benutzer

                                          82.3k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe