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

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

Script für open meteo weather

Geplant Angeheftet Gesperrt Verschoben JavaScript
6 Beiträge 4 Kommentatoren 66 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.3.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 Online
      M Online
      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 - es gibt fast nichts, was nicht auch für andere interessant ist.

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

          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
              2
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              672

              Online

              32.6k

              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