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. [TypeSkript] Wetter.com Forecast/Vorhersage

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.0k

[TypeSkript] Wetter.com Forecast/Vorhersage

Geplant Angeheftet Gesperrt Verschoben JavaScript
37 Beiträge 6 Kommentatoren 446 Aufrufe 13 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    MartyBr
    schrieb am zuletzt editiert von
    #17

    Sieht gut. Kein Fehler mehr.
    Ich lasse diese Version nun laufen.

    Danke für die prompte Fehlerbehebung.

    Gruß
    Martin


    Intel NUCs mit Proxmox / Iobroker als VM unter Debian
    Raspeberry mit USB Leseköpfen für Smartmeter
    Homematic und Homematic IP

    1 Antwort Letzte Antwort
    1
    • S Offline
      S Offline
      Schimi
      schrieb am zuletzt editiert von
      #18

      so, habe die 24 Std vorhersage eingebaut (und den 3ten API-Key verbraucht ;-))

      es gab auch eine große Änderung!!!!!

      Das Skript ist nun in TypeSkript geschrieben.

      Ihr müsst es als neues Skript importieren und dort "TypeSkript" auswählen

      Für mich wäre es dann jetzt "future-complete" und ich würde nur noch was bei Fehlern ändern und solange selber nutzen :-)

      1 Antwort Letzte Antwort
      0
      • M Offline
        M Offline
        MartyBr
        schrieb am zuletzt editiert von
        #19

        Leider wieder der Fehler mit ICON_BASE_URL:

        javascript.2
        2026-01-14 08:57:47.384	error	script.js.Wetter.Forecast_Wetter_com_1-8-3: TypeScript compilation failed:';; ^ERROR: Unterminated string literal. lang: obj.common.language || DEFAULT_LANGUAGE ^ERROR: Cannot find name 'DEFAULT_LANGUAGE'. resolve({ lat: null, lon: null, lang: DEFAULT_LANGUAGE }); ^ERROR: Cannot find name 'DEFAULT_LANGUAGE'. await setStateAsync(`${dayPath}.weather_icon`, String(`${ICON_BASE_URL}/d_${day.weather?.state}.svg`), true); ^ERROR: Cannot find name 'ICON_BASE_URL'. await setStateChangedAsync(`${hPath}.weather_icon`, String(`${ICON_BASE_URL}/d_${h.weather?.state}.svg`), true); ^ERROR: Cannot find name 'ICON_BASE_URL'.
        
        javascript.2
        2026-01-14 08:57:47.297	info	script.js.Wetter.Forecast_Wetter_com_1-8-3: Compiling TypeScript source
        
        javascript.2
        2026-01-14 08:57:43.337	info	script.js.Wetter.Forecast_Wetter_com_1-8-3: Stopping script
        
        javascript.2
        2026-01-14 08:57:31.016	error	script.js.Wetter.Forecast_Wetter_com_1-8-3: TypeScript compilation failed:';; ^ERROR: Unterminated string literal. lang: obj.common.language || DEFAULT_LANGUAGE ^ERROR: Cannot find name 'DEFAULT_LANGUAGE'. resolve({ lat: null, lon: null, lang: DEFAULT_LANGUAGE }); ^ERROR: Cannot find name 'DEFAULT_LANGUAGE'. await setStateAsync(`${dayPath}.weather_icon`, String(`${ICON_BASE_URL}/d_${day.weather?.state}.svg`), true); ^ERROR: Cannot find name 'ICON_BASE_URL'. await setStateChangedAsync(`${hPath}.weather_icon`, String(`${ICON_BASE_URL}/d_${h.weather?.state}.svg`), true); ^ERROR: Cannot find name 'ICON_BASE_URL'.
        
        javascript.2
        2026-01-14 08:57:30.119	info	script.js.Wetter.Forecast_Wetter_com_1-8-3: Compiling TypeScript source
        

        Gruß
        Martin


        Intel NUCs mit Proxmox / Iobroker als VM unter Debian
        Raspeberry mit USB Leseköpfen für Smartmeter
        Homematic und Homematic IP

        1 Antwort Letzte Antwort
        0
        • S Offline
          S Offline
          Schimi
          schrieb am zuletzt editiert von Schimi
          #20

          @martybr versuche mal das im Spoiler... vielleicht auch mal den Datenpunkt komplett löschen und neu erstellen lassen (in den Objekten)

          Nicht das durch den Wechsel auf TypeSkript da auch was geändert wurde

          /**
          * ioBroker Script: Wetter.com Forecast API v4.0 (TrueScript)
          * API: https://doc.meteonomiqs.com/doc/forecast_v4_0.html
          * * * Changelog:
          * 1.8.4: FIX: Compiler-Fehler & Syntax-Bereinigung.
          * - Konfiguration in 'CONFIG'-Objekt gekapselt, um Scope-Fehler ("Cannot find name") zu beheben.
          * - Bereinigung von Template-Strings (entfernte redundante String()-Wrapper).
          * - Typsichere Implementierung von getObject-Callbacks.
          * 1.8.3: FIX: Namenskonflikte behoben (wcom-Präfix).
          */
          
          // --- KONFIGURATION ---
          const CONFIG = {
             API_KEY: 'DEIN_API_KEY_HIER', // <-- BITTE HIER DEINEN API-KEY EINTRAGEN
             BASE_URL: 'https://forecast.meteonomiqs.com/v4_0',
             ICON_BASE_URL: 'https://cs3.wettercomassets.com/wcomv5/images/icons/weather',
             DP_PATH: '0_userdata.0.wetter_com',
             DEFAULT_LANGUAGE: 'de',
             FORECAST_DAYS: 7, // max. 16 Tage
             ENABLE_HOURLY: true,
             ENABLE_SPACES: true,
             LOCATION: {
                 LAT: '', // Leer lassen für System-Einstellung
                 LON: '', // Leer lassen für System-Einstellung
                 FORCE_MANUAL: false
             }
          };
          
          // --- INTERFACES ---
          
          interface WetterComValue {
             avg?: number;
             value?: number;
             sum?: number;
             max?: number;
             min?: number;
          }
          
          interface WetterComWeather {
             state: number;
             text: string;
             icon?: string;
          }
          
          interface WetterComWind {
             avg?: number | WetterComValue;
             gusts?: number | WetterComValue | { value: number | null };
             direction?: string;
             unit?: string;
          }
          
          interface WetterComPrec {
             probability: number;
             sum: number | WetterComValue;
          }
          
          interface ForecastSummary {
             date: string;
             weather: WetterComWeather;
             temperature: { min: number | WetterComValue; max: number | WetterComValue; avg?: number | WetterComValue };
             wind: WetterComWind;
             prec: WetterComPrec;
             clouds: number | WetterComValue;
             relativeHumidity: number | WetterComValue;
          }
          
          interface ForecastSpaceSegment {
             temperature: number | WetterComValue;
             weather: WetterComWeather;
             prec: WetterComPrec;
             wind: WetterComWind;
             clouds: number | WetterComValue;
             relativeHumidity: number | WetterComValue;
          }
          
          interface ForecastSpace {
             morning?: ForecastSpaceSegment;
             afternoon?: ForecastSpaceSegment;
             evening?: ForecastSpaceSegment;
             night?: ForecastSpaceSegment;
          }
          
          interface ForecastHourly {
             from: string;
             date: string;
             weather: WetterComWeather;
             temperature: number | WetterComValue;
             windchill: number | WetterComValue;
             wind: WetterComWind;
             prec: WetterComPrec;
             relativeHumidity: number | WetterComValue;
          }
          
          interface WetterComResponse {
             summary: ForecastSummary[];
             spaces: ForecastSpace[];
             hourly: ForecastHourly[];
          }
          
          // --- HILFSFUNKTIONEN ---
          
          const wcomWait = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms));
          
          function wcomExtractValue(val: any): number {
             if (val === null || val === undefined) return 0;
             if (typeof val === 'number') return val;
             if (typeof val === 'object') {
                 if (val.avg !== undefined) return val.avg;
                 if (val.value !== undefined) return val.value;
                 if (val.sum !== undefined) return val.sum;
                 if (val.max !== undefined) return val.max;
                 if (val.min !== undefined) return val.min;
                 if (val.gusts && typeof val.gusts === 'object' && val.gusts.value !== undefined) return val.gusts.value;
             }
             return parseFloat(String(val)) || 0;
          }
          
          function wcomFormatDate(dateStr: string): string {
             if (!dateStr) return '';
             const date = new Date(dateStr);
             if (isNaN(date.getTime())) return dateStr;
             return `${String(date.getDate()).padStart(2, '0')}.${String(date.getMonth() + 1).padStart(2, '0')}.${date.getFullYear()}`;
          }
          
          function wcomGetDayName(dateStr: string, locale: string): string {
             if (!dateStr) return '';
             const date = new Date(dateStr);
             if (isNaN(date.getTime())) return '';
             return date.toLocaleDateString(locale, { weekday: 'long' });
          }
          
          async function wcomGetSystemSettings(): Promise<{ lat: string; lon: string; lang: string } | null> {
             let coords: { lat: string; lon: string } | null = null;
             if (CONFIG.LOCATION.FORCE_MANUAL && CONFIG.LOCATION.LAT && CONFIG.LOCATION.LON) {
                  coords = { lat: parseFloat(CONFIG.LOCATION.LAT).toFixed(3), lon: parseFloat(CONFIG.LOCATION.LON).toFixed(3) };
             }
          
             const systemConf: any = await new Promise((resolve) => {
                 getObject('system.config', (err, obj: any) => {
                     if (!err && obj && obj.common) {
                         resolve({
                             lat: obj.common.latitude ? parseFloat(String(obj.common.latitude)).toFixed(3) : null,
                             lon: obj.common.longitude ? parseFloat(String(obj.common.longitude)).toFixed(3) : null,
                             lang: obj.common.language || CONFIG.DEFAULT_LANGUAGE
                         });
                     } else { resolve({ lat: null, lon: null, lang: CONFIG.DEFAULT_LANGUAGE }); }
                 });
             });
          
             if (!coords && systemConf.lat && systemConf.lon) coords = { lat: systemConf.lat, lon: systemConf.lon };
             return coords ? { ...coords, lang: systemConf.lang } : null;
          }
          
          async function wcomEnsureSubStructure(path: string, name: string, type: 'device' | 'channel' = 'channel'): Promise<void> {
             if (!path) return;
             if (!existsObject(path)) {
                 await extendObjectAsync(path, {
                     type: type,
                     common: { name: name },
                     native: {}
                 });
                 await wcomWait(50);
             }
          }
          
          async function wcomEnsureDayStates(path: string, index: number): Promise<void> {
             const states: Record<string, { name: string; type: iobJS.CommonType; role: string; unit?: string; init: any }> = {
                 'date': { name: 'Datum', type: 'string', role: 'text', init: '' },
                 'day_name': { name: 'Wochentag', type: 'string', role: 'text', init: '' },
                 'temp_max': { name: 'Max Temp', type: 'number', unit: '°C', role: 'value.temperature.max', init: 0 },
                 'temp_min': { name: 'Min Temp', type: 'number', unit: '°C', role: 'value.temperature.min', init: 0 },
                 'weather_text': { name: 'Wetter', type: 'string', role: 'weather.state', init: '' },
                 'weather_icon': { name: 'Icon URL', type: 'string', role: 'weather.icon', init: '' },
                 'prec_probability': { name: 'Regenrisiko', type: 'number', unit: '%', role: 'value.precipitation.probability', init: 0 },
                 'prec_sum': { name: 'Regenmenge', type: 'number', unit: 'mm', role: 'value.precipitation', init: 0 },
                 'wind_gusts': { name: 'Windböen', type: 'number', unit: 'km/h', role: 'value.speed.wind.gust', init: 0 },
                 'clouds': { name: 'Bewölkung', type: 'number', unit: '%', role: 'value', init: 0 },
                 'humidity': { name: 'Relative Feuchte', type: 'number', unit: '%', role: 'value.humidity', init: 0 }
             };
          
             for (const [id, cfg] of Object.entries(states)) {
                 await createStateAsync(`${path}.${id}`, cfg.init, false, { 
                     name: `Tag ${index}: ${cfg.name}`, 
                     type: cfg.type,
                     role: cfg.role,
                     unit: cfg.unit || '',
                     read: true, 
                     write: false 
                 });
             }
          }
          
          // --- LOGIK ---
          
          async function wcomFetchWeatherData(): Promise<void> {
             try {
                 const settings = await wcomGetSystemSettings();
                 if (!settings) return;
                 
                 console.log(`[Wetter.com] Abruf für Lat ${settings.lat}, Lon ${settings.lon}`);
          
                 const url: string = `${CONFIG.BASE_URL}/forecast/${settings.lat}/${settings.lon}`;
                 const options = { headers: { 'x-api-key': CONFIG.API_KEY, 'Accept-Language': settings.lang } };
          
                 httpGet(url, options, async (err, response) => {
                     if (response && response.statusCode === 429) {
                         console.error('[Wetter.com] Das Limit von 100 API-Calls im Monat ist ausgeschöpft.');
                         return;
                     }
          
                     if (err || (response && response.statusCode !== 200)) {
                         console.error(`[Wetter.com] API-Fehler: ${err || (response ? response.statusCode : 'Unbekannter Status')}`);
                         return;
                     }
          
                     let data: WetterComResponse;
                     try {
                         data = JSON.parse(response.data);
                     } catch (e) { return; }
          
                     if (data && data.summary) {
                         await wcomProcessForecastData(data, settings.lang);
                         await wcomCleanupObsoleteDays();
                         await wcomUpdateUsageInfo();
                     }
                 });
             } catch (e: any) { console.error(`[Wetter.com] Script-Fehler: ${e.message}`); }
          }
          
          async function wcomProcessForecastData(data: WetterComResponse, lang: string): Promise<void> {
             await wcomEnsureSubStructure(CONFIG.DP_PATH, 'Wetter.com Forecast', 'device');
             await wcomEnsureSubStructure(`${CONFIG.DP_PATH}.info`, 'Informationen');
             await createStateAsync(`${CONFIG.DP_PATH}.info.last_sync`, '', false, { name: 'Letztes Update', type: 'string', role: 'text' } as any);
             await createStateAsync(`${CONFIG.DP_PATH}.info.requests_today`, 0, false, { name: 'Anfragen heute', type: 'number', role: 'value' } as any);
          
             const maxDays: number = Math.min(data.summary.length, CONFIG.FORECAST_DAYS);
          
             for (let i = 0; i < maxDays; i++) {
                 const day: ForecastSummary = data.summary[i];
                 const dayPath: string = `${CONFIG.DP_PATH}.day_${i}`;
                 
                 await wcomEnsureSubStructure(dayPath, `Tag ${i}`);
                 await wcomEnsureDayStates(dayPath, i);
          
                 await setStateAsync(`${dayPath}.date`, String(wcomFormatDate(day.date)), true);
                 await setStateAsync(`${dayPath}.day_name`, String(wcomGetDayName(day.date, lang)), true);
                 await setStateAsync(`${dayPath}.temp_max`, wcomExtractValue(day.temperature?.max), true);
                 await setStateAsync(`${dayPath}.temp_min`, wcomExtractValue(day.temperature?.min), true);
                 await setStateAsync(`${dayPath}.weather_text`, String(day.weather?.text || ''), true);
                 await setStateAsync(`${dayPath}.weather_icon`, `${CONFIG.ICON_BASE_URL}/d_${day.weather?.state}.svg`, true);
                 await setStateAsync(`${dayPath}.prec_probability`, wcomExtractValue(day.prec?.probability), true);
                 await setStateAsync(`${dayPath}.prec_sum`, wcomExtractValue(day.prec?.sum), true);
                 await setStateAsync(`${dayPath}.wind_gusts`, wcomExtractValue(day.wind?.gusts), true);
                 await setStateAsync(`${dayPath}.clouds`, wcomExtractValue(day.clouds), true);
                 await setStateAsync(`${dayPath}.humidity`, wcomExtractValue(day.relativeHumidity), true);
          
                 if (CONFIG.ENABLE_SPACES && data.spaces && data.spaces[i]) {
                     const spacesPath: string = `${dayPath}.spaces`;
                     await wcomEnsureSubStructure(spacesPath, 'Tagesabschnitte');
                     const segments: (keyof ForecastSpace)[] = ['morning', 'afternoon', 'evening', 'night'];
                     
                     for (const seg of segments) {
                         const sData = data.spaces[i][seg];
                         if (!sData) continue;
                         const sPath: string = `${spacesPath}.${seg}`;
                         await wcomEnsureSubStructure(sPath, seg);
                         
                         await createStateAsync(`${sPath}.temp`, 0, false, { name: 'Temperatur', type: 'number', unit: '°C', role: 'value.temperature' } as any);
                         await setStateChangedAsync(`${sPath}.temp`, wcomExtractValue(sData.temperature), true);
                         await createStateAsync(`${sPath}.text`, '', false, { name: 'Wetter', type: 'string', role: 'weather.state' } as any);
                         await setStateChangedAsync(`${sPath}.text`, String(sData.weather?.text || ''), true);
                         await createStateAsync(`${sPath}.prec_prob`, 0, false, { name: 'Regenrisiko', type: 'number', unit: '%', role: 'value.precipitation.probability' } as any);
                         await setStateChangedAsync(`${sPath}.prec_prob`, wcomExtractValue(sData.prec?.probability), true);
                         await createStateAsync(`${sPath}.prec_sum`, 0, false, { name: 'Regenmenge', type: 'number', unit: 'mm', role: 'value.precipitation' } as any);
                         await setStateChangedAsync(`${sPath}.prec_sum`, wcomExtractValue(sData.prec?.sum), true);
                         await createStateAsync(`${sPath}.wind_speed`, 0, false, { name: 'Windgeschwindigkeit', type: 'number', unit: 'km/h', role: 'value.speed.wind' } as any);
                         await setStateChangedAsync(`${sPath}.wind_speed`, wcomExtractValue(sData.wind?.avg), true);
                         await createStateAsync(`${sPath}.wind_gusts`, 0, false, { name: 'Windböen', type: 'number', unit: 'km/h', role: 'value.speed.wind.gust' } as any);
                         await setStateChangedAsync(`${sPath}.wind_gusts`, wcomExtractValue(sData.wind?.gusts), true);
                         await createStateAsync(`${sPath}.clouds`, 0, false, { name: 'Bewölkung', type: 'number', unit: '%', role: 'value' } as any);
                         await setStateChangedAsync(`${sPath}.clouds`, wcomExtractValue(sData.clouds), true);
                         await createStateAsync(`${sPath}.humidity`, 0, false, { name: 'Relative Feuchte', type: 'number', unit: '%', role: 'value.humidity' } as any);
                         await setStateChangedAsync(`${sPath}.humidity`, wcomExtractValue(sData.relativeHumidity), true);
                     }
                 }
          
                 if (CONFIG.ENABLE_HOURLY && i <= 1 && data.hourly) {
                     const dateIso: string = day.date.split('T')[0];
                     const hourlyPath: string = `${dayPath}.hourly`;
                     await wcomEnsureSubStructure(hourlyPath, 'Stündlich');
                     const dayHours = data.hourly.filter((h: ForecastHourly) => (h.from || h.date).startsWith(dateIso));
                     
                     for (const h of dayHours) {
                         const hourDate: Date = new Date(h.from || h.date);
                         const hourLabel: string = String(hourDate.getHours()).padStart(2, '0');
                         const hPath: string = `${hourlyPath}.${hourLabel}`;
                         
                         await wcomEnsureSubStructure(hPath, `${hourLabel}:00 Uhr`);
                         
                         await createStateAsync(`${hPath}.time`, '', false, { name: 'Uhrzeit', type: 'string', role: 'text' } as any);
                         await setStateChangedAsync(`${hPath}.time`, `${hourLabel}:00`, true);
                         await createStateAsync(`${hPath}.temp`, 0, false, { name: 'Temperatur', type: 'number', unit: '°C', role: 'value.temperature' } as any);
                         await setStateChangedAsync(`${hPath}.temp`, wcomExtractValue(h.temperature), true);
                         await createStateAsync(`${hPath}.windchill`, 0, false, { name: 'Gefühlt', type: 'number', unit: '°C', role: 'value.temperature' } as any);
                         await setStateChangedAsync(`${hPath}.windchill`, wcomExtractValue(h.windchill), true);
                         await createStateAsync(`${hPath}.weather_text`, '', false, { name: 'Wetter', type: 'string', role: 'weather.state' } as any);
                         await setStateChangedAsync(`${hPath}.weather_text`, String(h.weather?.text || ''), true);
                         await createStateAsync(`${hPath}.weather_icon`, '', false, { name: 'Wetter Icon', type: 'string', role: 'weather.icon' } as any);
                         await setStateChangedAsync(`${hPath}.weather_icon`, `${CONFIG.ICON_BASE_URL}/d_${h.weather?.state}.svg`, true);
                         await createStateAsync(`${hPath}.prec_prob`, 0, false, { name: 'Regenwahrscheinlichkeit', type: 'number', unit: '%', role: 'value.precipitation.probability' } as any);
                         await setStateChangedAsync(`${hPath}.prec_prob`, wcomExtractValue(h.prec?.probability), true);
                         await createStateAsync(`${hPath}.prec_sum`, 0, false, { name: 'Regenmenge', type: 'number', unit: 'mm', role: 'value.precipitation' } as any);
                         await setStateChangedAsync(`${hPath}.prec_sum`, wcomExtractValue(h.prec?.sum), true);
                         await createStateAsync(`${hPath}.wind_speed`, 0, false, { name: 'Windgeschwindigkeit', type: 'number', unit: 'km/h', role: 'value.speed.wind' } as any);
                         await setStateChangedAsync(`${hPath}.wind_speed`, wcomExtractValue(h.wind?.avg), true);
                         await createStateAsync(`${hPath}.wind_dir`, '', false, { name: 'Windrichtung', type: 'string', role: 'weather.direction' } as any);
                         await setStateChangedAsync(`${hPath}.wind_dir`, String(h.wind?.direction || ''), true);
                         await createStateAsync(`${hPath}.wind_gusts`, 0, false, { name: 'Windböen', type: 'number', unit: 'km/h', role: 'value.speed.wind.gust' } as any);
                         await setStateChangedAsync(`${hPath}.wind_gusts`, wcomExtractValue(h.wind?.gusts), true);
                         await createStateAsync(`${hPath}.humidity`, 0, false, { name: 'Relative Feuchte', type: 'number', unit: '%', role: 'value.humidity' } as any);
                         await setStateChangedAsync(`${hPath}.humidity`, wcomExtractValue(h.relativeHumidity), true);
                     }
                 }
                 await wcomWait(20); 
             }
          }
          
          async function wcomCleanupObsoleteDays(): Promise<void> {
             for (let i = CONFIG.FORECAST_DAYS; i <= 25; i++) {
                 const path: string = `${CONFIG.DP_PATH}.day_${i}`;
                 if (existsObject(path)) {
                     await deleteObjectAsync(path, true);
                     await wcomWait(150);
                 }
             }
          }
          
          async function wcomUpdateUsageInfo(): Promise<void> {
             const now: Date = new Date();
             const timestamp: string = `${String(now.getDate()).padStart(2,'0')}.${String(now.getMonth()+1).padStart(2,'0')}.${now.getFullYear()} ${String(now.getHours()).padStart(2,'0')}:${String(now.getMinutes()).padStart(2,'0')}`;
             await setStateAsync(`${CONFIG.DP_PATH}.info.last_sync`, String(timestamp), true);
             const countState: iobJS.State | null = await getStateAsync(`${CONFIG.DP_PATH}.info.requests_today`);
             await setStateAsync(`${CONFIG.DP_PATH}.info.requests_today`, (countState ? (Number(countState.val) || 0) : 0) + 1, true);
          }
          
          // --- ZEITSTEUERUNG ---
          
          function wcomGetRandomCron(startHour: number, endHour: number, minMinute: number = 0): string {
             const hour: number = Math.floor(Math.random() * (endHour - startHour + 1)) + startHour;
             let minute: number = (hour === startHour) ? Math.floor(Math.random() * (60 - minMinute)) + minMinute : (hour === endHour ? 0 : Math.floor(Math.random() * 60));
             return `${minute} ${hour} * * *`;
          }
          
          schedule("0 0 * * *", () => setState(`${CONFIG.DP_PATH}.info.requests_today`, 0, true));
          schedule(wcomGetRandomCron(0, 5, 2), wcomFetchWeatherData);
          schedule(wcomGetRandomCron(13, 17, 2), wcomFetchWeatherData);
          
          wcomFetchWeatherData();
          

          1 Antwort Letzte Antwort
          0
          • M Offline
            M Offline
            MartyBr
            schrieb am zuletzt editiert von MartyBr
            #21

            Jetzt läuft das Script und die Datenpunkte wurden angelegt.

            Hier das Log:

            javascript.2
            2026-01-14 10:10:38.171	info	script.js.Wetter.Forecast_Wetter_com_1-8-4: [Wetter.com] Abruf für Lat 52.aaaaa, Lon 13.xxxx
            
            javascript.2
            2026-01-14 10:10:38.169	info	script.js.Wetter.Forecast_Wetter_com_1-8-4: registered 0 subscriptions, 3 schedules, 0 messages, 0 logs and 0 file subscriptions
            
            javascript.2
            2026-01-14 10:10:38.154	info	script.js.Wetter.Forecast_Wetter_com_1-8-4: TypeScript compilation successful
            
            javascript.2
            2026-01-14 10:10:37.928	info	script.js.Wetter.Forecast_Wetter_com_1-8-4: Compiling TypeScript source
            
            viessmannapi.0
            2026-01-14 10:10:33.273	info	
            

            Gruß
            Martin


            Intel NUCs mit Proxmox / Iobroker als VM unter Debian
            Raspeberry mit USB Leseköpfen für Smartmeter
            Homematic und Homematic IP

            S 1 Antwort Letzte Antwort
            0
            • M MartyBr

              Jetzt läuft das Script und die Datenpunkte wurden angelegt.

              Hier das Log:

              javascript.2
              2026-01-14 10:10:38.171	info	script.js.Wetter.Forecast_Wetter_com_1-8-4: [Wetter.com] Abruf für Lat 52.aaaaa, Lon 13.xxxx
              
              javascript.2
              2026-01-14 10:10:38.169	info	script.js.Wetter.Forecast_Wetter_com_1-8-4: registered 0 subscriptions, 3 schedules, 0 messages, 0 logs and 0 file subscriptions
              
              javascript.2
              2026-01-14 10:10:38.154	info	script.js.Wetter.Forecast_Wetter_com_1-8-4: TypeScript compilation successful
              
              javascript.2
              2026-01-14 10:10:37.928	info	script.js.Wetter.Forecast_Wetter_com_1-8-4: Compiling TypeScript source
              
              viessmannapi.0
              2026-01-14 10:10:33.273	info	
              
              S Offline
              S Offline
              Schimi
              schrieb am zuletzt editiert von
              #22

              @MartyBr Danke

              mach mal Lat und Lon in deinem Log unkenntlich... sonst sieht jeder wo du wohnst ;-)

              M 1 Antwort Letzte Antwort
              0
              • nik82N Offline
                nik82N Offline
                nik82
                Most Active
                schrieb am zuletzt editiert von
                #23

                Also ich hab jetzt auch das neue TypeScript importiert, schaut soweit perfekt aus und hab keine Fehlermeldung.

                1 Antwort Letzte Antwort
                1
                • S Schimi

                  @MartyBr Danke

                  mach mal Lat und Lon in deinem Log unkenntlich... sonst sieht jeder wo du wohnst ;-)

                  M Offline
                  M Offline
                  MartyBr
                  schrieb am zuletzt editiert von
                  #24

                  @Schimi
                  Danke für den Hinweis. Ist erledigt!

                  Gruß
                  Martin


                  Intel NUCs mit Proxmox / Iobroker als VM unter Debian
                  Raspeberry mit USB Leseköpfen für Smartmeter
                  Homematic und Homematic IP

                  1 Antwort Letzte Antwort
                  1
                  • nik82N Offline
                    nik82N Offline
                    nik82
                    Most Active
                    schrieb am zuletzt editiert von
                    #25

                    Hab mal eine schöne VIS gemacht, falls es irgendwer braucht:

                    image.png

                    Hier die View zum importieren:
                    wettercom_view.txt

                    NashraN 1 Antwort Letzte Antwort
                    3
                    • Pedder007P Offline
                      Pedder007P Offline
                      Pedder007
                      schrieb zuletzt editiert von
                      #26

                      Hi @schimi, TypScript läuft, danke!
                      Hattest Du aber evtl. die prognostizierten Sonnenstunden wieder herausgenommen?
                      Oder steckt der DP nur woanders im Geäst? ;-)

                      Pedder
                      All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
                      Unifi, Motioneye/3Reolinks, PiHole, Bosch CS7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus
                      Under construction: Smart-WoMo auf Raspi4

                      1 Antwort Letzte Antwort
                      0
                      • nik82N Offline
                        nik82N Offline
                        nik82
                        Most Active
                        schrieb zuletzt editiert von nik82
                        #27

                        @schimi
                        @pedder007 hat tatsächlich recht, der auch für mich sehr wichtige Datenpunkt "0_userdata.0.wetter_com.day_0.sun_hours" wird bei mir auch nicht mehr aktualisiert siehe ich gerade.

                        EDIT

                        Jetzt hab ich mal den kompletten Baum erst gelöscht, diese Punkte fehlen mir jetzt mit dem TypeScript:

                        0_userdata.0.wetter_com.day_0.wind_speed_max
                        0_userdata.0.wetter_com.day_0.sun_hours

                        Wäre klasse wenn du das noch rein machen könntest.

                        P.S. und bei Anfragen, war da nicht auch Anfragen pro Monat drin?
                        e874b707-15a2-4d29-a580-195af9e73039-image.png

                        1 Antwort Letzte Antwort
                        0
                        • S Offline
                          S Offline
                          Schimi
                          schrieb zuletzt editiert von
                          #28

                          @pedder007 @nik82 sehr gut beobachtet von euch (war nur ein Test ;-))

                          Habe es wieder eingefügt und etwas erweitert.... (Ist im Spoiler ganz oben

                          Erstmal die schlechte Nachricht: Durch die Umstellung auf TypeSkript, hat er neu angefangen zu Zählen... also nicht zu oft das Skript neu starten :-)

                          Jetzt die "guten" (?):

                          Das Skript resettet an jedem 01 des Monats den Monatlichen Zähler.
                          Bei jedem Nachmittags Abruf, prüft es ob die 100 Abfragen bis zum Monatsende noch reichen, falls NEIN, dann ruft es nur noch einmal ab.

                          Bei 100 abrufen sollte es ja immer passen (zwei pro Tag + Reserve bei Skriptneustart)

                          1 Antwort Letzte Antwort
                          2
                          • nik82N Offline
                            nik82N Offline
                            nik82
                            Most Active
                            schrieb zuletzt editiert von
                            #29

                            Du bist der beste :-)
                            Vielen, vielen Dank...

                            1 Antwort Letzte Antwort
                            0
                            • Pedder007P Offline
                              Pedder007P Offline
                              Pedder007
                              schrieb zuletzt editiert von
                              #30

                              @schimi perfekt!!! Danke auch von meiner Seite!
                              ... mir war es aufgefallen, weil ich mir selber schon so eine kleine 'Sonnenstundenermittlung' in Blockly gebaut hatte und aktuelle beide parallel anzeigen lasse. Bisher stimmt das auch immer ziemlich gut überein ;-)
                              Allerdings wäre ich nicht in der Lage, das Ganze so schön in ein Script zu verpacken. Ich habe selber nie professionell coden gelernt. Bin eher so der Allrounder in der IT :-)

                              Pedder
                              All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
                              Unifi, Motioneye/3Reolinks, PiHole, Bosch CS7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus
                              Under construction: Smart-WoMo auf Raspi4

                              1 Antwort Letzte Antwort
                              0
                              • S Offline
                                S Offline
                                Schimi
                                schrieb zuletzt editiert von Schimi
                                #31

                                @pedder007 ich auch nicht... habe in meiner Jugend mal bisschen QBASIC (sehr jung) und danach etwas Delphi gemacht...

                                Ich arbeite hier komplett mit Gemini (Google KI)... früher stand das auch ganz oben im Skript (habe ich extra gemacht), scheint Gemini selbst "wegoptimiert" zu haben :-)

                                edit
                                theoretisch kann jeder das Skript in eine KI kopieren und verändern, eine der vorgaben ist das viele Kommentare drin sind, damit jede KI es interpretieren und nachvollziehen kann.

                                1 Antwort Letzte Antwort
                                1
                                • Pedder007P Offline
                                  Pedder007P Offline
                                  Pedder007
                                  schrieb zuletzt editiert von Pedder007
                                  #32

                                  Nicht schlecht, hätte nicht gedacht das man da so schöne Sachen mit KI zaubern kann!
                                  Aber ich hab' schon genug Hobbies, ich fange jetzt nicht auch noch mit KI-Coding an ;-)

                                  Bin gerade dabei das WoMo Smart zu machen. Das ist auch nochmal ne' Welt für sich. Quasi alles nur geschlossene properitäre Technik. Im Grunde muss man alles an Sensorik doppeln damit man's irgendwie verwendbar machen kann. Eigentlich wollte ich nur ne' Alarmanlage einbauen, aber wenn man dann einmal anfängt ... :-)

                                  Pedder
                                  All @Proxmox/Bookworm auf HP Elitedesk 800 G4; Zigbee: ZigStar (LAN), ~110Devices
                                  Unifi, Motioneye/3Reolinks, PiHole, Bosch CS7800i via BBQKees/EMS-ESP, Fronius/BYD 11kWp via Modbus
                                  Under construction: Smart-WoMo auf Raspi4

                                  1 Antwort Letzte Antwort
                                  0
                                  • nik82N nik82

                                    Hab mal eine schöne VIS gemacht, falls es irgendwer braucht:

                                    image.png

                                    Hier die View zum importieren:
                                    wettercom_view.txt

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

                                    @nik82 sagte in [TypeSkript] Wetter.com Forecast/Vorhersage:

                                    Hab mal eine schöne VIS gemacht, falls es irgendwer braucht:

                                    image.png

                                    Hier die View zum importieren:
                                    wettercom_view.txt

                                    Würdest Du bitte noch die Icons hier hochladen, danke.

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

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

                                    S 1 Antwort Letzte Antwort
                                    0
                                    • NashraN Nashra

                                      @nik82 sagte in [TypeSkript] Wetter.com Forecast/Vorhersage:

                                      Hab mal eine schöne VIS gemacht, falls es irgendwer braucht:

                                      image.png

                                      Hier die View zum importieren:
                                      wettercom_view.txt

                                      Würdest Du bitte noch die Icons hier hochladen, danke.

                                      S Offline
                                      S Offline
                                      Schimi
                                      schrieb zuletzt editiert von
                                      #34

                                      @Nashra

                                      die findest du hier, bzw die URL wird im Datenpunkt ausgegeben...
                                      https://doc.meteonomiqs.com/doc/forecast_v4_0.html#section/References

                                      1 Antwort Letzte Antwort
                                      1
                                      • nik82N Offline
                                        nik82N Offline
                                        nik82
                                        Most Active
                                        schrieb zuletzt editiert von
                                        #35

                                        @nashra
                                        Du brauchst kein icon set, das holt er sich direkt über url über den wetter.com server

                                        NashraN 1 Antwort Letzte Antwort
                                        0
                                        • nik82N nik82

                                          @nashra
                                          Du brauchst kein icon set, das holt er sich direkt über url über den wetter.com server

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

                                          @nik82 sagte in [TypeSkript] Wetter.com Forecast/Vorhersage:

                                          @nashra
                                          Du brauchst kein icon set, das holt er sich direkt über url über den wetter.com server

                                          Ich meinte die restlichen Icons deiner VIS z.B. die aus /vis.0/main/img/Windwarnung.png usw.

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

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

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          285

                                          Online

                                          32.6k

                                          Benutzer

                                          82.0k

                                          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