+ * The Timeline API offers complete, global weather data coverage both geographically and chronologically. It always
+ * picks the best available data sources to answer any weather API query. These sources include:
+ *
+ *
Current weather conditions
+ *
Daily historical, forecast and statistical forecast data (depending on dates requested)
+ *
Hourly historical observations and 15-day forecast
+ *
Weather alerts
+ *
Astronomical observations including sunrise, sunset and moon phase.
+ *
+ *
+ * Result data is provided in a common JSON format allowing you to ignore to complex underlying data sources and
+ * focus entirely on your weather data use case. You can also request the result in CSV text format if you prefer.
+ *
+ * @param location (required) Is the address, partial address or latitude,longitude location for which to retrieve
+ * weather data. You can also use US ZIP Codes. If you would like to submit multiple locations in the
+ * same request, consider our Multiple Location Timeline Weather API.
+ * @param unitGroup (optional) The system of units used for the output data. Supported values are us, uk, metric,
+ * base. See Unit groups and measurement units for more information. Defaults to US system of units.
+ * @param lang (optional) Sets the language of the translatable parts of the output such as the conditions field.
+ * Available languages include: ar (Arabic), bg (Bulgiarian), cs (Czech), da (Danish), de (German), el
+ * (Greek Modern), en (English), es (Spanish) ), fa (Farsi), fi (Finnish), fr (French), he Hebrew), hu,
+ * (Hungarian), it (Italian), ja (Japanese), ko (Korean), nl (Dutch), pl (Polish), pt (Portuguese), ru
+ * (Russian), sk (Slovakian), sr (Serbian), sv (Swedish), tr (Turkish), uk (Ukranian), vi (Vietnamese)
+ * and zh (Chinese). In addition passing in ‘id’ will result in the raw descriptor IDs. See How
+ * to create or modify language files for more information on how to help add additional languages.
+ * @param dateFrom (optional) Is the start date for which to retrieve weather data. If a date2 value is also given,
+ * then it represents the first date for which to retrieve weather data. If no date2 is specified then
+ * weather data for a single day is retrieved, and that date is specified in date1. All dates and times
+ * are in local time of the location specified. Dates should be in the format yyyy-MM-dd. For example
+ * 2020-10-19 for October 19th, 2020 or 2017-02-03 for February 3rd, 2017. Instead of an exact date, you
+ * can specify a dynamic
+ * date period. See below for more details. You may also supply the in “UNIX time”. In this case
+ * provide the number of seconds since 1st January 1970 UTC. For example 1612137600 for Midnight on 1st
+ * February 2021. You can also request the information for a specific time for a single date by including
+ * time into the date1 field using the format yyyy-MM-ddTHH:mm:ss. For example 2020-10-19T13:00:00.The
+ * results are returned in the ‘currentConditions’ field and are truncated to the hour requested (i.e.
+ * 2020-10-19T13:59:00 will return data at 2020-10-19T13:00:00).
+ * @param dateTo (optional) Is the end date for which to retrieve weather data. This value may only be used when a
+ * date1 value is given. When both date1 and date2 values are given, the query is inclusive of date2 and
+ * the weather data request period will end on midnight of the date2 value. All dates and times are in
+ * local time of the specified location and should be in the format yyyy-MM-dd.
+ * @return WeatherResponse from server
+ * @throws VisualCrossingApiException in case of an error
+ * @throws VisualCrossingAuthException if the API key is not correct
+ * @throws VisualCrossingRateException if the rate limit was exceeded
+ * @see Timeline
+ * Weather API
+ */
+ public WeatherResponse timeline(String location, @Nullable UnitGroup unitGroup, @Nullable String lang,
+ @Nullable String dateFrom, @Nullable String dateTo)
+ throws VisualCrossingApiException, VisualCrossingAuthException, VisualCrossingRateException {
+ if (unitGroup == null) {
+ unitGroup = METRIC;
+ }
+ if (dateFrom == null && dateTo != null) {
+ throw new VisualCrossingApiException("When passing dateTo you also need to pass dateFrom!");
+ }
+
+ var escapedLocation = URLEncoder.encode(location, UTF_8).replaceAll("\\+", "%20");
+
+ var url = new StringBuilder(baseUrl)//
+ .append("/VisualCrossingWebServices/rest/services/timeline/")//
+ .append(escapedLocation);
+ if (dateFrom != null) {
+ url.append("/").append(dateFrom);
+ if (dateTo != null) {
+ url.append("/").append(dateTo);
+ }
+ }
+ url.append("?key=").append(apiKey)//
+ .append("&contentType=json")//
+ .append("&unitGroup=").append(unitGroup.unit);
+ if (lang != null && !lang.isEmpty()) {
+ url.append("&lang=").append(lang);
+ }
+ var response = restClient.get(url.toString());
+
+ try {
+ var weatherResponse = requireNonNull(gson.fromJson(response, WeatherResponse.class));
+ addCost(weatherResponse);
+ return weatherResponse;
+ } catch (JsonSyntaxException e) {
+ var target = WeatherResponse.class.getSimpleName();
+ if (logger.isTraceEnabled()) {
+ logger.trace("Cannot parse {} from JSON:\n{}", target, response, e);
+ } else {
+ logger.debug("Cannot parse {} from JSON", target, e);
+ }
+ throw new VisualCrossingApiException("Cannot parse %s from JSON!".formatted(target), e);
+ }
+ }
+
+ private void addCost(Cost cost) {
+ var c = cost.queryCost();
+ if (c != null) {
+ this.cost.addAndGet(c);
+ }
+ }
+
+ public long getCurrentCost() {
+ return cost.get();
+ }
+
+ /**
+ * @see Unit
+ * groups and measurement units
+ */
+ public enum UnitGroup {
+ METRIC("metric"),
+ US("us"),
+ UK("uk");
+
+ private final String unit;
+
+ UnitGroup(String unit) {
+ this.unit = unit;
+ }
+ }
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApiException.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApiException.java
new file mode 100644
index 0000000000000..2b06fea077849
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApiException.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api;
+
+import java.io.Serial;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public class VisualCrossingApiException extends Exception {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ public VisualCrossingApiException() {
+ }
+
+ public VisualCrossingApiException(String message) {
+ super(message);
+ }
+
+ public VisualCrossingApiException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public VisualCrossingApiException(Throwable cause) {
+ super(cause);
+ }
+
+ public VisualCrossingApiException(String message, Throwable cause, boolean enableSuppression,
+ boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingAuthException.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingAuthException.java
new file mode 100644
index 0000000000000..7db9fe4c93c22
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingAuthException.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api;
+
+import java.io.Serial;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public class VisualCrossingAuthException extends Exception {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ public VisualCrossingAuthException() {
+ }
+
+ public VisualCrossingAuthException(String message) {
+ super(message);
+ }
+
+ public VisualCrossingAuthException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public VisualCrossingAuthException(Throwable cause) {
+ super(cause);
+ }
+
+ public VisualCrossingAuthException(String message, Throwable cause, boolean enableSuppression,
+ boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingRateException.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingRateException.java
new file mode 100644
index 0000000000000..0b771be0f40a3
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingRateException.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api;
+
+import java.io.Serial;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public class VisualCrossingRateException extends Exception {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ public VisualCrossingRateException() {
+ }
+
+ public VisualCrossingRateException(String message) {
+ super(message);
+ }
+
+ public VisualCrossingRateException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public VisualCrossingRateException(Throwable cause) {
+ super(cause);
+ }
+
+ public VisualCrossingRateException(String message, Throwable cause, boolean enableSuppression,
+ boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/Cost.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/Cost.java
new file mode 100644
index 0000000000000..7348414a91c81
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/Cost.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api.dto;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public interface Cost {
+ @Nullable
+ Integer queryCost();
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/CurrentConditions.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/CurrentConditions.java
new file mode 100644
index 0000000000000..0bb7278da3eb4
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/CurrentConditions.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api.dto;
+
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public record CurrentConditions(@Nullable String datetime, @Nullable Long datetimeEpoch, @Nullable Double temp,
+ @Nullable Double feelslike, @Nullable Double humidity, @Nullable Double dew, @Nullable Double precip,
+ @Nullable Double precipprob, @Nullable Double snow, @Nullable Double snowdepth, @Nullable String preciptype,
+ @Nullable Double windgust, @Nullable Double windspeed, @Nullable Double winddir, @Nullable Double pressure,
+ @Nullable Double visibility, @Nullable Double cloudcover, @Nullable Double solarradiation,
+ @Nullable Double solarenergy, @Nullable Double uvindex, @Nullable String conditions, @Nullable String icon,
+ @Nullable List stations, @Nullable String source, @Nullable String sunrise, @Nullable Long sunriseEpoch,
+ @Nullable String sunset, @Nullable Long sunsetEpoch, @Nullable Double moonphase) {
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/Day.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/Day.java
new file mode 100644
index 0000000000000..19a83ac5b0b0f
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/Day.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api.dto;
+
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public record Day(@Nullable String datetime, @Nullable Long datetimeEpoch, @Nullable Double tempmax,
+ @Nullable Double tempmin, @Nullable Double temp, @Nullable Double feelslikemax, @Nullable Double feelslikemin,
+ @Nullable Double feelslike, @Nullable Double dew, @Nullable Double humidity, @Nullable Double precip,
+ @Nullable Double precipprob, @Nullable Double precipcover, @Nullable List preciptype,
+ @Nullable Double snow, @Nullable Double snowdepth, @Nullable Double windgust, @Nullable Double windspeed,
+ @Nullable Double winddir, @Nullable Double pressure, @Nullable Double cloudcover, @Nullable Double visibility,
+ @Nullable Double solarradiation, @Nullable Double solarenergy, @Nullable Double uvindex,
+ @Nullable Double severerisk, @Nullable String sunrise, @Nullable Long sunriseEpoch, @Nullable String sunset,
+ @Nullable Long sunsetEpoch, @Nullable Double moonphase, @Nullable String conditions,
+ @Nullable String description, @Nullable String icon, @Nullable List stations, @Nullable String source,
+ @Nullable List hours) {
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/Hour.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/Hour.java
new file mode 100644
index 0000000000000..f2a934b03355b
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/Hour.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api.dto;
+
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public record Hour(@Nullable String datetime, @Nullable Long datetimeEpoch, @Nullable Double temp,
+ @Nullable Double feelslike, @Nullable Double humidity, @Nullable Double dew, @Nullable Double precip,
+ @Nullable Double precipprob, @Nullable Double snow, @Nullable Double snowdepth,
+ @Nullable List preciptype, @Nullable Double windgust, @Nullable Double windspeed,
+ @Nullable Double winddir, @Nullable Double pressure, @Nullable Double visibility, @Nullable Double cloudcover,
+ @Nullable Double solarradiation, @Nullable Double solarenergy, @Nullable Double uvindex,
+ @Nullable Double severerisk, @Nullable String conditions, @Nullable String icon,
+ @Nullable List stations, @Nullable String source) {
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/WeatherResponse.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/WeatherResponse.java
new file mode 100644
index 0000000000000..2819cb9eac49a
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/dto/WeatherResponse.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api.dto;
+
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public record WeatherResponse(@Nullable Integer queryCost, @Nullable Double latitude, @Nullable Double longitude,
+ @Nullable String resolvedAddress, @Nullable String address, @Nullable String timezone,
+ @Nullable Double tzoffset, @Nullable String description, @Nullable List days,
+ @Nullable CurrentConditions currentConditions) implements Cost {
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/ApiClient.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/ApiClient.java
new file mode 100644
index 0000000000000..3ec6089ffd9f3
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/ApiClient.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api.rest;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpResponseException;
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.client.util.StringContentProvider;
+import org.openhab.binding.visualcrossing.internal.api.VisualCrossingApiException;
+import org.openhab.binding.visualcrossing.internal.api.VisualCrossingAuthException;
+import org.openhab.binding.visualcrossing.internal.api.VisualCrossingRateException;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public class ApiClient implements RestClient {
+ private static final int TIMEOUT = 10;
+ private static final int IDLE_TIMEOUT = TIMEOUT;
+ private final HttpClient client;
+
+ public ApiClient(HttpClient client) {
+ this.client = client;
+ if (this.client.isStopped()) {
+ throw new IllegalStateException("HttpClient is stopped");
+ }
+ }
+
+ @Override
+ public @Nullable String get(String url, @Nullable Header... headers)
+ throws VisualCrossingApiException, VisualCrossingAuthException, VisualCrossingRateException {
+ var request = client.newRequest(url);
+ return execute(request, headers, url);
+ }
+
+ @Override
+ public @Nullable String post(String url, @Nullable Content content, @Nullable Header... headers)
+ throws VisualCrossingApiException, VisualCrossingAuthException, VisualCrossingRateException {
+ var request = client.POST(url);
+ if (content != null) {
+ request.content(new StringContentProvider(content.body()), content.type());
+ }
+ return execute(request, headers, url);
+ }
+
+ @SuppressWarnings("ConstantValue")
+ private @Nullable String execute(Request request, @Nullable Header[] headers, String url)
+ throws VisualCrossingApiException, VisualCrossingAuthException, VisualCrossingRateException {
+ try {
+ if (headers != null) {
+ for (var header : headers) {
+ if (header == null) {
+ continue;
+ }
+ for (var value : header.values()) {
+ request.header(header.name(), value);
+ }
+ }
+ }
+ request.timeout(TIMEOUT, SECONDS);
+ request.idleTimeout(IDLE_TIMEOUT, SECONDS);
+ var response = request.send();
+ var status = response.getStatus();
+ if (status < 200 || status >= 399) {
+ throw new HttpVisualCrossingApiException(status, response.getReason());
+ }
+ return response.getContentAsString();
+ } catch (RuntimeException | TimeoutException | ExecutionException | InterruptedException ex) {
+ Throwable cause = ex;
+ while (cause != null) {
+ if (cause instanceof HttpResponseException hte) {
+ var response = hte.getResponse();
+ int status = response.getStatus();
+ if (status == 401) {
+ throw new VisualCrossingAuthException();
+ }
+ if (status == 429) {
+ throw new VisualCrossingRateException();
+ }
+ throw new HttpVisualCrossingApiException(response.getStatus(), response.getReason(), hte);
+ }
+ cause = cause.getCause();
+ }
+ throw new VisualCrossingApiException("Error while executing request to " + url, ex);
+ }
+ }
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/HttpVisualCrossingApiException.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/HttpVisualCrossingApiException.java
new file mode 100644
index 0000000000000..170730186d4fb
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/HttpVisualCrossingApiException.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api.rest;
+
+import java.io.Serial;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jetty.client.HttpResponseException;
+import org.openhab.binding.visualcrossing.internal.api.VisualCrossingApiException;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public class HttpVisualCrossingApiException extends VisualCrossingApiException {
+ @Serial
+ private static final long serialVersionUID = 1L;
+ private final int code;
+ private final String msg;
+
+ public HttpVisualCrossingApiException(int code, String msg, HttpResponseException e) {
+ super("HTTP Error %s: %s".formatted(code, msg), e);
+ this.code = code;
+ this.msg = msg;
+ }
+
+ public HttpVisualCrossingApiException(int code, String msg) {
+ super("HTTP Error %s: %s".formatted(code, msg));
+ this.code = code;
+ this.msg = msg;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/RestClient.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/RestClient.java
new file mode 100644
index 0000000000000..6f203c734e668
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/RestClient.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api.rest;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.visualcrossing.internal.api.VisualCrossingApiException;
+import org.openhab.binding.visualcrossing.internal.api.VisualCrossingAuthException;
+import org.openhab.binding.visualcrossing.internal.api.VisualCrossingRateException;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public interface RestClient {
+ /**
+ * GET request to server
+ *
+ * @param url to send request
+ * @param headers to send
+ * @return response from server
+ */
+ @Nullable
+ String get(String url, @Nullable Header... headers)
+ throws VisualCrossingApiException, VisualCrossingAuthException, VisualCrossingRateException;
+
+ /**
+ * POST request to server
+ *
+ * @param url to send request
+ * @param headers to send
+ * @param content to send
+ * @return response from server
+ */
+ @Nullable
+ String post(String url, Content content, @Nullable Header... headers)
+ throws VisualCrossingApiException, VisualCrossingAuthException, VisualCrossingRateException;
+
+ /**
+ * Represents content with a body and a type.
+ */
+ record Content(String body, String type) {
+ /**
+ * Creates a Content instance with the given body and default type ("application/json").
+ *
+ * @param body The content body.
+ */
+ public Content(String body) {
+ this(body, APPLICATION_JSON);
+ }
+ }
+
+ /**
+ * Represents an HTTP header with a name and a list of values.
+ */
+ record Header(String name, List values) {
+ /**
+ * Creates a Header instance with the given name and a single value.
+ *
+ * @param name The header name.
+ * @param value The header value.
+ */
+ public Header(String name, String value) {
+ this(name, List.of(value));
+ }
+ }
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/RetryHttpClient.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/RetryHttpClient.java
new file mode 100644
index 0000000000000..b2232003c0cf2
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/rest/RetryHttpClient.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api.rest;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.visualcrossing.internal.api.VisualCrossingApiException;
+import org.openhab.binding.visualcrossing.internal.api.VisualCrossingAuthException;
+import org.openhab.binding.visualcrossing.internal.api.VisualCrossingRateException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public class RetryHttpClient implements RestClient {
+ private final Logger logger = LoggerFactory.getLogger(RetryHttpClient.class);
+ private final RestClient restClient;
+ private final int maxRetries;
+
+ public RetryHttpClient(RestClient restClient, int maxRetries) {
+ this.restClient = restClient;
+ if (maxRetries <= 0) {
+ throw new IllegalArgumentException("maxRetries cannot be lower or equal to 0, but was " + maxRetries);
+ }
+ this.maxRetries = maxRetries;
+ }
+
+ @Override
+ public @Nullable String get(String url, @Nullable Header... headers)
+ throws VisualCrossingApiException, VisualCrossingAuthException, VisualCrossingRateException {
+ for (int i = 0; i < maxRetries; i++) {
+ try {
+ return restClient.get(url, headers);
+ } catch (VisualCrossingApiException ex) {
+ if (i < maxRetries - 1) {
+ logger.debug("Error while calling GET {}. Retrying {}/{}...", url, i + 1, maxRetries, ex);
+ } else {
+ throw ex;
+ }
+ }
+ }
+ throw new IllegalStateException("Should not happen!");
+ }
+
+ @Override
+ public @Nullable String post(String url, Content content, @Nullable Header... headers)
+ throws VisualCrossingAuthException, VisualCrossingApiException, VisualCrossingRateException {
+ for (int i = 0; i < maxRetries; i++) {
+ try {
+ return restClient.post(url, content, headers);
+ } catch (VisualCrossingApiException ex) {
+ if (i < maxRetries - 1) {
+ logger.debug("Error while calling POST {}. Retrying {}/{}...", url, i + 1, maxRetries, ex);
+ } else {
+ throw ex;
+ }
+ }
+ }
+ throw new IllegalStateException("Should not happen!");
+ }
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/addon/addon.xml b/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/addon/addon.xml
new file mode 100644
index 0000000000000..4e8896b35c1d2
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/addon/addon.xml
@@ -0,0 +1,15 @@
+
+
+
+ binding
+ Visual Crossing Binding
+
+ Visual Crossing Weather is the easiest-to-use and lowest-cost source for historical and forecast weather
+ data. Weather API (https://www.visualcrossing.com/weather-api) is designed to integrate easily into any app or
+ code.
+
+ cloud
+
+
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/i18n/visualcrossing.properties b/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/i18n/visualcrossing.properties
new file mode 100644
index 0000000000000..f0b55b7960077
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/i18n/visualcrossing.properties
@@ -0,0 +1,544 @@
+# add-on
+
+addon.visualcrossing.name = Visual Crossing Binding
+addon.visualcrossing.description = Visual Crossing Weather is the easiest-to-use and lowest-cost source for historical and forecast weather data. Weather API (https://www.visualcrossing.com/weather-api) is designed to integrate easily into any app or code.
+
+# thing types
+
+thing-type.visualcrossing.weather.label = Total Weather Data
+thing-type.visualcrossing.weather.description = Historical Weather Data & Weather Forecast Data
+thing-type.visualcrossing.weather.group.day01.label = Day T+1
+thing-type.visualcrossing.weather.group.day02.label = Day T+2
+thing-type.visualcrossing.weather.group.day03.label = Day T+3
+thing-type.visualcrossing.weather.group.day04.label = Day T+4
+thing-type.visualcrossing.weather.group.day05.label = Day T+5
+thing-type.visualcrossing.weather.group.day06.label = Day T+6
+thing-type.visualcrossing.weather.group.day07.label = Day T+7
+thing-type.visualcrossing.weather.group.day08.label = Day T+8
+thing-type.visualcrossing.weather.group.day09.label = Day T+9
+thing-type.visualcrossing.weather.group.day10.label = Day T+10
+thing-type.visualcrossing.weather.group.day11.label = Day T+11
+thing-type.visualcrossing.weather.group.day12.label = Day T+12
+thing-type.visualcrossing.weather.group.day13.label = Day T+13
+thing-type.visualcrossing.weather.group.day14.label = Day T+14
+thing-type.visualcrossing.weather.group.day15.label = Day T+15
+
+# thing types config
+
+thing-type.config.visualcrossing.weather.apiKey.label = API Key
+thing-type.config.visualcrossing.weather.apiKey.description = API Key to connect to the cloud.
+thing-type.config.visualcrossing.weather.hostname.label = Hostname
+thing-type.config.visualcrossing.weather.hostname.description = Hostname or IP address of the server
+thing-type.config.visualcrossing.weather.httpRetries.label = HTTP Retries
+thing-type.config.visualcrossing.weather.httpRetries.description = How many times retry requests.
+thing-type.config.visualcrossing.weather.lang.label = Language
+thing-type.config.visualcrossing.weather.lang.description = Sets the language of the translatable parts of the output such as the conditions field.
+thing-type.config.visualcrossing.weather.lang.option.ar = Arabic
+thing-type.config.visualcrossing.weather.lang.option.bg = Bulgarian
+thing-type.config.visualcrossing.weather.lang.option.cs = Czech
+thing-type.config.visualcrossing.weather.lang.option.da = Danish
+thing-type.config.visualcrossing.weather.lang.option.de = German
+thing-type.config.visualcrossing.weather.lang.option.el = Greek
+thing-type.config.visualcrossing.weather.lang.option.en = English
+thing-type.config.visualcrossing.weather.lang.option.es = Spanish
+thing-type.config.visualcrossing.weather.lang.option.fa = Persian
+thing-type.config.visualcrossing.weather.lang.option.fi = Farsi
+thing-type.config.visualcrossing.weather.lang.option.fr = French
+thing-type.config.visualcrossing.weather.lang.option.he = Hebrew
+thing-type.config.visualcrossing.weather.lang.option.hu = Hungarian
+thing-type.config.visualcrossing.weather.lang.option.it = Italian
+thing-type.config.visualcrossing.weather.lang.option.ja = Japanese
+thing-type.config.visualcrossing.weather.lang.option.ko = Korean
+thing-type.config.visualcrossing.weather.lang.option.nl = Dutch
+thing-type.config.visualcrossing.weather.lang.option.pl = Polish
+thing-type.config.visualcrossing.weather.lang.option.pt = Portuguese
+thing-type.config.visualcrossing.weather.lang.option.ru = Russian
+thing-type.config.visualcrossing.weather.lang.option.sk = Slovakian
+thing-type.config.visualcrossing.weather.lang.option.sr = Serbian
+thing-type.config.visualcrossing.weather.lang.option.sv = Swedish
+thing-type.config.visualcrossing.weather.lang.option.tr = Turkish
+thing-type.config.visualcrossing.weather.lang.option.uk = Ukrainian
+thing-type.config.visualcrossing.weather.lang.option.vi = Vietnamese
+thing-type.config.visualcrossing.weather.lang.option.zh = Chinese
+thing-type.config.visualcrossing.weather.location.label = Location
+thing-type.config.visualcrossing.weather.location.description = Is the address, partial address or latitude,longitude location for which to retrieve weather data. You can also use US ZIP Codes.
+thing-type.config.visualcrossing.weather.refreshInterval.label = Refresh Interval
+thing-type.config.visualcrossing.weather.refreshInterval.description = Interval the device is polled in sec (default 1h).
+
+# channel group types
+
+channel-group-type.visualcrossing.basic-channel-group.label = Basic Info
+channel-group-type.visualcrossing.current-conditions-channel-group.label = Current Conditions
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.dew.label = Dew
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.dew.description = Dew point temperature
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.feels-like.label = Feels Like
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.sunrise-epoch.label = Sunrise Epoch
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.sunrise-epoch.description = Sunrise time specified as number of seconds since 1st January 1970 in UTC time
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.sunset-epoch.label = Sunset Epoch
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.sunset-epoch.description = Sunset time specified as number of seconds since 1st January 1970 in UTC time
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.label = Day
+channel-group-type.visualcrossing.day-channel-group.channel.dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.feels-like-max.label = Feels Like (max)
+channel-group-type.visualcrossing.day-channel-group.channel.feels-like-max.description = Maximum feels like temperature at the location.
+channel-group-type.visualcrossing.day-channel-group.channel.feels-like-min.label = Feels Like (min)
+channel-group-type.visualcrossing.day-channel-group.channel.feels-like-min.description = Minimum feels like temperature at the location.
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-dew.label = Dew
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-dew.description = Dew point temperature
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-feels-like.label = Feels Like
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-feels-like.description = What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.pressure.description = The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+channel-group-type.visualcrossing.day-channel-group.channel.snow-depth.label = Snow Depth
+channel-group-type.visualcrossing.day-channel-group.channel.snow-depth.description = The depth of snow on the ground
+channel-group-type.visualcrossing.day-channel-group.channel.sunrise-epoch.label = Sunrise Epoch
+channel-group-type.visualcrossing.day-channel-group.channel.sunrise-epoch.description = Sunrise time specified as number of seconds since 1st January 1970 in UTC time
+channel-group-type.visualcrossing.day-channel-group.channel.sunset-epoch.label = Sunset Epoch
+channel-group-type.visualcrossing.day-channel-group.channel.sunset-epoch.description = Sunset time specified as number of seconds since 1st January 1970 in UTC time
+channel-group-type.visualcrossing.day-channel-group.channel.temperature.description = Temperature at the location. Daily values are average values (mean) for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.temperature-max.label = Maximum Temperature
+channel-group-type.visualcrossing.day-channel-group.channel.temperature-max.description = Maximum temperature at the location.
+channel-group-type.visualcrossing.day-channel-group.channel.temperature-min.label = Minimum Temperature
+channel-group-type.visualcrossing.day-channel-group.channel.temperature-min.description = Minimum temperature at the location.
+channel-group-type.visualcrossing.day-channel-group.channel.uv-index.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+channel-group-type.visualcrossing.day-channel-group.channel.wind-dir.description = Direction from which the wind is blowing
+channel-group-type.visualcrossing.day-channel-group.channel.wind-gust.label = Wind Gust
+channel-group-type.visualcrossing.day-channel-group.channel.wind-gust.description = Instantaneous wind speed at a location – May be empty if it is not significantly higher than the wind speed. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+
+# channel types
+
+channel-type.visualcrossing.cloud-cover-channel.label = Cloud Cover
+channel-type.visualcrossing.cloud-cover-channel.description = How much of the sky is covered in cloud ranging from 0–100%
+channel-type.visualcrossing.conditions-channel.label = Conditions
+channel-type.visualcrossing.conditions-channel.description = Textual representation of the weather conditions. See Weather Data Conditions (https://www.visualcrossing.com/resources/documentation/weather-api/weather-condition-fields/).
+channel-type.visualcrossing.cost-channel.label = Current Cost
+channel-type.visualcrossing.cost-channel.description = How much API tokens thing used since start
+channel-type.visualcrossing.description-channel.label = Description
+channel-type.visualcrossing.description-channel.description = Longer text descriptions suitable for displaying in weather displays. The descriptions combine the main features of the weather for the day such as precipitation or amount of cloud cover. Daily descriptions are provided for historical and forecast days. When the timeline request includes the model forecast period, a seven day outlook description is provided at the root response level.
+channel-type.visualcrossing.icon-channel.label = Icon
+channel-type.visualcrossing.icon-channel.description = A fixed, machine readable summary that can be used to display an icon
+channel-type.visualcrossing.moon-phase-channel.label = Moon Phase
+channel-type.visualcrossing.moon-phase-channel.description = Represents the fractional portion through the current moon lunation cycle ranging from 0 (the new moon) to 0.5 (the full moon) and back to 1 (the next new moon).
+channel-type.visualcrossing.precip-channel.label = Precip
+channel-type.visualcrossing.precip-channel.description = The amount of liquid precipitation that fell or is predicted to fall in the period. This includes the liquid-equivalent amount of any frozen precipitation such as snow or ice.
+channel-type.visualcrossing.precip-cover-channel.label = Precip Cover
+channel-type.visualcrossing.precip-cover-channel.description = The proportion of hours where there was non-zero precipitation
+channel-type.visualcrossing.precip-prob-channel.label = Precip Prob
+channel-type.visualcrossing.precip-prob-channel.description = The likelihood of measurable precipitation ranging from 0% to 100%
+channel-type.visualcrossing.precip-type-channel.label = Precip Type
+channel-type.visualcrossing.precip-type-channel.description = An comma separated array indicating the type(s) of precipitation expected or that occurred. Possible values include `rain`, `snow`, `freezingrain` and `ice`.
+channel-type.visualcrossing.severe-risk-channel.label = Severe Risk
+channel-type.visualcrossing.severe-risk-channel.description = A value between 0 and 100 representing the risk of convective storms (e.g. thunderstorms, hail and tornadoes). Severe risk is a scaled measure that combines a variety of other fields such as the convective availabel potential energy (CAPE) and convective inhibition (CIN), predicted rain and wind. Typically, a severe risk value less than 30 indicates a low risk, between 30 and 70 a moderate risk and above 70 a high risk.
+channel-type.visualcrossing.snow-channel.label = Snow
+channel-type.visualcrossing.snow-channel.description = The amount of snow that fell or is predicted to fall
+channel-type.visualcrossing.snow-depth-channel.label = Snow
+channel-type.visualcrossing.solar-energy-channel.label = Solar Energy
+channel-type.visualcrossing.solar-energy-channel.description = (MJ /m^2) Indicates the total energy from the sun that builds up over an hour or day. See the full solar radiation data documentation (https://www.visualcrossing.com/resources/documentation/weather-data/how-to-obtain-solar-radiation-data/) and Wind and Solar Energy (https://www.visualcrossing.com/resources/documentation/weather-api/energy-elements-in-the-timeline-weather-api/) pages.
+channel-type.visualcrossing.solar-radiation-channel.label = Solar Radiation
+channel-type.visualcrossing.solar-radiation-channel.description = The solar radiation power at the instantaneous moment of the observation (or forecast prediction). See the full solar radiation data documentation (https://www.visualcrossing.com/resources/documentation/weather-data/how-to-obtain-solar-radiation-data/) and Wind and Solar Energy (https://www.visualcrossing.com/resources/documentation/weather-api/energy-elements-in-the-timeline-weather-api/) pages.
+channel-type.visualcrossing.source-channel.label = Source
+channel-type.visualcrossing.source-channel.description = The type of weather data used for this weather object. – Values include historical observation (“obs”), forecast (“fcst”), historical forecast (“histfcst”) or statistical forecast (“stats”). If multiple types are used in the same day, “comb” is used. Today a combination of historical observations and forecast data.
+channel-type.visualcrossing.stations-channel.label = Stations
+channel-type.visualcrossing.stations-channel.description = The weather stations (comma separated) used when collecting an historical observation record
+channel-type.visualcrossing.sunrise-channel.label = Sunrise
+channel-type.visualcrossing.sunrise-channel.description = The formatted time of the sunrise (For example “2022-05-23T05:50:40”). See How to include sunrise, sunset, moon phase, moonrise and moonset data into your API requests (https://www.visualcrossing.com/resources/documentation/weather-api/how-to-include-sunrise-sunset-and-moon-phase-data-into-your-api-requests/)
+channel-type.visualcrossing.sunset-channel.label = Sunset
+channel-type.visualcrossing.sunset-channel.description = The formatted time of the sunset (For example “2022-05-23T20:22:29”).
+channel-type.visualcrossing.temperature-channel.label = Temperature
+channel-type.visualcrossing.time-channel.label = Time
+channel-type.visualcrossing.time-channel.description = In format HH:mm:ss
+channel-type.visualcrossing.timestamp-channel.label = Time Stamp
+channel-type.visualcrossing.visibility-channel.label = Visibility
+channel-type.visualcrossing.visibility-channel.description = Distance at which distant objects are visible
+
+# channel types
+
+channel-type.visualcrossing.dew-channel.label = Dew
+channel-type.visualcrossing.dew-channel.description = dew point temperature
+channel-type.visualcrossing.feels-like-channel.label = Feels Like
+channel-type.visualcrossing.feels-like-channel.description = what the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day.
+channel-type.visualcrossing.humidity-channel.label = Humidity
+channel-type.visualcrossing.humidity-channel.description = relative humidity in %
+
+# channel types
+
+channel-type.visualcrossing.uv-index-channel.label = UV Index
+channel-type.visualcrossing.uv-index-channel.description = A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10 represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of short wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and location altitude. Daily values represent the maximum value of the hourly values.
+
+# channel group types
+
+channel-group-type.visualcrossing.current-conditions-channel-group.channel.system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+
+# channel group types
+
+channel-group-type.visualcrossing.day-channel-group.channel.hour00-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour01-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour02-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour03-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour04-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour05-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour06-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour07-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour08-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour09-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour10-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour11-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour12-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour13-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour14-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour15-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour16-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour17-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour18-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour19-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour20-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour21-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour22-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.hour23-system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+channel-group-type.visualcrossing.day-channel-group.channel.system.wind-speed.description = The sustained wind speed measured as the average windspeed that occurs during the preceding one to two minutes. Daily values are the maximum hourly value for the day.
+
+# add-on
+
+action.description.location = Is the address, partial address or latitude,longitude location for which to retrieve weather data. You can also use US ZIP Codes. If you would like to submit multiple locations in the same request, consider our Multiple Location Timeline Weather API
+action.description.unitGroup = The system of units used for the output data. Supported values are us, uk, metric, base. See Unit groups and measurement units for more information. Defaults to US system of units.
+action.description.lang = Sets the language of the translatable parts of the output such as the conditions field. Available languages include: ar (Arabic), bg (Bulgiarian), cs (Czech), da (Danish), de (German), el (Greek Modern), en (English), es (Spanish) ), fa (Farsi), fi (Finnish), fr (French), he Hebrew), hu, (Hungarian), it (Italian), ja (Japanese), ko (Korean), nl (Dutch), pl (Polish), pt (Portuguese), ru (Russian), sk (Slovakian), sr (Serbian), sv (Swedish), tr (Turkish), uk (Ukranian), vi (Vietnamese) and zh (Chinese). In addition passing in 'id' will result in the raw descriptor IDs. See How to create or modify language files for more information on how to help add additional languages.
+action.description.dateFrom = Is the start date for which to retrieve weather data. If a date2 value is also given, then it represents the first date for which to retrieve weather data. If no date2 is specified then weather data for a single day is retrieved, and that date is specified in date1. All dates and times are in local time of the location specified. Dates should be in the format yyyy-MM-dd. For example 2020-10-19 for October 19th, 2020 or 2017-02-03 for February 3rd, 2017. Instead of an exact date, you can specify a dynamic date period. See below for more details. You may also supply the in "UNIX time". In this case provide the number of seconds since 1st January 1970 UTC. For example 1612137600 for Midnight on 1st February 2021. You can also request the information for a specific time for a single date by including time into the date1 field using the format yyyy-MM-ddTHH:mm:ss. For example 2020-10-19T13:00:00.The results are returned in the 'currentConditions' field and are truncated to the hour requested (i.e. 2020-10-19T13:59:00 will return data at 2020-10-19T13:00:00).
+action.description.dateTo = Is the end date for which to retrieve weather data. This value may only be used when a date1 value is given. When both date1 and date2 values are given, the query is inclusive of date2 and the weather data request period will end on midnight of the date2 value. All dates and times are in local time of the specified location and should be in the format yyyy-MM-dd.
+action.label.location = Location
+action.label.unitGroup = Unit Group
+action.label.lang = Language
+action.label.dateFrom = Date From
+action.label.dateTo = Date To
+action.timeline.label = Timeline Weather API
+action.timeline.description = The Timeline Weather API is the simplest and most powerful way to retrieve weather data. You can request data over any time window including windows that span the past, present, and future. The API will take care of the combining historical observations, current 15-day forecasts, and statistical weather forecasts to create a single, consolidated dataset via a single API call
+addon.visualcrossing.weather.error.generic = Generic error occurred: {0}
+addon.visualcrossing.weather.error.hostname = Hostname "{0}" is not proper URL!
+addon.visualcrossing.weather.error.auth = Wrong API key!
+addon.visualcrossing.weather.error.rate = You have exceeded the rate limit!
+addon.visualcrossing.weather.error.api = API Error: {0}
+addon.visualcrossing.weather.error.bad-language = Language "{0}" is not supported!
+addon.visualcrossing.weather.error.no-location = No location was set in the thing nor default location exists!
+addon.visualcrossing.weather.error.missing-api-key = Missing the API key!
+channel-type.visualcrossing.sample-channel.label = Example Temperature
+channel-type.visualcrossing.sample-channel.description = Sample channel for VisualCrossing Binding
+channel-type.visualcrossing.weather.config-pending = Configuration pending...
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/thing/channel-types.xml b/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/thing/channel-types.xml
new file mode 100644
index 0000000000000..21e537f10d4df
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/thing/channel-types.xml
@@ -0,0 +1,1975 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ Minimum temperature at the location.
+
+
+
+ Maximum temperature at the location.
+
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are average
+ values (mean) for the day.
+
+
+
+
+ Minimum feels like temperature at the location.
+
+
+
+ Maximum feels like temperature at the location.
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+ Sunrise time specified as number of seconds since 1st January 1970 in UTC time
+
+
+
+
+ Sunset time specified as number of seconds since 1st January 1970 in UTC time
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher than
+ the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding one
+ to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Temperature at the location. Daily values are average values (mean) for the day.
+
+
+
+
+ What the temperature feels like accounting for heat index or wind chill. Daily values are
+ average values
+ (mean) for the day.
+
+
+
+
+
+ Dew point temperature
+
+
+
+
+
+
+
+ The depth of snow on the ground
+
+
+
+ Instantaneous wind speed at a location – May be empty if it is not significantly higher
+ than the wind
+ speed. Daily values are the maximum hourly value for the day.
+
+
+
+ The sustained wind speed measured as the average windspeed that occurs during the preceding
+ one to two
+ minutes. Daily values are the maximum hourly value for the day.
+
+
+
+ Direction from which the wind is blowing
+
+
+ The sea level atmospheric or barometric pressure in millibars (or hectopascals)
+
+
+
+
+
+
+
+
+ A value between 0 and 10 indicating the level of ultra violet (UV) exposure for that hour or day. 10
+ represents high level of exposure, and 0 represents no exposure. The UV index is calculated based on amount of
+ short
+ wave solar radiation which in turn is a level the cloudiness, type of cloud, time of day, time of year and
+ location
+ altitude. Daily values represent the maximum value of the hourly values.
+
+
+
+
+
+
+
+
+
+ Sunrise time specified as number of seconds since 1st January 1970 in UTC time
+
+
+
+
+
+ Sunset time specified as number of seconds since 1st January 1970 in UTC time
+
+
+
+
+
+
+
+
+ Number
+
+ How much API tokens thing used since start
+
+
+ String
+
+ Longer text descriptions suitable for displaying in weather displays. The descriptions combine the
+ main
+ features of the weather for the day such as precipitation or amount of cloud cover. Daily descriptions
+ are provided
+ for historical and forecast days. When the timeline request includes the model forecast period,
+ a seven day outlook
+ description is provided at the root response level.
+
+
+
+
+ String
+
+ In format HH:mm:ss
+ time
+
+
+
+ DateTime
+
+ time
+
+
+
+ Number:Temperature
+
+ Temperature
+
+
+
+ Number:Length
+
+
+ The amount of liquid precipitation that fell or is predicted to fall in the period. This includes the
+ liquid-equivalent amount of any frozen precipitation such as snow or ice.
+
+
+
+
+ Number:Dimensionless
+
+ The likelihood of measurable precipitation ranging from 0% to 100%
+
+
+
+ String
+
+
+ An comma separated array indicating the type(s) of precipitation expected or that occurred. Possible
+ values include `rain`, `snow`, `freezingrain` and `ice`.
+
+
+
+
+ Number
+
+ The proportion of hours where there was non-zero precipitation
+
+
+
+ Number:Length
+
+ The amount of snow that fell or is predicted to fall
+ Snow
+
+
+
+ Number:Length
+
+ Snow
+
+
+
+ Number:Length
+
+ Distance at which distant objects are visible
+
+
+
+ Number:Dimensionless
+
+ How much of the sky is covered in cloud ranging from 0–100%
+ Sun_Clouds
+
+
+
+ Number:Intensity
+
+ The solar radiation power at the instantaneous moment of the observation (or forecast prediction).
+ See the
+ full solar radiation data documentation
+ (https://www.visualcrossing.com/resources/documentation/weather-data/how-to-obtain-solar-radiation-data/)
+ and Wind and
+ Solar Energy
+ (https://www.visualcrossing.com/resources/documentation/weather-api/energy-elements-in-the-timeline-weather-api/)
+ pages.
+
+
+
+
+ Number
+
+ (MJ /m^2) Indicates the total energy from the sun that builds up over an hour or day. See the full
+ solar
+ radiation data documentation
+ (https://www.visualcrossing.com/resources/documentation/weather-data/how-to-obtain-solar-radiation-data/)
+ and Wind and
+ Solar Energy
+ (https://www.visualcrossing.com/resources/documentation/weather-api/energy-elements-in-the-timeline-weather-api/)
+ pages.
+
+
+
+
+ String
+
+ Textual representation of the weather conditions. See Weather Data Conditions
+ (https://www.visualcrossing.com/resources/documentation/weather-api/weather-condition-fields/).
+
+
+
+
+ String
+
+ A fixed, machine readable summary that can be used to display an icon
+
+
+
+ String
+
+ The weather stations (comma separated) used when collecting an historical observation record
+
+
+
+
+ String
+
+
+ The type of weather data used for this weather object. – Values include historical observation (“obs”),
+ forecast (“fcst”), historical forecast (“histfcst”) or statistical forecast (“stats”). If multiple types are used in
+ the same day, “comb” is used. Today a combination of historical observations and forecast data.
+
+
+
+
+ String
+
+ The formatted time of the sunrise (For example “2022-05-23T05:50:40”). See How to include sunrise,
+ sunset, moon phase, moonrise and moonset data into your API requests
+ (https://www.visualcrossing.com/resources/documentation/weather-api/how-to-include-sunrise-sunset-and-moon-phase-data-into-your-api-requests/)
+
+
+
+
+ String
+
+ The formatted time of the sunset (For example “2022-05-23T20:22:29”).
+
+
+
+
+ Number
+
+
+ Represents the fractional portion through the current moon lunation cycle ranging from 0 (the new moon)
+ to 0.5 (the full moon) and back to 1 (the next new moon).
+
+
+
+
+ Number:Dimensionless
+
+
+ A value between 0 and 100 representing the risk of convective storms (e.g. thunderstorms, hail and
+ tornadoes). Severe risk is a scaled measure that combines a variety of other fields such as the convective availabel
+ potential energy (CAPE) and convective inhibition (CIN), predicted rain and wind. Typically, a severe risk value less
+ than 30 indicates a low risk, between 30 and 70 a moderate risk and above 70 a high risk.
+
+
+
+
+
diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/thing/thing-types.xml
new file mode 100644
index 0000000000000..0171ee7052979
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/main/resources/OH-INF/thing/thing-types.xml
@@ -0,0 +1,127 @@
+
+
+
+
+
+ Historical Weather Data & Weather Forecast Data
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ password
+
+ API Key to connect to the cloud.
+
+
+
+ Is the address, partial address or latitude,longitude location for which to retrieve weather data. You
+ can also use US ZIP Codes.
+
+
+
+ Sets the language of the translatable parts of the output such as the conditions field.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ network-address
+
+ Hostname or IP address of the server
+ true
+ https://weather.visualcrossing.com
+
+
+
+ Interval the device is polled in sec (default 1h).
+ 3600
+ true
+
+
+
+ How many times retry requests.
+ 3
+ true
+
+
+
+
+
diff --git a/bundles/org.openhab.binding.visualcrossing/src/test/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApiTest.java b/bundles/org.openhab.binding.visualcrossing/src/test/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApiTest.java
new file mode 100644
index 0000000000000..e45ec6b0726ec
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/test/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApiTest.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api;
+
+import static java.util.Objects.requireNonNull;
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.mockito.BDDMockito.given;
+import static org.openhab.binding.visualcrossing.internal.api.VisualCrossingApi.UnitGroup.METRIC;
+import static org.openhab.binding.visualcrossing.internal.api.VisualCrossingApiTestConst.*;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.openhab.binding.visualcrossing.internal.api.rest.RestClient;
+
+import com.google.gson.Gson;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+@ExtendWith({ MockitoExtension.class })
+class VisualCrossingApiTest {
+ @Nullable
+ VisualCrossingApi api;
+ @Mock
+ @Nullable
+ RestClient restClient;
+
+ @BeforeEach
+ void setUp() {
+ api = new VisualCrossingApi("https://weather.visualcrossing.com", "xyz", requireNonNull(restClient),
+ new Gson());
+ }
+
+ @Test
+ @DisplayName("should parse full JSON")
+ void parseFullJson() throws VisualCrossingAuthException, VisualCrossingApiException, VisualCrossingRateException {
+ // given
+ // noinspection DataFlowIssue
+ given(requireNonNull(restClient)
+ .get("https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/"//
+ + "wroc%C5%82aw%2Cpoland"//
+ + "?key=xyz"//
+ + "&contentType=json"//
+ + "&unitGroup=metric"//
+ + "&lang=en"))
+ .willReturn(FULL_JSON);
+
+ // when
+ var timeline = requireNonNull(api).timeline("wrocław,poland", METRIC, "en", null, null);
+
+ // then
+ assertThat(timeline).isEqualTo(FULL_JSON_RESPONSE);
+ }
+}
diff --git a/bundles/org.openhab.binding.visualcrossing/src/test/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApiTestConst.java b/bundles/org.openhab.binding.visualcrossing/src/test/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApiTestConst.java
new file mode 100644
index 0000000000000..d0fedc24d36bf
--- /dev/null
+++ b/bundles/org.openhab.binding.visualcrossing/src/test/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApiTestConst.java
@@ -0,0 +1,2956 @@
+/**
+ * Copyright (c) 2010-2024 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.visualcrossing.internal.api;
+
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.openhab.binding.visualcrossing.internal.api.dto.CurrentConditions;
+import org.openhab.binding.visualcrossing.internal.api.dto.Day;
+import org.openhab.binding.visualcrossing.internal.api.dto.Hour;
+import org.openhab.binding.visualcrossing.internal.api.dto.WeatherResponse;
+
+/**
+ * @author Martin Grześlowski - Initial contribution
+ */
+@NonNullByDefault
+public class VisualCrossingApiTestConst {
+ public static final String FULL_JSON = """
+ {
+ "queryCost": 1,
+ "latitude": 51.1082,
+ "longitude": 17.0269,
+ "resolvedAddress": "Wrocław, Woj. Dolnośląskie, Polska",
+ "address": "wrocław,poland",
+ "timezone": "Europe/Warsaw",
+ "tzoffset": 2.0,
+ "description": "Similar temperatures continuing with a chance of rain Wednesday & Thursday.",
+ "days": [
+ {
+ "datetime": "2024-08-09",
+ "datetimeEpoch": 1723154400,
+ "tempmax": 26.4,
+ "tempmin": 13.0,
+ "temp": 20.3,
+ "feelslikemax": 26.4,
+ "feelslikemin": 13.0,
+ "feelslike": 20.3,
+ "dew": 13.9,
+ "humidity": 70.7,
+ "precip": 0.0,
+ "precipprob": 29.0,
+ "precipcover": 0.0,
+ "preciptype": null,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "windgust": 23.8,
+ "windspeed": 11.2,
+ "winddir": 252.4,
+ "pressure": 1016.6,
+ "cloudcover": 59.4,
+ "visibility": 16.3,
+ "solarradiation": 149.8,
+ "solarenergy": 12.9,
+ "uvindex": 8.0,
+ "severerisk": 10.0,
+ "sunrise": "05:29:47",
+ "sunriseEpoch": 1723174187,
+ "sunset": "20:23:59",
+ "sunsetEpoch": 1723227839,
+ "moonphase": 0.16,
+ "conditions": "Partially cloudy",
+ "description": "Partly cloudy throughout the day.",
+ "icon": "partly-cloudy-day",
+ "stations": [
+ "EPWR",
+ "F4529",
+ "remote"
+ ],
+ "source": "comb",
+ "hours": [
+ {
+ "datetime": "00:00:00",
+ "datetimeEpoch": 1723154400,
+ "temp": 16.0,
+ "feelslike": 16.0,
+ "humidity": 93.79,
+ "dew": 15.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 13.7,
+ "windspeed": 9.4,
+ "winddir": 270.0,
+ "pressure": 1017.0,
+ "visibility": 10.0,
+ "cloudcover": 62.5,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-night",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "01:00:00",
+ "datetimeEpoch": 1723158000,
+ "temp": 16.0,
+ "feelslike": 16.0,
+ "humidity": 100.0,
+ "dew": 16.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 10.8,
+ "windspeed": 7.6,
+ "winddir": 280.0,
+ "pressure": 1017.0,
+ "visibility": 10.0,
+ "cloudcover": 0.0,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Clear",
+ "icon": "clear-night",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "02:00:00",
+ "datetimeEpoch": 1723161600,
+ "temp": 15.0,
+ "feelslike": 15.0,
+ "humidity": 93.74,
+ "dew": 14.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 10.1,
+ "windspeed": 9.4,
+ "winddir": 299.4,
+ "pressure": 1017.0,
+ "visibility": 10.0,
+ "cloudcover": 3.4,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Clear",
+ "icon": "clear-night",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "03:00:00",
+ "datetimeEpoch": 1723165200,
+ "temp": 14.0,
+ "feelslike": 14.0,
+ "humidity": 100.0,
+ "dew": 14.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 9.7,
+ "windspeed": 3.6,
+ "winddir": 260.0,
+ "pressure": 1017.0,
+ "visibility": 10.0,
+ "cloudcover": 0.0,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Clear",
+ "icon": "clear-night",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "04:00:00",
+ "datetimeEpoch": 1723168800,
+ "temp": 14.0,
+ "feelslike": 14.0,
+ "humidity": 100.0,
+ "dew": 14.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 8.3,
+ "windspeed": 5.4,
+ "winddir": 270.0,
+ "pressure": 1017.0,
+ "visibility": 10.0,
+ "cloudcover": 100.0,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "05:00:00",
+ "datetimeEpoch": 1723172400,
+ "temp": 13.0,
+ "feelslike": 13.0,
+ "humidity": 100.0,
+ "dew": 13.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 7.6,
+ "windspeed": 5.4,
+ "winddir": 270.0,
+ "pressure": 1017.0,
+ "visibility": 10.0,
+ "cloudcover": 0.0,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Clear",
+ "icon": "clear-night",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "06:00:00",
+ "datetimeEpoch": 1723176000,
+ "temp": 13.0,
+ "feelslike": 13.0,
+ "humidity": 100.0,
+ "dew": 13.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 7.6,
+ "windspeed": 3.6,
+ "winddir": 260.0,
+ "pressure": 1018.0,
+ "visibility": 6.0,
+ "cloudcover": 0.0,
+ "solarradiation": 8.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Clear",
+ "icon": "clear-day",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "07:00:00",
+ "datetimeEpoch": 1723179600,
+ "temp": 15.0,
+ "feelslike": 15.0,
+ "humidity": 100.0,
+ "dew": 15.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 7.2,
+ "windspeed": 5.4,
+ "winddir": 280.0,
+ "pressure": 1018.0,
+ "visibility": 10.0,
+ "cloudcover": 0.1,
+ "solarradiation": 18.0,
+ "solarenergy": 0.1,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Clear",
+ "icon": "clear-day",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "08:00:00",
+ "datetimeEpoch": 1723183200,
+ "temp": 17.0,
+ "feelslike": 17.0,
+ "humidity": 88.01,
+ "dew": 15.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 10.1,
+ "windspeed": 7.6,
+ "winddir": 260.0,
+ "pressure": 1018.0,
+ "visibility": 10.0,
+ "cloudcover": 0.1,
+ "solarradiation": 22.0,
+ "solarenergy": 0.1,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Clear",
+ "icon": "clear-day",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "09:00:00",
+ "datetimeEpoch": 1723186800,
+ "temp": 19.0,
+ "feelslike": 19.0,
+ "humidity": 77.61,
+ "dew": 15.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 12.2,
+ "windspeed": 5.4,
+ "winddir": 190.0,
+ "pressure": 1018.0,
+ "visibility": 10.0,
+ "cloudcover": 0.3,
+ "solarradiation": 27.0,
+ "solarenergy": 0.1,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Clear",
+ "icon": "clear-day",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "10:00:00",
+ "datetimeEpoch": 1723190400,
+ "temp": 21.0,
+ "feelslike": 21.0,
+ "humidity": 64.28,
+ "dew": 14.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 11.9,
+ "windspeed": 7.6,
+ "winddir": 190.0,
+ "pressure": 1018.0,
+ "visibility": 10.0,
+ "cloudcover": 100.0,
+ "solarradiation": 33.0,
+ "solarenergy": 0.1,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "11:00:00",
+ "datetimeEpoch": 1723194000,
+ "temp": 22.0,
+ "feelslike": 22.0,
+ "humidity": 53.05,
+ "dew": 12.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 13.0,
+ "windspeed": 5.4,
+ "winddir": 203.2,
+ "pressure": 1018.0,
+ "visibility": 10.0,
+ "cloudcover": 90.9,
+ "solarradiation": 224.0,
+ "solarenergy": 0.8,
+ "uvindex": 2.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "12:00:00",
+ "datetimeEpoch": 1723197600,
+ "temp": 23.0,
+ "feelslike": 23.0,
+ "humidity": 56.89,
+ "dew": 14.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 16.6,
+ "windspeed": 11.2,
+ "winddir": 240.0,
+ "pressure": 1018.0,
+ "visibility": 10.0,
+ "cloudcover": 88.3,
+ "solarradiation": 592.0,
+ "solarenergy": 2.1,
+ "uvindex": 6.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": [
+ "EPWR",
+ "F4529"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "13:00:00",
+ "datetimeEpoch": 1723201200,
+ "temp": 24.4,
+ "feelslike": 24.4,
+ "humidity": 49.0,
+ "dew": 13.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 19.4,
+ "windspeed": 8.3,
+ "winddir": 253.0,
+ "pressure": 1017.0,
+ "visibility": 24.1,
+ "cloudcover": 54.0,
+ "solarradiation": 753.0,
+ "solarenergy": 2.7,
+ "uvindex": 8.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": [
+ "remote"
+ ],
+ "source": "obs"
+ },
+ {
+ "datetime": "14:00:00",
+ "datetimeEpoch": 1723204800,
+ "temp": 25.4,
+ "feelslike": 25.4,
+ "humidity": 46.16,
+ "dew": 13.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 20.9,
+ "windspeed": 8.3,
+ "winddir": 256.5,
+ "pressure": 1017.0,
+ "visibility": 24.1,
+ "cloudcover": 72.2,
+ "solarradiation": 703.0,
+ "solarenergy": 2.5,
+ "uvindex": 7.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "15:00:00",
+ "datetimeEpoch": 1723208400,
+ "temp": 26.1,
+ "feelslike": 26.1,
+ "humidity": 42.29,
+ "dew": 12.3,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 21.6,
+ "windspeed": 9.7,
+ "winddir": 252.8,
+ "pressure": 1016.0,
+ "visibility": 24.1,
+ "cloudcover": 100.0,
+ "solarradiation": 583.0,
+ "solarenergy": 2.1,
+ "uvindex": 6.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "16:00:00",
+ "datetimeEpoch": 1723212000,
+ "temp": 26.4,
+ "feelslike": 26.4,
+ "humidity": 42.1,
+ "dew": 12.5,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 23.8,
+ "windspeed": 10.8,
+ "winddir": 261.6,
+ "pressure": 1015.0,
+ "visibility": 24.1,
+ "cloudcover": 91.8,
+ "solarradiation": 146.0,
+ "solarenergy": 0.5,
+ "uvindex": 1.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "17:00:00",
+ "datetimeEpoch": 1723215600,
+ "temp": 26.3,
+ "feelslike": 26.3,
+ "humidity": 43.19,
+ "dew": 12.8,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 23.8,
+ "windspeed": 9.4,
+ "winddir": 258.9,
+ "pressure": 1015.0,
+ "visibility": 24.1,
+ "cloudcover": 99.1,
+ "solarradiation": 161.0,
+ "solarenergy": 0.6,
+ "uvindex": 2.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "18:00:00",
+ "datetimeEpoch": 1723219200,
+ "temp": 26.3,
+ "feelslike": 26.3,
+ "humidity": 43.76,
+ "dew": 13.0,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 20.2,
+ "windspeed": 9.0,
+ "winddir": 253.9,
+ "pressure": 1015.0,
+ "visibility": 24.1,
+ "cloudcover": 100.0,
+ "solarradiation": 222.0,
+ "solarenergy": 0.8,
+ "uvindex": 2.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "19:00:00",
+ "datetimeEpoch": 1723222800,
+ "temp": 25.0,
+ "feelslike": 25.0,
+ "humidity": 51.11,
+ "dew": 14.2,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 18.4,
+ "windspeed": 5.8,
+ "winddir": 243.6,
+ "pressure": 1015.0,
+ "visibility": 24.1,
+ "cloudcover": 99.7,
+ "solarradiation": 78.0,
+ "solarenergy": 0.3,
+ "uvindex": 1.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "20:00:00",
+ "datetimeEpoch": 1723226400,
+ "temp": 23.7,
+ "feelslike": 23.7,
+ "humidity": 56.7,
+ "dew": 14.6,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 11.5,
+ "windspeed": 5.0,
+ "winddir": 249.1,
+ "pressure": 1015.0,
+ "visibility": 24.1,
+ "cloudcover": 79.2,
+ "solarradiation": 25.0,
+ "solarenergy": 0.1,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "21:00:00",
+ "datetimeEpoch": 1723230000,
+ "temp": 22.4,
+ "feelslike": 22.4,
+ "humidity": 61.74,
+ "dew": 14.7,
+ "precip": 0.0,
+ "precipprob": 29.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 9.7,
+ "windspeed": 4.7,
+ "winddir": 235.7,
+ "pressure": 1015.0,
+ "visibility": 24.1,
+ "cloudcover": 97.5,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 3.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "22:00:00",
+ "datetimeEpoch": 1723233600,
+ "temp": 21.9,
+ "feelslike": 21.9,
+ "humidity": 65.31,
+ "dew": 15.1,
+ "precip": 0.0,
+ "precipprob": 29.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 9.0,
+ "windspeed": 4.0,
+ "winddir": 217.7,
+ "pressure": 1015.0,
+ "visibility": 24.1,
+ "cloudcover": 92.6,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "23:00:00",
+ "datetimeEpoch": 1723237200,
+ "temp": 21.5,
+ "feelslike": 21.5,
+ "humidity": 67.79,
+ "dew": 15.3,
+ "precip": 0.0,
+ "precipprob": 29.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 9.4,
+ "windspeed": 4.7,
+ "winddir": 229.5,
+ "pressure": 1016.0,
+ "visibility": 24.1,
+ "cloudcover": 93.1,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ }
+ ]
+ },
+ {
+ "datetime": "2024-08-10",
+ "datetimeEpoch": 1723240800,
+ "tempmax": 25.9,
+ "tempmin": 19.0,
+ "temp": 22.1,
+ "feelslikemax": 25.9,
+ "feelslikemin": 19.0,
+ "feelslike": 22.1,
+ "dew": 14.9,
+ "humidity": 65.4,
+ "precip": 0.0,
+ "precipprob": 29.0,
+ "precipcover": 0.0,
+ "preciptype": [
+ "rain"
+ ],
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "windgust": 34.9,
+ "windspeed": 15.5,
+ "winddir": 296.2,
+ "pressure": 1018.9,
+ "cloudcover": 60.6,
+ "visibility": 24.1,
+ "solarradiation": 246.9,
+ "solarenergy": 21.4,
+ "uvindex": 7.0,
+ "severerisk": 10.0,
+ "sunrise": "05:31:19",
+ "sunriseEpoch": 1723260679,
+ "sunset": "20:22:08",
+ "sunsetEpoch": 1723314128,
+ "moonphase": 0.19,
+ "conditions": "Partially cloudy",
+ "description": "Partly cloudy throughout the day.",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst",
+ "hours": [
+ {
+ "datetime": "00:00:00",
+ "datetimeEpoch": 1723240800,
+ "temp": 21.1,
+ "feelslike": 21.1,
+ "humidity": 69.47,
+ "dew": 15.3,
+ "precip": 0.0,
+ "precipprob": 29.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 10.1,
+ "windspeed": 4.3,
+ "winddir": 294.1,
+ "pressure": 1016.0,
+ "visibility": 24.1,
+ "cloudcover": 99.3,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "01:00:00",
+ "datetimeEpoch": 1723244400,
+ "temp": 20.7,
+ "feelslike": 20.7,
+ "humidity": 72.12,
+ "dew": 15.5,
+ "precip": 0.0,
+ "precipprob": 29.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 9.4,
+ "windspeed": 4.3,
+ "winddir": 263.3,
+ "pressure": 1017.0,
+ "visibility": 24.1,
+ "cloudcover": 95.8,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "02:00:00",
+ "datetimeEpoch": 1723248000,
+ "temp": 20.3,
+ "feelslike": 20.3,
+ "humidity": 74.88,
+ "dew": 15.7,
+ "precip": 0.0,
+ "precipprob": 29.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": [
+ "rain"
+ ],
+ "windgust": 9.4,
+ "windspeed": 4.7,
+ "winddir": 251.8,
+ "pressure": 1017.0,
+ "visibility": 24.1,
+ "cloudcover": 92.6,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "03:00:00",
+ "datetimeEpoch": 1723251600,
+ "temp": 20.2,
+ "feelslike": 20.2,
+ "humidity": 76.31,
+ "dew": 15.9,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 14.4,
+ "windspeed": 6.8,
+ "winddir": 255.8,
+ "pressure": 1017.0,
+ "visibility": 24.1,
+ "cloudcover": 77.6,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-night",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "04:00:00",
+ "datetimeEpoch": 1723255200,
+ "temp": 19.8,
+ "feelslike": 19.8,
+ "humidity": 79.23,
+ "dew": 16.1,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 16.6,
+ "windspeed": 7.9,
+ "winddir": 267.2,
+ "pressure": 1017.0,
+ "visibility": 24.1,
+ "cloudcover": 98.3,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Overcast",
+ "icon": "cloudy",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "05:00:00",
+ "datetimeEpoch": 1723258800,
+ "temp": 19.3,
+ "feelslike": 19.3,
+ "humidity": 83.84,
+ "dew": 16.5,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 17.3,
+ "windspeed": 8.3,
+ "winddir": 279.8,
+ "pressure": 1018.0,
+ "visibility": 24.1,
+ "cloudcover": 76.6,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-night",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "06:00:00",
+ "datetimeEpoch": 1723262400,
+ "temp": 19.0,
+ "feelslike": 19.0,
+ "humidity": 85.97,
+ "dew": 16.6,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 16.9,
+ "windspeed": 7.6,
+ "winddir": 284.8,
+ "pressure": 1018.0,
+ "visibility": 24.1,
+ "cloudcover": 70.5,
+ "solarradiation": 4.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "07:00:00",
+ "datetimeEpoch": 1723266000,
+ "temp": 19.2,
+ "feelslike": 19.2,
+ "humidity": 86.54,
+ "dew": 16.9,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 16.6,
+ "windspeed": 7.9,
+ "winddir": 295.6,
+ "pressure": 1019.0,
+ "visibility": 24.1,
+ "cloudcover": 71.8,
+ "solarradiation": 68.0,
+ "solarenergy": 0.2,
+ "uvindex": 1.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "08:00:00",
+ "datetimeEpoch": 1723269600,
+ "temp": 20.2,
+ "feelslike": 20.2,
+ "humidity": 82.89,
+ "dew": 17.2,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 22.0,
+ "windspeed": 10.4,
+ "winddir": 293.4,
+ "pressure": 1020.0,
+ "visibility": 24.1,
+ "cloudcover": 53.0,
+ "solarradiation": 224.0,
+ "solarenergy": 0.8,
+ "uvindex": 2.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "09:00:00",
+ "datetimeEpoch": 1723273200,
+ "temp": 21.2,
+ "feelslike": 21.2,
+ "humidity": 76.47,
+ "dew": 16.9,
+ "precip": 0.0,
+ "precipprob": 12.9,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 27.4,
+ "windspeed": 12.6,
+ "winddir": 298.9,
+ "pressure": 1020.0,
+ "visibility": 24.1,
+ "cloudcover": 63.6,
+ "solarradiation": 383.0,
+ "solarenergy": 1.4,
+ "uvindex": 4.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "10:00:00",
+ "datetimeEpoch": 1723276800,
+ "temp": 21.7,
+ "feelslike": 21.7,
+ "humidity": 71.39,
+ "dew": 16.3,
+ "precip": 0.0,
+ "precipprob": 12.9,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 29.2,
+ "windspeed": 13.7,
+ "winddir": 303.3,
+ "pressure": 1020.0,
+ "visibility": 24.1,
+ "cloudcover": 76.8,
+ "solarradiation": 535.0,
+ "solarenergy": 1.9,
+ "uvindex": 5.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "11:00:00",
+ "datetimeEpoch": 1723280400,
+ "temp": 22.7,
+ "feelslike": 22.7,
+ "humidity": 63.01,
+ "dew": 15.3,
+ "precip": 0.0,
+ "precipprob": 12.9,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": [
+ "rain"
+ ],
+ "windgust": 30.2,
+ "windspeed": 14.0,
+ "winddir": 301.1,
+ "pressure": 1020.0,
+ "visibility": 24.1,
+ "cloudcover": 54.8,
+ "solarradiation": 626.0,
+ "solarenergy": 2.3,
+ "uvindex": 6.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "12:00:00",
+ "datetimeEpoch": 1723284000,
+ "temp": 23.6,
+ "feelslike": 23.6,
+ "humidity": 57.78,
+ "dew": 14.8,
+ "precip": 0.0,
+ "precipprob": 12.9,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": [
+ "rain"
+ ],
+ "windgust": 33.8,
+ "windspeed": 14.8,
+ "winddir": 298.6,
+ "pressure": 1020.0,
+ "visibility": 24.1,
+ "cloudcover": 46.0,
+ "solarradiation": 608.0,
+ "solarenergy": 2.2,
+ "uvindex": 6.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "13:00:00",
+ "datetimeEpoch": 1723287600,
+ "temp": 24.5,
+ "feelslike": 24.5,
+ "humidity": 53.69,
+ "dew": 14.5,
+ "precip": 0.0,
+ "precipprob": 12.9,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 34.9,
+ "windspeed": 15.1,
+ "winddir": 298.7,
+ "pressure": 1020.0,
+ "visibility": 24.1,
+ "cloudcover": 50.9,
+ "solarradiation": 642.0,
+ "solarenergy": 2.3,
+ "uvindex": 6.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "14:00:00",
+ "datetimeEpoch": 1723291200,
+ "temp": 25.3,
+ "feelslike": 25.3,
+ "humidity": 49.88,
+ "dew": 14.1,
+ "precip": 0.0,
+ "precipprob": 12.9,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 33.1,
+ "windspeed": 14.8,
+ "winddir": 296.0,
+ "pressure": 1020.0,
+ "visibility": 24.1,
+ "cloudcover": 58.4,
+ "solarradiation": 693.0,
+ "solarenergy": 2.5,
+ "uvindex": 7.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "15:00:00",
+ "datetimeEpoch": 1723294800,
+ "temp": 25.7,
+ "feelslike": 25.7,
+ "humidity": 47.46,
+ "dew": 13.7,
+ "precip": 0.0,
+ "precipprob": 3.2,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 33.1,
+ "windspeed": 15.5,
+ "winddir": 299.5,
+ "pressure": 1019.0,
+ "visibility": 24.1,
+ "cloudcover": 57.7,
+ "solarradiation": 431.0,
+ "solarenergy": 1.6,
+ "uvindex": 4.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "16:00:00",
+ "datetimeEpoch": 1723298400,
+ "temp": 25.9,
+ "feelslike": 25.9,
+ "humidity": 45.99,
+ "dew": 13.4,
+ "precip": 0.0,
+ "precipprob": 3.2,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 33.8,
+ "windspeed": 15.1,
+ "winddir": 299.3,
+ "pressure": 1019.0,
+ "visibility": 24.1,
+ "cloudcover": 55.1,
+ "solarradiation": 530.0,
+ "solarenergy": 1.9,
+ "uvindex": 5.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "17:00:00",
+ "datetimeEpoch": 1723302000,
+ "temp": 25.6,
+ "feelslike": 25.6,
+ "humidity": 45.91,
+ "dew": 13.1,
+ "precip": 0.0,
+ "precipprob": 3.2,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 32.8,
+ "windspeed": 14.0,
+ "winddir": 300.0,
+ "pressure": 1019.0,
+ "visibility": 24.1,
+ "cloudcover": 62.4,
+ "solarradiation": 526.0,
+ "solarenergy": 1.9,
+ "uvindex": 5.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "18:00:00",
+ "datetimeEpoch": 1723305600,
+ "temp": 25.2,
+ "feelslike": 25.2,
+ "humidity": 46.71,
+ "dew": 13.0,
+ "precip": 0.0,
+ "precipprob": 3.2,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 29.9,
+ "windspeed": 11.9,
+ "winddir": 305.5,
+ "pressure": 1019.0,
+ "visibility": 24.1,
+ "cloudcover": 66.8,
+ "solarradiation": 376.0,
+ "solarenergy": 1.4,
+ "uvindex": 4.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "19:00:00",
+ "datetimeEpoch": 1723309200,
+ "temp": 24.5,
+ "feelslike": 24.5,
+ "humidity": 49.02,
+ "dew": 13.1,
+ "precip": 0.0,
+ "precipprob": 3.2,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 24.8,
+ "windspeed": 7.6,
+ "winddir": 306.1,
+ "pressure": 1019.0,
+ "visibility": 24.1,
+ "cloudcover": 51.6,
+ "solarradiation": 211.0,
+ "solarenergy": 0.8,
+ "uvindex": 2.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "20:00:00",
+ "datetimeEpoch": 1723312800,
+ "temp": 22.9,
+ "feelslike": 22.9,
+ "humidity": 57.61,
+ "dew": 14.1,
+ "precip": 0.0,
+ "precipprob": 3.2,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 15.5,
+ "windspeed": 4.3,
+ "winddir": 341.4,
+ "pressure": 1019.0,
+ "visibility": 24.1,
+ "cloudcover": 34.3,
+ "solarradiation": 69.0,
+ "solarenergy": 0.2,
+ "uvindex": 1.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-day",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "21:00:00",
+ "datetimeEpoch": 1723316400,
+ "temp": 21.1,
+ "feelslike": 21.1,
+ "humidity": 63.06,
+ "dew": 13.8,
+ "precip": 0.0,
+ "precipprob": 3.2,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 8.3,
+ "windspeed": 3.6,
+ "winddir": 2.0,
+ "pressure": 1020.0,
+ "visibility": 24.1,
+ "cloudcover": 10.9,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Clear",
+ "icon": "clear-night",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "22:00:00",
+ "datetimeEpoch": 1723320000,
+ "temp": 20.3,
+ "feelslike": 20.3,
+ "humidity": 64.54,
+ "dew": 13.4,
+ "precip": 0.0,
+ "precipprob": 3.2,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 6.8,
+ "windspeed": 2.5,
+ "winddir": 14.5,
+ "pressure": 1020.0,
+ "visibility": 24.1,
+ "cloudcover": 6.0,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Clear",
+ "icon": "clear-night",
+ "stations": null,
+ "source": "fcst"
+ },
+ {
+ "datetime": "23:00:00",
+ "datetimeEpoch": 1723323600,
+ "temp": 19.8,
+ "feelslike": 19.8,
+ "humidity": 64.86,
+ "dew": 13.0,
+ "precip": 0.0,
+ "precipprob": 3.2,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 3.6,
+ "windspeed": 2.5,
+ "winddir": 138.2,
+ "pressure": 1020.0,
+ "visibility": 24.1,
+ "cloudcover": 24.4,
+ "solarradiation": 0.0,
+ "solarenergy": 0.0,
+ "uvindex": 0.0,
+ "severerisk": 10.0,
+ "conditions": "Partially cloudy",
+ "icon": "partly-cloudy-night",
+ "stations": null,
+ "source": "fcst"
+ }
+ ]
+ }
+ ],
+ "alerts": [],
+ "stations": {
+ "F4529": {
+ "distance": 7820.0,
+ "latitude": 51.176,
+ "longitude": 16.999,
+ "useCount": 0,
+ "id": "F4529",
+ "name": "FW4529 Wroclaw PO",
+ "quality": 0,
+ "contribution": 0.0
+ },
+ "EPWR": {
+ "distance": 10309.0,
+ "latitude": 51.1,
+ "longitude": 16.88,
+ "useCount": 0,
+ "id": "EPWR",
+ "name": "EPWR",
+ "quality": 50,
+ "contribution": 0.0
+ },
+ "E1158": {
+ "distance": 8755.0,
+ "latitude": 51.087,
+ "longitude": 16.906,
+ "useCount": 0,
+ "id": "E1158",
+ "name": "EW1158 Wrocaw PL",
+ "quality": 0,
+ "contribution": 0.0
+ }
+ },
+ "currentConditions": {
+ "datetime": "15:45:00",
+ "datetimeEpoch": 1723297500,
+ "temp": 79.7,
+ "feelslike": 79.7,
+ "humidity": 53.2,
+ "dew": 61.1,
+ "precip": 0.0,
+ "precipprob": 0.0,
+ "snow": 0.0,
+ "snowdepth": 0.0,
+ "preciptype": null,
+ "windgust": 7.8,
+ "windspeed": 6.0,
+ "winddir": 16.0,
+ "pressure": 1019.0,
+ "visibility": 6.2,
+ "cloudcover": 68.4,
+ "solarradiation": 321.0,
+ "solarenergy": 1.2,
+ "uvindex": 3.0,
+ "conditions": "Częściowe zachmurzenie",
+ "icon": "partly-cloudy-day",
+ "stations": [
+ "EPWR",
+ "E1158",
+ "F4529"
+ ],
+ "source": "obs",
+ "sunrise": "05:31:19",
+ "sunriseEpoch": 1723260679,
+ "sunset": "20:22:08",
+ "sunsetEpoch": 1723314128,
+ "moonphase": 0.19
+ }
+ }
+ """;
+ public static final WeatherResponse FULL_JSON_RESPONSE = new WeatherResponse(1, //
+ 51.1082, //
+ 17.0269, //
+ "Wrocław, Woj. Dolnośląskie, Polska", //
+ "wrocław,poland", //
+ "Europe/Warsaw", //
+ 2.0, //
+ "Similar temperatures continuing with a chance of rain Wednesday & Thursday.", //
+ List.of( //
+ new Day( //
+ "2024-08-09", //
+ 1723154400L, //
+ 26.4, //
+ 13.0, //
+ 20.3, //
+ 26.4, //
+ 13.0, //
+ 20.3, //
+ 13.9, //
+ 70.7, //
+ 0.0, //
+ 29.0, //
+ 0.0, //
+ null, //
+ 0.0, //
+ 0.0, //
+ 23.8, //
+ 11.2, //
+ 252.4, //
+ 1016.6, //
+ 59.4, //
+ 16.3, //
+ 149.8, //
+ 12.9, //
+ 8.0, //
+ 10.0, //
+ "05:29:47", //
+ 1723174187L, //
+ "20:23:59", //
+ 1723227839L, //
+ 0.16, //
+ "Partially cloudy", //
+ "Partly cloudy throughout the day.", //
+ "partly-cloudy-day", //
+ List.of("EPWR", "F4529", "remote"), //
+ "comb", //
+ List.of( //
+ new Hour( //
+ "00:00:00", //
+ 1723154400L, //
+ 16.0, //
+ 16.0, //
+ 93.79, //
+ 15.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 13.7, //
+ 9.4, //
+ 270.0, //
+ 1017.0, //
+ 10.0, //
+ 62.5, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-night", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "01:00:00", //
+ 1723158000L, //
+ 16.0, //
+ 16.0, //
+ 100.0, //
+ 16.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 10.8, //
+ 7.6, //
+ 280.0, //
+ 1017.0, //
+ 10.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Clear", //
+ "clear-night", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "02:00:00", //
+ 1723161600L, //
+ 15.0, //
+ 15.0, //
+ 93.74, //
+ 14.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 10.1, //
+ 9.4, //
+ 299.4, //
+ 1017.0, //
+ 10.0, //
+ 3.4, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Clear", //
+ "clear-night", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "03:00:00", //
+ 1723165200L, //
+ 14.0, //
+ 14.0, //
+ 100.0, //
+ 14.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 9.7, //
+ 3.6, //
+ 260.0, //
+ 1017.0, //
+ 10.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Clear", //
+ "clear-night", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "04:00:00", //
+ 1723168800L, //
+ 14.0, //
+ 14.0, //
+ 100.0, //
+ 14.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 8.3, //
+ 5.4, //
+ 270.0, //
+ 1017.0, //
+ 10.0, //
+ 100.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "05:00:00", //
+ 1723172400L, //
+ 13.0, //
+ 13.0, //
+ 100.0, //
+ 13.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 7.6, //
+ 5.4, //
+ 270.0, //
+ 1017.0, //
+ 10.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Clear", //
+ "clear-night", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "06:00:00", //
+ 1723176000L, //
+ 13.0, //
+ 13.0, //
+ 100.0, //
+ 13.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 7.6, //
+ 3.6, //
+ 260.0, //
+ 1018.0, //
+ 6.0, //
+ 0.0, //
+ 8.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Clear", //
+ "clear-day", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "07:00:00", //
+ 1723179600L, //
+ 15.0, //
+ 15.0, //
+ 100.0, //
+ 15.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 7.2, //
+ 5.4, //
+ 280.0, //
+ 1018.0, //
+ 10.0, //
+ 0.1, //
+ 18.0, //
+ 0.1, //
+ 0.0, //
+ 10.0, //
+ "Clear", //
+ "clear-day", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "08:00:00", //
+ 1723183200L, //
+ 17.0, //
+ 17.0, //
+ 88.01, //
+ 15.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 10.1, //
+ 7.6, //
+ 260.0, //
+ 1018.0, //
+ 10.0, //
+ 0.1, //
+ 22.0, //
+ 0.1, //
+ 0.0, //
+ 10.0, //
+ "Clear", //
+ "clear-day", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "09:00:00", //
+ 1723186800L, //
+ 19.0, //
+ 19.0, //
+ 77.61, //
+ 15.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 12.2, //
+ 5.4, //
+ 190.0, //
+ 1018.0, //
+ 10.0, //
+ 0.3, //
+ 27.0, //
+ 0.1, //
+ 0.0, //
+ 10.0, //
+ "Clear", //
+ "clear-day", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "10:00:00", //
+ 1723190400L, //
+ 21.0, //
+ 21.0, //
+ 64.28, //
+ 14.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 11.9, //
+ 7.6, //
+ 190.0, //
+ 1018.0, //
+ 10.0, //
+ 100.0, //
+ 33.0, //
+ 0.1, //
+ 0.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "11:00:00", //
+ 1723194000L, //
+ 22.0, //
+ 22.0, //
+ 53.05, //
+ 12.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 13.0, //
+ 5.4, //
+ 203.2, //
+ 1018.0, //
+ 10.0, //
+ 90.9, //
+ 224.0, //
+ 0.8, //
+ 2.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "12:00:00", //
+ 1723197600L, //
+ 23.0, //
+ 23.0, //
+ 56.89, //
+ 14.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 16.6, //
+ 11.2, //
+ 240.0, //
+ 1018.0, //
+ 10.0, //
+ 88.3, //
+ 592.0, //
+ 2.1, //
+ 6.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ List.of("EPWR", "F4529"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "13:00:00", //
+ 1723201200L, //
+ 24.4, //
+ 24.4, //
+ 49.0, //
+ 13.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 19.4, //
+ 8.3, //
+ 253.0, //
+ 1017.0, //
+ 24.1, //
+ 54.0, //
+ 753.0, //
+ 2.7, //
+ 8.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ List.of("remote"), //
+ "obs" //
+ ), //
+ new Hour( //
+ "14:00:00", //
+ 1723204800L, //
+ 25.4, //
+ 25.4, //
+ 46.16, //
+ 13.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 20.9, //
+ 8.3, //
+ 256.5, //
+ 1017.0, //
+ 24.1, //
+ 72.2, //
+ 703.0, //
+ 2.5, //
+ 7.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "15:00:00", //
+ 1723208400L, //
+ 26.1, //
+ 26.1, //
+ 42.29, //
+ 12.3, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 21.6, //
+ 9.7, //
+ 252.8, //
+ 1016.0, //
+ 24.1, //
+ 100.0, //
+ 583.0, //
+ 2.1, //
+ 6.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "16:00:00", //
+ 1723212000L, //
+ 26.4, //
+ 26.4, //
+ 42.1, //
+ 12.5, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 23.8, //
+ 10.8, //
+ 261.6, //
+ 1015.0, //
+ 24.1, //
+ 91.8, //
+ 146.0, //
+ 0.5, //
+ 1.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "17:00:00", //
+ 1723215600L, //
+ 26.3, //
+ 26.3, //
+ 43.19, //
+ 12.8, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 23.8, //
+ 9.4, //
+ 258.9, //
+ 1015.0, //
+ 24.1, //
+ 99.1, //
+ 161.0, //
+ 0.6, //
+ 2.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "18:00:00", //
+ 1723219200L, //
+ 26.3, //
+ 26.3, //
+ 43.76, //
+ 13.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 20.2, //
+ 9.0, //
+ 253.9, //
+ 1015.0, //
+ 24.1, //
+ 100.0, //
+ 222.0, //
+ 0.8, //
+ 2.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "19:00:00", //
+ 1723222800L, //
+ 25.0, //
+ 25.0, //
+ 51.11, //
+ 14.2, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 18.4, //
+ 5.8, //
+ 243.6, //
+ 1015.0, //
+ 24.1, //
+ 99.7, //
+ 78.0, //
+ 0.3, //
+ 1.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "20:00:00", //
+ 1723226400L, //
+ 23.7, //
+ 23.7, //
+ 56.7, //
+ 14.6, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 11.5, //
+ 5.0, //
+ 249.1, //
+ 1015.0, //
+ 24.1, //
+ 79.2, //
+ 25.0, //
+ 0.1, //
+ 0.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "21:00:00", //
+ 1723230000L, //
+ 22.4, //
+ 22.4, //
+ 61.74, //
+ 14.7, //
+ 0.0, //
+ 29.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 9.7, //
+ 4.7, //
+ 235.7, //
+ 1015.0, //
+ 24.1, //
+ 97.5, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 3.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "22:00:00", //
+ 1723233600L, //
+ 21.9, //
+ 21.9, //
+ 65.31, //
+ 15.1, //
+ 0.0, //
+ 29.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 9.0, //
+ 4.0, //
+ 217.7, //
+ 1015.0, //
+ 24.1, //
+ 92.6, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "23:00:00", //
+ 1723237200L, //
+ 21.5, //
+ 21.5, //
+ 67.79, //
+ 15.3, //
+ 0.0, //
+ 29.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 9.4, //
+ 4.7, //
+ 229.5, //
+ 1016.0, //
+ 24.1, //
+ 93.1, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ) //
+ ) //
+ ), //
+ new Day( //
+ "2024-08-10", //
+ 1723240800L, //
+ 25.9, //
+ 19.0, //
+ 22.1, //
+ 25.9, //
+ 19.0, //
+ 22.1, //
+ 14.9, //
+ 65.4, //
+ 0.0, //
+ 29.0, //
+ 0.0, //
+ List.of("rain"), //
+ 0.0, //
+ 0.0, //
+ 34.9, //
+ 15.5, //
+ 296.2, //
+ 1018.9, //
+ 60.6, //
+ 24.1, //
+ 246.9, //
+ 21.4, //
+ 7.0, //
+ 10.0, //
+ "05:31:19", //
+ 1723260679L, //
+ "20:22:08", //
+ 1723314128L, //
+ 0.19, //
+ "Partially cloudy", //
+ "Partly cloudy throughout the day.", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst", //
+ List.of( //
+ new Hour( //
+ "00:00:00", //
+ 1723240800L, //
+ 21.1, //
+ 21.1, //
+ 69.47, //
+ 15.3, //
+ 0.0, //
+ 29.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 10.1, //
+ 4.3, //
+ 294.1, //
+ 1016.0, //
+ 24.1, //
+ 99.3, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "01:00:00", //
+ 1723244400L, //
+ 20.7, //
+ 20.7, //
+ 72.12, //
+ 15.5, //
+ 0.0, //
+ 29.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 9.4, //
+ 4.3, //
+ 263.3, //
+ 1017.0, //
+ 24.1, //
+ 95.8, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "02:00:00", //
+ 1723248000L, //
+ 20.3, //
+ 20.3, //
+ 74.88, //
+ 15.7, //
+ 0.0, //
+ 29.0, //
+ 0.0, //
+ 0.0, //
+ List.of("rain"), //
+ 9.4, //
+ 4.7, //
+ 251.8, //
+ 1017.0, //
+ 24.1, //
+ 92.6, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "03:00:00", //
+ 1723251600L, //
+ 20.2, //
+ 20.2, //
+ 76.31, //
+ 15.9, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 14.4, //
+ 6.8, //
+ 255.8, //
+ 1017.0, //
+ 24.1, //
+ 77.6, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-night", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "04:00:00", //
+ 1723255200L, //
+ 19.8, //
+ 19.8, //
+ 79.23, //
+ 16.1, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 16.6, //
+ 7.9, //
+ 267.2, //
+ 1017.0, //
+ 24.1, //
+ 98.3, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Overcast", //
+ "cloudy", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "05:00:00", //
+ 1723258800L, //
+ 19.3, //
+ 19.3, //
+ 83.84, //
+ 16.5, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 17.3, //
+ 8.3, //
+ 279.8, //
+ 1018.0, //
+ 24.1, //
+ 76.6, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-night", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "06:00:00", //
+ 1723262400L, //
+ 19.0, //
+ 19.0, //
+ 85.97, //
+ 16.6, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 16.9, //
+ 7.6, //
+ 284.8, //
+ 1018.0, //
+ 24.1, //
+ 70.5, //
+ 4.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "07:00:00", //
+ 1723266000L, //
+ 19.2, //
+ 19.2, //
+ 86.54, //
+ 16.9, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 16.6, //
+ 7.9, //
+ 295.6, //
+ 1019.0, //
+ 24.1, //
+ 71.8, //
+ 68.0, //
+ 0.2, //
+ 1.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "08:00:00", //
+ 1723269600L, //
+ 20.2, //
+ 20.2, //
+ 82.89, //
+ 17.2, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 22.0, //
+ 10.4, //
+ 293.4, //
+ 1020.0, //
+ 24.1, //
+ 53.0, //
+ 224.0, //
+ 0.8, //
+ 2.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "09:00:00", //
+ 1723273200L, //
+ 21.2, //
+ 21.2, //
+ 76.47, //
+ 16.9, //
+ 0.0, //
+ 12.9, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 27.4, //
+ 12.6, //
+ 298.9, //
+ 1020.0, //
+ 24.1, //
+ 63.6, //
+ 383.0, //
+ 1.4, //
+ 4.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "10:00:00", //
+ 1723276800L, //
+ 21.7, //
+ 21.7, //
+ 71.39, //
+ 16.3, //
+ 0.0, //
+ 12.9, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 29.2, //
+ 13.7, //
+ 303.3, //
+ 1020.0, //
+ 24.1, //
+ 76.8, //
+ 535.0, //
+ 1.9, //
+ 5.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "11:00:00", //
+ 1723280400L, //
+ 22.7, //
+ 22.7, //
+ 63.01, //
+ 15.3, //
+ 0.0, //
+ 12.9, //
+ 0.0, //
+ 0.0, //
+ List.of("rain"), //
+ 30.2, //
+ 14.0, //
+ 301.1, //
+ 1020.0, //
+ 24.1, //
+ 54.8, //
+ 626.0, //
+ 2.3, //
+ 6.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "12:00:00", //
+ 1723284000L, //
+ 23.6, //
+ 23.6, //
+ 57.78, //
+ 14.8, //
+ 0.0, //
+ 12.9, //
+ 0.0, //
+ 0.0, //
+ List.of("rain"), //
+ 33.8, //
+ 14.8, //
+ 298.6, //
+ 1020.0, //
+ 24.1, //
+ 46.0, //
+ 608.0, //
+ 2.2, //
+ 6.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "13:00:00", //
+ 1723287600L, //
+ 24.5, //
+ 24.5, //
+ 53.69, //
+ 14.5, //
+ 0.0, //
+ 12.9, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 34.9, //
+ 15.1, //
+ 298.7, //
+ 1020.0, //
+ 24.1, //
+ 50.9, //
+ 642.0, //
+ 2.3, //
+ 6.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "14:00:00", //
+ 1723291200L, //
+ 25.3, //
+ 25.3, //
+ 49.88, //
+ 14.1, //
+ 0.0, //
+ 12.9, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 33.1, //
+ 14.8, //
+ 296.0, //
+ 1020.0, //
+ 24.1, //
+ 58.4, //
+ 693.0, //
+ 2.5, //
+ 7.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "15:00:00", //
+ 1723294800L, //
+ 25.7, //
+ 25.7, //
+ 47.46, //
+ 13.7, //
+ 0.0, //
+ 3.2, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 33.1, //
+ 15.5, //
+ 299.5, //
+ 1019.0, //
+ 24.1, //
+ 57.7, //
+ 431.0, //
+ 1.6, //
+ 4.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "16:00:00", //
+ 1723298400L, //
+ 25.9, //
+ 25.9, //
+ 45.99, //
+ 13.4, //
+ 0.0, //
+ 3.2, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 33.8, //
+ 15.1, //
+ 299.3, //
+ 1019.0, //
+ 24.1, //
+ 55.1, //
+ 530.0, //
+ 1.9, //
+ 5.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "17:00:00", //
+ 1723302000L, //
+ 25.6, //
+ 25.6, //
+ 45.91, //
+ 13.1, //
+ 0.0, //
+ 3.2, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 32.8, //
+ 14.0, //
+ 300.0, //
+ 1019.0, //
+ 24.1, //
+ 62.4, //
+ 526.0, //
+ 1.9, //
+ 5.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "18:00:00", //
+ 1723305600L, //
+ 25.2, //
+ 25.2, //
+ 46.71, //
+ 13.0, //
+ 0.0, //
+ 3.2, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 29.9, //
+ 11.9, //
+ 305.5, //
+ 1019.0, //
+ 24.1, //
+ 66.8, //
+ 376.0, //
+ 1.4, //
+ 4.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "19:00:00", //
+ 1723309200L, //
+ 24.5, //
+ 24.5, //
+ 49.02, //
+ 13.1, //
+ 0.0, //
+ 3.2, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 24.8, //
+ 7.6, //
+ 306.1, //
+ 1019.0, //
+ 24.1, //
+ 51.6, //
+ 211.0, //
+ 0.8, //
+ 2.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "20:00:00", //
+ 1723312800L, //
+ 22.9, //
+ 22.9, //
+ 57.61, //
+ 14.1, //
+ 0.0, //
+ 3.2, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 15.5, //
+ 4.3, //
+ 341.4, //
+ 1019.0, //
+ 24.1, //
+ 34.3, //
+ 69.0, //
+ 0.2, //
+ 1.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-day", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "21:00:00", //
+ 1723316400L, //
+ 21.1, //
+ 21.1, //
+ 63.06, //
+ 13.8, //
+ 0.0, //
+ 3.2, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 8.3, //
+ 3.6, //
+ 2.0, //
+ 1020.0, //
+ 24.1, //
+ 10.9, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Clear", //
+ "clear-night", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "22:00:00", //
+ 1723320000L, //
+ 20.3, //
+ 20.3, //
+ 64.54, //
+ 13.4, //
+ 0.0, //
+ 3.2, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 6.8, //
+ 2.5, //
+ 14.5, //
+ 1020.0, //
+ 24.1, //
+ 6.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Clear", //
+ "clear-night", //
+ null, //
+ "fcst" //
+ ), //
+ new Hour( //
+ "23:00:00", //
+ 1723323600L, //
+ 19.8, //
+ 19.8, //
+ 64.86, //
+ 13.0, //
+ 0.0, //
+ 3.2, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 3.6, //
+ 2.5, //
+ 138.2, //
+ 1020.0, //
+ 24.1, //
+ 24.4, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 10.0, //
+ "Partially cloudy", //
+ "partly-cloudy-night", //
+ null, //
+ "fcst" //
+ ) //
+ ) //
+ ) //
+ ), new CurrentConditions(//
+ "15:45:00", //
+ 1723297500L, //
+ 79.7, //
+ 79.7, //
+ 53.2, //
+ 61.1, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ 0.0, //
+ null, //
+ 7.8, //
+ 6.0, //
+ 16.0, //
+ 1019.0, //
+ 6.2, //
+ 68.4, //
+ 321.0, //
+ 1.2, //
+ 3.0, //
+ "Częściowe zachmurzenie", //
+ "partly-cloudy-day", //
+ List.of("EPWR", "E1158", "F4529"), //
+ "obs", //
+ "05:31:19", //
+ 1723260679L, //
+ "20:22:08", //
+ 1723314128L, //
+ 0.19//
+ )//
+ ); //
+}
diff --git a/bundles/pom.xml b/bundles/pom.xml
index 2e9c12d782a34..9985f15a55d3b 100644
--- a/bundles/pom.xml
+++ b/bundles/pom.xml
@@ -430,6 +430,7 @@
org.openhab.binding.verisureorg.openhab.binding.vesyncorg.openhab.binding.vigicrues
+ org.openhab.binding.visualcrossingorg.openhab.binding.vitotronicorg.openhab.binding.vizioorg.openhab.binding.volvooncall