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. Skripten / Logik
  4. JavaScript
  5. Script für open meteo weather

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    0
    1
    1

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

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

Script für open meteo weather

Geplant Angeheftet Gesperrt Verschoben JavaScript
6 Beiträge 4 Kommentatoren 175 Aufrufe 6 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde aufgespalten von Test Adapter open-meteo-weather v2.6.x GitHub/Latest Homoran
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • R Online
    R Online
    RISSN
    schrieb am zuletzt editiert von RISSN
    #1

    hier mal das Script etwas korrigiert und mit den Winddaten.

    // version: 0.2.6
    
    //////////////////////////////////////////////////
    const locationName = 'wo auch immer';
    //////////////////////////////////////////////////
    
    // Schriftgrößen-Konfiguration
    const fontSizeCurrentLabel = '1.3rem';
    const fontSizeTempBig = '3.8rem';
    const fontSizeDescription = '1.1rem';
    const fontSizeInfoGrid = '0.85rem';
    const fontSizeSunMoon = '0.8rem';
    const fontSizeHourly = '0.75rem';
    const fontSizeHourlyRain = '0.65rem';
    const fontSizeForecastDay = '0.75rem';
    const fontSizeForecastText = '0.65rem';
    const fontSizeForecastTempMax = '1rem';
    const fontSizeForecastTempMin = '0.85rem';
    const fontSizeForecastDetails = '0.65rem';
    
    const version = '0.2.6';
    const dpBase = 'open-meteo-weather.0.' + locationName + '.weather';
    const forecast = dpBase + '.forecast';
    const targetDP = '0_userdata.0.Wetter_Widget_HTML';
    
    // Sprach-Check
    let sysLang = 'de';
    try {
        const systemConfig = getObject("system.config");
        sysLang = systemConfig.common.language || 'de';
    } catch (e) { sysLang = 'de'; }
    
    const i18n = {
        de: { current: "Aktuell" }, 
        en: { current: "Current" }
    };
    const lang = i18n[sysLang] || i18n['en'];
    
    
    // DP anlegen falls nicht vorhanden
    if (!existsState(targetDP)) {
        createState(targetDP, '', {
            name: 'Weather Widget for VIS2',
            type: 'string',
            role: 'html'
        });
    }
    
    
    // ------------------------------------------------------------
    // Hauptfunktion
    // ------------------------------------------------------------
    function updateWeatherWidget() {
    
        function getVal(id, unit = "") {
            let state = getState(id);
            if (!state || state.val === null || state.val === undefined) return "--" + unit;
            return state.val + unit;
        }
    
        function getNum(id) {
            let s = getState(id);
            return (!s || s.val === null || s.val === undefined) ? null : Number(s.val);
        }
    
        function getImg(id, size = "20px") {
            let url = getVal(id, "");
            if (url === "" || url === "--") return "";
            return `<img src="${url}" style="width:${size}; height:${size}; object-fit:contain;">`;
        }
    
        function getSunHours(id) {
            let sec = getNum(id);
            if (sec === null) return "--h";
            return (sec / 3600).toFixed(1) + "h";
        }
    
        // HTML Start
        let html = `
        <style>
    
            @keyframes moonGlow {
                0% { filter: drop-shadow(0 0 2px #fbbf24); opacity: 0.85; }
                50% { filter: drop-shadow(0 0 6px #fbbf24); opacity: 1; }
                100% { filter: drop-shadow(0 0 2px #fbbf24); opacity: 0.85; }
            }
    
            .moon-anim {
                animation: moonGlow 3.5s ease-in-out infinite;
            }
    
            .w-container {
                font-family: 'Segoe UI', sans-serif;
                background: linear-gradient(160deg, #1e293b 0%, #0f172a 100%);
                color: #f1f5f9;
                padding: 20px;
                border-radius: 24px;
                border: 1px solid #334155;
                box-shadow: 0 10px 30px rgba(0,0,0,0.5);
            }
    
            /* Mini-Verbesserung Z: Header optisch sauberer, gleiche Höhe */
            .w-header {
                display: grid;
                grid-template-columns: 1.2fr 1.5fr 1fr;
                gap: 14px; /* vorher 15px */
                background: rgba(255,255,255,0.05);
                padding: 18px; /* vorher 20px, aber gleiche Höhe durch Innenstruktur */
                border-radius: 20px;
                margin-bottom: 20px;
                border: 1px solid rgba(255,255,255,0.1);
            }
    
            .w-temp-big { font-size: ${fontSizeTempBig}; font-weight: 900; color: #fbbf24; line-height: 1; }
            .w-desc { font-size: ${fontSizeDescription}; color: #38bdf8; font-weight: 600; }
            .w-info-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; font-size: ${fontSizeInfoGrid}; margin-top: 10px; }
            .w-info-item { background: rgba(0,0,0,0.2); padding: 6px 10px; border-radius: 10px; display: flex; align-items: center; gap: 5px; }
            .w-sun-moon { font-size: ${fontSizeSunMoon}; line-height: 1.6; border-left: 1px solid rgba(255,255,255,0.1); padding-left: 15px; }
    
            /* Mini-Verbesserung X: Stunden kompakter */
            .w-hourly {
                display: grid;
                grid-template-columns: repeat(6, 1fr);
                gap: 8px;
                margin-bottom: 16px; /* vorher 20px */
                background: rgba(0,0,0,0.15);
                padding: 10px;
                border-radius: 15px;
            }
    
            .w-h-item { text-align: center; font-size: ${fontSizeHourly}; }
            .w-h-time { font-weight: bold; color: #38bdf8; }
            .w-h-temp { font-weight: bold; color: #fbbf24; display: block; }
            .w-h-rain { font-size: ${fontSizeHourlyRain}; color: #94a3b8; }
    
            .w-forecast {
                display: grid;
                grid-template-columns: repeat(6, 1fr);
                gap: 10px;
            }
    
            .w-fc-day {
                background: rgba(255,255,255,0.03);
                padding: 12px 8px;
                border-radius: 18px;
                text-align: center;
                border: 1px solid rgba(255,255,255,0.05);
                display: flex;
                flex-direction: column;
                justify-content: space-between;
            }
    
            .w-fc-name {
                font-weight: bold;
                color: #38bdf8;
                font-size: ${fontSizeForecastDay};
                text-transform: uppercase;
                margin-bottom: 2px;
            }
    
            /* Mini-Verbesserung X: Wettertext sauber zentriert */
            .w-fc-text {
                font-size: ${fontSizeForecastText};
                color: #94a3b8;
                min-height: 2.2em;
                display: flex;
                align-items: center;
                justify-content: center;
                text-align: center;
                margin-bottom: 5px;
            }
    
            /* Mini-Verbesserung X: Temperaturen zentriert */
            .w-fc-temp-max {
                color: #f87171;
                font-weight: bold;
                font-size: ${fontSizeForecastTempMax};
                display: block;
                text-align: center;
            }
            .w-fc-temp-min {
                color: #60a5fa;
                font-size: ${fontSizeForecastTempMin};
                display: block;
                margin-bottom: 5px;
                text-align: center;
            }
    
            /* Mini-Verbesserung Y: Icons perfekt vertikal ausgerichtet */
            .w-fc-day img {
                margin: 2px 0 4px 0; /* optisch sauberer, gleiche Höhe */
            }
    
            .w-fc-details {
                font-size: ${fontSizeForecastDetails};
                color: #94a3b8;
                border-top: 1px solid rgba(255,255,255,0.05);
                margin-top: 8px;
                padding-top: 8px;
            }
    
        </style>
    
        <div class="w-container">
            <div class="w-header">
                <div style="text-align: center;">
                    <div style="font-size:${fontSizeCurrentLabel}; font-weight:bold;">
                        ${lang.current} / ${getVal(forecast + '.day0.name_day')}
                    </div>
                    ${getImg(dpBase + '.current.icon_url', "80px")}
                    <div class="w-desc">${getVal(dpBase + '.current.weather_text')}</div>
                </div>
    
                <div>
                    <div class="w-temp-big">${getVal(dpBase + '.current.temperature_2m', "°")}</div>
    
                    <div style="font-weight:bold; margin-bottom:10px;">
                        <span style="color:#f87171">${getVal(forecast + '.day0.temperature_2m_max', "°")}</span> |
                        <span style="color:#60a5fa">${getVal(forecast + '.day0.temperature_2m_min', "°")}</span>
                    </div>
    
                    <div class="w-info-grid">
                        <div class="w-info-item">💧 ${getVal(dpBase + '.current.relative_humidity_2m', "%")}</div>
                        <div class="w-info-item">🌧️ ${getVal(forecast + '.day0.precipitation_sum', "mm")}</div>
                        <div class="w-info-item">☀️ UV ${getVal(forecast + '.day0.uv_index_max')}</div>
                        <div class="w-info-item">⏱️ ${getSunHours(forecast + '.day0.sunshine_duration')}</div>
                        <div class="w-info-item">💨 Wind ${getVal(dpBase + '.current.wind_speed_10m', " km/h")}</div>
                        <div class="w-info-item">🌬️ Böen ${getVal(dpBase + '.current.wind_gusts_10m', " km/h")}</div>
                    </div>
                </div>
    
                <div class="w-sun-moon" style="position:relative;">
                    🌅 ${getVal(forecast + '.day0.sunrise')}<br>
                    🌇 ${getVal(forecast + '.day0.sunset')}<br>
    
                    🌙 ${getVal(forecast + '.day0.moonrise')}<br>
                    🌘 ${getVal(forecast + '.day0.moonset')}<br>
    
                    <div style="margin-top:6px;">
                        ${getImg(forecast + '.day0.moon_phase_icon', "34px")}
                        <div class="moon-anim" style="font-size:0.75rem; color:#cbd5e1;">
                            ${getVal(forecast + '.day0.moon_phase_text')}
                        </div>
                    </div>
    
                    <div style="margin-top:10px;">
                        💨 Richtung: ${getVal(dpBase + '.current.wind_direction_text')}<br>
                        ${getImg(dpBase + '.current.wind_direction_icon', "30px")}
                    </div>
    
                    <div style="position:absolute; bottom:-10px; right:0; font-size:0.6rem; color:#475569; opacity:0.8;">
                        Script Version ${version}
                    </div>
                </div>
            </div>
    
            <div class="w-hourly">
        `;
    
        // Stunden – mit Wind + Mond
        for (let h = 0; h <= 5; h++) {
            let hPath = forecast + '.hourly.next_hours.hour' + h;
    
            let isNight = getNum(hPath + '.is_day') === 0;
    
            html += `
                <div class="w-h-item">
                    <div class="w-h-time">${getVal(hPath + '.time')}</div>
    
                    ${getImg(hPath + '.icon_url', "30px")}
                    <span class="w-h-temp">${getVal(hPath + '.temperature_2m', "°")}</span>
    
                    <span class="w-h-rain">
                        🌧️${getVal(hPath + '.precipitation_probability', "%")} /
                        ${getVal(hPath + '.precipitation', "mm")}
                    </span>
    
                    <div style="margin-top:4px; font-size:0.7rem; color:#cbd5e1;">
                        💨 ${getVal(hPath + '.wind_speed_10m', " km/h")}
                        🌬️ ${getVal(hPath + '.wind_gusts_10m', " km/h")}
                    </div>
    
                    <div style="margin-top:2px;">
                        ${getImg(hPath + '.wind_direction_icon', "24px")}
                        <span style="font-size:0.7rem; color:#94a3b8;">
                            ${getVal(hPath + '.wind_direction_text')}
                        </span>
                    </div>
    
                    ${
                        isNight
                        ? `
                        <div style="margin-top:4px;">
                            ${getImg(hPath + '.moon_phase_icon', "24px")}
                            <div style="font-size:0.65rem; color:#cbd5e1;">
                                ${getVal(hPath + '.moon_phase_text')}
                            </div>
                        </div>
                        `
                        : ""
                    }
                </div>
            `;
        }
    
        html += `
            </div>
            <div class="w-forecast">
        `;
    
        // 6-Tage-Vorhersage
        for (let i = 1; i <= 6; i++) {
            let d = forecast + '.day' + i;
            html += `
            <div class="w-fc-day">
                <div>
                    <div class="w-fc-name">${getVal(d + '.name_day')}</div>
                    <div class="w-fc-text">${getVal(d + '.weather_text')}</div>
                    ${getImg(d + '.icon_url', "45px")}
                    <span class="w-fc-temp-max">${getVal(d + '.temperature_2m_max', "°")}</span>
                    <span class="w-fc-temp-min">${getVal(d + '.temperature_2m_min', "°")}</span>
                </div>
    
                <div class="w-fc-details">
                    🌧️ ${getVal(d + '.precipitation_sum', "mm")} (${getVal(d + '.precipitation_probability_max', "%")})<br>
                    💧 ${getVal(d + '.relative_humidity_2m_mean', "%")}<br>
    
                    💨 Wind ${getVal(d + '.wind_speed_10m_max', " km/h")}<br>
                    🌬️ Böen ${getVal(d + '.wind_gusts_10m_max', " km/h")}<br>
    
                    ${getVal(d + '.wind_direction_text')}<br>
                    ${getImg(d + '.wind_direction_icon', "26px")}<br>
    
                    ${getImg(d + '.wind_gust_icon', "26px")}<br>
    
                    ☀️ UV ${getVal(d + '.uv_index_max')}
                </div>
            </div>
            `;
        }
    
        html += `</div></div>`;
    
        setState(targetDP, html, true);
        console.log("Weather widget: HTML successfully generated (v0.2.6).");
    }
    
    
    // Trigger
    updateWeatherWidget();
    schedule("*/5 * * * *", updateWeatherWidget);
    on({id: dpBase + '.current.temperature_2m', change: 'any'}, updateWeatherWidget);
    on({id: forecast + '.hourly.next_hours.hour0.time', change: 'any'}, updateWeatherWidget);
    
    

    ff15d820-6d4a-4516-ac0a-9644323133cc-image.png

    M 1 Antwort Letzte Antwort
    3
    • R RISSN

      hier mal das Script etwas korrigiert und mit den Winddaten.

      // version: 0.2.6
      
      //////////////////////////////////////////////////
      const locationName = 'wo auch immer';
      //////////////////////////////////////////////////
      
      // Schriftgrößen-Konfiguration
      const fontSizeCurrentLabel = '1.3rem';
      const fontSizeTempBig = '3.8rem';
      const fontSizeDescription = '1.1rem';
      const fontSizeInfoGrid = '0.85rem';
      const fontSizeSunMoon = '0.8rem';
      const fontSizeHourly = '0.75rem';
      const fontSizeHourlyRain = '0.65rem';
      const fontSizeForecastDay = '0.75rem';
      const fontSizeForecastText = '0.65rem';
      const fontSizeForecastTempMax = '1rem';
      const fontSizeForecastTempMin = '0.85rem';
      const fontSizeForecastDetails = '0.65rem';
      
      const version = '0.2.6';
      const dpBase = 'open-meteo-weather.0.' + locationName + '.weather';
      const forecast = dpBase + '.forecast';
      const targetDP = '0_userdata.0.Wetter_Widget_HTML';
      
      // Sprach-Check
      let sysLang = 'de';
      try {
          const systemConfig = getObject("system.config");
          sysLang = systemConfig.common.language || 'de';
      } catch (e) { sysLang = 'de'; }
      
      const i18n = {
          de: { current: "Aktuell" }, 
          en: { current: "Current" }
      };
      const lang = i18n[sysLang] || i18n['en'];
      
      
      // DP anlegen falls nicht vorhanden
      if (!existsState(targetDP)) {
          createState(targetDP, '', {
              name: 'Weather Widget for VIS2',
              type: 'string',
              role: 'html'
          });
      }
      
      
      // ------------------------------------------------------------
      // Hauptfunktion
      // ------------------------------------------------------------
      function updateWeatherWidget() {
      
          function getVal(id, unit = "") {
              let state = getState(id);
              if (!state || state.val === null || state.val === undefined) return "--" + unit;
              return state.val + unit;
          }
      
          function getNum(id) {
              let s = getState(id);
              return (!s || s.val === null || s.val === undefined) ? null : Number(s.val);
          }
      
          function getImg(id, size = "20px") {
              let url = getVal(id, "");
              if (url === "" || url === "--") return "";
              return `<img src="${url}" style="width:${size}; height:${size}; object-fit:contain;">`;
          }
      
          function getSunHours(id) {
              let sec = getNum(id);
              if (sec === null) return "--h";
              return (sec / 3600).toFixed(1) + "h";
          }
      
          // HTML Start
          let html = `
          <style>
      
              @keyframes moonGlow {
                  0% { filter: drop-shadow(0 0 2px #fbbf24); opacity: 0.85; }
                  50% { filter: drop-shadow(0 0 6px #fbbf24); opacity: 1; }
                  100% { filter: drop-shadow(0 0 2px #fbbf24); opacity: 0.85; }
              }
      
              .moon-anim {
                  animation: moonGlow 3.5s ease-in-out infinite;
              }
      
              .w-container {
                  font-family: 'Segoe UI', sans-serif;
                  background: linear-gradient(160deg, #1e293b 0%, #0f172a 100%);
                  color: #f1f5f9;
                  padding: 20px;
                  border-radius: 24px;
                  border: 1px solid #334155;
                  box-shadow: 0 10px 30px rgba(0,0,0,0.5);
              }
      
              /* Mini-Verbesserung Z: Header optisch sauberer, gleiche Höhe */
              .w-header {
                  display: grid;
                  grid-template-columns: 1.2fr 1.5fr 1fr;
                  gap: 14px; /* vorher 15px */
                  background: rgba(255,255,255,0.05);
                  padding: 18px; /* vorher 20px, aber gleiche Höhe durch Innenstruktur */
                  border-radius: 20px;
                  margin-bottom: 20px;
                  border: 1px solid rgba(255,255,255,0.1);
              }
      
              .w-temp-big { font-size: ${fontSizeTempBig}; font-weight: 900; color: #fbbf24; line-height: 1; }
              .w-desc { font-size: ${fontSizeDescription}; color: #38bdf8; font-weight: 600; }
              .w-info-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; font-size: ${fontSizeInfoGrid}; margin-top: 10px; }
              .w-info-item { background: rgba(0,0,0,0.2); padding: 6px 10px; border-radius: 10px; display: flex; align-items: center; gap: 5px; }
              .w-sun-moon { font-size: ${fontSizeSunMoon}; line-height: 1.6; border-left: 1px solid rgba(255,255,255,0.1); padding-left: 15px; }
      
              /* Mini-Verbesserung X: Stunden kompakter */
              .w-hourly {
                  display: grid;
                  grid-template-columns: repeat(6, 1fr);
                  gap: 8px;
                  margin-bottom: 16px; /* vorher 20px */
                  background: rgba(0,0,0,0.15);
                  padding: 10px;
                  border-radius: 15px;
              }
      
              .w-h-item { text-align: center; font-size: ${fontSizeHourly}; }
              .w-h-time { font-weight: bold; color: #38bdf8; }
              .w-h-temp { font-weight: bold; color: #fbbf24; display: block; }
              .w-h-rain { font-size: ${fontSizeHourlyRain}; color: #94a3b8; }
      
              .w-forecast {
                  display: grid;
                  grid-template-columns: repeat(6, 1fr);
                  gap: 10px;
              }
      
              .w-fc-day {
                  background: rgba(255,255,255,0.03);
                  padding: 12px 8px;
                  border-radius: 18px;
                  text-align: center;
                  border: 1px solid rgba(255,255,255,0.05);
                  display: flex;
                  flex-direction: column;
                  justify-content: space-between;
              }
      
              .w-fc-name {
                  font-weight: bold;
                  color: #38bdf8;
                  font-size: ${fontSizeForecastDay};
                  text-transform: uppercase;
                  margin-bottom: 2px;
              }
      
              /* Mini-Verbesserung X: Wettertext sauber zentriert */
              .w-fc-text {
                  font-size: ${fontSizeForecastText};
                  color: #94a3b8;
                  min-height: 2.2em;
                  display: flex;
                  align-items: center;
                  justify-content: center;
                  text-align: center;
                  margin-bottom: 5px;
              }
      
              /* Mini-Verbesserung X: Temperaturen zentriert */
              .w-fc-temp-max {
                  color: #f87171;
                  font-weight: bold;
                  font-size: ${fontSizeForecastTempMax};
                  display: block;
                  text-align: center;
              }
              .w-fc-temp-min {
                  color: #60a5fa;
                  font-size: ${fontSizeForecastTempMin};
                  display: block;
                  margin-bottom: 5px;
                  text-align: center;
              }
      
              /* Mini-Verbesserung Y: Icons perfekt vertikal ausgerichtet */
              .w-fc-day img {
                  margin: 2px 0 4px 0; /* optisch sauberer, gleiche Höhe */
              }
      
              .w-fc-details {
                  font-size: ${fontSizeForecastDetails};
                  color: #94a3b8;
                  border-top: 1px solid rgba(255,255,255,0.05);
                  margin-top: 8px;
                  padding-top: 8px;
              }
      
          </style>
      
          <div class="w-container">
              <div class="w-header">
                  <div style="text-align: center;">
                      <div style="font-size:${fontSizeCurrentLabel}; font-weight:bold;">
                          ${lang.current} / ${getVal(forecast + '.day0.name_day')}
                      </div>
                      ${getImg(dpBase + '.current.icon_url', "80px")}
                      <div class="w-desc">${getVal(dpBase + '.current.weather_text')}</div>
                  </div>
      
                  <div>
                      <div class="w-temp-big">${getVal(dpBase + '.current.temperature_2m', "°")}</div>
      
                      <div style="font-weight:bold; margin-bottom:10px;">
                          <span style="color:#f87171">${getVal(forecast + '.day0.temperature_2m_max', "°")}</span> |
                          <span style="color:#60a5fa">${getVal(forecast + '.day0.temperature_2m_min', "°")}</span>
                      </div>
      
                      <div class="w-info-grid">
                          <div class="w-info-item">💧 ${getVal(dpBase + '.current.relative_humidity_2m', "%")}</div>
                          <div class="w-info-item">🌧️ ${getVal(forecast + '.day0.precipitation_sum', "mm")}</div>
                          <div class="w-info-item">☀️ UV ${getVal(forecast + '.day0.uv_index_max')}</div>
                          <div class="w-info-item">⏱️ ${getSunHours(forecast + '.day0.sunshine_duration')}</div>
                          <div class="w-info-item">💨 Wind ${getVal(dpBase + '.current.wind_speed_10m', " km/h")}</div>
                          <div class="w-info-item">🌬️ Böen ${getVal(dpBase + '.current.wind_gusts_10m', " km/h")}</div>
                      </div>
                  </div>
      
                  <div class="w-sun-moon" style="position:relative;">
                      🌅 ${getVal(forecast + '.day0.sunrise')}<br>
                      🌇 ${getVal(forecast + '.day0.sunset')}<br>
      
                      🌙 ${getVal(forecast + '.day0.moonrise')}<br>
                      🌘 ${getVal(forecast + '.day0.moonset')}<br>
      
                      <div style="margin-top:6px;">
                          ${getImg(forecast + '.day0.moon_phase_icon', "34px")}
                          <div class="moon-anim" style="font-size:0.75rem; color:#cbd5e1;">
                              ${getVal(forecast + '.day0.moon_phase_text')}
                          </div>
                      </div>
      
                      <div style="margin-top:10px;">
                          💨 Richtung: ${getVal(dpBase + '.current.wind_direction_text')}<br>
                          ${getImg(dpBase + '.current.wind_direction_icon', "30px")}
                      </div>
      
                      <div style="position:absolute; bottom:-10px; right:0; font-size:0.6rem; color:#475569; opacity:0.8;">
                          Script Version ${version}
                      </div>
                  </div>
              </div>
      
              <div class="w-hourly">
          `;
      
          // Stunden – mit Wind + Mond
          for (let h = 0; h <= 5; h++) {
              let hPath = forecast + '.hourly.next_hours.hour' + h;
      
              let isNight = getNum(hPath + '.is_day') === 0;
      
              html += `
                  <div class="w-h-item">
                      <div class="w-h-time">${getVal(hPath + '.time')}</div>
      
                      ${getImg(hPath + '.icon_url', "30px")}
                      <span class="w-h-temp">${getVal(hPath + '.temperature_2m', "°")}</span>
      
                      <span class="w-h-rain">
                          🌧️${getVal(hPath + '.precipitation_probability', "%")} /
                          ${getVal(hPath + '.precipitation', "mm")}
                      </span>
      
                      <div style="margin-top:4px; font-size:0.7rem; color:#cbd5e1;">
                          💨 ${getVal(hPath + '.wind_speed_10m', " km/h")}
                          🌬️ ${getVal(hPath + '.wind_gusts_10m', " km/h")}
                      </div>
      
                      <div style="margin-top:2px;">
                          ${getImg(hPath + '.wind_direction_icon', "24px")}
                          <span style="font-size:0.7rem; color:#94a3b8;">
                              ${getVal(hPath + '.wind_direction_text')}
                          </span>
                      </div>
      
                      ${
                          isNight
                          ? `
                          <div style="margin-top:4px;">
                              ${getImg(hPath + '.moon_phase_icon', "24px")}
                              <div style="font-size:0.65rem; color:#cbd5e1;">
                                  ${getVal(hPath + '.moon_phase_text')}
                              </div>
                          </div>
                          `
                          : ""
                      }
                  </div>
              `;
          }
      
          html += `
              </div>
              <div class="w-forecast">
          `;
      
          // 6-Tage-Vorhersage
          for (let i = 1; i <= 6; i++) {
              let d = forecast + '.day' + i;
              html += `
              <div class="w-fc-day">
                  <div>
                      <div class="w-fc-name">${getVal(d + '.name_day')}</div>
                      <div class="w-fc-text">${getVal(d + '.weather_text')}</div>
                      ${getImg(d + '.icon_url', "45px")}
                      <span class="w-fc-temp-max">${getVal(d + '.temperature_2m_max', "°")}</span>
                      <span class="w-fc-temp-min">${getVal(d + '.temperature_2m_min', "°")}</span>
                  </div>
      
                  <div class="w-fc-details">
                      🌧️ ${getVal(d + '.precipitation_sum', "mm")} (${getVal(d + '.precipitation_probability_max', "%")})<br>
                      💧 ${getVal(d + '.relative_humidity_2m_mean', "%")}<br>
      
                      💨 Wind ${getVal(d + '.wind_speed_10m_max', " km/h")}<br>
                      🌬️ Böen ${getVal(d + '.wind_gusts_10m_max', " km/h")}<br>
      
                      ${getVal(d + '.wind_direction_text')}<br>
                      ${getImg(d + '.wind_direction_icon', "26px")}<br>
      
                      ${getImg(d + '.wind_gust_icon', "26px")}<br>
      
                      ☀️ UV ${getVal(d + '.uv_index_max')}
                  </div>
              </div>
              `;
          }
      
          html += `</div></div>`;
      
          setState(targetDP, html, true);
          console.log("Weather widget: HTML successfully generated (v0.2.6).");
      }
      
      
      // Trigger
      updateWeatherWidget();
      schedule("*/5 * * * *", updateWeatherWidget);
      on({id: dpBase + '.current.temperature_2m', change: 'any'}, updateWeatherWidget);
      on({id: forecast + '.hourly.next_hours.hour0.time', change: 'any'}, updateWeatherWidget);
      
      

      ff15d820-6d4a-4516-ac0a-9644323133cc-image.png

      M Offline
      M Offline
      michihorn
      schrieb am zuletzt editiert von michihorn
      #2

      @RISSN Moin, mit dem neuen Script 0.2.6 bekomme ich einige Warnmeldungen:

      javascript.0	14:05:48.528	info	
      Stopping script
      javascript.0	14:05:48.552	info	
      start JavaScript (Javascript/js)
      javascript.0	14:05:48.560	warn	
          at getVal (script.js.Trash.Wetter:57:21)
      javascript.0	14:05:48.561	warn	
          at getImg (script.js.Trash.Wetter:68:19)
      javascript.0	14:05:48.563	warn	
          at updateWeatherWidget (script.js.Trash.Wetter:295:27)
      javascript.0	14:05:48.563	warn	
          at script.js.Trash.Wetter:351:1
      javascript.0	14:05:48.563	warn	
          at script.js.Trash.Wetter:360:3
      javascript.0	14:05:48.564	warn	
          at getVal (script.js.Trash.Wetter:57:21)
      javascript.0	14:05:48.564	warn	
          at updateWeatherWidget (script.js.Trash.Wetter:297:31)
      javascript.0	14:05:48.564	warn	
          at script.js.Trash.Wetter:351:1
      javascript.0	14:05:48.565	warn	
          at script.js.Trash.Wetter:360:3
      javascript.0	14:05:48.566	warn	
          at getVal (script.js.Trash.Wetter:57:21)
      javascript.0	14:05:48.566	warn	
          at getImg (script.js.Trash.Wetter:68:19)
      javascript.0	14:05:48.566	warn	
          at updateWeatherWidget (script.js.Trash.Wetter:295:27)
      javascript.0	14:05:48.566	warn	
          at script.js.Trash.Wetter:351:1
      javascript.0	14:05:48.566	warn	
          at script.js.Trash.Wetter:360:3
      javascript.0	14:05:48.567	warn	
          at getVal (script.js.Trash.Wetter:57:21)
      javascript.0	14:05:48.567	warn	
          at updateWeatherWidget (script.js.Trash.Wetter:297:31)
      javascript.0	14:05:48.567	warn	
          at script.js.Trash.Wetter:351:1
      javascript.0	14:05:48.568	warn	
          at script.js.Trash.Wetter:360:3
      javascript.0	14:05:48.568	info	
      Weather widget: HTML successfully generated (v0.2.6).
      javascript.0	14:05:48.570	info	
      registered 2 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
      
      HomoranH H5N1H R 3 Antworten Letzte Antwort
      0
      • M michihorn

        @RISSN Moin, mit dem neuen Script 0.2.6 bekomme ich einige Warnmeldungen:

        javascript.0	14:05:48.528	info	
        Stopping script
        javascript.0	14:05:48.552	info	
        start JavaScript (Javascript/js)
        javascript.0	14:05:48.560	warn	
            at getVal (script.js.Trash.Wetter:57:21)
        javascript.0	14:05:48.561	warn	
            at getImg (script.js.Trash.Wetter:68:19)
        javascript.0	14:05:48.563	warn	
            at updateWeatherWidget (script.js.Trash.Wetter:295:27)
        javascript.0	14:05:48.563	warn	
            at script.js.Trash.Wetter:351:1
        javascript.0	14:05:48.563	warn	
            at script.js.Trash.Wetter:360:3
        javascript.0	14:05:48.564	warn	
            at getVal (script.js.Trash.Wetter:57:21)
        javascript.0	14:05:48.564	warn	
            at updateWeatherWidget (script.js.Trash.Wetter:297:31)
        javascript.0	14:05:48.564	warn	
            at script.js.Trash.Wetter:351:1
        javascript.0	14:05:48.565	warn	
            at script.js.Trash.Wetter:360:3
        javascript.0	14:05:48.566	warn	
            at getVal (script.js.Trash.Wetter:57:21)
        javascript.0	14:05:48.566	warn	
            at getImg (script.js.Trash.Wetter:68:19)
        javascript.0	14:05:48.566	warn	
            at updateWeatherWidget (script.js.Trash.Wetter:295:27)
        javascript.0	14:05:48.566	warn	
            at script.js.Trash.Wetter:351:1
        javascript.0	14:05:48.566	warn	
            at script.js.Trash.Wetter:360:3
        javascript.0	14:05:48.567	warn	
            at getVal (script.js.Trash.Wetter:57:21)
        javascript.0	14:05:48.567	warn	
            at updateWeatherWidget (script.js.Trash.Wetter:297:31)
        javascript.0	14:05:48.567	warn	
            at script.js.Trash.Wetter:351:1
        javascript.0	14:05:48.568	warn	
            at script.js.Trash.Wetter:360:3
        javascript.0	14:05:48.568	info	
        Weather widget: HTML successfully generated (v0.2.6).
        javascript.0	14:05:48.570	info	
        registered 2 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
        
        H5N1H Offline
        H5N1H Offline
        H5N1
        Developer
        schrieb am zuletzt editiert von
        #3

        @michihorn sagte in Test Adapter open-meteo-weather v2.2.x GitHub/Lates:

        @RISSN Moin, mit dem neuen Script 0.2.6 bekomme ich einige Warnmeldungen:

        Bitte macht dazu ein eigenes Thema auf, das bearbeitete Script von @rissn soll nun nicht hier Diskutiert werden, da es das Thema total Durcheinander bringt. Hier geht es um den Adapter und um das originale Widget.

        Danke fürs Verständnis.

        Grüße H5N1

        1 Antwort Letzte Antwort
        0
        • HomoranH Homoran verschob dieses Thema von Tester am
        • HomoranH Nicht stören
          HomoranH Nicht stören
          Homoran
          Global Moderator Administrators
          schrieb am zuletzt editiert von
          #4

          Hab das mal abgetrennt

          hoffentlich nichts vergessen

          kein Support per PN! - Fragen im Forum stellen -

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

          ioBroker freut sich auch über eine Spende für das Forum. Benutzt dazu den Spendenbutton im Header. Danke!

          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

          1 Antwort Letzte Antwort
          1
          • M michihorn

            @RISSN Moin, mit dem neuen Script 0.2.6 bekomme ich einige Warnmeldungen:

            javascript.0	14:05:48.528	info	
            Stopping script
            javascript.0	14:05:48.552	info	
            start JavaScript (Javascript/js)
            javascript.0	14:05:48.560	warn	
                at getVal (script.js.Trash.Wetter:57:21)
            javascript.0	14:05:48.561	warn	
                at getImg (script.js.Trash.Wetter:68:19)
            javascript.0	14:05:48.563	warn	
                at updateWeatherWidget (script.js.Trash.Wetter:295:27)
            javascript.0	14:05:48.563	warn	
                at script.js.Trash.Wetter:351:1
            javascript.0	14:05:48.563	warn	
                at script.js.Trash.Wetter:360:3
            javascript.0	14:05:48.564	warn	
                at getVal (script.js.Trash.Wetter:57:21)
            javascript.0	14:05:48.564	warn	
                at updateWeatherWidget (script.js.Trash.Wetter:297:31)
            javascript.0	14:05:48.564	warn	
                at script.js.Trash.Wetter:351:1
            javascript.0	14:05:48.565	warn	
                at script.js.Trash.Wetter:360:3
            javascript.0	14:05:48.566	warn	
                at getVal (script.js.Trash.Wetter:57:21)
            javascript.0	14:05:48.566	warn	
                at getImg (script.js.Trash.Wetter:68:19)
            javascript.0	14:05:48.566	warn	
                at updateWeatherWidget (script.js.Trash.Wetter:295:27)
            javascript.0	14:05:48.566	warn	
                at script.js.Trash.Wetter:351:1
            javascript.0	14:05:48.566	warn	
                at script.js.Trash.Wetter:360:3
            javascript.0	14:05:48.567	warn	
                at getVal (script.js.Trash.Wetter:57:21)
            javascript.0	14:05:48.567	warn	
                at updateWeatherWidget (script.js.Trash.Wetter:297:31)
            javascript.0	14:05:48.567	warn	
                at script.js.Trash.Wetter:351:1
            javascript.0	14:05:48.568	warn	
                at script.js.Trash.Wetter:360:3
            javascript.0	14:05:48.568	info	
            Weather widget: HTML successfully generated (v0.2.6).
            javascript.0	14:05:48.570	info	
            registered 2 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
            
            R Online
            R Online
            RISSN
            schrieb am zuletzt editiert von
            #5

            @michihorn sagte in Script für open meteo weather:

            @RISSN Moin, mit dem neuen Script 0.2.6 bekomme ich einige Warnmeldungen:

            javascript.0	14:05:48.528	info	
            Stopping script
            javascript.0	14:05:48.552	info	
            start JavaScript (Javascript/js)
            javascript.0	14:05:48.560	warn	
                at getVal (script.js.Trash.Wetter:57:21)
            javascript.0	14:05:48.561	warn	
                at getImg (script.js.Trash.Wetter:68:19)
            javascript.0	14:05:48.563	warn	
                at updateWeatherWidget (script.js.Trash.Wetter:295:27)
            javascript.0	14:05:48.563	warn	
                at script.js.Trash.Wetter:351:1
            javascript.0	14:05:48.563	warn	
                at script.js.Trash.Wetter:360:3
            javascript.0	14:05:48.564	warn	
                at getVal (script.js.Trash.Wetter:57:21)
            javascript.0	14:05:48.564	warn	
                at updateWeatherWidget (script.js.Trash.Wetter:297:31)
            javascript.0	14:05:48.564	warn	
                at script.js.Trash.Wetter:351:1
            javascript.0	14:05:48.565	warn	
                at script.js.Trash.Wetter:360:3
            javascript.0	14:05:48.566	warn	
                at getVal (script.js.Trash.Wetter:57:21)
            javascript.0	14:05:48.566	warn	
                at getImg (script.js.Trash.Wetter:68:19)
            javascript.0	14:05:48.566	warn	
                at updateWeatherWidget (script.js.Trash.Wetter:295:27)
            javascript.0	14:05:48.566	warn	
                at script.js.Trash.Wetter:351:1
            javascript.0	14:05:48.566	warn	
                at script.js.Trash.Wetter:360:3
            javascript.0	14:05:48.567	warn	
                at getVal (script.js.Trash.Wetter:57:21)
            javascript.0	14:05:48.567	warn	
                at updateWeatherWidget (script.js.Trash.Wetter:297:31)
            javascript.0	14:05:48.567	warn	
                at script.js.Trash.Wetter:351:1
            javascript.0	14:05:48.568	warn	
                at script.js.Trash.Wetter:360:3
            javascript.0	14:05:48.568	info	
            Weather widget: HTML successfully generated (v0.2.6).
            javascript.0	14:05:48.570	info	
            registered 2 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
            

            Es sind halt Warnungen, ich habe die abgeschaltet um Script, dass passiert eigentlich, wenn Datenpunkte in der Vorhersage fehlen. Aber @h5n1 hat schon Recht, es bringt zu viel durcheinander bei zu vielen Scripten

            1 Antwort Letzte Antwort
            0
            • R Online
              R Online
              RISSN
              schrieb am zuletzt editiert von RISSN
              #6

              hier noch etwas überarbeitet und ohne Warnungen

              // version: 0.2.6
              
              //////////////////////////////////////////////////
              const locationName = 'wo auch immer';
              //////////////////////////////////////////////////
              
              // Schriftgrößen-Konfiguration
              const fontSizeCurrentLabel = '1.3rem';
              const fontSizeTempBig = '3.8rem';
              const fontSizeDescription = '1.1rem';
              const fontSizeInfoGrid = '0.85rem';
              const fontSizeSunMoon = '0.8rem';
              const fontSizeHourly = '0.75rem';
              const fontSizeHourlyRain = '0.65rem';
              const fontSizeForecastDay = '0.75rem';
              const fontSizeForecastText = '0.65rem';
              const fontSizeForecastTempMax = '1rem';
              const fontSizeForecastTempMin = '0.85rem';
              const fontSizeForecastDetails = '0.65rem';
              
              const version = '0.2.6';
              const dpBase = 'open-meteo-weather.0.' + locationName + '.weather';
              const forecast = dpBase + '.forecast';
              const targetDP = '0_userdata.0.Wetter_Widget_HTML';
              
              // Sprach-Check
              let sysLang = 'de';
              try {
                  const systemConfig = getObject("system.config");
                  sysLang = systemConfig.common.language || 'de';
              } catch (e) { sysLang = 'de'; }
              
              const i18n = {
                  de: { current: "Aktuell" }, 
                  en: { current: "Current" }
              };
              const lang = i18n[sysLang] || i18n['en'];
              
              
              // DP anlegen falls nicht vorhanden
              if (!existsState(targetDP)) {
                  createState(targetDP, '', {
                      name: 'Weather Widget for VIS',
                      type: 'string',
                      role: 'html'
                  });
              }
              
              
              // ------------------------------------------------------------
              // Hilfsfunktionen
              // ------------------------------------------------------------
              
              // HEUTE aus JavaScript, kompakt
              function getToday() {
                  const d = new Date();
                  const day = String(d.getDate()).padStart(2, "0");
                  const month = String(d.getMonth() + 1).padStart(2, "0");
                  const year = d.getFullYear();
                  return `${day}.${month}.${year}`;
              }
              
              function getVal(id, unit = "") {
                  if (!existsState(id)) return "--" + unit;
                  let state = getState(id);
                  if (!state || state.val === null || state.val === undefined) return "--" + unit;
                  return state.val + unit;
              }
              
              function getImg(id, size = "20px") {
                  if (!existsState(id)) return "";
                  let state = getState(id);
                  if (!state || !state.val) return "";
                  return `<img src="${state.val}" style="width:${size}; height:${size}; object-fit:contain;">`;
              }
              
              
              function getNum(id) {
                  let s = getState(id);
                  return (!s || s.val === null || s.val === undefined) ? null : Number(s.val);
              }
              
              function getSunHours(id) {
                  let sec = getNum(id);
                  if (sec === null) return "--h";
                  return (sec / 3600).toFixed(1) + "h";
              }
              
              
              // ------------------------------------------------------------
              // Hauptfunktion
              // ------------------------------------------------------------
              function updateWeatherWidget() {
              
                  // ⭐ AB HIER: ALLES UNVERÄNDERT GELASSEN
                  let html = `
                  <style>
              
                      @keyframes moonGlow {
                          0% { filter: drop-shadow(0 0 2px #fbbf24); opacity: 0.85; }
                          50% { filter: drop-shadow(0 0 6px #fbbf24); opacity: 1; }
                          100% { filter: drop-shadow(0 0 2px #fbbf24); opacity: 0.85; }
                      }
              
                      .moon-anim {
                          animation: moonGlow 3.5s ease-in-out infinite;
                      }
              
                      .w-container {
                          font-family: 'Segoe UI', sans-serif;
                          background: linear-gradient(160deg, #1e293b 0%, #0f172a 100%);
                          color: #f1f5f9;
                          padding: 10px;
                          border-radius: 20px;
                          border: 1px solid #334155;
                          box-shadow: 0 10px 30px rgba(0,0,0,0.5);
                      }
              
                      .w-header {
                          display: grid;
                          grid-template-columns: 1.2fr 1.5fr 1fr;
                          gap: 10px;
                          background: rgba(255,255,255,0.05);
                          padding: 10px;
                          border-radius: 10px;
                          margin-bottom: 10px;
                          border: 1px solid rgba(255,255,255,0.1);
                      }
              
                      .w-temp-big { font-size: ${fontSizeTempBig}; font-weight: 900; color: #fbbf24; line-height: 1; }
                      .w-desc { font-size: ${fontSizeDescription}; color: #38bdf8; font-weight: 600; }
                      .w-info-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; font-size: ${fontSizeInfoGrid}; margin-top: 10px; }
                      .w-info-item { background: rgba(0,0,0,0.2); padding: 6px 10px; border-radius: 10px; display: flex; align-items: center; gap: 5px; }
                      .w-sun-moon { font-size: ${fontSizeSunMoon}; line-height: 1.6; border-left: 1px solid rgba(255,255,255,0.1); padding-left: 15px; }
              
                      .w-hourly {
                          display: grid;
                          grid-template-columns: repeat(6, 1fr);
                          gap: 8px;
                          margin-bottom: 10px;
                          background: rgba(0,0,0,0.15);
                          padding: 10px;
                          border-radius: 15px;
                      }
              
                      .w-h-item { text-align: center; font-size: ${fontSizeHourly}; }
                      .w-h-time { font-weight: bold; color: #38bdf8; }
                      .w-h-temp { font-weight: bold; color: #fbbf24; display: block; }
                      .w-h-rain { font-size: ${fontSizeHourlyRain}; color: #94a3b8; }
              
                      .w-forecast {
                          display: grid;
                          grid-template-columns: repeat(6, 1fr);
                          gap: 10px;
                      }
              
                      .w-fc-day {
                          background: rgba(255,255,255,0.03);
                          padding: 12px 8px;
                          border-radius: 18px;
                          text-align: center;
                          border: 1px solid rgba(255,255,255,0.05);
                          display: flex;
                          flex-direction: column;
                          justify-content: space-between;
                      }
              
                      .w-fc-name {
                          font-weight: bold;
                          color: #38bdf8;
                          font-size: ${fontSizeForecastDay};
                          text-transform: uppercase;
                          margin-bottom: 2px;
                      }
              
                      .w-fc-text {
                          font-size: ${fontSizeForecastText};
                          color: #94a3b8;
                          min-height: 2.2em;
                          display: flex;
                          align-items: center;
                          justify-content: center;
                          text-align: center;
                          margin-bottom: 5px;
                      }
              
                      .w-fc-temp-max {
                          color: #f87171;
                          font-weight: bold;
                          font-size: ${fontSizeForecastTempMax};
                          display: block;
                          text-align: center;
                      }
                      .w-fc-temp-min {
                          color: #60a5fa;
                          font-size: ${fontSizeForecastTempMin};
                          display: block;
                          margin-bottom: 5px;
                          text-align: center;
                      }
              
                      .w-fc-day img {
                          margin: 2px 0 4px 0;
                      }
              
                      .w-fc-details {
                          font-size: ${fontSizeForecastDetails};
                          color: #94a3b8;
                          border-top: 1px solid rgba(255,255,255,0.05);
                          margin-top: 8px;
                          padding-top: 8px;
                      }
              
                  </style>
              
                  <div class="w-container">
                      <div class="w-header">
                          <div style="text-align: center;">
              
                              <div style="font-size:${fontSizeCurrentLabel}; font-weight:bold;">
                                  ${lang.current} / ${getVal(forecast + '.day0.name_day')}
                              </div>
              
                              <div style="font-size:0.75rem; color:#94a3b8; margin-top:0;">
                                  ${getToday()}
                              </div>
              
                              ${getImg(dpBase + '.current.icon_url', "80px")}
                              <div class="w-desc">${getVal(dpBase + '.current.weather_text')}</div>
                          </div>
              
                          <div>
                              <div class="w-temp-big">${getVal(dpBase + '.current.temperature_2m', " °C")}</div>
              
                              <div style="font-weight:bold; margin-bottom:10px;">
                                  <span style="color:#f87171">${getVal(forecast + '.day0.temperature_2m_max', " °C")}</span> |
                                  <span style="color:#60a5fa">${getVal(forecast + '.day0.temperature_2m_min', " °C")}</span>
                              </div>
              
                              <div class="w-info-grid">
                                  <div class="w-info-item">💧 ${getVal(dpBase + '.current.relative_humidity_2m', "%")}</div>
                                  <div class="w-info-item">🌧️ ${getVal(forecast + '.day0.precipitation_sum', "mm")}</div>
              
                                  <div class="w-info-item">☀️ ${getSunHours(forecast + '.day0.sunshine_duration')}</div>
                                  <div class="w-info-item">☁️ ${getVal(dpBase + '.current.cloud_cover', "%")}</div>
              
                                  <div class="w-info-item">💨 Wind ${getVal(dpBase + '.current.wind_speed_10m', " km/h")}</div>
                                  <div class="w-info-item">🌬️ Böen ${getVal(dpBase + '.current.wind_gusts_10m', " km/h")}</div>
                              </div>
                          </div>
              
                          <div class="w-sun-moon" style="position:relative;">
                              🌅 ${getVal(forecast + '.day0.sunrise')}<br>
                              🌇 ${getVal(forecast + '.day0.sunset')}<br>
              
                              🌙 ${getVal(forecast + '.day0.moonrise')}<br>
                              🌘 ${getVal(forecast + '.day0.moonset')}<br>
              
                              <div style="margin-top:6px;">
                                  ${getImg(forecast + '.day0.moon_phase_icon', "34px")}
                                  <div class="moon-anim" style="font-size:0.75rem; color:#cbd5e1;">
                                      ${getVal(forecast + '.day0.moon_phase_text')}
                                  </div>
                              </div>
              
                              <div style="margin-top:10px;">
                                  💨 Richtung: ${getVal(dpBase + '.current.wind_direction_text')}<br>
                                  ${getImg(dpBase + '.current.wind_direction_icon', "30px")}
                              </div>
              
                              <div style="position:absolute; bottom:-10px; right:0; font-size:0.6rem; color:#475569; opacity:0.8;">
                                  Script Version ${version}
                              </div>
                          </div>
                      </div>
              
                      <div class="w-hourly">
                  `;
              
                  // Stunden – mit Wind + Mond
                  for (let h = 0; h <= 5; h++) {
                      let hPath = forecast + '.hourly.next_hours.hour' + h;
              
                      let isNight = getNum(hPath + '.is_day') === 0;
              
                      html += `
                          <div class="w-h-item">
                              <div class="w-h-time">${getVal(hPath + '.time')}</div>
              
                              ${getImg(hPath + '.icon_url', "30px")}
                              <span class="w-h-temp">${getVal(hPath + '.temperature_2m', " °C")}</span>
              
                              <span class="w-h-rain">
                                  🌧️${getVal(hPath + '.precipitation_probability', "%")} /
                                  ${getVal(hPath + '.precipitation', "mm")}
                              </span>
              
                              <div style="margin-top:4px; font-size:0.7rem; color:#cbd5e1;">
                                  💨 ${getVal(hPath + '.wind_speed_10m', " km/h")}
                                  🌬️ ${getVal(hPath + '.wind_gusts_10m', " km/h")}
                              </div>
              
                              <div style="margin-top:2px;">
                                  ${getImg(hPath + '.wind_direction_icon', "32px")}
                                  <span style="font-size:0.7rem; color:#94a3b8;">
                                      ${getVal(hPath + '.wind_direction_text')}
                                  </span>
                              </div>
              
                              ${
                                  isNight
                                  ? `
                                  <div style="margin-top:4px;">
                                      ${getImg(hPath + '.moon_phase_icon', "24px")}
                                      <div style="font-size:0.65rem; color:#cbd5e1;">
                                          ${getVal(hPath + '.moon_phase_text')}
                                      </div>
                                  </div>
                                  `
                                  : ""
                              }
                          </div>
                      `;
                  }
              
                  html += `
                      </div>
                      <div class="w-forecast">
                  `;
              
                  // 6-Tage-Vorhersage
                  for (let i = 1; i <= 6; i++) {
                      let d = forecast + '.day' + i;
                      html += `
                      <div class="w-fc-day">
                          <div>
                              <div class="w-fc-name">${getVal(d + '.name_day')}</div>
                              <div class="w-fc-text">${getVal(d + '.weather_text')}</div>
                              ${getImg(d + '.icon_url', "50px")}
                              <span class="w-fc-temp-max">${getVal(d + '.temperature_2m_max', " °C")}</span>
                              <span class="w-fc-temp-min">${getVal(d + '.temperature_2m_min', " °C")}</span>
                          </div>
              
                          <div class="w-fc-details">
                              🌧️ ${getVal(d + '.precipitation_sum', "mm")} (${getVal(d + '.precipitation_probability_max', "%")})<br>
                              💧 ${getVal(d + '.relative_humidity_2m_mean', "%")}<br>
              
                              💨 Wind ${getVal(d + '.wind_speed_10m_max', " km/h")}<br>
                              🌬️ Böen ${getVal(d + '.wind_gusts_10m_max', " km/h")}<br>
              
                              ${getVal(d + '.wind_direction_text')}<br>
                              ${getImg(d + '.wind_direction_icon', "32px")}<br>
              
                              ${getImg(d + '.wind_gust_icon', "24px")}<br>
              
                              ☀️ ${getSunHours(d + '.sunshine_duration')}
                          </div>
                      </div>
                      `;
                  }
              
                  html += `</div></div>`;
              
                  setState(targetDP, html, true);
                  console.log("Weather widget: HTML successfully generated (v0.2.6-XYZ-SUN-CLOUD-C-DATE-COMPACT).");
              }
              
              
              // Trigger
              updateWeatherWidget();
              schedule("*/5 * * * *", updateWeatherWidget);
              on({id: dpBase + '.current.temperature_2m', change: 'any'}, updateWeatherWidget);
              on({id: forecast + '.hourly.next_hours.hour0.time', change: 'any'}, updateWeatherWidget);
              
              

              43377c6a-c836-4580-8f67-56ca3bac553b-image.png

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


              Support us

              ioBroker
              Community Adapters
              Donate

              579

              Online

              32.7k

              Benutzer

              82.4k

              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