From 52afe0acac7b5086fe53ea1875ae5d142e1166a1 Mon Sep 17 00:00:00 2001 From: veeck Date: Sun, 6 Oct 2024 18:37:55 +0200 Subject: [PATCH 1/2] add error to weather njk --- modules/default/weather/current.njk | 4 ++++ modules/default/weather/forecast.njk | 4 ++++ modules/default/weather/hourly.njk | 4 ++++ modules/default/weather/providers/ukmetofficedatahub.js | 1 + tests/e2e/modules/calendar_spec.js | 2 +- 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index 51687231eb..e24aaf95fc 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -90,6 +90,10 @@ {% if config.showHumidity === "below" %} {{ humidity() }} {% endif %} +{% elseif error %} +
+ {{ "MODULE_CONFIG_ERROR" | translate({MODULE_NAME: "Weather", ERROR: error}) | safe }} +
{% else %}
{{ "LOADING" | translate }}
{% endif %} diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index 91fef6ab78..b7f6d549e5 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -39,6 +39,10 @@ {% set currentStep = currentStep + 1 %} {% endfor %} +{% elseif error %} +
+ {{ "MODULE_CONFIG_ERROR" | translate({MODULE_NAME: "Weather", ERROR: error}) | safe }} +
{% else %}
{{ "LOADING" | translate }}
{% endif %} diff --git a/modules/default/weather/hourly.njk b/modules/default/weather/hourly.njk index 05416de7dd..9b1424a350 100644 --- a/modules/default/weather/hourly.njk +++ b/modules/default/weather/hourly.njk @@ -41,6 +41,10 @@ {% set currentStep = currentStep + 1 %} {% endfor %} +{% elseif error %} +
+ {{ "MODULE_CONFIG_ERROR" | translate({MODULE_NAME: "Weather", ERROR: error}) | safe }} +
{% else %}
{{ "LOADING" | translate }}
{% endif %} diff --git a/modules/default/weather/providers/ukmetofficedatahub.js b/modules/default/weather/providers/ukmetofficedatahub.js index 0a9d872c5b..2021a702fa 100644 --- a/modules/default/weather/providers/ukmetofficedatahub.js +++ b/modules/default/weather/providers/ukmetofficedatahub.js @@ -273,6 +273,7 @@ WeatherProvider.register("ukmetofficedatahub", { 30: "thunderstorm" }; + // TODO check for duplicat eand if neeeded return weatherTypes.hasOwnProperty(weatherType) ? weatherTypes[weatherType] : null; } }); diff --git a/tests/e2e/modules/calendar_spec.js b/tests/e2e/modules/calendar_spec.js index 56d2a45ad5..95357a111e 100644 --- a/tests/e2e/modules/calendar_spec.js +++ b/tests/e2e/modules/calendar_spec.js @@ -9,7 +9,7 @@ describe("Calendar module", () => { * @param {string} not reverse result * @returns {boolean} result */ - const testElementLength = async (element, result, not) => { + const testElementLength = async (element, result, not = "") => { const elem = await helpers.waitForAllElements(element); expect(elem).not.toBeNull(); if (not === "not") { From 8d43aaaf4d502c1d3005589efc4daeee8662f09d Mon Sep 17 00:00:00 2001 From: veeck Date: Thu, 18 Sep 2025 13:39:44 +0200 Subject: [PATCH 2/2] handle errors from weatherprovider for now only in openmeteo --- modules/default/weather/current.njk | 6 +-- modules/default/weather/forecast.njk | 6 +-- modules/default/weather/hourly.njk | 6 +-- .../default/weather/providers/openmeteo.js | 27 +++--------- modules/default/weather/weather.js | 42 ++++++++++++------- modules/default/weather/weatherprovider.js | 6 +-- 6 files changed, 43 insertions(+), 50 deletions(-) diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index e24aaf95fc..08ff49c277 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -90,10 +90,8 @@ {% if config.showHumidity === "below" %} {{ humidity() }} {% endif %} -{% elseif error %} -
- {{ "MODULE_CONFIG_ERROR" | translate({MODULE_NAME: "Weather", ERROR: error}) | safe }} -
+ {% elseif error %} +
{{ "MODULE_CONFIG_ERROR" | translate({MODULE_NAME: "Weather", ERROR: error}) | safe }}
{% else %}
{{ "LOADING" | translate }}
{% endif %} diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index b7f6d549e5..00ec9fdc46 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -39,10 +39,8 @@ {% set currentStep = currentStep + 1 %} {% endfor %} -{% elseif error %} -
- {{ "MODULE_CONFIG_ERROR" | translate({MODULE_NAME: "Weather", ERROR: error}) | safe }} -
+ {% elseif error %} +
{{ "MODULE_CONFIG_ERROR" | translate({MODULE_NAME: "Weather", ERROR: error}) | safe }}
{% else %}
{{ "LOADING" | translate }}
{% endif %} diff --git a/modules/default/weather/hourly.njk b/modules/default/weather/hourly.njk index 9b1424a350..2b98d821a5 100644 --- a/modules/default/weather/hourly.njk +++ b/modules/default/weather/hourly.njk @@ -41,10 +41,8 @@ {% set currentStep = currentStep + 1 %} {% endfor %} -{% elseif error %} -
- {{ "MODULE_CONFIG_ERROR" | translate({MODULE_NAME: "Weather", ERROR: error}) | safe }} -
+ {% elseif error %} +
{{ "MODULE_CONFIG_ERROR" | translate({MODULE_NAME: "Weather", ERROR: error}) | safe }}
{% else %}
{{ "LOADING" | translate }}
{% endif %} diff --git a/modules/default/weather/providers/openmeteo.js b/modules/default/weather/providers/openmeteo.js index 38e694a9d9..f2f3f8c543 100644 --- a/modules/default/weather/providers/openmeteo.js +++ b/modules/default/weather/providers/openmeteo.js @@ -143,56 +143,41 @@ WeatherProvider.register("openmeteo", { }, fetchCurrentWeather () { - this.fetchData(this.getUrl()) + return this.fetchData(this.getUrl()) .then((data) => this.parseWeatherApiResponse(data)) .then((parsedData) => { if (!parsedData) { - // No usable data? - return; + throw new Error("No usable data ..."); } - const currentWeather = this.generateWeatherDayFromCurrentWeather(parsedData); this.setCurrentWeather(currentWeather); }) - .catch(function (request) { - Log.error("Could not load data ... ", request); - }) .finally(() => this.updateAvailable()); }, fetchWeatherForecast () { - this.fetchData(this.getUrl()) + return this.fetchData(this.getUrl()) .then((data) => this.parseWeatherApiResponse(data)) .then((parsedData) => { if (!parsedData) { - // No usable data? - return; + throw new Error("No usable data ..."); } - const dailyForecast = this.generateWeatherObjectsFromForecast(parsedData); this.setWeatherForecast(dailyForecast); }) - .catch(function (request) { - Log.error("Could not load data ... ", request); - }) .finally(() => this.updateAvailable()); }, fetchWeatherHourly () { - this.fetchData(this.getUrl()) + return this.fetchData(this.getUrl()) .then((data) => this.parseWeatherApiResponse(data)) .then((parsedData) => { if (!parsedData) { - // No usable data? - return; + throw new Error("No usable data ..."); } - const hourlyForecast = this.generateWeatherObjectsFromHourly(parsedData); this.setWeatherHourly(hourlyForecast); }) - .catch(function (request) { - Log.error("Could not load data ... ", request); - }) .finally(() => this.updateAvailable()); }, diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 8a81b276e1..18a5ec6d62 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -47,6 +47,8 @@ Module.register("weather", { // Module properties. weatherProvider: null, + error: null, + // Can be used by the provider to display location of event if nothing else is specified firstEvent: null, @@ -148,6 +150,12 @@ Module.register("weather", { // Skip some hourly forecast entries if configured const hourlyData = this.weatherProvider.weatherHourly()?.filter((e, i) => (i + 1) % this.config.hourlyForecastIncrements === this.config.hourlyForecastIncrements - 1); + if (this.error) { + return { + error: this.error + }; + } + return { config: this.config, current: currentData, @@ -194,20 +202,26 @@ Module.register("weather", { nextLoad = delay; } - setTimeout(() => { - switch (this.config.type.toLowerCase()) { - case "current": - this.weatherProvider.fetchCurrentWeather(); - break; - case "hourly": - this.weatherProvider.fetchWeatherHourly(); - break; - case "daily": - case "forecast": - this.weatherProvider.fetchWeatherForecast(); - break; - default: - Log.error(`Invalid type ${this.config.type} configured (must be one of 'current', 'hourly', 'daily' or 'forecast')`); + setTimeout(async () => { + try { + switch (this.config.type.toLowerCase()) { + case "current": + await this.weatherProvider.fetchCurrentWeather(); + break; + case "hourly": + this.weatherProvider.fetchWeatherHourly(); + break; + case "daily": + case "forecast": + this.weatherProvider.fetchWeatherForecast(); + break; + default: + Log.error(`Invalid type ${this.config.type} configured (must be one of 'current', 'hourly', 'daily' or 'forecast')`); + } + this.error = null; + } catch (error) { + this.error = error; + this.updateAvailable(); } }, nextLoad); }, diff --git a/modules/default/weather/weatherprovider.js b/modules/default/weather/weatherprovider.js index 0fa24a69b0..890b12dd7a 100644 --- a/modules/default/weather/weatherprovider.js +++ b/modules/default/weather/weatherprovider.js @@ -41,19 +41,19 @@ const WeatherProvider = Class.extend({ // This method should start the API request to fetch the current weather. // This method should definitely be overwritten in the provider. - fetchCurrentWeather () { + async fetchCurrentWeather () { Log.warn(`Weather provider: ${this.providerName} does not subclass the fetchCurrentWeather method.`); }, // This method should start the API request to fetch the weather forecast. // This method should definitely be overwritten in the provider. - fetchWeatherForecast () { + async fetchWeatherForecast () { Log.warn(`Weather provider: ${this.providerName} does not subclass the fetchWeatherForecast method.`); }, // This method should start the API request to fetch the weather hourly. // This method should definitely be overwritten in the provider. - fetchWeatherHourly () { + async fetchWeatherHourly () { Log.warn(`Weather provider: ${this.providerName} does not subclass the fetchWeatherHourly method.`); },