]> git.basschouten.com Git - openhab-addons.git/commitdiff
How to support OpenWeatherMap one call api 3.0. (#13414)
authorrossbuggins <20972856+rossbuggins@users.noreply.github.com>
Sat, 24 Sep 2022 19:15:19 +0000 (20:15 +0100)
committerGitHub <noreply@github.com>
Sat, 24 Sep 2022 19:15:19 +0000 (21:15 +0200)
Add OpenCall API version property.

Allowing for version 3.0 API to be set.

Signed-off-by: Ross Buggins <20972856+rossbuggins@users.noreply.github.com>
bundles/org.openhab.binding.openweathermap/README.md
bundles/org.openhab.binding.openweathermap/src/main/java/org/openhab/binding/openweathermap/internal/config/OpenWeatherMapAPIConfiguration.java
bundles/org.openhab.binding.openweathermap/src/main/java/org/openhab/binding/openweathermap/internal/connection/OpenWeatherMapConnection.java
bundles/org.openhab.binding.openweathermap/src/main/resources/OH-INF/config/config.xml
bundles/org.openhab.binding.openweathermap/src/main/resources/OH-INF/i18n/openweathermap.properties

index bc97a8e314e1e4d40071a0fc0342c5e98df8b247..88fba39574f8ebd0a26dec8ba3aa6f993efd07e9 100644 (file)
@@ -39,6 +39,11 @@ It requires coordinates of the location of your interest.
 Air pollution forecast is available for 5 days with hourly granularity.
 You can add as much `air-pollution` things for different locations to your setup as you like to observe.
 
+#### One Call API Version
+New Subscribers to the One Call API will require setting the API version to 3.0 (The API key will not work with 2.5). Existing subscribers can continue to use their existing API key with version 2.5.
+
+ One Call API Version 3.0 [requires payment details](https://openweathermap.org/price) for future forecast information. However, it is possible to set a [daily API call limit to 1000](https://openweathermap.org/faq#onecall), which will avoid charges. 
+
 ### One Call API Weather and Forecast
 
 The thing `onecall` supports the [current and forecast weather data](https://openweathermap.org/api/one-call-api#how) for a specific location using the One Call API.
index 06c547f159f7867b56bf0cee7f8f680b38d77e1d..b7ebb6e728aa271111c3b51762cbb73b9a6ae251 100644 (file)
@@ -97,8 +97,9 @@ public class OpenWeatherMapConnection {
     // Weather icons (see https://openweathermap.org/weather-conditions)
     private static final String ICON_URL = "https://openweathermap.org/img/w/%s.png";
     // One Call API (see https://openweathermap.org/api/one-call-api )
-    private static final String ONECALL_URL = "https://api.openweathermap.org/data/2.5/onecall";
-    private static final String ONECALL_HISTORY_URL = "https://api.openweathermap.org/data/2.5/onecall/timemachine";
+    private static final String ONECALL_URL = "https://api.openweathermap.org/data";
+    private static final String ONECALL_DATA_SUFFIX_URL = "onecall";
+    private static final String ONECALL_HISTORY_SUFFIX_URL = "onecall/timemachine";
 
     private final OpenWeatherMapAPIHandler handler;
     private final HttpClient httpClient;
@@ -325,7 +326,8 @@ public class OpenWeatherMapConnection {
         if (!exclude.isEmpty()) {
             params.put(PARAM_EXCLUDE, exclude.stream().collect(Collectors.joining(",")));
         }
-        return gson.fromJson(getResponseFromCache(buildURL(ONECALL_URL, params)), OpenWeatherMapOneCallAPIData.class);
+        return gson.fromJson(getResponseFromCache(buildURL(buildOneCallURL(), params)),
+                OpenWeatherMapOneCallAPIData.class);
     }
 
     /**
@@ -346,7 +348,7 @@ public class OpenWeatherMapConnection {
         // the API requests the history as timestamp in Unix time format.
         params.put(PARAM_HISTORY_DATE,
                 Long.toString(ZonedDateTime.now(ZoneId.of("UTC")).minusDays(days).toEpochSecond()));
-        return gson.fromJson(getResponseFromCache(buildURL(ONECALL_HISTORY_URL, params)),
+        return gson.fromJson(getResponseFromCache(buildURL(buildOneCallHistoryURL(), params)),
                 OpenWeatherMapOneCallHistAPIData.class);
     }
 
@@ -383,6 +385,16 @@ public class OpenWeatherMapConnection {
                 .collect(Collectors.joining("&", url + "?", ""));
     }
 
+    private String buildOneCallURL() {
+        var config = handler.getOpenWeatherMapAPIConfig();
+        return ONECALL_URL + "/" + config.apiVersion + "/" + ONECALL_DATA_SUFFIX_URL;
+    }
+
+    private String buildOneCallHistoryURL() {
+        var config = handler.getOpenWeatherMapAPIConfig();
+        return ONECALL_URL + "/" + config.apiVersion + "/" + ONECALL_HISTORY_SUFFIX_URL;
+    }
+
     private String encodeParam(@Nullable String value) {
         return value == null ? "" : URLEncoder.encode(value, StandardCharsets.UTF_8);
     }
index 116c1666000f46009c5c90df4cf9640852bf79a4..728a2c7a96ce6f8cf1e866d91877100e03af1283 100644 (file)
                        <label>API Key</label>
                        <description>API key to access the OpenWeatherMap API.</description>
                </parameter>
+               <parameter name="apiVersion" type="text">
+                       <label>One Call API Version</label>
+                       <description>One Call API version (defaults to 2.5, version 3.0 is available, but needs different subscription).</description>
+                       <default>2.5</default>
+                       <options>
+                               <option value="2.5">2.5</option>
+                               <option value="3.0">3.0</option>
+                       </options>
+               </parameter>
                <parameter name="refreshInterval" type="integer" min="1" unit="min">
                        <label>Refresh Interval</label>
                        <description>Specifies the refresh interval (in minutes).</description>
index dde7aa2918d6ea7c06df52f57d6325b946da3fd9..6f37aa0e52aa98b7faa1a9da657f81cb574098cd 100644 (file)
@@ -76,6 +76,8 @@ thing-type.openweathermap.weather-api.description = Provides access to the OpenW
 
 bridge-type.config.openweathermap.weather-api.apikey.label = API Key
 bridge-type.config.openweathermap.weather-api.apikey.description = API key to access the OpenWeatherMap API.
+bridge-type.config.openweathermap.weather-api.apiVersion.label = One Call API Version
+bridge-type.config.openweathermap.weather-api.apiVersion.description = One Call API version (defaults to 2.5, version 3.0 is available, but needs different subscription).
 bridge-type.config.openweathermap.weather-api.language.label = Language
 bridge-type.config.openweathermap.weather-api.language.description = Language to be used by the OpenWeatherMap API.
 bridge-type.config.openweathermap.weather-api.language.option.af = Afrikaans