iobroker.assistant 0.1.2 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -2
- package/admin/custom/.vite/manifest.json +38 -61
- package/admin/custom/assets/Components-xWdtqvTH.js +1 -0
- package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAssistant__mf_owner__1-dybYZgsu.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BnSUsPHa.js +1 -0
- package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-BEFjTs9S.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-DlSVT49A.js} +1 -1
- package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-C4r3udVz.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-Cfsgderv.js} +78 -78
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-ByJf4zv_.js +1494 -0
- package/admin/custom/assets/hostInit-CZawMH9B.js +1 -0
- package/admin/custom/assets/{index-B8wW0kQx.js → index-JB7g1jgx.js} +1 -1
- package/admin/custom/assets/{lib-DpE8sc4h.js → lib-bB-LHRhZ.js} +1 -1
- package/admin/custom/assets/{mf-entry-bootstrap-0-e7fa582d.js → mf-entry-bootstrap-0-87f15505.js} +7 -2
- package/admin/custom/assets/virtualExposes-brKKZvi0.js +1 -0
- package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAssistant__customComponents_js-CRhwj12f.js +1 -0
- package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomAssistant__customComponents_js-C5XHUc1J.js +2 -0
- package/admin/custom/customComponents.js +12 -1
- package/admin/custom/i18n/de.json +23 -23
- package/admin/custom/i18n/en.json +23 -23
- package/admin/custom/i18n/es.json +24 -0
- package/admin/custom/i18n/fr.json +24 -0
- package/admin/custom/i18n/it.json +24 -0
- package/admin/custom/i18n/nl.json +24 -0
- package/admin/custom/i18n/pl.json +24 -0
- package/admin/custom/i18n/pt.json +24 -0
- package/admin/custom/i18n/ru.json +24 -0
- package/admin/custom/i18n/uk.json +24 -0
- package/admin/custom/i18n/zh-cn.json +24 -0
- package/admin/custom/index.html +2 -2
- package/admin/custom/mf-manifest.json +1 -1
- package/admin/custom/mf-stats.json +1 -1
- package/admin/i18n/de.json +21 -21
- package/admin/i18n/en.json +21 -21
- package/admin/i18n/es.json +24 -0
- package/admin/i18n/fr.json +24 -0
- package/admin/i18n/it.json +24 -0
- package/admin/i18n/nl.json +24 -0
- package/admin/i18n/pl.json +24 -0
- package/admin/i18n/pt.json +24 -0
- package/admin/i18n/ru.json +24 -0
- package/admin/i18n/uk.json +24 -0
- package/admin/i18n/zh-cn.json +24 -0
- package/build/lib/credentials.js +38 -8
- package/build/lib/credentials.js.map +1 -1
- package/build/lib/nlu.js +173 -27
- package/build/lib/nlu.js.map +1 -1
- package/build/lib/weather.js +132 -0
- package/build/lib/weather.js.map +1 -1
- package/build/main.js +129 -25
- package/build/main.js.map +1 -1
- package/io-package.json +28 -3
- package/package.json +6 -6
- package/admin/custom/assets/Components-DcnuVFM6.js +0 -1
- package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAssistant__mf_owner__1-DogEjv3U.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-Dw5TkU1t.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DlOBHPL0.js +0 -1494
- package/admin/custom/assets/hostInit-DKMI-sLp.js +0 -1
- package/admin/custom/assets/virtualExposes-DOTO22UK.js +0 -1
- package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAssistant__customComponents_js-CQa59yVi.js +0 -1
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__ConfigCustomAssistant__customComponents_js-9g2Fj8tk.js +0 -2
- package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomAssistant__customComponents_js-BTUQTbYo.js +0 -2
- package/admin/custom/customComponents.ssr.js +0 -1
package/build/lib/weather.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weather.js","sourceRoot":"","sources":["../../src/lib/weather.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Weather understanding — reads a user-selected ioBroker weather adapter's states and normalizes their\n * (wildly different) state trees into one compact {@link WeatherReport} the LLM can answer from.\n *\n * Each weather adapter names its states differently, so there is one small mapper per adapter \"kind\"\n * (verified against the adapters' source):\n * - `openmeteo` → `open-meteo-weather` (H5N1v2): `<root>.weather.current.*`, `<root>.weather.forecast.dayN.*`\n * - `wunderground` → `weatherunderground`: `<root>.forecast.current.*`, `<root>.forecast.Nd.*`\n * - `openweathermap` → `openweathermap`: `<root>.forecast.current.*`, `<root>.forecast.dayN.*`\n * Adapters without a mapper fall back to a raw state dump (handled by the caller), so the dropdown can still\n * offer them and the LLM can attempt an answer.\n */\n\n/** How to read a given weather adapter's state tree. */\nexport type WeatherKind =\n 'openmeteo' | 'wunderground' | 'openweathermap' | 'brightsky' | 'pirate' | 'accuweather' | 'daswetter' | 'yr';\n\n/**\n * Registry of weather adapters offered in the settings dropdown. `kind` present = fully normalized.\n * `perLocationProbe` (a state path that exists once per location) marks adapters that namespace their data\n * under a per-location device, so the dropdown lists each location separately (its first path segment is\n * used to split the location out of the state id).\n */\nexport const WEATHER_ADAPTERS: Record<string, { label: string; kind?: WeatherKind; perLocationProbe?: string }> = {\n 'open-meteo-weather': {\n label: 'Open-Meteo',\n kind: 'openmeteo',\n perLocationProbe: 'weather.current.temperature_2m',\n },\n weatherunderground: { label: 'Weather Underground', kind: 'wunderground' },\n openweathermap: { label: 'OpenWeatherMap', kind: 'openweathermap' },\n brightsky: { label: 'Bright Sky (DWD, free)', kind: 'brightsky' },\n 'pirate-weather': { label: 'Pirate Weather', kind: 'pirate' },\n accuweather: { label: 'AccuWeather', kind: 'accuweather' },\n daswetter: {\n label: 'DasWetter (Meteored)',\n kind: 'daswetter',\n perLocationProbe: 'ForecastDaily.Day_1.Temperature_Max',\n },\n yr: { label: 'Yr / met.no', kind: 'yr' },\n dwd: { label: 'DWD (warnings only)' },\n};\n\n/** Current conditions, normalized. All fields optional (an adapter may not provide them). */\nexport interface WeatherCurrent {\n temperature?: number;\n feelsLike?: number;\n humidity?: number;\n condition?: string;\n windSpeed?: number;\n windDir?: string | number;\n pressure?: number;\n precipitation?: number;\n cloudCover?: number;\n uvIndex?: number;\n}\n\n/** One forecast day, normalized. */\nexport interface WeatherDay {\n day: number;\n date?: string;\n tempMax?: number;\n tempMin?: number;\n condition?: string;\n precipProbability?: number;\n precipitation?: number;\n windSpeed?: number;\n windDir?: string | number;\n}\n\nexport interface WeatherReport {\n /** Adapter name the data came from. */\n source: string;\n /** Location name, if the root path carries one (Open-Meteo). */\n location?: string;\n /** Unit labels for the numeric values (the weather adapter's default units). */\n units: { temp: string; wind: string; precip: string };\n current?: WeatherCurrent;\n forecast: WeatherDay[];\n}\n\n/** A flat map of state id → value (as returned by getForeignStates, `.val` already unwrapped by the caller). */\nexport type StateValues = Record<string, unknown>;\n\n/** WMO weather-code → short English text, used when an adapter gives only a numeric code. */\nconst WMO_TEXT: Record<number, string> = {\n 0: 'clear sky',\n 1: 'mainly clear',\n 2: 'partly cloudy',\n 3: 'overcast',\n 45: 'fog',\n 48: 'depositing rime fog',\n 51: 'light drizzle',\n 53: 'drizzle',\n 55: 'dense drizzle',\n 56: 'freezing drizzle',\n 57: 'dense freezing drizzle',\n 61: 'slight rain',\n 63: 'rain',\n 65: 'heavy rain',\n 66: 'freezing rain',\n 67: 'heavy freezing rain',\n 71: 'slight snow',\n 73: 'snow',\n 75: 'heavy snow',\n 77: 'snow grains',\n 80: 'slight rain showers',\n 81: 'rain showers',\n 82: 'violent rain showers',\n 85: 'snow showers',\n 86: 'heavy snow showers',\n 95: 'thunderstorm',\n 96: 'thunderstorm with slight hail',\n 99: 'thunderstorm with heavy hail',\n};\n\n/** Human text for a WMO code (or '' if unknown). */\nexport function wmoText(code: unknown): string {\n const n = typeof code === 'number' ? code : parseInt(String(code), 10);\n return Number.isFinite(n) ? WMO_TEXT[n] || '' : '';\n}\n\nfunction num(states: StateValues, id: string): number | undefined {\n const v = states[id];\n if (v === undefined || v === null || v === '') {\n return undefined;\n }\n const n = typeof v === 'number' ? v : parseFloat(v == null ? '0' : (v as string).toString());\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction str(states: StateValues, id: string): string | undefined {\n const v = states[id];\n if (v == null || v === '') {\n return undefined;\n }\n return (v as string).toString();\n}\n\n/** First defined number among several candidate ids (for adapters with windowed/variant fields). */\nfunction firstNum(states: StateValues, ids: string[]): number | undefined {\n for (const id of ids) {\n const n = num(states, id);\n if (n !== undefined) {\n return n;\n }\n }\n return undefined;\n}\n\n/** First defined string among several candidate ids. */\nfunction firstStr(states: StateValues, ids: string[]): string | undefined {\n for (const id of ids) {\n const s = str(states, id);\n if (s !== undefined) {\n return s;\n }\n }\n return undefined;\n}\n\n/** Number of forecast days present under `dayId(i)` (probe until a day has no max-temp). */\nfunction countDays(states: StateValues, maxId: (i: number) => string, cap = 8): number {\n let n = 0;\n for (let i = 0; i < cap; i++) {\n if (num(states, maxId(i)) === undefined && str(states, maxId(i)) === undefined) {\n break;\n }\n n++;\n }\n return n;\n}\n\nfunction mapOpenMeteo(root: string, states: StateValues): WeatherReport {\n const c = `${root}.weather.current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temperature_2m`),\n feelsLike: num(states, `${c}.apparent_temperature`),\n humidity: num(states, `${c}.relative_humidity_2m`),\n condition: str(states, `${c}.weather_text`) || wmoText(states[`${c}.weather_code`]),\n windSpeed: num(states, `${c}.wind_speed_10m`),\n windDir: str(states, `${c}.wind_direction_text`) ?? num(states, `${c}.wind_direction_10m`),\n pressure: num(states, `${c}.pressure_msl`),\n precipitation: num(states, `${c}.precipitation`),\n cloudCover: num(states, `${c}.cloud_cover`),\n };\n const dayBase = (i: number): string => `${root}.weather.forecast.day${i}`;\n const days = countDays(states, i => `${dayBase(i)}.temperature_2m_max`);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: str(states, `${d}.name_day`) || str(states, `${d}.time`),\n tempMax: num(states, `${d}.temperature_2m_max`),\n tempMin: num(states, `${d}.temperature_2m_min`),\n condition: str(states, `${d}.weather_text`) || wmoText(states[`${d}.weather_code`]),\n precipProbability: num(states, `${d}.precipitation_probability_max`),\n precipitation: num(states, `${d}.precipitation_sum`),\n windSpeed: num(states, `${d}.wind_speed_10m_max`),\n windDir: num(states, `${d}.wind_direction_10m_dominant`),\n });\n }\n // Location = the segment between the instance (adapter.N) and the fixed \".weather\" suffix.\n const m = root.match(/^[^.]+\\.\\d+\\.(.+)$/);\n return {\n source: 'open-meteo-weather',\n location: m ? m[1].replace(/_/g, ' ') : undefined,\n units: { temp: '°C', wind: 'km/h', precip: 'mm' },\n current,\n forecast,\n };\n}\n\nfunction mapWunderground(root: string, states: StateValues): WeatherReport {\n const c = `${root}.forecast.current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temp`),\n feelsLike: num(states, `${c}.feelsLike`),\n humidity: num(states, `${c}.relativeHumidity`),\n condition: str(states, `${c}.weather`),\n windSpeed: num(states, `${c}.wind`),\n windDir: str(states, `${c}.windDirection`) ?? num(states, `${c}.windDegrees`),\n pressure: num(states, `${c}.pressure`),\n precipitation: num(states, `${c}.precipitationHour`),\n };\n const dayBase = (i: number): string => `${root}.forecast.${i}d`;\n const days = countDays(states, i => `${dayBase(i)}.tempMax`);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: str(states, `${d}.date`),\n tempMax: num(states, `${d}.tempMax`),\n tempMin: num(states, `${d}.tempMin`),\n condition: str(states, `${d}.state`),\n precipProbability: num(states, `${d}.precipitationChance`),\n precipitation: num(states, `${d}.precipitationAllDay`),\n windSpeed: num(states, `${d}.windSpeed`),\n windDir: str(states, `${d}.windDirection`),\n });\n }\n return { source: 'weatherunderground', units: { temp: '°C', wind: 'km/h', precip: 'mm' }, current, forecast };\n}\n\nfunction mapOpenWeatherMap(root: string, states: StateValues): WeatherReport {\n const c = `${root}.forecast.current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temperature`),\n feelsLike: num(states, `${c}.feelsLike`),\n humidity: num(states, `${c}.humidity`),\n condition: str(states, `${c}.state`) || str(states, `${c}.title`),\n windSpeed: num(states, `${c}.windSpeed`),\n windDir: str(states, `${c}.windDirectionText`) ?? num(states, `${c}.windDirection`),\n pressure: num(states, `${c}.pressure`),\n precipitation: num(states, `${c}.precipitationRain`),\n };\n const dayBase = (i: number): string => `${root}.forecast.day${i}`;\n const days = countDays(states, i => `${dayBase(i)}.temperatureMax`);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: str(states, `${d}.date`),\n tempMax: num(states, `${d}.temperatureMax`),\n tempMin: num(states, `${d}.temperatureMin`),\n condition: str(states, `${d}.state`) || str(states, `${d}.title`),\n precipitation: num(states, `${d}.precipitationRain`),\n windSpeed: num(states, `${d}.windSpeed`),\n windDir: str(states, `${d}.windDirectionText`),\n });\n }\n // OpenWeatherMap reports wind in m/s.\n return { source: 'openweathermap', units: { temp: '°C', wind: 'm/s', precip: 'mm' }, current, forecast };\n}\n\nfunction mapBrightsky(root: string, states: StateValues): WeatherReport {\n const c = `${root}.weather.current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temperature`),\n feelsLike: num(states, `${c}.apparent_temperature`),\n humidity: num(states, `${c}.relative_humidity`),\n condition: firstStr(states, [`${c}.conditionUI`, `${c}.condition`]),\n windSpeed: firstNum(states, [`${c}.wind_speed_60`, `${c}.wind_speed_10`, `${c}.wind_speed_30`]),\n windDir:\n firstStr(states, [`${c}.wind_bearing_text`]) ??\n firstNum(states, [`${c}.wind_direction_60`, `${c}.wind_direction_10`]),\n pressure: num(states, `${c}.pressure_msl`),\n precipitation: firstNum(states, [`${c}.precipitation_60`, `${c}.precipitation_10`]),\n cloudCover: num(states, `${c}.cloud_cover`),\n };\n const dayBase = (i: number): string => `${root}.weather.daily.${i}`;\n const days = countDays(states, i => `${dayBase(i)}.temperature_max`);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: firstStr(states, [`${d}.dayName_long`, `${d}.dayName_short`]),\n tempMax: num(states, `${d}.temperature_max`),\n tempMin: num(states, `${d}.temperature_min`),\n condition: str(states, `${d}.condition`),\n precipProbability: num(states, `${d}.precipitation_probability_median`),\n precipitation: num(states, `${d}.precipitation`),\n windSpeed: firstNum(states, [`${d}.wind_speed_max`, `${d}.wind_speed_median`]),\n windDir: num(states, `${d}.wind_direction_median`),\n });\n }\n return { source: 'brightsky', units: { temp: '°C', wind: 'km/h', precip: 'mm' }, current, forecast };\n}\n\nfunction mapPirate(root: string, states: StateValues): WeatherReport {\n const c = `${root}.weather.currently`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temperature`),\n feelsLike: num(states, `${c}.apparentTemperature`),\n humidity: num(states, `${c}.humidity`),\n condition: str(states, `${c}.summary`),\n windSpeed: num(states, `${c}.windSpeed`),\n windDir: str(states, `${c}.windBearingText`) ?? num(states, `${c}.windBearing`),\n pressure: num(states, `${c}.pressure`),\n precipitation: num(states, `${c}.precipIntensity`),\n cloudCover: num(states, `${c}.cloudCover`),\n };\n const dayBase = (i: number): string => `${root}.weather.daily.${i}`;\n const days = countDays(states, i => `${dayBase(i)}.temperatureHigh`);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: str(states, `${d}.time`),\n tempMax: num(states, `${d}.temperatureHigh`),\n tempMin: num(states, `${d}.temperatureLow`),\n condition: str(states, `${d}.summary`),\n precipProbability: num(states, `${d}.precipProbability`),\n precipitation: firstNum(states, [`${d}.precipAccumulation`, `${d}.precipIntensity`]),\n windSpeed: num(states, `${d}.windSpeed`),\n windDir: str(states, `${d}.windBearingText`) ?? num(states, `${d}.windBearing`),\n });\n }\n // Pirate Weather defaults to SI units (wind m/s).\n return { source: 'pirate-weather', units: { temp: '°C', wind: 'm/s', precip: 'mm' }, current, forecast };\n}\n\nfunction mapAccuweather(root: string, states: StateValues): WeatherReport {\n const c = `${root}.Current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.Temperature`),\n feelsLike: num(states, `${c}.RealFeelTemperature`),\n humidity: num(states, `${c}.RelativeHumidity`),\n condition: str(states, `${c}.WeatherText`),\n windSpeed: num(states, `${c}.WindSpeed`),\n windDir: str(states, `${c}.WindDirectionText`) ?? num(states, `${c}.WindDirection`),\n pressure: num(states, `${c}.Pressure`),\n cloudCover: num(states, `${c}.CloudCover`),\n uvIndex: num(states, `${c}.UVIndex`),\n };\n // AccuWeather days are the fixed folders Day1..Day5 (i logical → Day${i+1}).\n const dayBase = (i: number): string => `${root}.Daily.Day${i + 1}`;\n const days = countDays(states, i => `${dayBase(i)}.Temperature.Maximum`, 6);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: str(states, `${d}.Date`),\n tempMax: num(states, `${d}.Temperature.Maximum`),\n tempMin: num(states, `${d}.Temperature.Minimum`),\n condition: firstStr(states, [`${d}.Day.IconPhrase`, `${d}.Day.ShortPhrase`]),\n precipProbability: num(states, `${d}.Day.PrecipitationProbability`),\n windSpeed: num(states, `${d}.Day.WindSpeed`),\n windDir: str(states, `${d}.Day.WindDirection`),\n });\n }\n // Metric config is the default (°C, km/h).\n return { source: 'accuweather', units: { temp: '°C', wind: 'km/h', precip: 'mm' }, current, forecast };\n}\n\nfunction mapDasWetter(root: string, states: StateValues): WeatherReport {\n // Current is a copy of an hourly record (only present when CopyCurrentHour is enabled).\n const c = `${root}.ForecastHourly.Current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temperature`),\n feelsLike: num(states, `${c}.temperature_feels_like`),\n humidity: num(states, `${c}.humidity`),\n condition: str(states, `${c}.symbol_description`),\n windSpeed: num(states, `${c}.wind_speed`),\n windDir: str(states, `${c}.wind_direction`),\n pressure: num(states, `${c}.pressure`),\n precipitation: num(states, `${c}.rain`),\n cloudCover: num(states, `${c}.clouds`),\n };\n // Daily folders are Day_1..Day_5 (i logical → Day_${i+1}).\n const dayBase = (i: number): string => `${root}.ForecastDaily.Day_${i + 1}`;\n const days = countDays(states, i => `${dayBase(i)}.Temperature_Max`, 6);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: firstStr(states, [`${d}.NameOfDay`, `${d}.date`]),\n tempMax: num(states, `${d}.Temperature_Max`),\n tempMin: num(states, `${d}.Temperature_Min`),\n condition: str(states, `${d}.symbol_description`),\n precipProbability: num(states, `${d}.Rain_Probability`),\n precipitation: num(states, `${d}.Rain`),\n windSpeed: num(states, `${d}.Wind_Speed`),\n windDir: str(states, `${d}.Wind_Direction`),\n });\n }\n return { source: 'daswetter', units: { temp: '°C', wind: 'km/h', precip: 'mm' }, current, forecast };\n}\n\nfunction mapYr(root: string, states: StateValues): WeatherReport {\n // met.no is hourly-only; the nearest hour (`forecastHourly.0h`) is the closest thing to \"current\".\n const c = `${root}.forecastHourly.0h`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.air_temperature`),\n humidity: num(states, `${c}.relative_humidity`),\n condition: firstStr(states, [`${c}.1h_summary_text`, `${c}.6h_summary_text`]),\n windSpeed: num(states, `${c}.wind_speed`),\n windDir: num(states, `${c}.wind_from_direction`),\n pressure: num(states, `${c}.air_pressure_at_sea_level`),\n precipitation: num(states, `${c}.1h_precipitation_amount`),\n cloudCover: num(states, `${c}.cloud_area_fraction`),\n };\n // No daily/multi-day branch in the yr adapter → forecast stays empty.\n return { source: 'yr', units: { temp: '°C', wind: 'm/s', precip: 'mm' }, current, forecast: [] };\n}\n\n/**\n * Build a normalized {@link WeatherReport} from a weather adapter's flat state map. `adapter` is the adapter\n * name (segment 0 of the instance id); `root` is the state prefix the data lives under (for Open-Meteo this\n * includes the location device, e.g. `open-meteo-weather.0.Berlin`). Returns null for adapters without a\n * mapper (the caller then falls back to a raw dump) or when no data is present.\n */\nexport function buildWeatherReport(adapter: string, root: string, states: StateValues): WeatherReport | null {\n const kind = WEATHER_ADAPTERS[adapter]?.kind;\n if (!kind) {\n return null;\n }\n const mappers: Record<WeatherKind, (root: string, states: StateValues) => WeatherReport> = {\n openmeteo: mapOpenMeteo,\n wunderground: mapWunderground,\n openweathermap: mapOpenWeatherMap,\n brightsky: mapBrightsky,\n pirate: mapPirate,\n accuweather: mapAccuweather,\n daswetter: mapDasWetter,\n yr: mapYr,\n };\n const report = mappers[kind](root, states);\n // Drop empty/undefined fields from `current` so the report is compact (and a data-less selection\n // collapses to no current at all, rather than a stray empty condition string).\n if (report.current) {\n report.current = Object.fromEntries(\n Object.entries(report.current).filter(([, v]) => v !== undefined && v !== ''),\n );\n if (!Object.keys(report.current).length) {\n report.current = undefined;\n }\n }\n if (!report.current && !report.forecast.length) {\n return null; // adapter selected but no data yet\n }\n return report;\n}\n\n/** Keep only the forecast days a question needs: 'current'/'today' → day 0, 'tomorrow' → day 1, 'week' → all. */\nexport function trimReport(report: WeatherReport, when?: string): WeatherReport {\n const w = (when || '').toLowerCase();\n if (w === 'tomorrow') {\n return { ...report, forecast: report.forecast.filter(d => d.day === 1) };\n }\n if (w === 'today' || w === 'current' || w === 'now') {\n return { ...report, forecast: report.forecast.filter(d => d.day === 0) };\n }\n return report; // 'week' / unspecified → everything\n}\n"]}
|
|
1
|
+
{"version":3,"file":"weather.js","sourceRoot":"","sources":["../../src/lib/weather.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Weather understanding — reads a user-selected ioBroker weather adapter's states and normalizes their\n * (wildly different) state trees into one compact {@link WeatherReport} the LLM can answer from.\n *\n * Each weather adapter names its states differently, so there is one small mapper per adapter \"kind\"\n * (verified against the adapters' source):\n * - `openmeteo` → `open-meteo-weather` (H5N1v2): `<root>.weather.current.*`, `<root>.weather.forecast.dayN.*`\n * - `wunderground` → `weatherunderground`: `<root>.forecast.current.*`, `<root>.forecast.Nd.*`\n * - `openweathermap` → `openweathermap`: `<root>.forecast.current.*`, `<root>.forecast.dayN.*`\n * Adapters without a mapper fall back to a raw state dump (handled by the caller), so the dropdown can still\n * offer them and the LLM can attempt an answer.\n */\n\n/** How to read a given weather adapter's state tree. */\nexport type WeatherKind =\n 'openmeteo' | 'wunderground' | 'openweathermap' | 'brightsky' | 'pirate' | 'accuweather' | 'daswetter' | 'yr';\n\n/**\n * Registry of weather adapters offered in the settings dropdown. `kind` present = fully normalized.\n * `perLocationProbe` (a state path that exists once per location) marks adapters that namespace their data\n * under a per-location device, so the dropdown lists each location separately (its first path segment is\n * used to split the location out of the state id).\n */\nexport const WEATHER_ADAPTERS: Record<string, { label: string; kind?: WeatherKind; perLocationProbe?: string }> = {\n 'open-meteo-weather': {\n label: 'Open-Meteo',\n kind: 'openmeteo',\n perLocationProbe: 'weather.current.temperature_2m',\n },\n weatherunderground: { label: 'Weather Underground', kind: 'wunderground' },\n openweathermap: { label: 'OpenWeatherMap', kind: 'openweathermap' },\n brightsky: { label: 'Bright Sky (DWD, free)', kind: 'brightsky' },\n 'pirate-weather': { label: 'Pirate Weather', kind: 'pirate' },\n accuweather: { label: 'AccuWeather', kind: 'accuweather' },\n daswetter: {\n label: 'DasWetter (Meteored)',\n kind: 'daswetter',\n perLocationProbe: 'ForecastDaily.Day_1.Temperature_Max',\n },\n yr: { label: 'Yr / met.no', kind: 'yr' },\n dwd: { label: 'DWD (warnings only)' },\n};\n\n/** Current conditions, normalized. All fields optional (an adapter may not provide them). */\nexport interface WeatherCurrent {\n temperature?: number;\n feelsLike?: number;\n humidity?: number;\n condition?: string;\n windSpeed?: number;\n windDir?: string | number;\n pressure?: number;\n precipitation?: number;\n cloudCover?: number;\n uvIndex?: number;\n}\n\n/** One forecast day, normalized. */\nexport interface WeatherDay {\n day: number;\n date?: string;\n tempMax?: number;\n tempMin?: number;\n condition?: string;\n precipProbability?: number;\n precipitation?: number;\n windSpeed?: number;\n windDir?: string | number;\n}\n\nexport interface WeatherReport {\n /** Adapter name the data came from. */\n source: string;\n /** Location name, if the root path carries one (Open-Meteo). */\n location?: string;\n /** Unit labels for the numeric values (the weather adapter's default units). */\n units: { temp: string; wind: string; precip: string };\n current?: WeatherCurrent;\n forecast: WeatherDay[];\n}\n\n/** A flat map of state id → value (as returned by getForeignStates, `.val` already unwrapped by the caller). */\nexport type StateValues = Record<string, unknown>;\n\n/** WMO weather-code → short English text, used when an adapter gives only a numeric code. */\nconst WMO_TEXT: Record<number, string> = {\n 0: 'clear sky',\n 1: 'mainly clear',\n 2: 'partly cloudy',\n 3: 'overcast',\n 45: 'fog',\n 48: 'depositing rime fog',\n 51: 'light drizzle',\n 53: 'drizzle',\n 55: 'dense drizzle',\n 56: 'freezing drizzle',\n 57: 'dense freezing drizzle',\n 61: 'slight rain',\n 63: 'rain',\n 65: 'heavy rain',\n 66: 'freezing rain',\n 67: 'heavy freezing rain',\n 71: 'slight snow',\n 73: 'snow',\n 75: 'heavy snow',\n 77: 'snow grains',\n 80: 'slight rain showers',\n 81: 'rain showers',\n 82: 'violent rain showers',\n 85: 'snow showers',\n 86: 'heavy snow showers',\n 95: 'thunderstorm',\n 96: 'thunderstorm with slight hail',\n 99: 'thunderstorm with heavy hail',\n};\n\n/** Human text for a WMO code (or '' if unknown). */\nexport function wmoText(code: unknown): string {\n const n = typeof code === 'number' ? code : parseInt(String(code), 10);\n return Number.isFinite(n) ? WMO_TEXT[n] || '' : '';\n}\n\nfunction num(states: StateValues, id: string): number | undefined {\n const v = states[id];\n if (v === undefined || v === null || v === '') {\n return undefined;\n }\n const n = typeof v === 'number' ? v : parseFloat(v == null ? '0' : (v as string).toString());\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction str(states: StateValues, id: string): string | undefined {\n const v = states[id];\n if (v == null || v === '') {\n return undefined;\n }\n return (v as string).toString();\n}\n\n/** First defined number among several candidate ids (for adapters with windowed/variant fields). */\nfunction firstNum(states: StateValues, ids: string[]): number | undefined {\n for (const id of ids) {\n const n = num(states, id);\n if (n !== undefined) {\n return n;\n }\n }\n return undefined;\n}\n\n/** First defined string among several candidate ids. */\nfunction firstStr(states: StateValues, ids: string[]): string | undefined {\n for (const id of ids) {\n const s = str(states, id);\n if (s !== undefined) {\n return s;\n }\n }\n return undefined;\n}\n\n/** Number of forecast days present under `dayId(i)` (probe until a day has no max-temp). */\nfunction countDays(states: StateValues, maxId: (i: number) => string, cap = 8): number {\n let n = 0;\n for (let i = 0; i < cap; i++) {\n if (num(states, maxId(i)) === undefined && str(states, maxId(i)) === undefined) {\n break;\n }\n n++;\n }\n return n;\n}\n\nfunction mapOpenMeteo(root: string, states: StateValues): WeatherReport {\n const c = `${root}.weather.current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temperature_2m`),\n feelsLike: num(states, `${c}.apparent_temperature`),\n humidity: num(states, `${c}.relative_humidity_2m`),\n condition: str(states, `${c}.weather_text`) || wmoText(states[`${c}.weather_code`]),\n windSpeed: num(states, `${c}.wind_speed_10m`),\n windDir: str(states, `${c}.wind_direction_text`) ?? num(states, `${c}.wind_direction_10m`),\n pressure: num(states, `${c}.pressure_msl`),\n precipitation: num(states, `${c}.precipitation`),\n cloudCover: num(states, `${c}.cloud_cover`),\n };\n const dayBase = (i: number): string => `${root}.weather.forecast.day${i}`;\n const days = countDays(states, i => `${dayBase(i)}.temperature_2m_max`);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: str(states, `${d}.name_day`) || str(states, `${d}.time`),\n tempMax: num(states, `${d}.temperature_2m_max`),\n tempMin: num(states, `${d}.temperature_2m_min`),\n condition: str(states, `${d}.weather_text`) || wmoText(states[`${d}.weather_code`]),\n precipProbability: num(states, `${d}.precipitation_probability_max`),\n precipitation: num(states, `${d}.precipitation_sum`),\n windSpeed: num(states, `${d}.wind_speed_10m_max`),\n windDir: num(states, `${d}.wind_direction_10m_dominant`),\n });\n }\n // Location = the segment between the instance (adapter.N) and the fixed \".weather\" suffix.\n const m = root.match(/^[^.]+\\.\\d+\\.(.+)$/);\n return {\n source: 'open-meteo-weather',\n location: m ? m[1].replace(/_/g, ' ') : undefined,\n units: { temp: '°C', wind: 'km/h', precip: 'mm' },\n current,\n forecast,\n };\n}\n\nfunction mapWunderground(root: string, states: StateValues): WeatherReport {\n const c = `${root}.forecast.current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temp`),\n feelsLike: num(states, `${c}.feelsLike`),\n humidity: num(states, `${c}.relativeHumidity`),\n condition: str(states, `${c}.weather`),\n windSpeed: num(states, `${c}.wind`),\n windDir: str(states, `${c}.windDirection`) ?? num(states, `${c}.windDegrees`),\n pressure: num(states, `${c}.pressure`),\n precipitation: num(states, `${c}.precipitationHour`),\n };\n const dayBase = (i: number): string => `${root}.forecast.${i}d`;\n const days = countDays(states, i => `${dayBase(i)}.tempMax`);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: str(states, `${d}.date`),\n tempMax: num(states, `${d}.tempMax`),\n tempMin: num(states, `${d}.tempMin`),\n condition: str(states, `${d}.state`),\n precipProbability: num(states, `${d}.precipitationChance`),\n precipitation: num(states, `${d}.precipitationAllDay`),\n windSpeed: num(states, `${d}.windSpeed`),\n windDir: str(states, `${d}.windDirection`),\n });\n }\n return { source: 'weatherunderground', units: { temp: '°C', wind: 'km/h', precip: 'mm' }, current, forecast };\n}\n\nfunction mapOpenWeatherMap(root: string, states: StateValues): WeatherReport {\n const c = `${root}.forecast.current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temperature`),\n feelsLike: num(states, `${c}.feelsLike`),\n humidity: num(states, `${c}.humidity`),\n condition: str(states, `${c}.state`) || str(states, `${c}.title`),\n windSpeed: num(states, `${c}.windSpeed`),\n windDir: str(states, `${c}.windDirectionText`) ?? num(states, `${c}.windDirection`),\n pressure: num(states, `${c}.pressure`),\n precipitation: num(states, `${c}.precipitationRain`),\n };\n const dayBase = (i: number): string => `${root}.forecast.day${i}`;\n const days = countDays(states, i => `${dayBase(i)}.temperatureMax`);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: str(states, `${d}.date`),\n tempMax: num(states, `${d}.temperatureMax`),\n tempMin: num(states, `${d}.temperatureMin`),\n condition: str(states, `${d}.state`) || str(states, `${d}.title`),\n precipitation: num(states, `${d}.precipitationRain`),\n windSpeed: num(states, `${d}.windSpeed`),\n windDir: str(states, `${d}.windDirectionText`),\n });\n }\n // OpenWeatherMap reports wind in m/s.\n return { source: 'openweathermap', units: { temp: '°C', wind: 'm/s', precip: 'mm' }, current, forecast };\n}\n\nfunction mapBrightsky(root: string, states: StateValues): WeatherReport {\n const c = `${root}.weather.current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temperature`),\n feelsLike: num(states, `${c}.apparent_temperature`),\n humidity: num(states, `${c}.relative_humidity`),\n condition: firstStr(states, [`${c}.conditionUI`, `${c}.condition`]),\n windSpeed: firstNum(states, [`${c}.wind_speed_60`, `${c}.wind_speed_10`, `${c}.wind_speed_30`]),\n windDir:\n firstStr(states, [`${c}.wind_bearing_text`]) ??\n firstNum(states, [`${c}.wind_direction_60`, `${c}.wind_direction_10`]),\n pressure: num(states, `${c}.pressure_msl`),\n precipitation: firstNum(states, [`${c}.precipitation_60`, `${c}.precipitation_10`]),\n cloudCover: num(states, `${c}.cloud_cover`),\n };\n const dayBase = (i: number): string => `${root}.weather.daily.${i}`;\n const days = countDays(states, i => `${dayBase(i)}.temperature_max`);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: firstStr(states, [`${d}.dayName_long`, `${d}.dayName_short`]),\n tempMax: num(states, `${d}.temperature_max`),\n tempMin: num(states, `${d}.temperature_min`),\n condition: str(states, `${d}.condition`),\n precipProbability: num(states, `${d}.precipitation_probability_median`),\n precipitation: num(states, `${d}.precipitation`),\n windSpeed: firstNum(states, [`${d}.wind_speed_max`, `${d}.wind_speed_median`]),\n windDir: num(states, `${d}.wind_direction_median`),\n });\n }\n return { source: 'brightsky', units: { temp: '°C', wind: 'km/h', precip: 'mm' }, current, forecast };\n}\n\nfunction mapPirate(root: string, states: StateValues): WeatherReport {\n const c = `${root}.weather.currently`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temperature`),\n feelsLike: num(states, `${c}.apparentTemperature`),\n humidity: num(states, `${c}.humidity`),\n condition: str(states, `${c}.summary`),\n windSpeed: num(states, `${c}.windSpeed`),\n windDir: str(states, `${c}.windBearingText`) ?? num(states, `${c}.windBearing`),\n pressure: num(states, `${c}.pressure`),\n precipitation: num(states, `${c}.precipIntensity`),\n cloudCover: num(states, `${c}.cloudCover`),\n };\n const dayBase = (i: number): string => `${root}.weather.daily.${i}`;\n const days = countDays(states, i => `${dayBase(i)}.temperatureHigh`);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: str(states, `${d}.time`),\n tempMax: num(states, `${d}.temperatureHigh`),\n tempMin: num(states, `${d}.temperatureLow`),\n condition: str(states, `${d}.summary`),\n precipProbability: num(states, `${d}.precipProbability`),\n precipitation: firstNum(states, [`${d}.precipAccumulation`, `${d}.precipIntensity`]),\n windSpeed: num(states, `${d}.windSpeed`),\n windDir: str(states, `${d}.windBearingText`) ?? num(states, `${d}.windBearing`),\n });\n }\n // Pirate Weather defaults to SI units (wind m/s).\n return { source: 'pirate-weather', units: { temp: '°C', wind: 'm/s', precip: 'mm' }, current, forecast };\n}\n\nfunction mapAccuweather(root: string, states: StateValues): WeatherReport {\n const c = `${root}.Current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.Temperature`),\n feelsLike: num(states, `${c}.RealFeelTemperature`),\n humidity: num(states, `${c}.RelativeHumidity`),\n condition: str(states, `${c}.WeatherText`),\n windSpeed: num(states, `${c}.WindSpeed`),\n windDir: str(states, `${c}.WindDirectionText`) ?? num(states, `${c}.WindDirection`),\n pressure: num(states, `${c}.Pressure`),\n cloudCover: num(states, `${c}.CloudCover`),\n uvIndex: num(states, `${c}.UVIndex`),\n };\n // AccuWeather days are the fixed folders Day1..Day5 (i logical → Day${i+1}).\n const dayBase = (i: number): string => `${root}.Daily.Day${i + 1}`;\n const days = countDays(states, i => `${dayBase(i)}.Temperature.Maximum`, 6);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: str(states, `${d}.Date`),\n tempMax: num(states, `${d}.Temperature.Maximum`),\n tempMin: num(states, `${d}.Temperature.Minimum`),\n condition: firstStr(states, [`${d}.Day.IconPhrase`, `${d}.Day.ShortPhrase`]),\n precipProbability: num(states, `${d}.Day.PrecipitationProbability`),\n windSpeed: num(states, `${d}.Day.WindSpeed`),\n windDir: str(states, `${d}.Day.WindDirection`),\n });\n }\n // Metric config is the default (°C, km/h).\n return { source: 'accuweather', units: { temp: '°C', wind: 'km/h', precip: 'mm' }, current, forecast };\n}\n\nfunction mapDasWetter(root: string, states: StateValues): WeatherReport {\n // Current is a copy of an hourly record (only present when CopyCurrentHour is enabled).\n const c = `${root}.ForecastHourly.Current`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.temperature`),\n feelsLike: num(states, `${c}.temperature_feels_like`),\n humidity: num(states, `${c}.humidity`),\n condition: str(states, `${c}.symbol_description`),\n windSpeed: num(states, `${c}.wind_speed`),\n windDir: str(states, `${c}.wind_direction`),\n pressure: num(states, `${c}.pressure`),\n precipitation: num(states, `${c}.rain`),\n cloudCover: num(states, `${c}.clouds`),\n };\n // Daily folders are Day_1..Day_5 (i logical → Day_${i+1}).\n const dayBase = (i: number): string => `${root}.ForecastDaily.Day_${i + 1}`;\n const days = countDays(states, i => `${dayBase(i)}.Temperature_Max`, 6);\n const forecast: WeatherDay[] = [];\n for (let i = 0; i < days; i++) {\n const d = dayBase(i);\n forecast.push({\n day: i,\n date: firstStr(states, [`${d}.NameOfDay`, `${d}.date`]),\n tempMax: num(states, `${d}.Temperature_Max`),\n tempMin: num(states, `${d}.Temperature_Min`),\n condition: str(states, `${d}.symbol_description`),\n precipProbability: num(states, `${d}.Rain_Probability`),\n precipitation: num(states, `${d}.Rain`),\n windSpeed: num(states, `${d}.Wind_Speed`),\n windDir: str(states, `${d}.Wind_Direction`),\n });\n }\n return { source: 'daswetter', units: { temp: '°C', wind: 'km/h', precip: 'mm' }, current, forecast };\n}\n\nfunction mapYr(root: string, states: StateValues): WeatherReport {\n // met.no is hourly-only; the nearest hour (`forecastHourly.0h`) is the closest thing to \"current\".\n const c = `${root}.forecastHourly.0h`;\n const current: WeatherCurrent = {\n temperature: num(states, `${c}.air_temperature`),\n humidity: num(states, `${c}.relative_humidity`),\n condition: firstStr(states, [`${c}.1h_summary_text`, `${c}.6h_summary_text`]),\n windSpeed: num(states, `${c}.wind_speed`),\n windDir: num(states, `${c}.wind_from_direction`),\n pressure: num(states, `${c}.air_pressure_at_sea_level`),\n precipitation: num(states, `${c}.1h_precipitation_amount`),\n cloudCover: num(states, `${c}.cloud_area_fraction`),\n };\n // No daily/multi-day branch in the yr adapter → forecast stays empty.\n return { source: 'yr', units: { temp: '°C', wind: 'm/s', precip: 'mm' }, current, forecast: [] };\n}\n\n/**\n * Build a normalized {@link WeatherReport} from a weather adapter's flat state map. `adapter` is the adapter\n * name (segment 0 of the instance id); `root` is the state prefix the data lives under (for Open-Meteo this\n * includes the location device, e.g. `open-meteo-weather.0.Berlin`). Returns null for adapters without a\n * mapper (the caller then falls back to a raw dump) or when no data is present.\n */\nexport function buildWeatherReport(adapter: string, root: string, states: StateValues): WeatherReport | null {\n const kind = WEATHER_ADAPTERS[adapter]?.kind;\n if (!kind) {\n return null;\n }\n const mappers: Record<WeatherKind, (root: string, states: StateValues) => WeatherReport> = {\n openmeteo: mapOpenMeteo,\n wunderground: mapWunderground,\n openweathermap: mapOpenWeatherMap,\n brightsky: mapBrightsky,\n pirate: mapPirate,\n accuweather: mapAccuweather,\n daswetter: mapDasWetter,\n yr: mapYr,\n };\n const report = mappers[kind](root, states);\n // Drop empty/undefined fields from `current` so the report is compact (and a data-less selection\n // collapses to no current at all, rather than a stray empty condition string).\n if (report.current) {\n report.current = Object.fromEntries(\n Object.entries(report.current).filter(([, v]) => v !== undefined && v !== ''),\n );\n if (!Object.keys(report.current).length) {\n report.current = undefined;\n }\n }\n if (!report.current && !report.forecast.length) {\n return null; // adapter selected but no data yet\n }\n return report;\n}\n\n/** Keep only the forecast days a question needs: 'current'/'today' → day 0, 'tomorrow' → day 1, 'week' → all. */\nexport function trimReport(report: WeatherReport, when?: string): WeatherReport {\n const w = (when || '').toLowerCase();\n if (w === 'tomorrow') {\n return { ...report, forecast: report.forecast.filter(d => d.day === 1) };\n }\n if (w === 'today' || w === 'current' || w === 'now') {\n return { ...report, forecast: report.forecast.filter(d => d.day === 0) };\n }\n return report; // 'week' / unspecified → everything\n}\n\n/** Localized wording for {@link buildWeatherPrompt} (the assistant's voice languages: de/en/ru). */\nconst PROMPT_LABELS: Record<string, Record<string, string>> = {\n en: {\n header: 'Current weather',\n feels: 'feels like',\n wind: 'wind',\n humidity: 'humidity',\n precip: 'precipitation',\n clouds: 'cloud cover',\n uv: 'UV index',\n pressure: 'pressure',\n today: 'Today',\n tomorrow: 'Tomorrow',\n chance: 'precipitation probability',\n max: 'max',\n min: 'min',\n hint: 'Answer weather questions from this data; call get_weather only for days beyond tomorrow.',\n },\n de: {\n header: 'Aktuelles Wetter',\n feels: 'gefühlt',\n wind: 'Wind',\n humidity: 'Luftfeuchte',\n precip: 'Niederschlag',\n clouds: 'Bewölkung',\n uv: 'UV-Index',\n pressure: 'Luftdruck',\n today: 'Heute',\n tomorrow: 'Morgen',\n chance: 'Niederschlagswahrscheinlichkeit',\n max: 'max.',\n min: 'min.',\n hint: 'Beantworte Wetterfragen aus diesen Daten; rufe get_weather nur für Tage nach morgen auf.',\n },\n ru: {\n header: 'Текущая погода',\n feels: 'ощущается как',\n wind: 'ветер',\n humidity: 'влажность',\n precip: 'осадки',\n clouds: 'облачность',\n uv: 'УФ-индекс',\n pressure: 'давление',\n today: 'Сегодня',\n tomorrow: 'Завтра',\n chance: 'вероятность осадков',\n max: 'макс.',\n min: 'мин.',\n hint: 'Отвечай на вопросы о погоде по этим данным; вызывай get_weather только для дней после завтра.',\n },\n};\n\n/** At most one decimal — weather values carry no meaningful precision beyond that. */\nfunction fmtNum(v: number): string {\n return String(Math.round(v * 10) / 10);\n}\n\n/**\n * Compact, localized summary of the current conditions plus today/tomorrow, meant to be prepended to the\n * LLM's user turn so it can answer \"how's the weather?\" straight away — no `get_weather` round-trip, and\n * small/local models (which have no tools at all) can answer instead of inventing a forecast. Days beyond\n * tomorrow stay behind the tool so the injected block stays short. Returns '' if the report carries nothing.\n */\nexport function buildWeatherPrompt(report: WeatherReport, lang: string): string {\n const t = PROMPT_LABELS[lang] || PROMPT_LABELS.en;\n const u = report.units;\n const lines: string[] = [];\n const where = [WEATHER_ADAPTERS[report.source]?.label || report.source, report.location].filter(Boolean).join(', ');\n const c = report.current;\n if (c) {\n const parts: string[] = [];\n if (c.temperature !== undefined) {\n const feels = c.feelsLike !== undefined ? ` (${t.feels} ${fmtNum(c.feelsLike)} ${u.temp})` : '';\n parts.push(`${fmtNum(c.temperature)} ${u.temp}${feels}`);\n }\n if (c.condition) {\n parts.push(String(c.condition));\n }\n if (c.windSpeed !== undefined) {\n parts.push(`${t.wind} ${fmtNum(c.windSpeed)} ${u.wind}`);\n }\n if (c.humidity !== undefined) {\n parts.push(`${t.humidity} ${fmtNum(c.humidity)} %`);\n }\n if (c.precipitation !== undefined) {\n parts.push(`${t.precip} ${fmtNum(c.precipitation)} ${u.precip}`);\n }\n if (c.cloudCover !== undefined) {\n parts.push(`${t.clouds} ${fmtNum(c.cloudCover)} %`);\n }\n if (c.uvIndex !== undefined) {\n parts.push(`${t.uv} ${fmtNum(c.uvIndex)}`);\n }\n if (c.pressure !== undefined) {\n parts.push(`${t.pressure} ${fmtNum(c.pressure)} hPa`);\n }\n if (parts.length) {\n lines.push(`${t.header} (${where}): ${parts.join(', ')}.`);\n }\n }\n for (const d of report.forecast.filter(f => f.day === 0 || f.day === 1)) {\n const parts: string[] = [];\n if (d.tempMin !== undefined && d.tempMax !== undefined) {\n parts.push(`${fmtNum(d.tempMin)}…${fmtNum(d.tempMax)} ${u.temp}`);\n } else if (d.tempMax !== undefined) {\n parts.push(`${t.max} ${fmtNum(d.tempMax)} ${u.temp}`);\n } else if (d.tempMin !== undefined) {\n parts.push(`${t.min} ${fmtNum(d.tempMin)} ${u.temp}`);\n }\n if (d.condition) {\n parts.push(String(d.condition));\n }\n if (d.precipProbability !== undefined) {\n parts.push(`${t.chance} ${fmtNum(d.precipProbability)} %`);\n }\n if (d.precipitation !== undefined) {\n parts.push(`${t.precip} ${fmtNum(d.precipitation)} ${u.precip}`);\n }\n if (d.windSpeed !== undefined) {\n parts.push(`${t.wind} ${fmtNum(d.windSpeed)} ${u.wind}`);\n }\n if (parts.length) {\n lines.push(`${d.day === 0 ? t.today : t.tomorrow}: ${parts.join(', ')}.`);\n }\n }\n if (!lines.length) {\n return '';\n }\n lines.push(t.hint);\n return lines.join('\\n');\n}\n"]}
|
package/build/main.js
CHANGED
|
@@ -52,6 +52,11 @@ const context_1 = require("./lib/context");
|
|
|
52
52
|
const voiceServer_1 = require("./lib/voice/voiceServer");
|
|
53
53
|
const wyoming_1 = require("./lib/voice/wyoming");
|
|
54
54
|
const engines_1 = require("./lib/voice/engines");
|
|
55
|
+
/**
|
|
56
|
+
* How long a rendered weather context line stays valid. Weather adapters refresh every few minutes at best,
|
|
57
|
+
* so re-reading their whole state tree on every single request would be pure overhead.
|
|
58
|
+
*/
|
|
59
|
+
const WEATHER_CTX_TTL = 5 * 60 * 1000;
|
|
55
60
|
/** A tts value is treated as an audio file (not text) when it looks like an mp3/wav/… URL or path. */
|
|
56
61
|
function isAudioRef(v) {
|
|
57
62
|
return /\.(mp3|wav|ogg|flac|m4a|aac|opus)(\?.*)?$/i.test(v.trim());
|
|
@@ -110,6 +115,8 @@ class Assistant extends adapter_core_1.Adapter {
|
|
|
110
115
|
memory = null;
|
|
111
116
|
/** Per-memory `memory.items.<id>` channels currently rendered. */
|
|
112
117
|
memoryObjIds = new Set();
|
|
118
|
+
/** Cached weather context line (see `buildWeatherContext`); `key` = source + language. */
|
|
119
|
+
weatherCtx = null;
|
|
113
120
|
/** Active "ringing" sessions (a timer/alarm looping its sound until stopped or timed out). */
|
|
114
121
|
rings = [];
|
|
115
122
|
constructor(options = {}) {
|
|
@@ -1421,13 +1428,17 @@ class Assistant extends adapter_core_1.Adapter {
|
|
|
1421
1428
|
this.log.debug(`NLU skipped: ${e.message}`);
|
|
1422
1429
|
}
|
|
1423
1430
|
}
|
|
1431
|
+
// Current weather from the configured adapter — prepended to the user turn of BOTH LLM tiers so
|
|
1432
|
+
// "how's the weather?" is answered from real data (the local model has no tools and would otherwise
|
|
1433
|
+
// invent a forecast; the cloud model saves a get_weather round-trip). Cached, see buildWeatherContext.
|
|
1434
|
+
const weather = await this.buildWeatherContext();
|
|
1424
1435
|
// Tier 1a: local LLM — answers general questions offline; emits HANDOFF for anything needing tools.
|
|
1425
1436
|
// Skipped inside an ongoing conversation (history present): the tool-free local model gets no history,
|
|
1426
1437
|
// so it would answer a follow-up like "yes" context-free and swallow it — let the cloud LLM (which has
|
|
1427
1438
|
// the thread and the tools) handle follow-ups instead.
|
|
1428
1439
|
if (this.config.useLocalLlm && this.localLlm && !history.length) {
|
|
1429
1440
|
try {
|
|
1430
|
-
const ans = await this.localLlm.ask(question);
|
|
1441
|
+
const ans = await this.localLlm.ask(weather ? `${weather}\n\n${question}` : question);
|
|
1431
1442
|
if (ans && !(0, localLlm_1.isHandoff)(ans)) {
|
|
1432
1443
|
this.log.info(`Answered by local LLM (source='${source}').`);
|
|
1433
1444
|
return ans;
|
|
@@ -1452,10 +1463,10 @@ class Assistant extends adapter_core_1.Adapter {
|
|
|
1452
1463
|
const followUp = this.config.voiceEnabled ? this.followUpHint() : '';
|
|
1453
1464
|
const parts = [this.config.systemPrompt || '', followUp, mem, ctx].filter(Boolean);
|
|
1454
1465
|
const sys = parts.length ? parts.join('\n\n') : undefined;
|
|
1455
|
-
this.log.info(`Cloud LLM [${this.agent.model}] (source='${source}', context=${history.length} turn(s)${mem ? ', memory' : ''}) — running tool loop…`);
|
|
1456
|
-
// Prepend the current date/time
|
|
1457
|
-
//
|
|
1458
|
-
const questionForLlm =
|
|
1466
|
+
this.log.info(`Cloud LLM [${this.agent.model}] (source='${source}', context=${history.length} turn(s)${mem ? ', memory' : ''}${weather ? ', weather' : ''}) — running tool loop…`);
|
|
1467
|
+
// Prepend the current date/time (and the weather line, if a source is configured) to the user turn —
|
|
1468
|
+
// cache-safe, see buildTimeContext. The stored history keeps the untouched question.
|
|
1469
|
+
const questionForLlm = [this.buildTimeContext(), weather, question].filter(Boolean).join('\n\n');
|
|
1459
1470
|
return this.agent.ask(questionForLlm, sys, history);
|
|
1460
1471
|
}
|
|
1461
1472
|
/**
|
|
@@ -1606,7 +1617,12 @@ class Assistant extends adapter_core_1.Adapter {
|
|
|
1606
1617
|
});
|
|
1607
1618
|
return this.localLlmLoading;
|
|
1608
1619
|
}
|
|
1609
|
-
/**
|
|
1620
|
+
/**
|
|
1621
|
+
* Run the rule-based NLU; returns a response string if it produced executable intents, else null.
|
|
1622
|
+
* A combined command ("Schalte A an und setze B auf 30 %", "Schalte A und B an") yields several
|
|
1623
|
+
* intents: they are all checked up front and only then executed in order, so an utterance is never
|
|
1624
|
+
* half-executed here and then handed to the LLM, which would repeat the parts already done.
|
|
1625
|
+
*/
|
|
1610
1626
|
async tryLocalNlu(question, source = '') {
|
|
1611
1627
|
if (!this.mcp) {
|
|
1612
1628
|
return null;
|
|
@@ -1614,28 +1630,81 @@ class Assistant extends adapter_core_1.Adapter {
|
|
|
1614
1630
|
// Timer intents match device-independently (parse() checks them first), so build the NLU even
|
|
1615
1631
|
// when no devices are known and always try timers before bailing out.
|
|
1616
1632
|
const { rooms, devices } = await this.getNluDevices();
|
|
1617
|
-
const
|
|
1618
|
-
if (!
|
|
1619
|
-
return null;
|
|
1620
|
-
}
|
|
1621
|
-
if (intent.action === 'timerSet' || intent.action === 'timerQuery' || intent.action === 'timerCancel') {
|
|
1622
|
-
return this.timers ? this.executeTimerIntent(intent, source) : null;
|
|
1633
|
+
const intents = new nlu_1.Nlu(rooms, devices, this.getNluAliases()).parseAll(question);
|
|
1634
|
+
if (!intents.length || !intents.every(i => this.canExecuteNlu(i, devices.length))) {
|
|
1635
|
+
return null; // nothing matched, or one part cannot run here → let the LLM answer the whole thing
|
|
1623
1636
|
}
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1637
|
+
const answers = [];
|
|
1638
|
+
for (const intent of intents) {
|
|
1639
|
+
try {
|
|
1640
|
+
answers.push(await this.executeNluIntent(intent, source));
|
|
1641
|
+
}
|
|
1642
|
+
catch (e) {
|
|
1643
|
+
// Nothing executed yet → hand the whole utterance to the LLM. Afterwards a state has already
|
|
1644
|
+
// been written and the LLM would repeat it, so report the failed part instead of bailing out.
|
|
1645
|
+
if (!answers.length) {
|
|
1646
|
+
throw e;
|
|
1647
|
+
}
|
|
1648
|
+
this.log.warn(`NLU intent '${intent.action}' failed: ${e.message}`);
|
|
1649
|
+
answers.push(this.nluFailureText(intent));
|
|
1650
|
+
}
|
|
1632
1651
|
}
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
if (isWrite && !this.config.allowWriteStates) {
|
|
1636
|
-
return null;
|
|
1652
|
+
if (intents.length > 1) {
|
|
1653
|
+
this.log.debug(`NLU handled a combined command (${intents.length} parts).`);
|
|
1637
1654
|
}
|
|
1638
|
-
return
|
|
1655
|
+
return answers.filter(Boolean).join(' ');
|
|
1656
|
+
}
|
|
1657
|
+
/**
|
|
1658
|
+
* Can this intent run locally at all? Checked for **every** part of a combined command before anything
|
|
1659
|
+
* is executed: a missing manager, no known devices or disabled writes send the whole utterance to the
|
|
1660
|
+
* LLM (which can explain why) instead of silently doing nothing — or only half of it.
|
|
1661
|
+
*/
|
|
1662
|
+
canExecuteNlu(intent, deviceCount) {
|
|
1663
|
+
switch (intent.action) {
|
|
1664
|
+
case 'timerSet':
|
|
1665
|
+
case 'timerQuery':
|
|
1666
|
+
case 'timerCancel':
|
|
1667
|
+
return !!this.timers;
|
|
1668
|
+
case 'alarmSet':
|
|
1669
|
+
case 'alarmQuery':
|
|
1670
|
+
case 'alarmCancel':
|
|
1671
|
+
return !!this.alarms;
|
|
1672
|
+
case 'timeQuery':
|
|
1673
|
+
case 'dateQuery':
|
|
1674
|
+
return true;
|
|
1675
|
+
default:
|
|
1676
|
+
// Device intents; writes additionally require the coarse "allow control" toggle.
|
|
1677
|
+
return (deviceCount > 0 &&
|
|
1678
|
+
(!['on', 'off', 'level', 'color'].includes(intent.action) || !!this.config.allowWriteStates));
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
/** Execute one intent that {@link canExecuteNlu} accepted, and return its spoken answer. */
|
|
1682
|
+
async executeNluIntent(intent, source) {
|
|
1683
|
+
switch (intent.action) {
|
|
1684
|
+
case 'timerSet':
|
|
1685
|
+
case 'timerQuery':
|
|
1686
|
+
case 'timerCancel':
|
|
1687
|
+
return this.executeTimerIntent(intent, source);
|
|
1688
|
+
case 'alarmSet':
|
|
1689
|
+
case 'alarmQuery':
|
|
1690
|
+
case 'alarmCancel':
|
|
1691
|
+
return this.executeAlarmIntent(intent, source);
|
|
1692
|
+
case 'timeQuery':
|
|
1693
|
+
case 'dateQuery':
|
|
1694
|
+
return this.executeTimeIntent(intent);
|
|
1695
|
+
default:
|
|
1696
|
+
return this.executeIntent(intent);
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
/** Localized "this part did not work" sentence for a failed part of a combined command. */
|
|
1700
|
+
nluFailureText(intent) {
|
|
1701
|
+
const lang = String(this.config.voiceLanguage || this.language || 'en');
|
|
1702
|
+
const what = intent.device?.name ? ` (${intent.device.name})` : '';
|
|
1703
|
+
return lang === 'ru'
|
|
1704
|
+
? `Одну команду${what} выполнить не удалось.`
|
|
1705
|
+
: lang === 'de'
|
|
1706
|
+
? `Ein Befehl${what} hat nicht funktioniert.`
|
|
1707
|
+
: `One command${what} did not work.`;
|
|
1639
1708
|
}
|
|
1640
1709
|
/**
|
|
1641
1710
|
* The configured NLU synonym dictionary filtered to the current interaction language (entries with no
|
|
@@ -2692,6 +2761,41 @@ class Assistant extends adapter_core_1.Adapter {
|
|
|
2692
2761
|
}
|
|
2693
2762
|
return Object.keys(dump).length ? { raw: dump, source: adapter } : { error: 'no weather data found' };
|
|
2694
2763
|
}
|
|
2764
|
+
/**
|
|
2765
|
+
* Compact current-weather line for the LLM, prepended to the user turn (never to the prompt-cached
|
|
2766
|
+
* system prompt — the values change constantly and would bust the cache, incl. the large device list,
|
|
2767
|
+
* on every call). Cached for {@link WEATHER_CTX_TTL}; the cache key carries source + language so a
|
|
2768
|
+
* settings change takes effect at once. Returns '' when no source is configured, the adapter has no
|
|
2769
|
+
* data yet, or it has no mapper (unknown adapters stay tool-only — a raw state dump is no prompt line).
|
|
2770
|
+
*/
|
|
2771
|
+
async buildWeatherContext() {
|
|
2772
|
+
const value = (this.config.weatherInstance || '').trim();
|
|
2773
|
+
if (!value) {
|
|
2774
|
+
return '';
|
|
2775
|
+
}
|
|
2776
|
+
const lang = String(this.config.voiceLanguage || this.language || 'en');
|
|
2777
|
+
const key = `${value}|${lang}`;
|
|
2778
|
+
const now = Date.now();
|
|
2779
|
+
if (this.weatherCtx && this.weatherCtx.key === key && now - this.weatherCtx.ts < WEATHER_CTX_TTL) {
|
|
2780
|
+
return this.weatherCtx.text;
|
|
2781
|
+
}
|
|
2782
|
+
let text = '';
|
|
2783
|
+
try {
|
|
2784
|
+
const res = await this.readWeather(value);
|
|
2785
|
+
if (res.report) {
|
|
2786
|
+
text = (0, weather_1.buildWeatherPrompt)(res.report, lang);
|
|
2787
|
+
}
|
|
2788
|
+
else if (res.error) {
|
|
2789
|
+
this.log.debug(`Weather context skipped: ${res.error}`);
|
|
2790
|
+
}
|
|
2791
|
+
}
|
|
2792
|
+
catch (e) {
|
|
2793
|
+
this.log.debug(`Weather context failed: ${e.message}`);
|
|
2794
|
+
}
|
|
2795
|
+
// Cache the empty result too — a missing/unmapped source must not re-read the tree every request.
|
|
2796
|
+
this.weatherCtx = { key, ts: now, text };
|
|
2797
|
+
return text;
|
|
2798
|
+
}
|
|
2695
2799
|
/** The LLM tool for weather questions (reads the configured weather adapter). */
|
|
2696
2800
|
buildWeatherTool() {
|
|
2697
2801
|
return {
|