From 00e9f25efe5b76c17c39a6d9a9ece0771dd8102e Mon Sep 17 00:00:00 2001 From: ticaki Date: Sun, 19 Jan 2025 15:58:22 +0100 Subject: [PATCH] chore: release v2.1.0-alpha.0 * (ticaki) Change: min. js-controller to 6.0.11 * (ticaki) Change: Outdated data is updated at startup. * (ticaki) New: Photo link added in current weather * (ticaki) New: Metric and Imperial are available for selection - Will be taken into account with the next data update. * (ticaki) New: In the event of a data retrieval error, an attempt is made again after 10 minute * (ticaki) Remove admin option (restart blocking) * (ticaki) Rewritten in Typescript --- README.md | 4 ++-- build/main.js | 2 +- build/main.js.map | 4 ++-- io-package.json | 30 +++++++++++++++--------------- package-lock.json | 4 ++-- package.json | 2 +- src/main.ts | 2 +- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index d599697..3a9f6cc 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ For better view a custom lovelace card is created - see https://github.com/algar Placeholder for the next version (at the beginning of the line): ### **WORK IN PROGRESS** --> -### **WORK IN PROGRESS** -* (ticaki) Change: min. js-controller 7.0.6 +### 2.1.0-alpha.0 (2025-01-19) +* (ticaki) Change: min. js-controller to 6.0.11 * (ticaki) Change: Outdated data is updated at startup. * (ticaki) New: Photo link added in current weather * (ticaki) New: Metric and Imperial are available for selection - Will be taken into account with the next data update. diff --git a/build/main.js b/build/main.js index 0c85034..3148030 100644 --- a/build/main.js +++ b/build/main.js @@ -407,7 +407,7 @@ class Accuweather extends utils.Adapter { }); } else if (key === "Photos" && Array.isArray(json[key])) { const l = json[key].length; - const index = Math.round(Math.random() * l); + const index = Math.round(Math.random() * (l - 1)); await this.setState("Current.LandscapeLink", json[key][index].LandscapeLink, true); await this.setState("Current.PortraitLink", json[key][index].PortraitLink, true); } diff --git a/build/main.js.map b/build/main.js.map index 872fbe8..4262768 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/main.ts"], - "sourcesContent": ["'use strict';\n\n/*\n * Created with @iobroker/create-adapter v1.16.0\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from '@iobroker/adapter-core';\nimport { Accuapi } from './lib/accuapi';\nimport * as nextHour from './lib/nexthour-obj';\nlet updateInterval: ioBroker.Interval | undefined = undefined;\nlet timeout1: ioBroker.Timeout | undefined = undefined;\nlet timeout2: ioBroker.Timeout | undefined = undefined;\nlet timeout3: ioBroker.Timeout | undefined = undefined;\n\nclass Accuweather extends utils.Adapter {\n forecast: Accuapi | undefined;\n /**\n * @param [options] - Optional settings for the adapter\n */\n constructor(options = {}) {\n super({\n ...options,\n name: 'accuweather',\n strictObjectChecks: false,\n });\n this.on('ready', this.onReady.bind(this));\n this.on('stateChange', this.onStateChange.bind(this));\n this.on('unload', this.onUnload.bind(this));\n }\n\n getCardinalDirection(angle: number): string {\n if (typeof angle === 'string') {\n angle = parseInt(angle);\n }\n if (angle <= 0 || angle > 360 || typeof angle === 'undefined') {\n return '\u2608';\n }\n const arrows: Record = {\n north: '\u2191N',\n north_east: '\u2197NE',\n east: '\u2192E',\n south_east: '\u2198SE',\n south: '\u2193S',\n south_west: '\u2199SW',\n west: '\u2190W',\n north_west: '\u2196NW',\n };\n const directions = Object.keys(arrows);\n const degree = 360 / directions.length;\n angle = angle + degree / 4;\n for (let i = 0; i < directions.length; i++) {\n if (angle >= i * degree && angle < (i + 1) * degree) {\n return arrows[directions[i]];\n }\n }\n return arrows.north;\n }\n\n async setDailyStates(obj: any): Promise {\n this.log.debug(`Daily: ${JSON.stringify(obj)}`);\n const days = obj.DailyForecasts;\n try {\n for (let day = 1; day <= 5; day++) {\n const json = days[day - 1];\n for (const key in json) {\n let dt = null;\n switch (key) {\n case 'Date':\n dt = new Date(json[key]);\n await this.setState(`Daily.Day${day}.${key}`, {\n val: json[key],\n ack: true,\n });\n await this.setState(`Summary.DateTime_d${day}`, {\n val: json[key],\n ack: true,\n });\n await this.setState(`Summary.DayOfWeek_d${day}`, {\n val: dt.toLocaleString(this.config.language, {\n weekday: 'short',\n }),\n ack: true,\n });\n break;\n case 'Sun':\n await this.setState(`Daily.Day${day}.Sunrise`, {\n val: json[key].Rise,\n ack: true,\n });\n await this.setState(`Daily.Day${day}.Sunset`, {\n val: json[key].Set,\n ack: true,\n });\n if (day === 1) {\n await this.setState('Summary.Sunrise', {\n val: json[key].Rise,\n ack: true,\n });\n await this.setState('Summary.Sunset', {\n val: json[key].Set,\n ack: true,\n });\n }\n break;\n case 'HoursOfSun':\n await this.setState(`Daily.Day${day}.HoursOfSun`, {\n val: json[key],\n ack: true,\n });\n if (day === 1) {\n await this.setState('Summary.HoursOfSun', {\n val: json[key],\n ack: true,\n });\n }\n break;\n case 'Temperature':\n await this.setState(`Daily.Day${day}.Temperature.Minimum`, {\n val: json[key].Minimum.Value,\n ack: true,\n });\n await this.setState(`Daily.Day${day}.Temperature.Maximum`, {\n val: json[key].Maximum.Value,\n ack: true,\n });\n await this.setState(`Summary.TempMin_d${day}`, {\n val: json[key].Minimum.Value,\n ack: true,\n });\n await this.setState(`Summary.TempMax_d${day}`, {\n val: json[key].Maximum.Value,\n ack: true,\n });\n break;\n case 'RealFeelTemperature':\n await this.setState(`Daily.Day${day}.RealFeelTemperature.Minimum`, {\n val: json[key].Minimum.Value,\n ack: true,\n });\n await this.setState(`Daily.Day${day}.RealFeelTemperature.Maximum`, {\n val: json[key].Maximum.Value,\n ack: true,\n });\n break;\n case 'Day':\n case 'Night':\n {\n const json1 = json[key];\n for (const key1 in json1) {\n if (typeof json1[key1] !== 'object') {\n await this.setState(`Daily.Day${day}.${key}.${key1}`, {\n val: json1[key1],\n ack: true,\n });\n if (key1 === 'Icon') {\n await this.setState(`Daily.Day${day}.${key}.IconURL`, {\n val: `https://developer.accuweather.com/sites/default/files/${String(json1[key1]).padStart(2, '0')}-s.png`,\n ack: true,\n });\n await this.setState(`Daily.Day${day}.${key}.IconURLS`, {\n val: `http://vortex.accuweather.com/adc2010/images/slate/icons/${String(json1[key1]).padStart(2, '0')}.svg`,\n ack: true,\n });\n if (key === 'Day') {\n await this.setState(`Summary.WeatherIconURL_d${day}`, {\n val: `http://vortex.accuweather.com/adc2010/images/slate/icons/${String(json1[key1]).padStart(2, '0')}.svg`,\n ack: true,\n });\n await this.setState(`Summary.WeatherIcon_d${day}`, {\n val: json1[key1],\n ack: true,\n });\n }\n } else if (key === 'Day') {\n if (key1 === 'IconPhrase') {\n await this.setState(`Summary.WeatherText_d${day}`, {\n val: json1[key1],\n ack: true,\n });\n } else {\n await this.setState(`Summary.${key1}_d${day}`, {\n val: json1[key1],\n ack: true,\n });\n }\n }\n } else if (typeof json1[key1] == 'object') {\n if (json1[key1].Value !== undefined) {\n if (['TotalLiquid', 'Rain', 'Snow', 'Ice'].includes(key1)) {\n await this.setState(`Daily.Day${day}.${key}.${key1}Volume`, {\n val: json1[key1].Value,\n ack: true,\n });\n if (key === 'Day' && key1 === 'TotalLiquid') {\n await this.setState(`Summary.TotalLiquidVolume_d${day}`, {\n val: json1[key1].Value,\n ack: true,\n });\n }\n } else {\n await this.setState(`Daily.Day${day}.${key}.${key1}`, {\n val: json1[key1].Value,\n ack: true,\n });\n }\n } else if (key1 === 'Wind') {\n await this.setState(`Daily.Day${day}.${key}.WindSpeed`, {\n val: json1[key1].Speed.Value,\n ack: true,\n });\n await this.setState(`Daily.Day${day}.${key}.WindDirection`, {\n val: json1[key1].Direction.Degrees,\n ack: true,\n });\n if (key === 'Day') {\n await this.setState(`Summary.WindSpeed_d${day}`, {\n val: json1[key1].Speed.Value,\n ack: true,\n });\n await this.setState(`Summary.WindDirection_d${day}`, {\n val: json1[key1].Direction.Degrees,\n ack: true,\n });\n await this.setState(`Summary.WindDirectionStr_d${day}`, {\n val: this.getCardinalDirection(json1[key1].Direction.Degrees),\n ack: true,\n });\n }\n } else if (key1 === 'WindGust') {\n await this.setState(`Daily.Day${day}.${key}.WindGust`, {\n val: json1[key1].Speed.Value,\n ack: true,\n });\n }\n }\n }\n }\n break;\n default:\n break;\n }\n }\n }\n } catch (err) {\n this.log.error(String(err));\n }\n }\n\n async setNextHourStates(obj: any, item: string, hour: string): Promise {\n this.log.debug(`Hours: ${JSON.stringify(obj)}`);\n const json = obj[item];\n try {\n for (const key in json) {\n if (typeof json[key] !== 'object') {\n await this.setState(`Hourly.h${hour}.${key}`, {\n val: json[key],\n ack: true,\n });\n if (key === 'WeatherIcon') {\n await this.setState(`Hourly.h${hour}.WeatherIconURL`, {\n val: `https://developer.accuweather.com/sites/default/files/${String(json[key]).padStart(2, '0')}-s.png`,\n ack: true,\n });\n await this.setState(`Hourly.h${hour}.WeatherIconURLS`, {\n val: `http://vortex.accuweather.com/adc2010/images/slate/icons/${String(json[key]).padStart(2, '0')}.svg`,\n ack: true,\n });\n }\n } else if (typeof json[key] == 'object') {\n if (json[key].Value !== undefined) {\n if (['TotalLiquid', 'Rain', 'Snow', 'Ice'].includes(key)) {\n await this.setState(`Hourly.h${hour}.${key}Volume`, {\n val: json[key].Value,\n ack: true,\n });\n } else {\n await this.setState(`Hourly.h${hour}.${key}`, {\n val: json[key].Value,\n ack: true,\n });\n }\n } else if (key === 'Wind') {\n await this.setState(`Hourly.h${hour}.WindSpeed`, {\n val: json[key].Speed.Value,\n ack: true,\n });\n await this.setState(`Hourly.h${hour}.WindDirection`, {\n val: json[key].Direction.Degrees,\n ack: true,\n });\n await this.setState(`Hourly.h${hour}.WindDirectionText`, {\n val: json[key].Direction.Localized,\n ack: true,\n });\n } else if (key === 'WindGust') {\n await this.setState(`Hourly.h${hour}.WindGust`, {\n val: json[key].Speed.Value,\n ack: true,\n });\n }\n }\n }\n } catch (err) {\n this.log.error(String(err));\n }\n }\n\n async setCurrentStates(obj: any): Promise {\n this.log.debug(`Current: ${JSON.stringify(obj)}`);\n const json = obj[0];\n try {\n for (const key in json) {\n //this.log.debug(\"Current: \" + key + \": \" + typeof json[key]);\n if (typeof json[key] !== 'object' || json[key] == null) {\n await this.setState(`Current.${key}`, { val: json[key], ack: true });\n\n if (key === 'WeatherIcon') {\n await this.setState('Current.WeatherIconURL', {\n val: `https://developer.accuweather.com/sites/default/files/${String(json[key]).padStart(2, '0')}-s.png`,\n ack: true,\n });\n await this.setState('Current.WeatherIconURLS', {\n val: `http://vortex.accuweather.com/adc2010/images/slate/icons/${String(json[key]).padStart(2, '0')}.svg`,\n ack: true,\n });\n await this.setState('Summary.WeatherIconURL', {\n val: `http://vortex.accuweather.com/adc2010/images/slate/icons/${String(json[key]).padStart(2, '0')}.svg`,\n ack: true,\n });\n await this.setState('Summary.WeatherIcon', {\n val: json[key],\n ack: true,\n });\n } else if (key === 'LocalObservationDateTime') {\n const dt = new Date(json[key]);\n const dow = dt.toLocaleString(this.config.language, {\n weekday: 'short',\n });\n await this.setState('Summary.CurrentDateTime', {\n val: json[key],\n ack: true,\n });\n await this.setState('Summary.DayOfWeek', { val: dow, ack: true });\n this.log.debug(\n `Date ${dt.getTime()}, dow: ${dt.toLocaleString(this.config.language, { weekday: 'short' })}`,\n );\n } else {\n await this.setState(`Summary.${key}`, {\n val: json[key],\n ack: true,\n });\n }\n } else if (json[key] !== null) {\n if (json[key][this.config.metric] !== undefined) {\n //this.log.debug(key + \": \" + json[key][this.config.metric].Value);\n await this.setState(`Current.${key}`, {\n val: json[key][this.config.metric].Value,\n ack: true,\n });\n await this.setState(`Summary.${key}`, {\n val: json[key][this.config.metric].Value,\n ack: true,\n });\n } else if (key === 'Wind') {\n await this.setState('Current.WindSpeed', {\n val: json[key].Speed[this.config.metric].Value,\n ack: true,\n });\n await this.setState('Summary.WindSpeed', {\n val: json[key].Speed[this.config.metric].Value,\n ack: true,\n });\n await this.setState('Current.WindDirection', {\n val: json[key].Direction.Degrees,\n ack: true,\n });\n await this.setState('Current.WindDirectionText', {\n val: json[key].Direction.Localized,\n ack: true,\n });\n await this.setState('Summary.WindDirection', {\n val: json[key].Direction.Degrees,\n ack: true,\n });\n await this.setState('Summary.WindDirectionStr', {\n val: this.getCardinalDirection(json[key].Direction.Degrees),\n ack: true,\n });\n } else if (key === 'WindGust') {\n await this.setState('Current.WindGust', {\n val: json[key].Speed[this.config.metric].Value,\n ack: true,\n });\n } else if (key === 'PressureTendency') {\n await this.setState('Current.PressureTendency', {\n val: json[key].LocalizedText,\n ack: true,\n });\n } else if (key === 'Photos' && Array.isArray(json[key])) {\n const l = json[key].length;\n const index = Math.round(Math.random() * l);\n await this.setState('Current.LandscapeLink', json[key][index].LandscapeLink, true);\n await this.setState('Current.PortraitLink', json[key][index].PortraitLink, true);\n }\n }\n }\n await this.setState('CurrentNextUpdate', Date.now(), true);\n } catch (err) {\n this.log.error(String(err));\n }\n }\n\n async setHourlyStates(obj: any): Promise {\n for (const hr in obj) {\n if (typeof obj[hr] === 'object' && obj[hr].DateTime) {\n const d = new Date(obj[hr].DateTime);\n await this.setNextHourStates(obj, hr, String(d.getHours()));\n }\n }\n await this.setState('HourlyNextUpdate', Date.now(), true);\n }\n\n async request5Days(): Promise {\n if (typeof this.forecast !== 'undefined') {\n const loc = this.config.loKey;\n const lang = this.config.language;\n\n this.forecast = this.forecast.localkey(loc).timeInt('daily/5day').language(lang).details(true).metric(true);\n\n const res = await this.forecast.get();\n await this.setDailyStates(res);\n }\n await this.setState('DailyNextUpdate', Date.now(), true);\n }\n\n async request12Hours(): Promise {\n if (typeof this.forecast !== 'undefined') {\n const loc = this.config.loKey;\n const lang = this.config.language;\n\n this.forecast = this.forecast\n .localkey(loc)\n .timeInt('hourly/12hour')\n .language(lang)\n .details(true)\n .metric(true);\n\n const res = await this.forecast.get();\n await this.setHourlyStates(res);\n }\n }\n\n async requestCurrent(): Promise {\n if (typeof this.forecast !== 'undefined') {\n const loc = this.config.loKey;\n const lang = this.config.language;\n\n this.forecast = this.forecast\n .localkey(loc)\n .timeInt()\n .language(lang)\n .details(true)\n .metric(true)\n .getphotos(true);\n\n const res = await this.forecast.getCurrent();\n await this.setCurrentStates(res);\n }\n }\n\n async onReady(): Promise {\n const nameSpaceObj = await this.getForeignObjectAsync(this.namespace);\n if (!nameSpaceObj) {\n await this.setForeignObject(this.namespace, {\n _id: this.namespace,\n type: 'meta',\n common: { name: 'Accuweather device', type: 'meta.folder' },\n native: {},\n });\n }\n const obj = await this.getForeignObjectAsync(`system.adapter.${this.namespace}`);\n\n if (obj && obj.native && obj.native.apiKey) {\n obj.native.apiKeyEncrypted = this.encrypt(obj.native.apiKey);\n this.config.apiKeyEncrypted = obj.native.apiKey;\n delete obj.native.apiKey;\n await this.setForeignObject(`system.adapter.${this.namespace}`, obj);\n }\n\n if (this.config.metric !== 'Metric' && this.config.metric !== 'Imperial') {\n this.config.metric = 'Metric';\n }\n if (!this.config.language) {\n const systemConfig = await this.getForeignObjectAsync('system.config');\n if (systemConfig && systemConfig.common && systemConfig.common.language) {\n this.config.language = systemConfig.common.language;\n }\n }\n\n //this.log.debug(`API: ${this.config.apiKey}; Loc: ${this.config.loKey} Lang: ${this.config.language}`);\n this.log.debug(`API: ********; Loc: ${this.config.loKey} Lang: ${this.config.language}`);\n\n if (this.config.apiKeyEncrypted) {\n this.forecast = new Accuapi(this.config.apiKeyEncrypted);\n } else {\n this.log.error('API Key is missing. Please enter Accuweather API key');\n return;\n }\n await nextHour.createHourlyForecastObjects(this);\n await nextHour.createCurrentConditionObjects(this);\n await nextHour.createDailyForecastObjects(this);\n await nextHour.createSummaryObjects(this);\n\n await this.extendObject('CurrentNextUpdate', {\n type: 'state',\n common: {\n name: 'Last Update of Current Weather',\n type: 'number',\n role: 'date',\n read: true,\n write: false,\n },\n native: {},\n });\n await this.extendObject('HourlyNextUpdate', {\n type: 'state',\n common: {\n name: 'Last Update of Hourly Weather',\n type: 'number',\n role: 'date',\n read: true,\n write: false,\n },\n native: {},\n });\n await this.extendObject('DailyNextUpdate', {\n type: 'state',\n common: {\n name: 'Last Update of Daily Weather',\n type: 'number',\n role: 'date',\n read: true,\n write: false,\n },\n native: {},\n });\n const startForbidden: { current?: boolean; hourly?: boolean; daily?: boolean } = {};\n\n let state = await this.getStateAsync('CurrentNextUpdate');\n startForbidden.current = !!(state && state.val && Number(state.val) + 66 * 60000 > Date.now()); // every hour + random 5 Minutes + random 10 seconds\n\n state = await this.getStateAsync('HourlyNextUpdate');\n startForbidden.hourly = !!(\n state &&\n state.ts &&\n state.ts +\n (new Date().setHours(7, 5, 0) < Date.now() && new Date().setHours(20, 6, 0) > Date.now() ? 13 : 11) *\n 60 *\n 60000 +\n 360000 >\n Date.now()\n );\n state = await this.getStateAsync('DailyNextUpdate');\n startForbidden.daily = !!(state && state.ts && state.ts + 6 * 60 * 60000 + 360000 > Date.now()); // every 6 hour s+ random 5 Minutes + random 10 seconds\n\n updateInterval = this.setInterval(() => {\n const now = new Date();\n if ((now.getHours() === 7 || now.getHours() === 20) && now.getMinutes() < 5) {\n const _get5DaysTimeout = (): void => {\n timeout1 && this.clearTimeout(timeout1);\n timeout1 = this.setTimeout(\n async () => {\n try {\n timeout1 = null;\n await this.request5Days();\n } catch (error: any) {\n this.log.error(error);\n this.log.info(`Retry in 10 Minutes`);\n timeout1 = this.setTimeout(_get5DaysTimeout, 600000);\n }\n },\n Math.random() * 10000 + 1,\n );\n };\n _get5DaysTimeout();\n }\n if (now.getMinutes() < 5) {\n const _getMinutesTimeout = (): void => {\n timeout2 && this.clearTimeout(timeout2);\n timeout2 = this.setTimeout(\n async () => {\n try {\n timeout2 = null;\n await this.requestCurrent();\n } catch (error: any) {\n this.log.error(error);\n this.log.info(`Retry in 10 Minutes`);\n timeout2 = this.setTimeout(_getMinutesTimeout, 600000);\n }\n },\n Math.random() * 10000 + 1,\n );\n };\n _getMinutesTimeout();\n }\n if (\n (now.getHours() === 6 || now.getHours() === 12 || now.getHours() === 18 || now.getHours() === 0) &&\n now.getMinutes() < 5\n ) {\n const _get12HoursTimeout = (): void => {\n timeout3 && this.clearTimeout(timeout3);\n timeout3 = this.setTimeout(\n async () => {\n try {\n timeout3 = null;\n await this.request12Hours();\n } catch (error: any) {\n this.log.error(error);\n this.log.info(`Retry in 10 Minutes`);\n timeout3 = this.setTimeout(_get12HoursTimeout, 600000);\n }\n },\n Math.random() * 10000 + 1,\n );\n };\n _get12HoursTimeout();\n }\n }, 300000); // 5 minutes\n try {\n if (!startForbidden.hourly) {\n this.log.info('Update hourly weather!');\n await this.request12Hours();\n }\n if (!startForbidden.current) {\n this.log.info('Update current weather!');\n await this.requestCurrent();\n }\n if (!startForbidden.daily) {\n this.log.info('Update daily weather!');\n await this.request5Days();\n }\n } catch (error: any) {\n this.log.error(error);\n }\n\n /*\n For every state in the system, there has to be also an object of type state\n Here a simple template for a boolean variable named \"testVariable\"\n Because every adapter instance uses its own unique namespace variable names can't collide with other adapters variables\n */\n\n await this.extendObject('updateCurrent', {\n type: 'state',\n common: {\n name: 'Update Current Weather',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n },\n native: {},\n });\n await this.extendObject('updateHourly', {\n type: 'state',\n common: {\n name: 'Update 12 Hours Forecast',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n },\n native: {},\n });\n await this.extendObject('updateDaily', {\n type: 'state',\n common: {\n name: 'Update 5 Days Forecast',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n },\n native: {},\n });\n\n // in this template, all states changes inside the adapter's namespace are subscribed\n await this.subscribeStatesAsync('updateCurrent');\n await this.subscribeStatesAsync('updateHourly');\n await this.subscribeStatesAsync('updateDaily');\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n *\n * @param callback - The callback function to be called when the unload process is complete\n */\n private onUnload(callback: () => void): void {\n try {\n this.log.info('cleaned everything up...');\n updateInterval && this.clearInterval(updateInterval);\n updateInterval = null;\n\n timeout1 && this.clearTimeout(timeout1);\n timeout1 = null;\n\n timeout2 && this.clearTimeout(timeout2);\n timeout2 = null;\n\n timeout3 && this.clearTimeout(timeout3);\n timeout3 = null;\n\n callback();\n } catch {\n callback && callback();\n }\n }\n\n /**\n * Is called if a subscribed state changes\n *\n * @param id - The id of the state that changed\n * @param state - The state object that changed\n */\n async onStateChange(id: string, state: ioBroker.State | null | undefined): Promise {\n if (state) {\n if (!state.ack) {\n try {\n // The state was changed\n if (id === `${this.namespace}.updateCurrent`) {\n await this.requestCurrent();\n } else if (id === `${this.namespace}.updateHourly`) {\n await this.request12Hours();\n } else if (id === `${this.namespace}.updateDaily`) {\n await this.request5Days();\n }\n this.log.debug(`state ${id} changed: ${state.val} (ack = ${state.ack})`);\n } catch (error: any) {\n this.log.error(error);\n }\n }\n } else {\n // The state was deleted\n this.log.debug(`state ${id} deleted`);\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial | undefined) => new Accuweather(options);\n} else {\n // otherwise start the instance directly\n (() => new Accuweather())();\n}\n\nexport = Accuweather;\n"], - "mappings": "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", + "sourcesContent": ["'use strict';\n\n/*\n * Created with @iobroker/create-adapter v1.16.0\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from '@iobroker/adapter-core';\nimport { Accuapi } from './lib/accuapi';\nimport * as nextHour from './lib/nexthour-obj';\nlet updateInterval: ioBroker.Interval | undefined = undefined;\nlet timeout1: ioBroker.Timeout | undefined = undefined;\nlet timeout2: ioBroker.Timeout | undefined = undefined;\nlet timeout3: ioBroker.Timeout | undefined = undefined;\n\nclass Accuweather extends utils.Adapter {\n forecast: Accuapi | undefined;\n /**\n * @param [options] - Optional settings for the adapter\n */\n constructor(options = {}) {\n super({\n ...options,\n name: 'accuweather',\n strictObjectChecks: false,\n });\n this.on('ready', this.onReady.bind(this));\n this.on('stateChange', this.onStateChange.bind(this));\n this.on('unload', this.onUnload.bind(this));\n }\n\n getCardinalDirection(angle: number): string {\n if (typeof angle === 'string') {\n angle = parseInt(angle);\n }\n if (angle <= 0 || angle > 360 || typeof angle === 'undefined') {\n return '\u2608';\n }\n const arrows: Record = {\n north: '\u2191N',\n north_east: '\u2197NE',\n east: '\u2192E',\n south_east: '\u2198SE',\n south: '\u2193S',\n south_west: '\u2199SW',\n west: '\u2190W',\n north_west: '\u2196NW',\n };\n const directions = Object.keys(arrows);\n const degree = 360 / directions.length;\n angle = angle + degree / 4;\n for (let i = 0; i < directions.length; i++) {\n if (angle >= i * degree && angle < (i + 1) * degree) {\n return arrows[directions[i]];\n }\n }\n return arrows.north;\n }\n\n async setDailyStates(obj: any): Promise {\n this.log.debug(`Daily: ${JSON.stringify(obj)}`);\n const days = obj.DailyForecasts;\n try {\n for (let day = 1; day <= 5; day++) {\n const json = days[day - 1];\n for (const key in json) {\n let dt = null;\n switch (key) {\n case 'Date':\n dt = new Date(json[key]);\n await this.setState(`Daily.Day${day}.${key}`, {\n val: json[key],\n ack: true,\n });\n await this.setState(`Summary.DateTime_d${day}`, {\n val: json[key],\n ack: true,\n });\n await this.setState(`Summary.DayOfWeek_d${day}`, {\n val: dt.toLocaleString(this.config.language, {\n weekday: 'short',\n }),\n ack: true,\n });\n break;\n case 'Sun':\n await this.setState(`Daily.Day${day}.Sunrise`, {\n val: json[key].Rise,\n ack: true,\n });\n await this.setState(`Daily.Day${day}.Sunset`, {\n val: json[key].Set,\n ack: true,\n });\n if (day === 1) {\n await this.setState('Summary.Sunrise', {\n val: json[key].Rise,\n ack: true,\n });\n await this.setState('Summary.Sunset', {\n val: json[key].Set,\n ack: true,\n });\n }\n break;\n case 'HoursOfSun':\n await this.setState(`Daily.Day${day}.HoursOfSun`, {\n val: json[key],\n ack: true,\n });\n if (day === 1) {\n await this.setState('Summary.HoursOfSun', {\n val: json[key],\n ack: true,\n });\n }\n break;\n case 'Temperature':\n await this.setState(`Daily.Day${day}.Temperature.Minimum`, {\n val: json[key].Minimum.Value,\n ack: true,\n });\n await this.setState(`Daily.Day${day}.Temperature.Maximum`, {\n val: json[key].Maximum.Value,\n ack: true,\n });\n await this.setState(`Summary.TempMin_d${day}`, {\n val: json[key].Minimum.Value,\n ack: true,\n });\n await this.setState(`Summary.TempMax_d${day}`, {\n val: json[key].Maximum.Value,\n ack: true,\n });\n break;\n case 'RealFeelTemperature':\n await this.setState(`Daily.Day${day}.RealFeelTemperature.Minimum`, {\n val: json[key].Minimum.Value,\n ack: true,\n });\n await this.setState(`Daily.Day${day}.RealFeelTemperature.Maximum`, {\n val: json[key].Maximum.Value,\n ack: true,\n });\n break;\n case 'Day':\n case 'Night':\n {\n const json1 = json[key];\n for (const key1 in json1) {\n if (typeof json1[key1] !== 'object') {\n await this.setState(`Daily.Day${day}.${key}.${key1}`, {\n val: json1[key1],\n ack: true,\n });\n if (key1 === 'Icon') {\n await this.setState(`Daily.Day${day}.${key}.IconURL`, {\n val: `https://developer.accuweather.com/sites/default/files/${String(json1[key1]).padStart(2, '0')}-s.png`,\n ack: true,\n });\n await this.setState(`Daily.Day${day}.${key}.IconURLS`, {\n val: `http://vortex.accuweather.com/adc2010/images/slate/icons/${String(json1[key1]).padStart(2, '0')}.svg`,\n ack: true,\n });\n if (key === 'Day') {\n await this.setState(`Summary.WeatherIconURL_d${day}`, {\n val: `http://vortex.accuweather.com/adc2010/images/slate/icons/${String(json1[key1]).padStart(2, '0')}.svg`,\n ack: true,\n });\n await this.setState(`Summary.WeatherIcon_d${day}`, {\n val: json1[key1],\n ack: true,\n });\n }\n } else if (key === 'Day') {\n if (key1 === 'IconPhrase') {\n await this.setState(`Summary.WeatherText_d${day}`, {\n val: json1[key1],\n ack: true,\n });\n } else {\n await this.setState(`Summary.${key1}_d${day}`, {\n val: json1[key1],\n ack: true,\n });\n }\n }\n } else if (typeof json1[key1] == 'object') {\n if (json1[key1].Value !== undefined) {\n if (['TotalLiquid', 'Rain', 'Snow', 'Ice'].includes(key1)) {\n await this.setState(`Daily.Day${day}.${key}.${key1}Volume`, {\n val: json1[key1].Value,\n ack: true,\n });\n if (key === 'Day' && key1 === 'TotalLiquid') {\n await this.setState(`Summary.TotalLiquidVolume_d${day}`, {\n val: json1[key1].Value,\n ack: true,\n });\n }\n } else {\n await this.setState(`Daily.Day${day}.${key}.${key1}`, {\n val: json1[key1].Value,\n ack: true,\n });\n }\n } else if (key1 === 'Wind') {\n await this.setState(`Daily.Day${day}.${key}.WindSpeed`, {\n val: json1[key1].Speed.Value,\n ack: true,\n });\n await this.setState(`Daily.Day${day}.${key}.WindDirection`, {\n val: json1[key1].Direction.Degrees,\n ack: true,\n });\n if (key === 'Day') {\n await this.setState(`Summary.WindSpeed_d${day}`, {\n val: json1[key1].Speed.Value,\n ack: true,\n });\n await this.setState(`Summary.WindDirection_d${day}`, {\n val: json1[key1].Direction.Degrees,\n ack: true,\n });\n await this.setState(`Summary.WindDirectionStr_d${day}`, {\n val: this.getCardinalDirection(json1[key1].Direction.Degrees),\n ack: true,\n });\n }\n } else if (key1 === 'WindGust') {\n await this.setState(`Daily.Day${day}.${key}.WindGust`, {\n val: json1[key1].Speed.Value,\n ack: true,\n });\n }\n }\n }\n }\n break;\n default:\n break;\n }\n }\n }\n } catch (err) {\n this.log.error(String(err));\n }\n }\n\n async setNextHourStates(obj: any, item: string, hour: string): Promise {\n this.log.debug(`Hours: ${JSON.stringify(obj)}`);\n const json = obj[item];\n try {\n for (const key in json) {\n if (typeof json[key] !== 'object') {\n await this.setState(`Hourly.h${hour}.${key}`, {\n val: json[key],\n ack: true,\n });\n if (key === 'WeatherIcon') {\n await this.setState(`Hourly.h${hour}.WeatherIconURL`, {\n val: `https://developer.accuweather.com/sites/default/files/${String(json[key]).padStart(2, '0')}-s.png`,\n ack: true,\n });\n await this.setState(`Hourly.h${hour}.WeatherIconURLS`, {\n val: `http://vortex.accuweather.com/adc2010/images/slate/icons/${String(json[key]).padStart(2, '0')}.svg`,\n ack: true,\n });\n }\n } else if (typeof json[key] == 'object') {\n if (json[key].Value !== undefined) {\n if (['TotalLiquid', 'Rain', 'Snow', 'Ice'].includes(key)) {\n await this.setState(`Hourly.h${hour}.${key}Volume`, {\n val: json[key].Value,\n ack: true,\n });\n } else {\n await this.setState(`Hourly.h${hour}.${key}`, {\n val: json[key].Value,\n ack: true,\n });\n }\n } else if (key === 'Wind') {\n await this.setState(`Hourly.h${hour}.WindSpeed`, {\n val: json[key].Speed.Value,\n ack: true,\n });\n await this.setState(`Hourly.h${hour}.WindDirection`, {\n val: json[key].Direction.Degrees,\n ack: true,\n });\n await this.setState(`Hourly.h${hour}.WindDirectionText`, {\n val: json[key].Direction.Localized,\n ack: true,\n });\n } else if (key === 'WindGust') {\n await this.setState(`Hourly.h${hour}.WindGust`, {\n val: json[key].Speed.Value,\n ack: true,\n });\n }\n }\n }\n } catch (err) {\n this.log.error(String(err));\n }\n }\n\n async setCurrentStates(obj: any): Promise {\n this.log.debug(`Current: ${JSON.stringify(obj)}`);\n const json = obj[0];\n try {\n for (const key in json) {\n //this.log.debug(\"Current: \" + key + \": \" + typeof json[key]);\n if (typeof json[key] !== 'object' || json[key] == null) {\n await this.setState(`Current.${key}`, { val: json[key], ack: true });\n\n if (key === 'WeatherIcon') {\n await this.setState('Current.WeatherIconURL', {\n val: `https://developer.accuweather.com/sites/default/files/${String(json[key]).padStart(2, '0')}-s.png`,\n ack: true,\n });\n await this.setState('Current.WeatherIconURLS', {\n val: `http://vortex.accuweather.com/adc2010/images/slate/icons/${String(json[key]).padStart(2, '0')}.svg`,\n ack: true,\n });\n await this.setState('Summary.WeatherIconURL', {\n val: `http://vortex.accuweather.com/adc2010/images/slate/icons/${String(json[key]).padStart(2, '0')}.svg`,\n ack: true,\n });\n await this.setState('Summary.WeatherIcon', {\n val: json[key],\n ack: true,\n });\n } else if (key === 'LocalObservationDateTime') {\n const dt = new Date(json[key]);\n const dow = dt.toLocaleString(this.config.language, {\n weekday: 'short',\n });\n await this.setState('Summary.CurrentDateTime', {\n val: json[key],\n ack: true,\n });\n await this.setState('Summary.DayOfWeek', { val: dow, ack: true });\n this.log.debug(\n `Date ${dt.getTime()}, dow: ${dt.toLocaleString(this.config.language, { weekday: 'short' })}`,\n );\n } else {\n await this.setState(`Summary.${key}`, {\n val: json[key],\n ack: true,\n });\n }\n } else if (json[key] !== null) {\n if (json[key][this.config.metric] !== undefined) {\n //this.log.debug(key + \": \" + json[key][this.config.metric].Value);\n await this.setState(`Current.${key}`, {\n val: json[key][this.config.metric].Value,\n ack: true,\n });\n await this.setState(`Summary.${key}`, {\n val: json[key][this.config.metric].Value,\n ack: true,\n });\n } else if (key === 'Wind') {\n await this.setState('Current.WindSpeed', {\n val: json[key].Speed[this.config.metric].Value,\n ack: true,\n });\n await this.setState('Summary.WindSpeed', {\n val: json[key].Speed[this.config.metric].Value,\n ack: true,\n });\n await this.setState('Current.WindDirection', {\n val: json[key].Direction.Degrees,\n ack: true,\n });\n await this.setState('Current.WindDirectionText', {\n val: json[key].Direction.Localized,\n ack: true,\n });\n await this.setState('Summary.WindDirection', {\n val: json[key].Direction.Degrees,\n ack: true,\n });\n await this.setState('Summary.WindDirectionStr', {\n val: this.getCardinalDirection(json[key].Direction.Degrees),\n ack: true,\n });\n } else if (key === 'WindGust') {\n await this.setState('Current.WindGust', {\n val: json[key].Speed[this.config.metric].Value,\n ack: true,\n });\n } else if (key === 'PressureTendency') {\n await this.setState('Current.PressureTendency', {\n val: json[key].LocalizedText,\n ack: true,\n });\n } else if (key === 'Photos' && Array.isArray(json[key])) {\n const l = json[key].length;\n const index = Math.round(Math.random() * (l - 1));\n await this.setState('Current.LandscapeLink', json[key][index].LandscapeLink, true);\n await this.setState('Current.PortraitLink', json[key][index].PortraitLink, true);\n }\n }\n }\n await this.setState('CurrentNextUpdate', Date.now(), true);\n } catch (err) {\n this.log.error(String(err));\n }\n }\n\n async setHourlyStates(obj: any): Promise {\n for (const hr in obj) {\n if (typeof obj[hr] === 'object' && obj[hr].DateTime) {\n const d = new Date(obj[hr].DateTime);\n await this.setNextHourStates(obj, hr, String(d.getHours()));\n }\n }\n await this.setState('HourlyNextUpdate', Date.now(), true);\n }\n\n async request5Days(): Promise {\n if (typeof this.forecast !== 'undefined') {\n const loc = this.config.loKey;\n const lang = this.config.language;\n\n this.forecast = this.forecast.localkey(loc).timeInt('daily/5day').language(lang).details(true).metric(true);\n\n const res = await this.forecast.get();\n await this.setDailyStates(res);\n }\n await this.setState('DailyNextUpdate', Date.now(), true);\n }\n\n async request12Hours(): Promise {\n if (typeof this.forecast !== 'undefined') {\n const loc = this.config.loKey;\n const lang = this.config.language;\n\n this.forecast = this.forecast\n .localkey(loc)\n .timeInt('hourly/12hour')\n .language(lang)\n .details(true)\n .metric(true);\n\n const res = await this.forecast.get();\n await this.setHourlyStates(res);\n }\n }\n\n async requestCurrent(): Promise {\n if (typeof this.forecast !== 'undefined') {\n const loc = this.config.loKey;\n const lang = this.config.language;\n\n this.forecast = this.forecast\n .localkey(loc)\n .timeInt()\n .language(lang)\n .details(true)\n .metric(true)\n .getphotos(true);\n\n const res = await this.forecast.getCurrent();\n await this.setCurrentStates(res);\n }\n }\n\n async onReady(): Promise {\n const nameSpaceObj = await this.getForeignObjectAsync(this.namespace);\n if (!nameSpaceObj) {\n await this.setForeignObject(this.namespace, {\n _id: this.namespace,\n type: 'meta',\n common: { name: 'Accuweather device', type: 'meta.folder' },\n native: {},\n });\n }\n const obj = await this.getForeignObjectAsync(`system.adapter.${this.namespace}`);\n\n if (obj && obj.native && obj.native.apiKey) {\n obj.native.apiKeyEncrypted = this.encrypt(obj.native.apiKey);\n this.config.apiKeyEncrypted = obj.native.apiKey;\n delete obj.native.apiKey;\n await this.setForeignObject(`system.adapter.${this.namespace}`, obj);\n }\n\n if (this.config.metric !== 'Metric' && this.config.metric !== 'Imperial') {\n this.config.metric = 'Metric';\n }\n if (!this.config.language) {\n const systemConfig = await this.getForeignObjectAsync('system.config');\n if (systemConfig && systemConfig.common && systemConfig.common.language) {\n this.config.language = systemConfig.common.language;\n }\n }\n\n //this.log.debug(`API: ${this.config.apiKey}; Loc: ${this.config.loKey} Lang: ${this.config.language}`);\n this.log.debug(`API: ********; Loc: ${this.config.loKey} Lang: ${this.config.language}`);\n\n if (this.config.apiKeyEncrypted) {\n this.forecast = new Accuapi(this.config.apiKeyEncrypted);\n } else {\n this.log.error('API Key is missing. Please enter Accuweather API key');\n return;\n }\n await nextHour.createHourlyForecastObjects(this);\n await nextHour.createCurrentConditionObjects(this);\n await nextHour.createDailyForecastObjects(this);\n await nextHour.createSummaryObjects(this);\n\n await this.extendObject('CurrentNextUpdate', {\n type: 'state',\n common: {\n name: 'Last Update of Current Weather',\n type: 'number',\n role: 'date',\n read: true,\n write: false,\n },\n native: {},\n });\n await this.extendObject('HourlyNextUpdate', {\n type: 'state',\n common: {\n name: 'Last Update of Hourly Weather',\n type: 'number',\n role: 'date',\n read: true,\n write: false,\n },\n native: {},\n });\n await this.extendObject('DailyNextUpdate', {\n type: 'state',\n common: {\n name: 'Last Update of Daily Weather',\n type: 'number',\n role: 'date',\n read: true,\n write: false,\n },\n native: {},\n });\n const startForbidden: { current?: boolean; hourly?: boolean; daily?: boolean } = {};\n\n let state = await this.getStateAsync('CurrentNextUpdate');\n startForbidden.current = !!(state && state.val && Number(state.val) + 66 * 60000 > Date.now()); // every hour + random 5 Minutes + random 10 seconds\n\n state = await this.getStateAsync('HourlyNextUpdate');\n startForbidden.hourly = !!(\n state &&\n state.ts &&\n state.ts +\n (new Date().setHours(7, 5, 0) < Date.now() && new Date().setHours(20, 6, 0) > Date.now() ? 13 : 11) *\n 60 *\n 60000 +\n 360000 >\n Date.now()\n );\n state = await this.getStateAsync('DailyNextUpdate');\n startForbidden.daily = !!(state && state.ts && state.ts + 6 * 60 * 60000 + 360000 > Date.now()); // every 6 hour s+ random 5 Minutes + random 10 seconds\n\n updateInterval = this.setInterval(() => {\n const now = new Date();\n if ((now.getHours() === 7 || now.getHours() === 20) && now.getMinutes() < 5) {\n const _get5DaysTimeout = (): void => {\n timeout1 && this.clearTimeout(timeout1);\n timeout1 = this.setTimeout(\n async () => {\n try {\n timeout1 = null;\n await this.request5Days();\n } catch (error: any) {\n this.log.error(error);\n this.log.info(`Retry in 10 Minutes`);\n timeout1 = this.setTimeout(_get5DaysTimeout, 600000);\n }\n },\n Math.random() * 10000 + 1,\n );\n };\n _get5DaysTimeout();\n }\n if (now.getMinutes() < 5) {\n const _getMinutesTimeout = (): void => {\n timeout2 && this.clearTimeout(timeout2);\n timeout2 = this.setTimeout(\n async () => {\n try {\n timeout2 = null;\n await this.requestCurrent();\n } catch (error: any) {\n this.log.error(error);\n this.log.info(`Retry in 10 Minutes`);\n timeout2 = this.setTimeout(_getMinutesTimeout, 600000);\n }\n },\n Math.random() * 10000 + 1,\n );\n };\n _getMinutesTimeout();\n }\n if (\n (now.getHours() === 6 || now.getHours() === 12 || now.getHours() === 18 || now.getHours() === 0) &&\n now.getMinutes() < 5\n ) {\n const _get12HoursTimeout = (): void => {\n timeout3 && this.clearTimeout(timeout3);\n timeout3 = this.setTimeout(\n async () => {\n try {\n timeout3 = null;\n await this.request12Hours();\n } catch (error: any) {\n this.log.error(error);\n this.log.info(`Retry in 10 Minutes`);\n timeout3 = this.setTimeout(_get12HoursTimeout, 600000);\n }\n },\n Math.random() * 10000 + 1,\n );\n };\n _get12HoursTimeout();\n }\n }, 300000); // 5 minutes\n try {\n if (!startForbidden.hourly) {\n this.log.info('Update hourly weather!');\n await this.request12Hours();\n }\n if (!startForbidden.current) {\n this.log.info('Update current weather!');\n await this.requestCurrent();\n }\n if (!startForbidden.daily) {\n this.log.info('Update daily weather!');\n await this.request5Days();\n }\n } catch (error: any) {\n this.log.error(error);\n }\n\n /*\n For every state in the system, there has to be also an object of type state\n Here a simple template for a boolean variable named \"testVariable\"\n Because every adapter instance uses its own unique namespace variable names can't collide with other adapters variables\n */\n\n await this.extendObject('updateCurrent', {\n type: 'state',\n common: {\n name: 'Update Current Weather',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n },\n native: {},\n });\n await this.extendObject('updateHourly', {\n type: 'state',\n common: {\n name: 'Update 12 Hours Forecast',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n },\n native: {},\n });\n await this.extendObject('updateDaily', {\n type: 'state',\n common: {\n name: 'Update 5 Days Forecast',\n type: 'boolean',\n role: 'button',\n read: false,\n write: true,\n },\n native: {},\n });\n\n // in this template, all states changes inside the adapter's namespace are subscribed\n await this.subscribeStatesAsync('updateCurrent');\n await this.subscribeStatesAsync('updateHourly');\n await this.subscribeStatesAsync('updateDaily');\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n *\n * @param callback - The callback function to be called when the unload process is complete\n */\n private onUnload(callback: () => void): void {\n try {\n this.log.info('cleaned everything up...');\n updateInterval && this.clearInterval(updateInterval);\n updateInterval = null;\n\n timeout1 && this.clearTimeout(timeout1);\n timeout1 = null;\n\n timeout2 && this.clearTimeout(timeout2);\n timeout2 = null;\n\n timeout3 && this.clearTimeout(timeout3);\n timeout3 = null;\n\n callback();\n } catch {\n callback && callback();\n }\n }\n\n /**\n * Is called if a subscribed state changes\n *\n * @param id - The id of the state that changed\n * @param state - The state object that changed\n */\n async onStateChange(id: string, state: ioBroker.State | null | undefined): Promise {\n if (state) {\n if (!state.ack) {\n try {\n // The state was changed\n if (id === `${this.namespace}.updateCurrent`) {\n await this.requestCurrent();\n } else if (id === `${this.namespace}.updateHourly`) {\n await this.request12Hours();\n } else if (id === `${this.namespace}.updateDaily`) {\n await this.request5Days();\n }\n this.log.debug(`state ${id} changed: ${state.val} (ack = ${state.ack})`);\n } catch (error: any) {\n this.log.error(error);\n }\n }\n } else {\n // The state was deleted\n this.log.debug(`state ${id} deleted`);\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial | undefined) => new Accuweather(options);\n} else {\n // otherwise start the instance directly\n (() => new Accuweather())();\n}\n\nexport = Accuweather;\n"], + "mappings": "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", "names": [] } diff --git a/io-package.json b/io-package.json index 2500a4f..6829672 100755 --- a/io-package.json +++ b/io-package.json @@ -1,8 +1,21 @@ { "common": { "name": "accuweather", - "version": "2.0.1", + "version": "2.1.0-alpha.0", "news": { + "2.1.0-alpha.0": { + "en": "Change: min. js-controller to 6.0.11\nChange: Outdated data is updated at startup.\nNew: Photo link added in current weather\nNew: Metric and Imperial are available for selection - Will be taken into account with the next data update.\nNew: In the event of a data retrieval error, an attempt is made again after 10 minute\nRemove admin option (restart blocking)\nRewritten in Typescript", + "de": "Änderung: min. js-controller auf 6.0.11\nÄnderung: Überholte Daten werden beim Start aktualisiert.\nNeu: Fotolink im aktuellen Wetter hinzugefügt\nNeu: Metric und Imperial stehen zur Auswahl - Wird mit dem nächsten Datenupdate berücksichtigt.\nNeu: Bei einem Datenabruffehler wird nach 10 Minuten erneut versucht\nAdmin-Option entfernen (Restart blockieren)\nNeu geschrieben in Typescript", + "ru": "Изменение: мин. js-контроллер до 6.0.11\nИзменение: устаревшие данные обновляются при запуске.\nНовый: Фотоссылка добавлена в текущую погоду\nНовый: Метрик и Империал доступны для выбора - будут приняты во внимание при следующем обновлении данных.\nНовое: В случае ошибки поиска данных, попытка повторяется через 10 минут\nУдалить параметр администратора (перезапуск блокировки)\nПереписанные в Typescript", + "pt": "Mudança: min. js-controller para 6.0.11\nChange: Os dados desatualizados são atualizados na inicialização.\nNovo: Foto link adicionado no tempo atual\nNovo: Metric e Imperial estão disponíveis para seleção - Será levado em conta com a próxima atualização de dados.\nNovo: Em caso de erro de recuperação de dados, uma tentativa é feita novamente após 10 minutos\nRemova a opção admin (reiniciar bloqueio)\nReescrito em Typescript", + "nl": "Wijziging: min. js-controller tot 6.0.11\nVerandering: Verouderde gegevens worden bijgewerkt bij het opstarten.\nNieuw: Foto link toegevoegd bij het huidige weer\nNieuw: Metric en Imperial zijn beschikbaar voor selectie - zal in aanmerking worden genomen bij de volgende gegevensupdate.\nNieuw: Bij een fout bij het ophalen van gegevens wordt na 10 minuten opnieuw een poging ondernomen\nAdmin optie verwijderen (opnieuw blokkeren)\nHerschreven in typescript", + "fr": "Changement : min. js-controller à 6.0.11\nChangement : Les données périmées sont mises à jour au démarrage.\nNouveau: Lien photo ajouté dans la météo actuelle\nNouveau: Metric et Imperial sont disponibles pour la sélection - sera pris en compte avec la prochaine mise à jour des données.\nNouveau: En cas d'erreur de récupération de données, une tentative est faite après 10 minutes\nSupprimer l'option admin (redémarrer le blocage)\nRéécrit dans Typescript", + "it": "Cambio: min. js-controller a 6.0.11\nModifica: i dati obsoleti vengono aggiornati all'avvio.\nNuovo: Collegamento foto aggiunto nel tempo corrente\nNovità: Metric e Imperial sono disponibili per la selezione - Sarà preso in considerazione con il prossimo aggiornamento dati.\nNuovo: In caso di errore di recupero dati, un tentativo viene fatto di nuovo dopo 10 minuti\nRimuovere l'opzione admin (blocco di riavvio)\nRescritto in Tipografia", + "es": "Cambio: min. js-controller a 6.0.11\nCambio: Los datos actualizados se actualizan al iniciarse.\nNuevo: Enlace fotográfico añadido en el tiempo actual\nNuevo: Métrico e Imperial están disponibles para la selección - Se tendrá en cuenta con la siguiente actualización de datos.\nNuevo: En caso de error de recuperación de datos, se vuelve a intentar después de 10 minutos\nEliminar la opción de administración (bloqueo de reinicio)\nReescrito en Tiposcript", + "pl": "Zmiana: min. js- controller do 6.0.11\nZmiana: Zaległe dane są aktualizowane przy starcie.\nNowy: link fotograficzny dodany w obecnej pogodzie\nNowy: Metric i Imperial są dostępne do wyboru - zostaną uwzględnione w następnej aktualizacji danych.\nNowy: W przypadku błędu w odzyskiwaniu danych, próba jest ponownie po 10 minutach\nUsuń opcję admin (ponowne uruchomienie blokady)\nPrzepisane na maszynie", + "uk": "Зміна: хв. js-controller до 6.0.11\nЗміна: Оновлення застарілих даних при запуску.\nНова: Фото посилання, додана в поточну погоду\nНовий: Metric і Imperial доступні для вибору - Буде враховано з наступним оновленням даних.\nНова: У разі перерозподілу даних спроба повторно виконана після 10 хвилин\nВидалити опцію адміністратора (блокування місця)\nПодати заявку", + "zh-cn": "更改:min.js控制器改为6.0.11\n更改:过期数据在启动时更新.\n新建: 在当前天气中添加图片链接\n新增:计量和帝国可供选择 -- -- 将在下一次数据更新时加以考虑.\n新建:如果出现数据检索错误,10分钟后再次尝试\n删除管理选项( 重新开始屏蔽)\n重写字体" + }, "2.0.1": { "en": "BREAKING: Requires Nodejs 20 or higher\nBREAKING: Command states are now buttons and only respond to ack=false. \nadmin option: No data is updated on adapter startup (default: true). \napikey renamed and encrypted\nDependencies and eslint updated\nAdd nextHour.CloudCover", "de": "BREAKING: Erfordert Nodejs 20 oder höher\nBREAKING: Befehlszustände sind jetzt Tasten und reagieren nur auf ack=false.\nadmin-Option: Beim Adapter-Startup werden keine Daten aktualisiert (Standard: true).\napikey umbenannt und verschlüsselt\nAbhängigkeiten und eslint aktualisiert\nNextHour.CloudCover hinzufügen", @@ -80,19 +93,6 @@ "pl": "aktualizacja zależności", "zh-cn": "依赖更新", "uk": "оновлення залежностей" - }, - "1.2.3": { - "en": "HoursOfSun parameter added to Daily forecast", - "de": "HoursOfSun-Parameter zur täglichen Vorhersage hinzugefügt", - "ru": "В суточный прогноз добавлен параметр HoursOfSun", - "pt": "Parâmetro HoursOfSun adicionado à previsão diária", - "nl": "HoursOfSun-parameter toegevoegd aan dagelijkse voorspelling", - "fr": "Paramètre HoursOfSun ajouté aux prévisions quotidiennes", - "it": "Parametro HoursOfSun aggiunto alla previsione giornaliera", - "es": "Parámetro HoursOfSun agregado al pronóstico diario", - "pl": "Dodano parametr HoursOfSun do prognozy dziennej", - "zh-cn": "每日预测中添加了 hoursOfSun 参数", - "uk": "До щоденного прогнозу додано параметр HoursOfSun" } }, "titleLang": { @@ -150,7 +150,7 @@ "dataSource": "poll", "dependencies": [ { - "js-controller": ">=7.0.6" + "js-controller": ">=6.0.11" } ], "globalDependencies": [ diff --git a/package-lock.json b/package-lock.json index f824c61..8bcb7b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "iobroker.accuweather", - "version": "2.0.1", + "version": "2.1.0-alpha.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "iobroker.accuweather", - "version": "2.0.1", + "version": "2.1.0-alpha.0", "license": "MIT", "dependencies": { "@iobroker/adapter-core": "^3.2.3", diff --git a/package.json b/package.json index a699f30..80988e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.accuweather", - "version": "2.0.1", + "version": "2.1.0-alpha.0", "description": "Weather forecast using AccuWeather API", "author": { "name": "algar42", diff --git a/src/main.ts b/src/main.ts index 9edc24a..4ade210 100644 --- a/src/main.ts +++ b/src/main.ts @@ -400,7 +400,7 @@ class Accuweather extends utils.Adapter { }); } else if (key === 'Photos' && Array.isArray(json[key])) { const l = json[key].length; - const index = Math.round(Math.random() * l); + const index = Math.round(Math.random() * (l - 1)); await this.setState('Current.LandscapeLink', json[key][index].LandscapeLink, true); await this.setState('Current.PortraitLink', json[key][index].PortraitLink, true); }