diff --git a/CODEOWNERS b/CODEOWNERS index 085876b540840..b6d7a02de8ac8 100755 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -395,6 +395,7 @@ /bundles/org.openhab.binding.verisure/ @jannegpriv /bundles/org.openhab.binding.vesync/ @dag81 /bundles/org.openhab.binding.vigicrues/ @clinique +/bundles/org.openhab.binding.visualcrossing/ @magx2 /bundles/org.openhab.binding.vitotronic/ @steand /bundles/org.openhab.binding.vizio/ @mlobstein /bundles/org.openhab.binding.volvooncall/ @Jamstah diff --git a/bom/openhab-addons/pom.xml b/bom/openhab-addons/pom.xml index e4acce9bd8d1e..fd2bac334ff5e 100644 --- a/bom/openhab-addons/pom.xml +++ b/bom/openhab-addons/pom.xml @@ -1971,6 +1971,11 @@ org.openhab.binding.vigicrues ${project.version} + + org.openhab.addons.bundles + org.openhab.binding.visualcrossing + ${project.version} + org.openhab.addons.bundles org.openhab.binding.vitotronic diff --git a/bundles/org.openhab.binding.visualcrossing/NOTICE b/bundles/org.openhab.binding.visualcrossing/NOTICE new file mode 100644 index 0000000000000..38d625e349232 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/NOTICE @@ -0,0 +1,13 @@ +This content is produced and maintained by the openHAB project. + +* Project home: https://www.openhab.org + +== Declared Project Licenses + +This program and the accompanying materials are made available under the terms +of the Eclipse Public License 2.0 which is available at +https://www.eclipse.org/legal/epl-2.0/. + +== Source Code + +https://github.com/openhab/openhab-addons diff --git a/bundles/org.openhab.binding.visualcrossing/README.md b/bundles/org.openhab.binding.visualcrossing/README.md new file mode 100644 index 0000000000000..aef84a356ad80 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/README.md @@ -0,0 +1,225 @@ +# VisualCrossing Binding + +VisualCrossing Binding provides integration with VisualCrossing API + + > Visual Crossing Weather is the easiest-to-use and lowest-cost source for historical and forecast weather data. + > Our [Weather API](https://www.visualcrossing.com/weather-api) is designed to integrate easily into any app or code, and + > our prices are lower than any other provider in the industry. + > + > Our data is used daily by a diverse customer-base including business analysts, data scientists, insurance professionals, + > energy producers, construction planners, and academics. + > + > We have the [Weather Data](https://www.visualcrossing.com/weather-data) and expertise needed to serve any individual or + > organization from an independent event planner to a global enterprise. + +from [VisualCrossing site](https://www.visualcrossing.com/) + +## Supported Things + +- `weather`: [Weather API](https://www.visualcrossing.com/weather-api) + +## Thing Configuration + +### `weather` Thing Configuration + +| Name | Type | Description | Default | Required | Advanced | +|-----------------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------|----------|----------| +| password | text | API Key to connect to the cloud | N/A | yes | no | +| location | text | Is the address, partial address or latitude,longitude location for which to retrieve weather data. You can also use US ZIP Codes. | OH location | no | no | +| lang | text | 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) | OH language | no | no | +| hostname | text | Hostname or IP address of the server | https://weather.visualcrossing.com | yes | yes | +| refreshInterval | integer | Interval the device is polled in sec. | 3600 | no | yes | +| httpRetries | integer | Interval the device is polled in sec. | 3 | no | yes | + +## Channels + +### `basic-channel-group` + +| Channel | Type | Read/Write | Description | +|-------------|--------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| cost | Switch | R | How much API tokens thing used since start | +| description | Switch | R | 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. | + +### `day-channel-group` + +| Channel | Type | Read/Write | Description | +|-----------------|----------------------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| datetime | String | R | | +| timestamp | Number | R | | +| temperature | Number:Temperature | R | Temperature at the location. Daily values are average values (mean) for the day | +| temperature-min | Number:Temperature | R | Minimum temperature at the location | +| temperature-max | Number:Temperature | R | Maximum temperature at the location | +| feels-like | Number:Temperature | R | What the temperature feels like accounting for heat index or wind chill. Daily values are average values (mean) for the day. | +| feels-like-min | Number:Temperature | R | Minimum feels like temperature at the location | +| feels-like-max | Number:Temperature | R | Maximum feels like temperature at the location | +| dew | Number:Temperature | R | Dew point temperature | +| humidity | Number:Dimensionless | R | | +| precip | Number:Length | R | 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. | +| precip-prob | Number:Dimensionless | R | The likelihood of measurable precipitation ranging from 0% to 100% | +| precip-type | String | R | An comma separated array indicating the type(s) of precipitation expected or that occurred. Possible values include `rain`, `snow`, `freezingrain` and `ice`. | +| precip-cover | Number | R | The proportion of hours where there was non-zero precipitation | +| snow | Number:Length | R | The amount of snow that fell or is predicted to fall | +| snow-depth | Number:Length | R | | +| wind-gust | Number:Speed | R | 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. | +| wind-speed | Number:Speed | R | 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. | +| wind-dir | Number:Angle | R | Direction from which the wind is blowing | +| pressure | Number:Pressure | R | The sea level atmospheric or barometric pressure in millibars (or hectopascals) | +| cloud-cover | Number:Dimensionless | R | How much of the sky is covered in cloud ranging from 0–100% | +| visibility | Number:Length | R | Distance at which distant objects are visible | +| solar-radiation | Number:Intensity | R | 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. | +| solar-energy | Number | R | (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. | +| uv-index | Number | R | 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 | String | R | | +| sunrise-epoch | | R | | +| sunset | String | R | | +| sunset-epoch | | R | | +| moon-phase | Number | R | 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). | +| conditions | String | R | Textual representation of the weather conditions. See [Weather Data Conditions](https://www.visualcrossing.com/resources/documentation/weather-api/weather-condition-fields/) | +| description | String | R | 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. | +| icon | String | R | A fixed, machine readable summary that can be used to display an icon | +| stations | String | R | The weather stations (comma separated) used when collecting an historical observation record | +| source | String | R | 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. | +| severe-risk | Number | R | 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. | + +#### `hourXX` + +In `day-channel-group` there are 0–23 channels of type `hourXX` + +| Channel | Type | Read/Write | Description | +|------------------------|-----------------------------|------------|-------------| +| hourXX-datetime | time-channel | R | | +| hourXX-timestamp | timestamp-channel | R | | +| hourXX-temperature | system.outdoor-temperature | R | | +| hourXX-feels-like | temperature-channel | R | | +| hourXX-humidity | system.atmospheric-humidity | R | | +| hourXX-dew | temperature-channel | R | | +| hourXX-precip | precip-channel | R | | +| hourXX-precip-prob | precip-prob-channel | R | | +| hourXX-precip-type | precip-type-channel | R | | +| hourXX-snow | snow-channel | R | | +| hourXX-snow-depth | snow-channel | R | | +| hourXX-wind-gust | system.wind-speed | R | | +| hourXX-wind-speed | system.wind-speed | R | | +| hourXX-wind-dir | system.wind-direction | R | | +| hourXX-pressure | system.barometric-pressure | R | | +| hourXX-visibility | visibility-channel | R | | +| hourXX-cloud-cover | cloud-cover-channel | R | | +| hourXX-solar-radiation | solar-radiation-channel | R | | +| hourXX-solar-energy | solar-energy-channel | R | | +| hourXX-uv-index | uv-index-channel | R | | +| hourXX-severe-risk | severe-risk-channel | R | | +| hourXX-conditions | conditions-channel | R | | +| hourXX-icon | icon-channel | R | | +| hourXX-stations | stations-channel | R | | +| hourXX-source | source-channel | R | | + +### `current-conditions-channel-group` + +| Channel | Type | Read/Write | Description | +|-----------------|-----------------------------|------------|-------------| +| datetime | time-channel | R | | +| timestamp | timestamp-channel | R | | +| temperature | system.outdoor-temperature | R | | +| feels-like | temperature-channel | R | | +| humidity | system.atmospheric-humidity | R | | +| dew | temperature-channel | R | | +| precip | precip-channel | R | | +| precip-prob | precip-prob-channel | R | | +| precip-type | precip-type-channel | R | | +| snow | snow-channel | R | | +| snow-depth | snow-channel | R | | +| wind-gust | system.wind-speed | R | | +| wind-speed | system.wind-speed | R | | +| wind-dir | system.wind-direction | R | | +| pressure | system.barometric-pressure | R | | +| visibility | visibility-channel | R | | +| cloud-cover | cloud-cover-channel | R | | +| solar-radiation | solar-radiation-channel | R | | +| solar-energy | solar-energy-channel | R | | +| uv-index | uv-index-channel | R | | +| conditions | conditions-channel | R | | +| icon | icon-channel | R | | +| stations | stations-channel | R | | +| source | source-channel | R | | +| sunrise | sunrise-channel | R | | +| sunrise-epoch | timestamp-channel | R | | +| sunset | sunset-channel | R | | +| sunset-epoch | timestamp-channel | R | | +| moon-phase | moon-phase-channel | R | | + +## Full Example + +### Thing Configuration + +```java +Thing visualcrossing:weather:default_config "Total Weather Data" @ "Weather" [ apiKey="MKSH4W6U2H3BYJBB7CQVWLPTT" ] +Thing visualcrossing:weather:all_config "Total Weather Data" @ "Weather" [ apiKey="MKSH4W6U2H3BYJBB7CQVWLPTT", location="wrocław,poland", lang="pl", hostname="https://weather.visualcrossing.com", refreshInterval="3600", httpRetries="3" ] +``` + +### Item Configuration + +**Note: I strongly suggest not using UI Items creation because it will kill the web browser. UI is getting unresponsive when loading so many channels and trying to bind them.** + +**Note 2: Use `docs/only_days.items` to have forecast for days but without hours or join items from `docs/Day_XX` to get hourly forecast for each day** + +```java +Group Total_Weather_Data "Total Weather Data" [ "Equipment" ] + +// basic group +Group Total_Weather_Data_Basic "Basic" (Total_Weather_Data) [ "Equipment" ] +Number Total_Weather_Data_Basic_Cost "Cost" (Total_Weather_Data_Basic) [ "Point" ] {channel="visualcrossing:weather:default_config:basic#cost"} +String Total_Weather_Data_Basic_Description "Description" (Total_Weather_Data_Basic) [ "Point" ] {channel="visualcrossing:weather:default_config:basic#description"} + +// current conditions +Group Total_Weather_Data_Current_Conditions "Current Conditions" (Total_Weather_Data) [ "Equipment" ] +String Total_Weather_Data_Basic_Datetime "Datetime" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#datetime"} +DateTime Total_Weather_Data_Basic_Timestamp "Timestamp" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#timestamp"} +Number:Temperature Total_Weather_Data_Basic_Temperature "Temperature" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#temperature"} +Number:Temperature Total_Weather_Data_Basic_Feels_Like "Feels Like" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#feels-like"} +Number:Dimensionless Total_Weather_Data_Basic_Humidity "Humidity" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#humidity"} +Number:Temperature Total_Weather_Data_Basic_Dew "Dew" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#dew"} +Number:Length Total_Weather_Data_Basic_Precip "Precip" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#precip", unit="mm"} +Number:Dimensionless Total_Weather_Data_Basic_Precip_Probality "Precip Probality" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#precip-prob"} +String Total_Weather_Data_Basic_Precip_Type "Precip Type" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#precip-type"} +Number:Length Total_Weather_Data_Basic_Snow "Snow" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#snow"} +Number:Length Total_Weather_Data_Basic_Snow_Depth "Snow Depth" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#snow-depth"} +Number:Speed Total_Weather_Data_Basic_Wind_Gust "Wind Gust" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#wind-gust"} +Number:Speed Total_Weather_Data_Basic_Wind_Speed "Wind Speed" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#wind-speed"} +Number:Angle Total_Weather_Data_Basic_Wind_Direction "Wind Direction" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#wind-dir"} +Number:Pressure Total_Weather_Data_Basic_Pressure "Pressure" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#pressure"} +Number:Length Total_Weather_Data_Basic_Visibility "Visibility" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#visibility"} +Number:Dimensionless Total_Weather_Data_Basic_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#cloud-cover"} +Number:Intensity Total_Weather_Data_Basic_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#solar-radiation"} +Number Total_Weather_Data_Basic_Solar_Energy "Solar Energy" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#solar-energy"} +Number Total_Weather_Data_Basic_UV_Index "UV Index" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#uv-index"} +String Total_Weather_Data_Basic_Conditions "Conditions" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#conditions"} +String Total_Weather_Data_Basic_Icon "Icon" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#icon"} +String Total_Weather_Data_Basic_Stations "Stations" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#stations"} +String Total_Weather_Data_Basic_Source "Source" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#source"} +String Total_Weather_Data_Basic_Sunrise "Sunrise" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#sunrise"} +DateTime Total_Weather_Data_Basic_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#sunrise-epoch"} +String Total_Weather_Data_Basic_Sunset "Sunset" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#sunset"} +DateTime Total_Weather_Data_Basic_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#sunset-epoch"} +Number Total_Weather_Data_Basic_Moon_Phase "Moon Phase" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#moon-phase"} +``` + +### Actions + +Visual Crossing binding provides actions to use in rules: + +```java +import static org.openhab.binding.visualcrossing.internal.api.VisualCrossingApi.UnitGroup.METRIC; + +rule "test" +when + /* when */ +then + val actions = getActions("visualcrossing", "visualcrossing:weather:as8af03m38") + if (actions !== null) { + val weatherResponse1 = actions.timeline() + // lang - https://www.visualcrossing.com/resources/documentation/weather-api/how-to-create-or-modify-language-files/ + // dateFrom, dateTo - https://www.visualcrossing.com/resources/documentation/weather-api/using-the-time-period-parameter-to-specify-dynamic-dates-for-weather-api-requests/ + val weatherResponse2 = actions.timeline("wrocław,poland", METRIC, "pl", "last7days", "next5days") + } +end +``` diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_01.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_01.items new file mode 100644 index 0000000000000..e3889713c84c8 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_01.items @@ -0,0 +1,39 @@ +// Day01 +Group Total_Weather_Data_Day01 "Day T+01" (Total_Weather_Data) [ "Equipment" ] +String Day01_DateTime "Time" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day01_Timestamp "Timestamp" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day01_Temperature "Temperature" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day01_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day01_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day01_FeelsLike "Feels Like" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day01_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day01_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day01_Dew "Dew Point" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day01_Humidity "Humidity" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day01_Precip "Precipitation" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day01_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day01_Precip_Type "Precipitation Type" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day01_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day01_Snow "Snow" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day01_Snow_Depth "Snow Depth" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day01_Wind_Gust "Wind Gust" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day01_Wind_Speed "Wind Speed" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day01_Wind_Dir "Wind Direction" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day01_Pressure "Pressure" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day01_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day01_Visibility "Visibility" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day01_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day01_Solar_Energy "Solar Energy" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day01_UV_Index "UV Index" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day01_Sunrise "Sunrise" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day01_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day01_Sunset "Sunset" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day01_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day01_Moon_Phase "Moon Phase" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day01_Conditions "Conditions" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day01_Description "Description" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day01_Icon "Icon" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day01_Stations "Stations" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day01_Source "Source" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day01_Severe_Risk "Severe Risk" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_02.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_02.items new file mode 100644 index 0000000000000..0c4f62c9979dc --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_02.items @@ -0,0 +1,39 @@ +// Day02 +Group Total_Weather_Data_Day02 "Day T+02" (Total_Weather_Data) [ "Equipment" ] +String Day02_DateTime "Time" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day02_Timestamp "Timestamp" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day02_Temperature "Temperature" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day02_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day02_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day02_FeelsLike "Feels Like" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day02_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day02_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day02_Dew "Dew Point" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day02_Humidity "Humidity" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day02_Precip "Precipitation" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day02_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day02_Precip_Type "Precipitation Type" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day02_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day02_Snow "Snow" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day02_Snow_Depth "Snow Depth" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day02_Wind_Gust "Wind Gust" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day02_Wind_Speed "Wind Speed" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day02_Wind_Dir "Wind Direction" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day02_Pressure "Pressure" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day02_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day02_Visibility "Visibility" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day02_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day02_Solar_Energy "Solar Energy" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day02_UV_Index "UV Index" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day02_Sunrise "Sunrise" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day02_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day02_Sunset "Sunset" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day02_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day02_Moon_Phase "Moon Phase" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day02_Conditions "Conditions" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day02_Description "Description" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day02_Icon "Icon" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day02_Stations "Stations" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day02_Source "Source" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day02_Severe_Risk "Severe Risk" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_03.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_03.items new file mode 100644 index 0000000000000..46a62740d105a --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_03.items @@ -0,0 +1,39 @@ +// Day03 +Group Total_Weather_Data_Day03 "Day T+03" (Total_Weather_Data) [ "Equipment" ] +String Day03_DateTime "Time" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day03_Timestamp "Timestamp" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day03_Temperature "Temperature" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day03_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day03_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day03_FeelsLike "Feels Like" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day03_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day03_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day03_Dew "Dew Point" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day03_Humidity "Humidity" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day03_Precip "Precipitation" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day03_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day03_Precip_Type "Precipitation Type" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day03_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day03_Snow "Snow" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day03_Snow_Depth "Snow Depth" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day03_Wind_Gust "Wind Gust" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day03_Wind_Speed "Wind Speed" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day03_Wind_Dir "Wind Direction" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day03_Pressure "Pressure" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day03_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day03_Visibility "Visibility" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day03_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day03_Solar_Energy "Solar Energy" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day03_UV_Index "UV Index" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day03_Sunrise "Sunrise" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day03_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day03_Sunset "Sunset" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day03_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day03_Moon_Phase "Moon Phase" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day03_Conditions "Conditions" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day03_Description "Description" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day03_Icon "Icon" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day03_Stations "Stations" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day03_Source "Source" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day03_Severe_Risk "Severe Risk" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_04.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_04.items new file mode 100644 index 0000000000000..03702904691da --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_04.items @@ -0,0 +1,39 @@ +// Day04 +Group Total_Weather_Data_Day04 "Day T+04" (Total_Weather_Data) [ "Equipment" ] +String Day04_DateTime "Time" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day04_Timestamp "Timestamp" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day04_Temperature "Temperature" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day04_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day04_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day04_FeelsLike "Feels Like" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day04_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day04_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day04_Dew "Dew Point" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day04_Humidity "Humidity" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day04_Precip "Precipitation" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day04_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day04_Precip_Type "Precipitation Type" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day04_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day04_Snow "Snow" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day04_Snow_Depth "Snow Depth" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day04_Wind_Gust "Wind Gust" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day04_Wind_Speed "Wind Speed" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day04_Wind_Dir "Wind Direction" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day04_Pressure "Pressure" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day04_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day04_Visibility "Visibility" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day04_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day04_Solar_Energy "Solar Energy" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day04_UV_Index "UV Index" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day04_Sunrise "Sunrise" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day04_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day04_Sunset "Sunset" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day04_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day04_Moon_Phase "Moon Phase" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day04_Conditions "Conditions" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day04_Description "Description" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day04_Icon "Icon" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day04_Stations "Stations" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day04_Source "Source" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day04_Severe_Risk "Severe Risk" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_05.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_05.items new file mode 100644 index 0000000000000..19f00e538c6c3 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_05.items @@ -0,0 +1,39 @@ +// Day05 +Group Total_Weather_Data_Day05 "Day T+05" (Total_Weather_Data) [ "Equipment" ] +String Day05_DateTime "Time" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day05_Timestamp "Timestamp" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day05_Temperature "Temperature" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day05_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day05_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day05_FeelsLike "Feels Like" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day05_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day05_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day05_Dew "Dew Point" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day05_Humidity "Humidity" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day05_Precip "Precipitation" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day05_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day05_Precip_Type "Precipitation Type" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day05_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day05_Snow "Snow" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day05_Snow_Depth "Snow Depth" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day05_Wind_Gust "Wind Gust" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day05_Wind_Speed "Wind Speed" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day05_Wind_Dir "Wind Direction" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day05_Pressure "Pressure" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day05_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day05_Visibility "Visibility" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day05_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day05_Solar_Energy "Solar Energy" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day05_UV_Index "UV Index" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day05_Sunrise "Sunrise" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day05_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day05_Sunset "Sunset" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day05_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day05_Moon_Phase "Moon Phase" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day05_Conditions "Conditions" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day05_Description "Description" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day05_Icon "Icon" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day05_Stations "Stations" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day05_Source "Source" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day05_Severe_Risk "Severe Risk" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_06.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_06.items new file mode 100644 index 0000000000000..8c4a6561e7617 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_06.items @@ -0,0 +1,39 @@ +// Day06 +Group Total_Weather_Data_Day06 "Day T+06" (Total_Weather_Data) [ "Equipment" ] +String Day06_DateTime "Time" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day06_Timestamp "Timestamp" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day06_Temperature "Temperature" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day06_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day06_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day06_FeelsLike "Feels Like" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day06_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day06_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day06_Dew "Dew Point" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day06_Humidity "Humidity" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day06_Precip "Precipitation" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day06_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day06_Precip_Type "Precipitation Type" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day06_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day06_Snow "Snow" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day06_Snow_Depth "Snow Depth" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day06_Wind_Gust "Wind Gust" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day06_Wind_Speed "Wind Speed" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day06_Wind_Dir "Wind Direction" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day06_Pressure "Pressure" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day06_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day06_Visibility "Visibility" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day06_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day06_Solar_Energy "Solar Energy" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day06_UV_Index "UV Index" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day06_Sunrise "Sunrise" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day06_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day06_Sunset "Sunset" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day06_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day06_Moon_Phase "Moon Phase" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day06_Conditions "Conditions" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day06_Description "Description" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day06_Icon "Icon" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day06_Stations "Stations" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day06_Source "Source" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day06_Severe_Risk "Severe Risk" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_07.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_07.items new file mode 100644 index 0000000000000..b3c0a2d7d91d1 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_07.items @@ -0,0 +1,39 @@ +// Day07 +Group Total_Weather_Data_Day07 "Day T+07" (Total_Weather_Data) [ "Equipment" ] +String Day07_DateTime "Time" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day07_Timestamp "Timestamp" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day07_Temperature "Temperature" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day07_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day07_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day07_FeelsLike "Feels Like" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day07_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day07_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day07_Dew "Dew Point" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day07_Humidity "Humidity" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day07_Precip "Precipitation" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day07_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day07_Precip_Type "Precipitation Type" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day07_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day07_Snow "Snow" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day07_Snow_Depth "Snow Depth" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day07_Wind_Gust "Wind Gust" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day07_Wind_Speed "Wind Speed" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day07_Wind_Dir "Wind Direction" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day07_Pressure "Pressure" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day07_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day07_Visibility "Visibility" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day07_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day07_Solar_Energy "Solar Energy" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day07_UV_Index "UV Index" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day07_Sunrise "Sunrise" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day07_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day07_Sunset "Sunset" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day07_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day07_Moon_Phase "Moon Phase" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day07_Conditions "Conditions" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day07_Description "Description" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day07_Icon "Icon" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day07_Stations "Stations" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day07_Source "Source" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day07_Severe_Risk "Severe Risk" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_08.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_08.items new file mode 100644 index 0000000000000..2537591d37103 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_08.items @@ -0,0 +1,39 @@ +// Day08 +Group Total_Weather_Data_Day08 "Day T+08" (Total_Weather_Data) [ "Equipment" ] +String Day08_DateTime "Time" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day08_Timestamp "Timestamp" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day08_Temperature "Temperature" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day08_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day08_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day08_FeelsLike "Feels Like" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day08_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day08_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day08_Dew "Dew Point" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day08_Humidity "Humidity" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day08_Precip "Precipitation" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day08_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day08_Precip_Type "Precipitation Type" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day08_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day08_Snow "Snow" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day08_Snow_Depth "Snow Depth" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day08_Wind_Gust "Wind Gust" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day08_Wind_Speed "Wind Speed" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day08_Wind_Dir "Wind Direction" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day08_Pressure "Pressure" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day08_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day08_Visibility "Visibility" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day08_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day08_Solar_Energy "Solar Energy" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day08_UV_Index "UV Index" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day08_Sunrise "Sunrise" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day08_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day08_Sunset "Sunset" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day08_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day08_Moon_Phase "Moon Phase" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day08_Conditions "Conditions" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day08_Description "Description" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day08_Icon "Icon" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day08_Stations "Stations" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day08_Source "Source" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day08_Severe_Risk "Severe Risk" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_09.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_09.items new file mode 100644 index 0000000000000..37e1b34cad75a --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_09.items @@ -0,0 +1,39 @@ +// Day09 +Group Total_Weather_Data_Day09 "Day T+09" (Total_Weather_Data) [ "Equipment" ] +String Day09_DateTime "Time" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day09_Timestamp "Timestamp" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day09_Temperature "Temperature" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day09_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day09_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day09_FeelsLike "Feels Like" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day09_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day09_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day09_Dew "Dew Point" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day09_Humidity "Humidity" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day09_Precip "Precipitation" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day09_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day09_Precip_Type "Precipitation Type" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day09_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day09_Snow "Snow" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day09_Snow_Depth "Snow Depth" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day09_Wind_Gust "Wind Gust" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day09_Wind_Speed "Wind Speed" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day09_Wind_Dir "Wind Direction" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day09_Pressure "Pressure" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day09_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day09_Visibility "Visibility" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day09_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day09_Solar_Energy "Solar Energy" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day09_UV_Index "UV Index" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day09_Sunrise "Sunrise" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day09_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day09_Sunset "Sunset" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day09_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day09_Moon_Phase "Moon Phase" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day09_Conditions "Conditions" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day09_Description "Description" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day09_Icon "Icon" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day09_Stations "Stations" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day09_Source "Source" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day09_Severe_Risk "Severe Risk" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_10.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_10.items new file mode 100644 index 0000000000000..2857c443bab6a --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_10.items @@ -0,0 +1,39 @@ +// Day10 +Group Total_Weather_Data_Day10 "Day T+10" (Total_Weather_Data) [ "Equipment" ] +String Day10_DateTime "Time" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day10_Timestamp "Timestamp" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day10_Temperature "Temperature" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day10_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day10_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day10_FeelsLike "Feels Like" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day10_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day10_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day10_Dew "Dew Point" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day10_Humidity "Humidity" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day10_Precip "Precipitation" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day10_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day10_Precip_Type "Precipitation Type" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day10_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day10_Snow "Snow" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day10_Snow_Depth "Snow Depth" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day10_Wind_Gust "Wind Gust" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day10_Wind_Speed "Wind Speed" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day10_Wind_Dir "Wind Direction" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day10_Pressure "Pressure" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day10_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day10_Visibility "Visibility" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day10_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day10_Solar_Energy "Solar Energy" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day10_UV_Index "UV Index" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day10_Sunrise "Sunrise" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day10_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day10_Sunset "Sunset" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day10_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day10_Moon_Phase "Moon Phase" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day10_Conditions "Conditions" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day10_Description "Description" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day10_Icon "Icon" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day10_Stations "Stations" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day10_Source "Source" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day10_Severe_Risk "Severe Risk" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_11.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_11.items new file mode 100644 index 0000000000000..734a679dba1f3 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_11.items @@ -0,0 +1,39 @@ +// Day11 +Group Total_Weather_Data_Day11 "Day T+11" (Total_Weather_Data) [ "Equipment" ] +String Day11_DateTime "Time" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day11_Timestamp "Timestamp" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day11_Temperature "Temperature" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day11_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day11_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day11_FeelsLike "Feels Like" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day11_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day11_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day11_Dew "Dew Point" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day11_Humidity "Humidity" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day11_Precip "Precipitation" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day11_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day11_Precip_Type "Precipitation Type" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day11_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day11_Snow "Snow" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day11_Snow_Depth "Snow Depth" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day11_Wind_Gust "Wind Gust" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day11_Wind_Speed "Wind Speed" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day11_Wind_Dir "Wind Direction" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day11_Pressure "Pressure" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day11_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day11_Visibility "Visibility" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day11_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day11_Solar_Energy "Solar Energy" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day11_UV_Index "UV Index" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day11_Sunrise "Sunrise" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day11_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day11_Sunset "Sunset" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day11_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day11_Moon_Phase "Moon Phase" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day11_Conditions "Conditions" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day11_Description "Description" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day11_Icon "Icon" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day11_Stations "Stations" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day11_Source "Source" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day11_Severe_Risk "Severe Risk" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_12.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_12.items new file mode 100644 index 0000000000000..62c07ed9bc20c --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_12.items @@ -0,0 +1,39 @@ +// Day12 +Group Total_Weather_Data_Day12 "Day T+12" (Total_Weather_Data) [ "Equipment" ] +String Day12_DateTime "Time" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day12_Timestamp "Timestamp" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day12_Temperature "Temperature" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day12_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day12_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day12_FeelsLike "Feels Like" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day12_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day12_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day12_Dew "Dew Point" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day12_Humidity "Humidity" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day12_Precip "Precipitation" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day12_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day12_Precip_Type "Precipitation Type" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day12_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day12_Snow "Snow" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day12_Snow_Depth "Snow Depth" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day12_Wind_Gust "Wind Gust" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day12_Wind_Speed "Wind Speed" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day12_Wind_Dir "Wind Direction" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day12_Pressure "Pressure" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day12_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day12_Visibility "Visibility" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day12_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day12_Solar_Energy "Solar Energy" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day12_UV_Index "UV Index" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day12_Sunrise "Sunrise" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day12_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day12_Sunset "Sunset" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day12_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day12_Moon_Phase "Moon Phase" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day12_Conditions "Conditions" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day12_Description "Description" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day12_Icon "Icon" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day12_Stations "Stations" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day12_Source "Source" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day12_Severe_Risk "Severe Risk" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_13.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_13.items new file mode 100644 index 0000000000000..a5d39a1481079 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_13.items @@ -0,0 +1,39 @@ +// Day13 +Group Total_Weather_Data_Day13 "Day T+13" (Total_Weather_Data) [ "Equipment" ] +String Day13_DateTime "Time" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day13_Timestamp "Timestamp" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day13_Temperature "Temperature" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day13_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day13_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day13_FeelsLike "Feels Like" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day13_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day13_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day13_Dew "Dew Point" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day13_Humidity "Humidity" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day13_Precip "Precipitation" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day13_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day13_Precip_Type "Precipitation Type" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day13_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day13_Snow "Snow" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day13_Snow_Depth "Snow Depth" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day13_Wind_Gust "Wind Gust" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day13_Wind_Speed "Wind Speed" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day13_Wind_Dir "Wind Direction" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day13_Pressure "Pressure" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day13_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day13_Visibility "Visibility" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day13_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day13_Solar_Energy "Solar Energy" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day13_UV_Index "UV Index" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day13_Sunrise "Sunrise" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day13_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day13_Sunset "Sunset" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day13_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day13_Moon_Phase "Moon Phase" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day13_Conditions "Conditions" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day13_Description "Description" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day13_Icon "Icon" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day13_Stations "Stations" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day13_Source "Source" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day13_Severe_Risk "Severe Risk" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_14.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_14.items new file mode 100644 index 0000000000000..3201aff35980f --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_14.items @@ -0,0 +1,39 @@ +// Day14 +Group Total_Weather_Data_Day14 "Day T+14" (Total_Weather_Data) [ "Equipment" ] +String Day14_DateTime "Time" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day14_Timestamp "Timestamp" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day14_Temperature "Temperature" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day14_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day14_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day14_FeelsLike "Feels Like" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day14_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day14_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day14_Dew "Dew Point" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day14_Humidity "Humidity" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day14_Precip "Precipitation" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day14_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day14_Precip_Type "Precipitation Type" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day14_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day14_Snow "Snow" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day14_Snow_Depth "Snow Depth" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day14_Wind_Gust "Wind Gust" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day14_Wind_Speed "Wind Speed" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day14_Wind_Dir "Wind Direction" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day14_Pressure "Pressure" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day14_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day14_Visibility "Visibility" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day14_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day14_Solar_Energy "Solar Energy" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day14_UV_Index "UV Index" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day14_Sunrise "Sunrise" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day14_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day14_Sunset "Sunset" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day14_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day14_Moon_Phase "Moon Phase" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day14_Conditions "Conditions" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day14_Description "Description" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day14_Icon "Icon" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day14_Stations "Stations" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day14_Source "Source" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day14_Severe_Risk "Severe Risk" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/Day_15.items b/bundles/org.openhab.binding.visualcrossing/docs/Day_15.items new file mode 100644 index 0000000000000..7c96a55a6d2fa --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/Day_15.items @@ -0,0 +1,39 @@ +// Day15 +Group Total_Weather_Data_Day15 "Day T+15" (Total_Weather_Data) [ "Equipment" ] +String Day15_DateTime "Time" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day15_Timestamp "Timestamp" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day15_Temperature "Temperature" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day15_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day15_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day15_FeelsLike "Feels Like" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day15_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day15_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day15_Dew "Dew Point" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day15_Humidity "Humidity" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day15_Precip "Precipitation" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day15_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day15_Precip_Type "Precipitation Type" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day15_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day15_Snow "Snow" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day15_Snow_Depth "Snow Depth" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day15_Wind_Gust "Wind Gust" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day15_Wind_Speed "Wind Speed" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day15_Wind_Dir "Wind Direction" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day15_Pressure "Pressure" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day15_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day15_Visibility "Visibility" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day15_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day15_Solar_Energy "Solar Energy" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day15_UV_Index "UV Index" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day15_Sunrise "Sunrise" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day15_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day15_Sunset "Sunset" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day15_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day15_Moon_Phase "Moon Phase" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day15_Conditions "Conditions" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day15_Description "Description" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day15_Icon "Icon" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day15_Stations "Stations" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day15_Source "Source" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day15_Severe_Risk "Severe Risk" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + diff --git a/bundles/org.openhab.binding.visualcrossing/docs/only_days.items b/bundles/org.openhab.binding.visualcrossing/docs/only_days.items new file mode 100644 index 0000000000000..33593946de6e0 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/docs/only_days.items @@ -0,0 +1,623 @@ +Group Total_Weather_Data "Total Weather Data" [ "Equipment" ] + +// basic group +Group Total_Weather_Data_Basic "Basic" (Total_Weather_Data) [ "Equipment" ] +Number Total_Weather_Data_Basic_Cost "Cost" (Total_Weather_Data_Basic) [ "Point" ] {channel="visualcrossing:weather:default_config:basic#cost"} +String Total_Weather_Data_Basic_Description "Description" (Total_Weather_Data_Basic) [ "Point" ] {channel="visualcrossing:weather:default_config:basic#description"} + +// current conditions +Group Total_Weather_Data_Current_Conditions "Current Conditions" (Total_Weather_Data) [ "Equipment" ] +String Total_Weather_Data_Basic_Datetime "Datetime" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#datetime"} +DateTime Total_Weather_Data_Basic_Timestamp "Timestamp" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#timestamp"} +Number:Temperature Total_Weather_Data_Basic_Temperature "Temperature" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#temperature"} +Number:Temperature Total_Weather_Data_Basic_Feels_Like "Feels Like" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#feels-like"} +Number:Dimensionless Total_Weather_Data_Basic_Humidity "Humidity" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#humidity"} +Number:Temperature Total_Weather_Data_Basic_Dew "Dew" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#dew"} +Number:Length Total_Weather_Data_Basic_Precip "Precip" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#precip", unit="mm"} +Number:Dimensionless Total_Weather_Data_Basic_Precip_Probality "Precip Probality" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#precip-prob"} +String Total_Weather_Data_Basic_Precip_Type "Precip Type" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#precip-type"} +Number:Length Total_Weather_Data_Basic_Snow "Snow" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#snow"} +Number:Length Total_Weather_Data_Basic_Snow_Depth "Snow Depth" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#snow-depth"} +Number:Speed Total_Weather_Data_Basic_Wind_Gust "Wind Gust" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#wind-gust"} +Number:Speed Total_Weather_Data_Basic_Wind_Speed "Wind Speed" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#wind-speed"} +Number:Angle Total_Weather_Data_Basic_Wind_Direction "Wind Direction" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#wind-dir"} +Number:Pressure Total_Weather_Data_Basic_Pressure "Pressure" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#pressure"} +Number:Length Total_Weather_Data_Basic_Visibility "Visibility" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#visibility"} +Number:Dimensionless Total_Weather_Data_Basic_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#cloud-cover"} +Number:Intensity Total_Weather_Data_Basic_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#solar-radiation"} +Number Total_Weather_Data_Basic_Solar_Energy "Solar Energy" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#solar-energy"} +Number Total_Weather_Data_Basic_UV_Index "UV Index" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#uv-index"} +String Total_Weather_Data_Basic_Conditions "Conditions" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#conditions"} +String Total_Weather_Data_Basic_Icon "Icon" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#icon"} +String Total_Weather_Data_Basic_Stations "Stations" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#stations"} +String Total_Weather_Data_Basic_Source "Source" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#source"} +String Total_Weather_Data_Basic_Sunrise "Sunrise" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#sunrise"} +DateTime Total_Weather_Data_Basic_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#sunrise-epoch"} +String Total_Weather_Data_Basic_Sunset "Sunset" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#sunset"} +DateTime Total_Weather_Data_Basic_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#sunset-epoch"} +Number Total_Weather_Data_Basic_Moon_Phase "Moon Phase" (Total_Weather_Data_Current_Conditions) [ "Point" ] {channel="visualcrossing:weather:default_config:current-conditions#moon-phase"} + +// Day01 +Group Total_Weather_Data_Day01 "Day T+01" (Total_Weather_Data) [ "Equipment" ] +String Day01_DateTime "Time" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day01_Timestamp "Timestamp" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day01_Temperature "Temperature" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day01_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day01_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day01_FeelsLike "Feels Like" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day01_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day01_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day01_Dew "Dew Point" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day01_Humidity "Humidity" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day01_Precip "Precipitation" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day01_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day01_Precip_Type "Precipitation Type" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day01_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day01_Snow "Snow" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day01_Snow_Depth "Snow Depth" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day01_Wind_Gust "Wind Gust" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day01_Wind_Speed "Wind Speed" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day01_Wind_Dir "Wind Direction" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day01_Pressure "Pressure" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day01_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day01_Visibility "Visibility" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day01_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day01_Solar_Energy "Solar Energy" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day01_UV_Index "UV Index" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day01_Sunrise "Sunrise" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day01_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day01_Sunset "Sunset" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day01_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day01_Moon_Phase "Moon Phase" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day01_Conditions "Conditions" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day01_Description "Description" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day01_Icon "Icon" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day01_Stations "Stations" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day01_Source "Source" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day01_Severe_Risk "Severe Risk" (Total_Weather_Data_Day01)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day02 +Group Total_Weather_Data_Day02 "Day T+02" (Total_Weather_Data) [ "Equipment" ] +String Day02_DateTime "Time" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day02_Timestamp "Timestamp" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day02_Temperature "Temperature" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day02_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day02_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day02_FeelsLike "Feels Like" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day02_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day02_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day02_Dew "Dew Point" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day02_Humidity "Humidity" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day02_Precip "Precipitation" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day02_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day02_Precip_Type "Precipitation Type" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day02_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day02_Snow "Snow" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day02_Snow_Depth "Snow Depth" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day02_Wind_Gust "Wind Gust" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day02_Wind_Speed "Wind Speed" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day02_Wind_Dir "Wind Direction" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day02_Pressure "Pressure" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day02_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day02_Visibility "Visibility" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day02_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day02_Solar_Energy "Solar Energy" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day02_UV_Index "UV Index" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day02_Sunrise "Sunrise" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day02_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day02_Sunset "Sunset" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day02_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day02_Moon_Phase "Moon Phase" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day02_Conditions "Conditions" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day02_Description "Description" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day02_Icon "Icon" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day02_Stations "Stations" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day02_Source "Source" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day02_Severe_Risk "Severe Risk" (Total_Weather_Data_Day02)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day03 +Group Total_Weather_Data_Day03 "Day T+03" (Total_Weather_Data) [ "Equipment" ] +String Day03_DateTime "Time" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day03_Timestamp "Timestamp" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day03_Temperature "Temperature" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day03_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day03_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day03_FeelsLike "Feels Like" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day03_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day03_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day03_Dew "Dew Point" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day03_Humidity "Humidity" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day03_Precip "Precipitation" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day03_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day03_Precip_Type "Precipitation Type" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day03_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day03_Snow "Snow" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day03_Snow_Depth "Snow Depth" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day03_Wind_Gust "Wind Gust" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day03_Wind_Speed "Wind Speed" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day03_Wind_Dir "Wind Direction" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day03_Pressure "Pressure" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day03_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day03_Visibility "Visibility" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day03_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day03_Solar_Energy "Solar Energy" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day03_UV_Index "UV Index" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day03_Sunrise "Sunrise" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day03_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day03_Sunset "Sunset" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day03_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day03_Moon_Phase "Moon Phase" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day03_Conditions "Conditions" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day03_Description "Description" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day03_Icon "Icon" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day03_Stations "Stations" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day03_Source "Source" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day03_Severe_Risk "Severe Risk" (Total_Weather_Data_Day03)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day04 +Group Total_Weather_Data_Day04 "Day T+04" (Total_Weather_Data) [ "Equipment" ] +String Day04_DateTime "Time" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day04_Timestamp "Timestamp" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day04_Temperature "Temperature" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day04_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day04_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day04_FeelsLike "Feels Like" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day04_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day04_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day04_Dew "Dew Point" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day04_Humidity "Humidity" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day04_Precip "Precipitation" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day04_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day04_Precip_Type "Precipitation Type" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day04_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day04_Snow "Snow" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day04_Snow_Depth "Snow Depth" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day04_Wind_Gust "Wind Gust" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day04_Wind_Speed "Wind Speed" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day04_Wind_Dir "Wind Direction" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day04_Pressure "Pressure" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day04_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day04_Visibility "Visibility" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day04_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day04_Solar_Energy "Solar Energy" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day04_UV_Index "UV Index" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day04_Sunrise "Sunrise" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day04_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day04_Sunset "Sunset" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day04_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day04_Moon_Phase "Moon Phase" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day04_Conditions "Conditions" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day04_Description "Description" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day04_Icon "Icon" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day04_Stations "Stations" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day04_Source "Source" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day04_Severe_Risk "Severe Risk" (Total_Weather_Data_Day04)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day05 +Group Total_Weather_Data_Day05 "Day T+05" (Total_Weather_Data) [ "Equipment" ] +String Day05_DateTime "Time" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day05_Timestamp "Timestamp" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day05_Temperature "Temperature" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day05_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day05_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day05_FeelsLike "Feels Like" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day05_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day05_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day05_Dew "Dew Point" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day05_Humidity "Humidity" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day05_Precip "Precipitation" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day05_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day05_Precip_Type "Precipitation Type" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day05_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day05_Snow "Snow" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day05_Snow_Depth "Snow Depth" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day05_Wind_Gust "Wind Gust" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day05_Wind_Speed "Wind Speed" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day05_Wind_Dir "Wind Direction" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day05_Pressure "Pressure" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day05_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day05_Visibility "Visibility" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day05_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day05_Solar_Energy "Solar Energy" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day05_UV_Index "UV Index" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day05_Sunrise "Sunrise" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day05_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day05_Sunset "Sunset" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day05_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day05_Moon_Phase "Moon Phase" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day05_Conditions "Conditions" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day05_Description "Description" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day05_Icon "Icon" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day05_Stations "Stations" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day05_Source "Source" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day05_Severe_Risk "Severe Risk" (Total_Weather_Data_Day05)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day06 +Group Total_Weather_Data_Day06 "Day T+06" (Total_Weather_Data) [ "Equipment" ] +String Day06_DateTime "Time" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day06_Timestamp "Timestamp" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day06_Temperature "Temperature" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day06_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day06_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day06_FeelsLike "Feels Like" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day06_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day06_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day06_Dew "Dew Point" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day06_Humidity "Humidity" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day06_Precip "Precipitation" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day06_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day06_Precip_Type "Precipitation Type" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day06_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day06_Snow "Snow" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day06_Snow_Depth "Snow Depth" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day06_Wind_Gust "Wind Gust" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day06_Wind_Speed "Wind Speed" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day06_Wind_Dir "Wind Direction" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day06_Pressure "Pressure" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day06_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day06_Visibility "Visibility" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day06_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day06_Solar_Energy "Solar Energy" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day06_UV_Index "UV Index" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day06_Sunrise "Sunrise" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day06_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day06_Sunset "Sunset" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day06_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day06_Moon_Phase "Moon Phase" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day06_Conditions "Conditions" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day06_Description "Description" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day06_Icon "Icon" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day06_Stations "Stations" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day06_Source "Source" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day06_Severe_Risk "Severe Risk" (Total_Weather_Data_Day06)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day07 +Group Total_Weather_Data_Day07 "Day T+07" (Total_Weather_Data) [ "Equipment" ] +String Day07_DateTime "Time" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day07_Timestamp "Timestamp" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day07_Temperature "Temperature" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day07_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day07_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day07_FeelsLike "Feels Like" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day07_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day07_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day07_Dew "Dew Point" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day07_Humidity "Humidity" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day07_Precip "Precipitation" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day07_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day07_Precip_Type "Precipitation Type" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day07_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day07_Snow "Snow" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day07_Snow_Depth "Snow Depth" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day07_Wind_Gust "Wind Gust" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day07_Wind_Speed "Wind Speed" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day07_Wind_Dir "Wind Direction" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day07_Pressure "Pressure" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day07_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day07_Visibility "Visibility" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day07_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day07_Solar_Energy "Solar Energy" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day07_UV_Index "UV Index" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day07_Sunrise "Sunrise" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day07_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day07_Sunset "Sunset" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day07_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day07_Moon_Phase "Moon Phase" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day07_Conditions "Conditions" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day07_Description "Description" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day07_Icon "Icon" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day07_Stations "Stations" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day07_Source "Source" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day07_Severe_Risk "Severe Risk" (Total_Weather_Data_Day07)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day08 +Group Total_Weather_Data_Day08 "Day T+08" (Total_Weather_Data) [ "Equipment" ] +String Day08_DateTime "Time" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day08_Timestamp "Timestamp" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day08_Temperature "Temperature" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day08_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day08_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day08_FeelsLike "Feels Like" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day08_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day08_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day08_Dew "Dew Point" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day08_Humidity "Humidity" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day08_Precip "Precipitation" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day08_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day08_Precip_Type "Precipitation Type" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day08_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day08_Snow "Snow" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day08_Snow_Depth "Snow Depth" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day08_Wind_Gust "Wind Gust" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day08_Wind_Speed "Wind Speed" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day08_Wind_Dir "Wind Direction" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day08_Pressure "Pressure" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day08_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day08_Visibility "Visibility" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day08_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day08_Solar_Energy "Solar Energy" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day08_UV_Index "UV Index" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day08_Sunrise "Sunrise" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day08_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day08_Sunset "Sunset" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day08_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day08_Moon_Phase "Moon Phase" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day08_Conditions "Conditions" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day08_Description "Description" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day08_Icon "Icon" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day08_Stations "Stations" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day08_Source "Source" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day08_Severe_Risk "Severe Risk" (Total_Weather_Data_Day08)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day09 +Group Total_Weather_Data_Day09 "Day T+09" (Total_Weather_Data) [ "Equipment" ] +String Day09_DateTime "Time" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day09_Timestamp "Timestamp" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day09_Temperature "Temperature" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day09_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day09_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day09_FeelsLike "Feels Like" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day09_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day09_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day09_Dew "Dew Point" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day09_Humidity "Humidity" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day09_Precip "Precipitation" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day09_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day09_Precip_Type "Precipitation Type" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day09_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day09_Snow "Snow" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day09_Snow_Depth "Snow Depth" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day09_Wind_Gust "Wind Gust" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day09_Wind_Speed "Wind Speed" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day09_Wind_Dir "Wind Direction" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day09_Pressure "Pressure" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day09_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day09_Visibility "Visibility" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day09_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day09_Solar_Energy "Solar Energy" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day09_UV_Index "UV Index" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day09_Sunrise "Sunrise" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day09_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day09_Sunset "Sunset" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day09_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day09_Moon_Phase "Moon Phase" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day09_Conditions "Conditions" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day09_Description "Description" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day09_Icon "Icon" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day09_Stations "Stations" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day09_Source "Source" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day09_Severe_Risk "Severe Risk" (Total_Weather_Data_Day09)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day10 +Group Total_Weather_Data_Day10 "Day T+10" (Total_Weather_Data) [ "Equipment" ] +String Day10_DateTime "Time" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day10_Timestamp "Timestamp" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day10_Temperature "Temperature" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day10_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day10_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day10_FeelsLike "Feels Like" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day10_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day10_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day10_Dew "Dew Point" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day10_Humidity "Humidity" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day10_Precip "Precipitation" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day10_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day10_Precip_Type "Precipitation Type" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day10_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day10_Snow "Snow" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day10_Snow_Depth "Snow Depth" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day10_Wind_Gust "Wind Gust" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day10_Wind_Speed "Wind Speed" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day10_Wind_Dir "Wind Direction" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day10_Pressure "Pressure" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day10_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day10_Visibility "Visibility" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day10_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day10_Solar_Energy "Solar Energy" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day10_UV_Index "UV Index" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day10_Sunrise "Sunrise" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day10_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day10_Sunset "Sunset" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day10_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day10_Moon_Phase "Moon Phase" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day10_Conditions "Conditions" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day10_Description "Description" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day10_Icon "Icon" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day10_Stations "Stations" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day10_Source "Source" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day10_Severe_Risk "Severe Risk" (Total_Weather_Data_Day10)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day11 +Group Total_Weather_Data_Day11 "Day T+11" (Total_Weather_Data) [ "Equipment" ] +String Day11_DateTime "Time" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day11_Timestamp "Timestamp" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day11_Temperature "Temperature" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day11_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day11_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day11_FeelsLike "Feels Like" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day11_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day11_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day11_Dew "Dew Point" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day11_Humidity "Humidity" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day11_Precip "Precipitation" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day11_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day11_Precip_Type "Precipitation Type" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day11_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day11_Snow "Snow" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day11_Snow_Depth "Snow Depth" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day11_Wind_Gust "Wind Gust" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day11_Wind_Speed "Wind Speed" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day11_Wind_Dir "Wind Direction" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day11_Pressure "Pressure" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day11_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day11_Visibility "Visibility" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day11_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day11_Solar_Energy "Solar Energy" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day11_UV_Index "UV Index" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day11_Sunrise "Sunrise" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day11_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day11_Sunset "Sunset" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day11_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day11_Moon_Phase "Moon Phase" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day11_Conditions "Conditions" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day11_Description "Description" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day11_Icon "Icon" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day11_Stations "Stations" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day11_Source "Source" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day11_Severe_Risk "Severe Risk" (Total_Weather_Data_Day11)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day12 +Group Total_Weather_Data_Day12 "Day T+12" (Total_Weather_Data) [ "Equipment" ] +String Day12_DateTime "Time" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day12_Timestamp "Timestamp" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day12_Temperature "Temperature" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day12_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day12_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day12_FeelsLike "Feels Like" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day12_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day12_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day12_Dew "Dew Point" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day12_Humidity "Humidity" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day12_Precip "Precipitation" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day12_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day12_Precip_Type "Precipitation Type" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day12_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day12_Snow "Snow" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day12_Snow_Depth "Snow Depth" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day12_Wind_Gust "Wind Gust" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day12_Wind_Speed "Wind Speed" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day12_Wind_Dir "Wind Direction" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day12_Pressure "Pressure" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day12_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day12_Visibility "Visibility" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day12_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day12_Solar_Energy "Solar Energy" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day12_UV_Index "UV Index" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day12_Sunrise "Sunrise" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day12_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day12_Sunset "Sunset" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day12_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day12_Moon_Phase "Moon Phase" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day12_Conditions "Conditions" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day12_Description "Description" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day12_Icon "Icon" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day12_Stations "Stations" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day12_Source "Source" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day12_Severe_Risk "Severe Risk" (Total_Weather_Data_Day12)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day13 +Group Total_Weather_Data_Day13 "Day T+13" (Total_Weather_Data) [ "Equipment" ] +String Day13_DateTime "Time" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day13_Timestamp "Timestamp" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day13_Temperature "Temperature" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day13_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day13_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day13_FeelsLike "Feels Like" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day13_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day13_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day13_Dew "Dew Point" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day13_Humidity "Humidity" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day13_Precip "Precipitation" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day13_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day13_Precip_Type "Precipitation Type" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day13_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day13_Snow "Snow" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day13_Snow_Depth "Snow Depth" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day13_Wind_Gust "Wind Gust" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day13_Wind_Speed "Wind Speed" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day13_Wind_Dir "Wind Direction" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day13_Pressure "Pressure" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day13_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day13_Visibility "Visibility" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day13_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day13_Solar_Energy "Solar Energy" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day13_UV_Index "UV Index" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day13_Sunrise "Sunrise" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day13_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day13_Sunset "Sunset" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day13_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day13_Moon_Phase "Moon Phase" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day13_Conditions "Conditions" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day13_Description "Description" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day13_Icon "Icon" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day13_Stations "Stations" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day13_Source "Source" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day13_Severe_Risk "Severe Risk" (Total_Weather_Data_Day13)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day14 +Group Total_Weather_Data_Day14 "Day T+14" (Total_Weather_Data) [ "Equipment" ] +String Day14_DateTime "Time" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day14_Timestamp "Timestamp" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day14_Temperature "Temperature" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day14_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day14_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day14_FeelsLike "Feels Like" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day14_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day14_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day14_Dew "Dew Point" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day14_Humidity "Humidity" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day14_Precip "Precipitation" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day14_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day14_Precip_Type "Precipitation Type" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day14_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day14_Snow "Snow" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day14_Snow_Depth "Snow Depth" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day14_Wind_Gust "Wind Gust" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day14_Wind_Speed "Wind Speed" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day14_Wind_Dir "Wind Direction" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day14_Pressure "Pressure" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day14_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day14_Visibility "Visibility" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day14_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day14_Solar_Energy "Solar Energy" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day14_UV_Index "UV Index" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day14_Sunrise "Sunrise" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day14_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day14_Sunset "Sunset" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day14_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day14_Moon_Phase "Moon Phase" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day14_Conditions "Conditions" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day14_Description "Description" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day14_Icon "Icon" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day14_Stations "Stations" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day14_Source "Source" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day14_Severe_Risk "Severe Risk" (Total_Weather_Data_Day14)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } + +// Day15 +Group Total_Weather_Data_Day15 "Day T+15" (Total_Weather_Data) [ "Equipment" ] +String Day15_DateTime "Time" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#datetime" } +DateTime Day15_Timestamp "Timestamp" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#timestamp" } +Number:Temperature Day15_Temperature "Temperature" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature" } +Number:Temperature Day15_Temperature_Min "Minimum Temperature" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-min" } +Number:Temperature Day15_Temperature_Max "Maximum Temperature" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#temperature-max" } +Number:Temperature Day15_FeelsLike "Feels Like" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like" } +Number:Temperature Day15_FeelsLike_Min "Feels Like (min)" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-min" } +Number:Temperature Day15_FeelsLike_Max "Feels Like (max)" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#feels-like-max" } +Number:Temperature Day15_Dew "Dew Point" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#dew" } +Number Day15_Humidity "Humidity" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#humidity" } +Number:Length Day15_Precip "Precipitation" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#precip" } +Number Day15_Precip_Prob "Precipitation Probability" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-prob" } +String Day15_Precip_Type "Precipitation Type" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-type" } +Number Day15_Precip_Cover "Precipitation Cover" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#precip-cover" } +Number:Length Day15_Snow "Snow" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#snow" } +Number:Length Day15_Snow_Depth "Snow Depth" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#snow-depth" } +Number:Speed Day15_Wind_Gust "Wind Gust" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-gust" } +Number:Speed Day15_Wind_Speed "Wind Speed" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-speed" } +Number:Angle Day15_Wind_Dir "Wind Direction" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#wind-dir" } +Number:Pressure Day15_Pressure "Pressure" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#pressure" } +Number Day15_Cloud_Cover "Cloud Cover" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#cloud-cover" } +Number:Length Day15_Visibility "Visibility" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#visibility" } +Number:Intensity Day15_Solar_Radiation "Solar Radiation" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-radiation" } +Number Day15_Solar_Energy "Solar Energy" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#solar-energy" } +Number Day15_UV_Index "UV Index" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#uv-index" } +String Day15_Sunrise "Sunrise" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise" } +DateTime Day15_Sunrise_Epoch "Sunrise Epoch" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#sunrise-epoch" } +String Day15_Sunset "Sunset" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset" } +DateTime Day15_Sunset_Epoch "Sunset Epoch" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#sunset-epoch" } +Number Day15_Moon_Phase "Moon Phase" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#moon-phase" } +String Day15_Conditions "Conditions" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#conditions" } +String Day15_Description "Description" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#description" } +String Day15_Icon "Icon" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#icon" } +String Day15_Stations "Stations" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#stations" } +String Day15_Source "Source" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#source" } +Number Day15_Severe_Risk "Severe Risk" (Total_Weather_Data_Day15)["Point"] { channel="visualcrossing:weather:default_config:day01#severe-risk" } diff --git a/bundles/org.openhab.binding.visualcrossing/pom.xml b/bundles/org.openhab.binding.visualcrossing/pom.xml new file mode 100644 index 0000000000000..cb11fe1840d15 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/pom.xml @@ -0,0 +1,32 @@ + + + + 4.0.0 + + + org.openhab.addons.bundles + org.openhab.addons.reactor.bundles + 4.3.0-SNAPSHOT + + + org.openhab.binding.visualcrossing + + openHAB Add-ons :: Bundles :: VisualCrossing Binding + + + + + org.assertj + assertj-core + 3.25.3 + test + + + org.mockito + mockito-core + 5.11.0 + test + + + diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/feature/feature.xml b/bundles/org.openhab.binding.visualcrossing/src/main/feature/feature.xml new file mode 100644 index 0000000000000..7acd42fdc85c7 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/src/main/feature/feature.xml @@ -0,0 +1,9 @@ + + + mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features + + + openhab-runtime-base + mvn:org.openhab.addons.bundles/org.openhab.binding.visualcrossing/${project.version} + + diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/TypeBuilder.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/TypeBuilder.java new file mode 100644 index 0000000000000..ce2173535ef7a --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/TypeBuilder.java @@ -0,0 +1,218 @@ +/** + * 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; + +import static javax.measure.MetricPrefix.MEGA; +import static org.openhab.core.library.unit.MetricPrefix.*; +import static org.openhab.core.library.unit.SIUnits.*; +import static org.openhab.core.library.unit.Units.*; +import static org.openhab.core.types.UnDefType.UNDEF; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.ZoneId; +import java.util.Collection; +import java.util.function.Function; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.core.library.types.DateTimeType; +import org.openhab.core.library.types.DecimalType; +import org.openhab.core.library.types.PercentType; +import org.openhab.core.library.types.QuantityType; +import org.openhab.core.library.types.StringType; +import org.openhab.core.types.State; + +/** + * @author Martin Grześlowski - Initial contribution + */ +@NonNullByDefault +class TypeBuilder { + private static State newStringType(@Nullable String string) { + return string != null ? new StringType(string) : UNDEF; + } + + public static State newStringType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newStringType(function.apply(obj)); + } + + private static State newStringType(@Nullable Collection strings) { + return strings != null ? new StringType(String.join(",", strings)) : UNDEF; + } + + public static State newStringCollectionType(@Nullable T obj, + Function> function) { + if (obj == null) { + return UNDEF; + } + return newStringType(function.apply(obj)); + } + + private static State newDecimalType(@Nullable Number number) { + return number != null ? new DecimalType(number) : UNDEF; + } + + public static State newDecimalType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newDecimalType(function.apply(obj)); + } + + private static State newPercentType(@Nullable Number decimal) { + if (decimal == null) { + return UNDEF; + } + + return new PercentType(new BigDecimal(decimal.toString())); + } + + public static State newPercentType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newPercentType(function.apply(obj)); + } + + private static State newTemperatureType(@Nullable Number temp) { + return temp != null ? new QuantityType<>(temp, CELSIUS) : UNDEF; + } + + public static State newTemperatureType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newTemperatureType(function.apply(obj)); + } + + private static State newHumidityType(@Nullable Number humidity) { + if (humidity == null) { + return UNDEF; + } + return new PercentType(new BigDecimal(humidity.toString())); + } + + public static State newHumidityType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newHumidityType(function.apply(obj)); + } + + private static State newMilliLengthType(@Nullable Number length) { + return length != null ? new QuantityType<>(length, MILLI(METRE)) : UNDEF; + } + + public static State newMilliLengthType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newMilliLengthType(function.apply(obj)); + } + + private static State newCentiLengthType(@Nullable Number length) { + return length != null ? new QuantityType<>(length, CENTI(METRE)) : UNDEF; + } + + public static State newCentiLengthType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newCentiLengthType(function.apply(obj)); + } + + private static State newSpeedType(@Nullable Number speed) { + return speed != null ? new QuantityType<>(speed, KILOMETRE_PER_HOUR) : UNDEF; + } + + public static State newSpeedType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newSpeedType(function.apply(obj)); + } + + private static State newAngleType(@Nullable Number angle) { + return angle != null ? new QuantityType<>(angle, DEGREE_ANGLE) : UNDEF; + } + + public static State newAngleType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newAngleType(function.apply(obj)); + } + + private static State newMilliPressureType(@Nullable Number pressure) { + return pressure != null ? new QuantityType<>(pressure, MILLI(BAR)) : UNDEF; + } + + public static State newMilliPressureType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newMilliPressureType(function.apply(obj)); + } + + private static State newKiloMeterType(@Nullable Number km) { + return km != null ? new QuantityType<>(km, KILO(METRE)) : UNDEF; + } + + public static State newKiloMeterType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newKiloMeterType(function.apply(obj)); + } + + private static State newSolarRadiationType(@Nullable Number solarRadiation) { + return solarRadiation != null ? new QuantityType<>(solarRadiation, WATT.divide(METRE.multiply(METRE))) : UNDEF; + } + + public static State newSolarRadiationType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newSolarRadiationType(function.apply(obj)); + } + + private static State newSolarEnergyType(@Nullable Number solarEnergy) { + return solarEnergy != null ? new QuantityType<>(solarEnergy, MEGA(JOULE).divide(METRE.multiply(METRE))) : UNDEF; + } + + public static State newSolarEnergyType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newSolarEnergyType(function.apply(obj)); + } + + private static State newDateTimeType(@Nullable Number number) { + if (number == null) { + return UNDEF; + } + var instant = Instant.ofEpochSecond(number.longValue()); + var zonedDateTime = instant.atZone(ZoneId.of("UTC")); + return new DateTimeType(zonedDateTime); + } + + public static State newDateTimeType(@Nullable T obj, Function function) { + if (obj == null) { + return UNDEF; + } + return newDateTimeType(function.apply(obj)); + } +} diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingBindingConstants.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingBindingConstants.java new file mode 100644 index 0000000000000..d1c8ce5df40f4 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingBindingConstants.java @@ -0,0 +1,347 @@ +/** + * 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; + +import static org.openhab.core.thing.ChannelUID.CHANNEL_GROUP_SEPARATOR; + +import java.util.Set; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.core.thing.ThingTypeUID; + +/** + * The {@link VisualCrossingBindingConstants} class defines common constants, which are + * used across the whole binding. + * + * @author Martin Grzeslowski - Initial contribution + */ +@NonNullByDefault +public class VisualCrossingBindingConstants { + + public static final String BINDING_ID = "visualcrossing"; + public static final Set SUPPORTED_LANGUAGES = Set.of("ar", "bg", "cs", "da", "de", "el", "en", "es", "fa", + "fi", "fr", "he", "hu,", "it", "ja", "ko", "nl", "pl", "pt", "ru", "sk", "sr", "sv", "tr", "uk", "vi", + "zh"); + public static final ThingTypeUID WEATHER_THING_TYPE = new ThingTypeUID(BINDING_ID, "weather"); + + public static final class Channels { + public static final class BasicChannelGroup { + private static final String CHANNEL_ID = "basic" + CHANNEL_GROUP_SEPARATOR; + + public static final String COST = CHANNEL_ID + "cost"; + public static final String DESCRIPTION = CHANNEL_ID + "description"; + } + + public static final class CurrentConditions { + private static final String CHANNEL_ID = "current-conditions" + CHANNEL_GROUP_SEPARATOR; + + public static final String DATE_TIME = CHANNEL_ID + "datetime"; + public static final String TIME_STAMP = CHANNEL_ID + "timestamp"; + public static final String TEMPERATURE = CHANNEL_ID + "temperature"; + public static final String FEELS_LIKE = CHANNEL_ID + "feels-like"; + public static final String HUMIDITY = CHANNEL_ID + "humidity"; + public static final String DEW = CHANNEL_ID + "dew"; + public static final String PRECIP = CHANNEL_ID + "precip"; + public static final String PRECIP_PROB = CHANNEL_ID + "precip-prob"; + public static final String PRECIP_TYPE = CHANNEL_ID + "precip-type"; + public static final String SNOW = CHANNEL_ID + "snow"; + public static final String SNOW_DEPTH = CHANNEL_ID + "snow-depth"; + public static final String WIND_GUST = CHANNEL_ID + "wind-gust"; + public static final String WIND_SPEED = CHANNEL_ID + "wind-speed"; + public static final String WIND_DIR = CHANNEL_ID + "wind-dir"; + public static final String PRESSURE = CHANNEL_ID + "pressure"; + public static final String VISIBILITY = CHANNEL_ID + "visibility"; + public static final String CLOUD_COVER = CHANNEL_ID + "cloud-cover"; + public static final String SOLAR_RADIATION = CHANNEL_ID + "solar-radiation"; + public static final String SOLAR_ENERGY = CHANNEL_ID + "solar-energy"; + public static final String UV_INDEX = CHANNEL_ID + "uv-index"; + public static final String CONDITIONS = CHANNEL_ID + "conditions"; + public static final String ICON = CHANNEL_ID + "icon"; + public static final String STATIONS = CHANNEL_ID + "stations"; + public static final String SOURCE = CHANNEL_ID + "source"; + public static final String SUNRISE = CHANNEL_ID + "sunrise"; + public static final String SUNRISE_EPOCH = CHANNEL_ID + "sunrise-epoch"; + public static final String SUNSET = CHANNEL_ID + "sunset"; + public static final String SUNSET_EPOCH = CHANNEL_ID + "sunset-epoch"; + public static final String MOON_PHASE = CHANNEL_ID + "moon-phase"; + } + + public static final class ChannelDay { + public static final int NR_OF_DAYS = 15; + public static final int NR_OF_HOURS = 24; + private final String channelId; + + public ChannelDay(int idx) { + var prefix = "day" + (idx < 10 ? "0" : ""); + this.channelId = prefix + idx + CHANNEL_GROUP_SEPARATOR; + } + + public String dateTime() { + return "%sdatetime".formatted(channelId); + } + + public String timeStamp() { + return "%stimestamp".formatted(channelId); + } + + public String temperature() { + return "%stemperature".formatted(channelId); + } + + public String temperatureMin() { + return "%stemperature-min".formatted(channelId); + } + + public String temperatureMax() { + return "%stemperature-max".formatted(channelId); + } + + public String feelsLike() { + return "%sfeels-like".formatted(channelId); + } + + public String feelsLikeMin() { + return "%sfeels-like-min".formatted(channelId); + } + + public String feelsLikeMax() { + return "%sfeels-like-max".formatted(channelId); + } + + public String dew() { + return "%sdew".formatted(channelId); + } + + public String humidity() { + return "%shumidity".formatted(channelId); + } + + public String precip() { + return "%sprecip".formatted(channelId); + } + + public String precipProb() { + return "%sprecip-prob".formatted(channelId); + } + + public String precipType() { + return "%sprecip-type".formatted(channelId); + } + + public String precipCover() { + return "%sprecip-cover".formatted(channelId); + } + + public String snow() { + return "%ssnow".formatted(channelId); + } + + public String snowDepth() { + return "%ssnow-depth".formatted(channelId); + } + + public String windGust() { + return "%swind-gust".formatted(channelId); + } + + public String windSpeed() { + return "%swind-speed".formatted(channelId); + } + + public String windDir() { + return "%swind-dir".formatted(channelId); + } + + public String pressure() { + return "%spressure".formatted(channelId); + } + + public String cloudCover() { + return "%scloud-cover".formatted(channelId); + } + + public String visibility() { + return "%svisibility".formatted(channelId); + } + + public String solarRadiation() { + return "%ssolar-radiation".formatted(channelId); + } + + public String solarEnergy() { + return "%ssolar-energy".formatted(channelId); + } + + public String uvIndex() { + return "%suv-index".formatted(channelId); + } + + public String sunrise() { + return "%ssunrise".formatted(channelId); + } + + public String sunriseEpoch() { + return "%ssunrise-epoch".formatted(channelId); + } + + public String sunset() { + return "%ssunset".formatted(channelId); + } + + public String sunsetEpoch() { + return "%ssunset-epoch".formatted(channelId); + } + + public String moonPhase() { + return "%smoon-phase".formatted(channelId); + } + + public String conditions() { + return "%sconditions".formatted(channelId); + } + + public String description() { + return "%sdescription".formatted(channelId); + } + + public String icon() { + return "%sicon".formatted(channelId); + } + + public String stations() { + return "%sstations".formatted(channelId); + } + + public String source() { + return "%ssource".formatted(channelId); + } + + public String severeRisk() { + return "%ssevere-risk".formatted(channelId); + } + + public Hour hour(int idx) { + return new Hour(idx); + } + + public class Hour { + private final String hourIdx; + + public Hour(int idx) { + var prefix = "hour" + (idx < 10 ? "0" : ""); + this.hourIdx = prefix + idx; + } + + public String hourDateTime() { + return "%s%s-datetime".formatted(channelId, hourIdx); + } + + public String hourTimeStamp() { + return "%s%s-timestamp".formatted(channelId, hourIdx); + } + + public String hourTemperature() { + return "%s%s-temperature".formatted(channelId, hourIdx); + } + + public String hourFeelsLike() { + return "%s%s-feels-like".formatted(channelId, hourIdx); + } + + public String hourHumidity() { + return "%s%s-humidity".formatted(channelId, hourIdx); + } + + public String hourDew() { + return "%s%s-dew".formatted(channelId, hourIdx); + } + + public String hourPrecip() { + return "%s%s-precip".formatted(channelId, hourIdx); + } + + public String hourPrecipProb() { + return "%s%s-precip-prob".formatted(channelId, hourIdx); + } + + public String hourPrecipType() { + return "%s%s-precip-type".formatted(channelId, hourIdx); + } + + public String hourSnow() { + return "%s%s-snow".formatted(channelId, hourIdx); + } + + public String hourSnowDepth() { + return "%s%s-snow-depth".formatted(channelId, hourIdx); + } + + public String hourWindGust() { + return "%s%s-wind-gust".formatted(channelId, hourIdx); + } + + public String hourWindSpeed() { + return "%s%s-wind-speed".formatted(channelId, hourIdx); + } + + public String hourWindDir() { + return "%s%s-wind-dir".formatted(channelId, hourIdx); + } + + public String hourPressure() { + return "%s%s-pressure".formatted(channelId, hourIdx); + } + + public String hourVisibility() { + return "%s%s-visibility".formatted(channelId, hourIdx); + } + + public String hourCloudCover() { + return "%s%s-cloud-cover".formatted(channelId, hourIdx); + } + + public String hourSolarRadiation() { + return "%s%s-solar-radiation".formatted(channelId, hourIdx); + } + + public String hourSolarEnergy() { + return "%s%s-solar-energy".formatted(channelId, hourIdx); + } + + public String hourUvIndex() { + return "%s%s-uv-index".formatted(channelId, hourIdx); + } + + public String hourSevereRisk() { + return "%s%s-severe-risk".formatted(channelId, hourIdx); + } + + public String hourConditions() { + return "%s%s-conditions".formatted(channelId, hourIdx); + } + + public String hourIcon() { + return "%s%s-icon".formatted(channelId, hourIdx); + } + + public String hourStations() { + return "%s%s-stations".formatted(channelId, hourIdx); + } + + public String hourSource() { + return "%s%s-source".formatted(channelId, hourIdx); + } + } + } + } +} diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingConfiguration.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingConfiguration.java new file mode 100644 index 0000000000000..29176aeb49d2e --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingConfiguration.java @@ -0,0 +1,34 @@ +/** + * 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; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + +/** + * The {@link VisualCrossingConfiguration} class contains fields mapping thing configuration parameters. + * + * @author Martin Grzeslowski - Initial contribution + */ +@NonNullByDefault +public class VisualCrossingConfiguration { + @Nullable + public String apiKey; + @Nullable + public String location; + @Nullable + public String lang; + public String hostname = "https://weather.visualcrossing.com"; + public int refreshInterval = 3600; + public int httpRetries = 3; +} diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingHandler.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingHandler.java new file mode 100644 index 0000000000000..c8dbc2761d10c --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingHandler.java @@ -0,0 +1,570 @@ +/** + * 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; + +import static java.util.Objects.requireNonNull; +import static java.util.Optional.ofNullable; +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.openhab.binding.visualcrossing.internal.TypeBuilder.*; +import static org.openhab.binding.visualcrossing.internal.VisualCrossingBindingConstants.Channels.BasicChannelGroup.*; +import static org.openhab.binding.visualcrossing.internal.VisualCrossingBindingConstants.Channels.CurrentConditions.*; +import static org.openhab.binding.visualcrossing.internal.VisualCrossingBindingConstants.SUPPORTED_LANGUAGES; +import static org.openhab.core.thing.ThingStatus.OFFLINE; +import static org.openhab.core.thing.ThingStatus.ONLINE; +import static org.openhab.core.thing.ThingStatusDetail.*; +import static org.openhab.core.types.RefreshType.REFRESH; +import static org.openhab.core.types.UnDefType.UNDEF; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicReference; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.visualcrossing.internal.VisualCrossingBindingConstants.Channels.ChannelDay; +import org.openhab.binding.visualcrossing.internal.api.VisualCrossingApi; +import org.openhab.binding.visualcrossing.internal.api.VisualCrossingApi.UnitGroup; +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.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; +import org.openhab.binding.visualcrossing.internal.api.rest.ApiClient; +import org.openhab.binding.visualcrossing.internal.api.rest.RestClient; +import org.openhab.binding.visualcrossing.internal.api.rest.RetryHttpClient; +import org.openhab.core.i18n.LocaleProvider; +import org.openhab.core.i18n.LocationProvider; +import org.openhab.core.io.net.http.HttpClientFactory; +import org.openhab.core.library.types.DecimalType; +import org.openhab.core.thing.ChannelUID; +import org.openhab.core.thing.Thing; +import org.openhab.core.thing.binding.BaseThingHandler; +import org.openhab.core.types.Command; +import org.openhab.core.types.RefreshType; +import org.openhab.core.types.State; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; + +/** + * The {@link VisualCrossingHandler} is responsible for handling commands, which are + * sent to one of the channels. + * + * @author Martin Grzeslowski - Initial contribution + */ +@NonNullByDefault +public class VisualCrossingHandler extends BaseThingHandler { + private final Logger logger = LoggerFactory.getLogger(VisualCrossingHandler.class); + + private final HttpClientFactory httpClientFactory; + private final LocaleProvider localeProvider; + private final LocationProvider locationProvider; + private final AtomicReference<@Nullable WeatherResponse> weatherResponse = new AtomicReference<>(); + @Nullable + private VisualCrossingApi api; + @Nullable + private String location; + @Nullable + private String lang; + @Nullable + private ScheduledFuture schedule; + + public VisualCrossingHandler(Thing thing, HttpClientFactory httpClientFactory, LocaleProvider localeProvider, + LocationProvider locationProvider) { + super(thing); + this.httpClientFactory = httpClientFactory; + this.localeProvider = localeProvider; + this.locationProvider = locationProvider; + } + + @Override + public void handleCommand(ChannelUID channelUID, Command command) { + if (!(command instanceof RefreshType)) { + // handling only refresh commands + return; + } + updateState(channelUID, findState(channelUID, this.weatherResponse.get())); + } + + private State findState(ChannelUID channelUID, @Nullable WeatherResponse weatherResponse) { + var channelId = channelUID.getId(); + { // base + if (COST.equals(channelId)) { + var localApi = api; + if (localApi == null) { + return UNDEF; + } + return new DecimalType(localApi.getCurrentCost()); + } + if (DESCRIPTION.equals(channelId)) { + return newStringType(weatherResponse, WeatherResponse::description); + } + } + { // current conditions + var currentConditions = ofNullable(weatherResponse).map(WeatherResponse::currentConditions); + switch (channelId) { + case DATE_TIME -> { + return requireNonNull( + currentConditions.map(cc -> newStringType(cc, CurrentConditions::datetime)).orElse(UNDEF)); + } + case TIME_STAMP -> { + return requireNonNull(currentConditions + .map(cc -> newDateTimeType(cc, CurrentConditions::datetimeEpoch)).orElse(UNDEF)); + } + case TEMPERATURE -> { + return requireNonNull( + currentConditions.map(cc -> newTemperatureType(cc, CurrentConditions::temp)).orElse(UNDEF)); + } + case FEELS_LIKE -> { + return requireNonNull(currentConditions + .map(cc -> newTemperatureType(cc, CurrentConditions::feelslike)).orElse(UNDEF)); + } + case HUMIDITY -> { + return requireNonNull(currentConditions.map(cc -> newHumidityType(cc, CurrentConditions::humidity)) + .orElse(UNDEF)); + } + case DEW -> { + return requireNonNull( + currentConditions.map(cc -> newTemperatureType(cc, CurrentConditions::dew)).orElse(UNDEF)); + } + case PRECIP -> { + return requireNonNull(currentConditions.map(cc -> newMilliLengthType(cc, CurrentConditions::precip)) + .orElse(UNDEF)); + } + case PRECIP_PROB -> { + return requireNonNull(currentConditions.map(cc -> newPercentType(cc, CurrentConditions::precipprob)) + .orElse(UNDEF)); + } + case PRECIP_TYPE -> { + return requireNonNull(currentConditions.map(cc -> newStringType(cc, CurrentConditions::preciptype)) + .orElse(UNDEF)); + } + case SNOW -> { + return requireNonNull( + currentConditions.map(cc -> newCentiLengthType(cc, CurrentConditions::snow)).orElse(UNDEF)); + } + case SNOW_DEPTH -> { + return requireNonNull(currentConditions + .map(cc -> newCentiLengthType(cc, CurrentConditions::snowdepth)).orElse(UNDEF)); + } + case WIND_GUST -> { + return requireNonNull( + currentConditions.map(cc -> newSpeedType(cc, CurrentConditions::windgust)).orElse(UNDEF)); + } + case WIND_SPEED -> { + return requireNonNull( + currentConditions.map(cc -> newSpeedType(cc, CurrentConditions::windspeed)).orElse(UNDEF)); + } + case WIND_DIR -> { + return requireNonNull( + currentConditions.map(cc -> newAngleType(cc, CurrentConditions::winddir)).orElse(UNDEF)); + } + case PRESSURE -> { + return requireNonNull(currentConditions + .map(cc -> newMilliPressureType(cc, CurrentConditions::pressure)).orElse(UNDEF)); + } + case VISIBILITY -> { + return requireNonNull(currentConditions + .map(cc -> newKiloMeterType(cc, CurrentConditions::visibility)).orElse(UNDEF)); + } + case CLOUD_COVER -> { + return requireNonNull(currentConditions.map(cc -> newPercentType(cc, CurrentConditions::cloudcover)) + .orElse(UNDEF)); + } + case SOLAR_RADIATION -> { + return requireNonNull(currentConditions + .map(cc -> newSolarRadiationType(cc, CurrentConditions::solarradiation)).orElse(UNDEF)); + } + case SOLAR_ENERGY -> { + return requireNonNull(currentConditions + .map(cc -> newSolarEnergyType(cc, CurrentConditions::solarenergy)).orElse(UNDEF)); + } + case UV_INDEX -> { + return requireNonNull( + currentConditions.map(cc -> newDecimalType(cc, CurrentConditions::uvindex)).orElse(UNDEF)); + } + case CONDITIONS -> { + return requireNonNull(currentConditions.map(cc -> newStringType(cc, CurrentConditions::conditions)) + .orElse(UNDEF)); + } + case ICON -> { + return requireNonNull( + currentConditions.map(cc -> newStringType(cc, CurrentConditions::icon)).orElse(UNDEF)); + } + case STATIONS -> { + return requireNonNull(currentConditions + .map(cc -> newStringCollectionType(cc, CurrentConditions::stations)).orElse(UNDEF)); + } + case SOURCE -> { + return requireNonNull( + currentConditions.map(cc -> newStringType(cc, CurrentConditions::source)).orElse(UNDEF)); + } + case SUNRISE -> { + return requireNonNull( + currentConditions.map(cc -> newStringType(cc, CurrentConditions::sunrise)).orElse(UNDEF)); + } + case SUNRISE_EPOCH -> { + return requireNonNull(currentConditions + .map(cc -> newDateTimeType(cc, CurrentConditions::sunriseEpoch)).orElse(UNDEF)); + } + case SUNSET -> { + return requireNonNull( + currentConditions.map(cc -> newStringType(cc, CurrentConditions::sunset)).orElse(UNDEF)); + } + case SUNSET_EPOCH -> { + return requireNonNull(currentConditions + .map(cc -> newDateTimeType(cc, CurrentConditions::sunsetEpoch)).orElse(UNDEF)); + } + case MOON_PHASE -> { + return requireNonNull(currentConditions.map(cc -> newDecimalType(cc, CurrentConditions::moonphase)) + .orElse(UNDEF)); + } + } + } + { // days + var days = ofNullable(weatherResponse).map(WeatherResponse::days).orElse(List.of()); + for (var dayIdx = 1; dayIdx <= ChannelDay.NR_OF_DAYS; dayIdx++) { + Day weatherDay; + if (dayIdx - 1 < days.size()) { + weatherDay = days.get(dayIdx - 1); + } else { + // there is no day with given dayIdx ; need to null the channel + weatherDay = null; + } + var day = new ChannelDay(dayIdx); + if (channelId.equals(day.dateTime())) { + return newStringType(weatherDay, Day::datetime); + } + if (channelId.equals(day.timeStamp())) { + return newDateTimeType(weatherDay, Day::datetimeEpoch); + } + if (channelId.equals(day.temperature())) { + return newTemperatureType(weatherDay, Day::temp); + } + if (channelId.equals(day.temperatureMin())) { + return newTemperatureType(weatherDay, Day::tempmin); + } + if (channelId.equals(day.temperatureMax())) { + return newTemperatureType(weatherDay, Day::tempmax); + } + if (channelId.equals(day.feelsLike())) { + return newTemperatureType(weatherDay, Day::feelslike); + } + if (channelId.equals(day.feelsLikeMin())) { + return newTemperatureType(weatherDay, Day::feelslikemin); + } + if (channelId.equals(day.feelsLikeMax())) { + return newTemperatureType(weatherDay, Day::feelslikemax); + } + if (channelId.equals(day.dew())) { + return newTemperatureType(weatherDay, Day::dew); + } + if (channelId.equals(day.humidity())) { + return newHumidityType(weatherDay, Day::humidity); + } + if (channelId.equals(day.precip())) { + return newMilliLengthType(weatherDay, Day::precip); + } + if (channelId.equals(day.precipProb())) { + return newPercentType(weatherDay, Day::precipprob); + } + if (channelId.equals(day.precipType())) { + return newStringCollectionType(weatherDay, Day::preciptype); + } + if (channelId.equals(day.precipCover())) { + return newPercentType(weatherDay, Day::precipcover); + } + if (channelId.equals(day.snow())) { + return newCentiLengthType(weatherDay, Day::snow); + } + if (channelId.equals(day.snowDepth())) { + return newCentiLengthType(weatherDay, Day::snowdepth); + } + if (channelId.equals(day.windGust())) { + return newSpeedType(weatherDay, Day::windgust); + } + if (channelId.equals(day.windSpeed())) { + return newSpeedType(weatherDay, Day::windspeed); + } + if (channelId.equals(day.windDir())) { + return newAngleType(weatherDay, Day::winddir); + } + if (channelId.equals(day.pressure())) { + return newMilliPressureType(weatherDay, Day::pressure); + } + if (channelId.equals(day.cloudCover())) { + return newPercentType(weatherDay, Day::cloudcover); + } + if (channelId.equals(day.visibility())) { + return newKiloMeterType(weatherDay, Day::visibility); + } + if (channelId.equals(day.solarRadiation())) { + return newSolarRadiationType(weatherDay, Day::solarradiation); + } + if (channelId.equals(day.solarEnergy())) { + return newSolarEnergyType(weatherDay, Day::solarenergy); + } + if (channelId.equals(day.uvIndex())) { + return newDecimalType(weatherDay, Day::uvindex); + } + if (channelId.equals(day.sunrise())) { + return newStringType(weatherDay, Day::sunrise); + } + if (channelId.equals(day.sunriseEpoch())) { + return newDateTimeType(weatherDay, Day::sunriseEpoch); + } + if (channelId.equals(day.sunset())) { + return newStringType(weatherDay, Day::sunset); + } + if (channelId.equals(day.sunsetEpoch())) { + return newDateTimeType(weatherDay, Day::sunsetEpoch); + } + if (channelId.equals(day.moonPhase())) { + return newDecimalType(weatherDay, Day::moonphase); + } + if (channelId.equals(day.conditions())) { + return newStringType(weatherDay, Day::conditions); + } + if (channelId.equals(day.description())) { + return newStringType(weatherDay, Day::description); + } + if (channelId.equals(day.icon())) { + return newStringType(weatherDay, Day::icon); + } + if (channelId.equals(day.stations())) { + return newStringCollectionType(weatherDay, Day::stations); + } + if (channelId.equals(day.source())) { + return newStringType(weatherDay, Day::source); + } + if (channelId.equals(day.severeRisk())) { + return newDecimalType(weatherDay, Day::severerisk); + } + + // hours + var hours = requireNonNull(ofNullable(weatherDay).map(Day::hours).orElse(List.of())); + for (var hourIdx = 0; hourIdx < ChannelDay.NR_OF_HOURS; hourIdx++) { + var dayHour = day.hour(hourIdx); + + if (dayHour.hourDateTime().equals(channelId)) { + return newStringType(findHour(hours, hourIdx), Hour::datetime); + } + if (dayHour.hourTimeStamp().equals(channelId)) { + return newDateTimeType(findHour(hours, hourIdx), Hour::datetimeEpoch); + } + if (dayHour.hourTemperature().equals(channelId)) { + return newTemperatureType(findHour(hours, hourIdx), Hour::temp); + } + if (dayHour.hourFeelsLike().equals(channelId)) { + return newTemperatureType(findHour(hours, hourIdx), Hour::feelslike); + } + if (dayHour.hourHumidity().equals(channelId)) { + return newHumidityType(findHour(hours, hourIdx), Hour::humidity); + } + if (dayHour.hourDew().equals(channelId)) { + return newTemperatureType(findHour(hours, hourIdx), Hour::dew); + } + if (dayHour.hourPrecip().equals(channelId)) { + return newMilliLengthType(findHour(hours, hourIdx), Hour::precip); + } + if (dayHour.hourPrecipProb().equals(channelId)) { + return newPercentType(findHour(hours, hourIdx), Hour::precipprob); + } + if (dayHour.hourPrecipType().equals(channelId)) { + return newStringCollectionType(findHour(hours, hourIdx), Hour::preciptype); + } + if (dayHour.hourSnow().equals(channelId)) { + return newCentiLengthType(findHour(hours, hourIdx), Hour::snow); + } + if (dayHour.hourSnowDepth().equals(channelId)) { + return newCentiLengthType(findHour(hours, hourIdx), Hour::snowdepth); + } + if (dayHour.hourWindGust().equals(channelId)) { + return newSpeedType(findHour(hours, hourIdx), Hour::windgust); + } + if (dayHour.hourWindSpeed().equals(channelId)) { + return newSpeedType(findHour(hours, hourIdx), Hour::windspeed); + } + if (dayHour.hourWindDir().equals(channelId)) { + return newAngleType(findHour(hours, hourIdx), Hour::winddir); + } + if (dayHour.hourPressure().equals(channelId)) { + return newMilliPressureType(findHour(hours, hourIdx), Hour::pressure); + } + if (dayHour.hourVisibility().equals(channelId)) { + return newKiloMeterType(findHour(hours, hourIdx), Hour::visibility); + } + if (dayHour.hourCloudCover().equals(channelId)) { + return newPercentType(findHour(hours, hourIdx), Hour::cloudcover); + } + if (dayHour.hourSolarRadiation().equals(channelId)) { + return newSolarRadiationType(findHour(hours, hourIdx), Hour::solarradiation); + } + if (dayHour.hourSolarEnergy().equals(channelId)) { + return newSolarEnergyType(findHour(hours, hourIdx), Hour::solarenergy); + } + if (dayHour.hourUvIndex().equals(channelId)) { + return newDecimalType(findHour(hours, hourIdx), Hour::uvindex); + } + if (dayHour.hourSevereRisk().equals(channelId)) { + return newDecimalType(findHour(hours, hourIdx), Hour::severerisk); + } + if (dayHour.hourConditions().equals(channelId)) { + return newStringType(findHour(hours, hourIdx), Hour::conditions); + } + if (dayHour.hourIcon().equals(channelId)) { + return newStringType(findHour(hours, hourIdx), Hour::icon); + } + if (dayHour.hourStations().equals(channelId)) { + return newStringCollectionType(findHour(hours, hourIdx), Hour::stations); + } + if (dayHour.hourSource().equals(channelId)) { + return newStringType(findHour(hours, hourIdx), Hour::source); + } + } + } + } + + logger.warn("Do not know this channel ID: {}", channelId); + return UNDEF; + } + + @Nullable + private Hour findHour(List hours, int hourIdx) { + if (hourIdx >= hours.size()) { + return null; + } + return hours.get(hourIdx); + } + + @Override + public void initialize() { + updateStatus(OFFLINE, CONFIGURATION_PENDING, "@text/channel-type.visualcrossing.weather.config-pending"); + weatherResponse.set(null); + + var config = getConfigAs(VisualCrossingConfiguration.class); + var hostname = config.hostname; + try { + new URL(hostname); + } catch (MalformedURLException e) { + logger.debug("Hostname [{}] is not an URL!", hostname, e); + updateStatus(OFFLINE, CONFIGURATION_ERROR, + "@text/addon.visualcrossing.weather.error.hostname [\"%s\"]".formatted(hostname)); + return; + } + + var apiKey = config.apiKey; + if (apiKey == null) { + updateStatus(OFFLINE, CONFIGURATION_ERROR, "@text/addon.visualcrossing.weather.error.missing-api-key"); + return; + } + + var restClient = (RestClient) new ApiClient(httpClientFactory.getCommonHttpClient()); + if (config.httpRetries > 0) { + restClient = new RetryHttpClient(restClient, config.httpRetries); + } + + if (config.location != null && !config.location.isBlank()) { + location = config.location; + } else { + var pointType = locationProvider.getLocation(); + if (pointType != null) { + var latitude = pointType.getLatitude(); + var longitude = pointType.getLongitude(); + location = "%s,%s".formatted(latitude, longitude); + } + } + if (location == null) { + updateStatus(OFFLINE, CONFIGURATION_ERROR, "@text/addon.visualcrossing.weather.error.no-location"); + return; + } + + if (config.lang != null && !config.lang.isBlank()) { + lang = config.lang; + } else { + lang = localeProvider.getLocale().getLanguage().toLowerCase(); + } + if (!SUPPORTED_LANGUAGES.contains(lang)) { + updateStatus(OFFLINE, CONFIGURATION_ERROR, + "@text/addon.visualcrossing.weather.error.bad-language [\"%s\"]".formatted(lang)); + return; + } + + api = new VisualCrossingApi(hostname, apiKey, restClient, new Gson()); + schedule = scheduler.scheduleWithFixedDelay(this::pull, 0, config.refreshInterval, SECONDS); + // do not set status to online - it is done in `pull` method that is run in schedule + } + + private void pull() { + var localApi = api; + if (localApi == null) { + logger.debug("Api was null!"); + updateStatus(OFFLINE, CONFIGURATION_PENDING, "@text/channel-type.visualcrossing.weather.config-pending"); + return; + } + try { + var weatherResponse = localApi.timeline(requireNonNull(location), null, lang, null, null); + this.weatherResponse.set(weatherResponse); + updateStatus(ONLINE); + thing.getChannels().forEach(channel -> handleCommand(channel.getUID(), REFRESH)); + } catch (VisualCrossingAuthException e) { + logger.debug("Auth error while getting timeline for {}", location, e); + updateStatus(OFFLINE, COMMUNICATION_ERROR, "@text/addon.visualcrossing.weather.error.auth"); + } catch (VisualCrossingRateException e) { + logger.debug("Rate error while getting timeline for {}", location, e); + updateStatus(OFFLINE, COMMUNICATION_ERROR, "@text/addon.visualcrossing.weather.error.rate"); + } catch (VisualCrossingApiException e) { + logger.debug("Error while getting timeline for {}", location, e); + updateStatus(OFFLINE, COMMUNICATION_ERROR, + "@text/addon.visualcrossing.weather.error.api [\"%s\"]".formatted(e.getLocalizedMessage())); + } catch (Exception e) { + logger.debug("Error while getting timeline for {}", location, e); + updateStatus(OFFLINE, COMMUNICATION_ERROR, + "@text/addon.visualcrossing.weather.error.generic [\"%s\"]".formatted(e.getLocalizedMessage())); + } + } + + @Override + public void dispose() { + { + var localSchedule = schedule; + schedule = null; + if (localSchedule != null) { + localSchedule.cancel(true); + } + } + api = null; + weatherResponse.set(null); + location = null; + } + + @Nullable + public WeatherResponse timeline(@Nullable String location, @Nullable UnitGroup unitGroup, @Nullable String lang, + @Nullable String dateFrom, @Nullable String dateTo) + throws VisualCrossingAuthException, VisualCrossingApiException, VisualCrossingRateException { + var localApi = api; + if (localApi == null) { + logger.debug("Api was null!"); + return null; + } + if (location == null) { + location = this.location; + } + return localApi.timeline(requireNonNull(location), unitGroup, lang, dateFrom, dateTo); + } +} diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingHandlerFactory.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingHandlerFactory.java new file mode 100644 index 0000000000000..138b84bfa3f6f --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/VisualCrossingHandlerFactory.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; + +import static org.openhab.binding.visualcrossing.internal.VisualCrossingBindingConstants.*; + +import java.util.Set; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.core.i18n.LocaleProvider; +import org.openhab.core.i18n.LocationProvider; +import org.openhab.core.io.net.http.HttpClientFactory; +import org.openhab.core.thing.Thing; +import org.openhab.core.thing.ThingTypeUID; +import org.openhab.core.thing.binding.BaseThingHandlerFactory; +import org.openhab.core.thing.binding.ThingHandler; +import org.openhab.core.thing.binding.ThingHandlerFactory; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * The {@link VisualCrossingHandlerFactory} is responsible for creating things and thing + * handlers. + * + * @author Martin Grzeslowski - Initial contribution + */ +@NonNullByDefault +@Component(configurationPid = "binding.visualcrossing", service = ThingHandlerFactory.class) +public class VisualCrossingHandlerFactory extends BaseThingHandlerFactory { + + private static final Set SUPPORTED_THING_TYPES_UIDS = Set.of(WEATHER_THING_TYPE); + private final HttpClientFactory httpClientFactory; + private final LocaleProvider localeProvider; + private final LocationProvider locationProvider; + + @Activate + public VisualCrossingHandlerFactory(@Reference final HttpClientFactory httpClientFactory, + @Reference final LocaleProvider localeProvider, @Reference final LocationProvider locationProvider) { + this.httpClientFactory = httpClientFactory; + this.localeProvider = localeProvider; + this.locationProvider = locationProvider; + } + + @Override + public boolean supportsThingType(ThingTypeUID thingTypeUID) { + return SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID); + } + + @Override + protected @Nullable ThingHandler createHandler(Thing thing) { + ThingTypeUID thingTypeUID = thing.getThingTypeUID(); + + if (WEATHER_THING_TYPE.equals(thingTypeUID)) { + return new VisualCrossingHandler(thing, httpClientFactory, localeProvider, locationProvider); + } + + return null; + } +} diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/WeatherCrossingActions.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/WeatherCrossingActions.java new file mode 100644 index 0000000000000..471ed061e9c98 --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/WeatherCrossingActions.java @@ -0,0 +1,82 @@ +/** + * 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; + +import static java.util.Objects.requireNonNull; +import static org.openhab.binding.visualcrossing.internal.VisualCrossingBindingConstants.BINDING_ID; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.visualcrossing.internal.api.VisualCrossingApi.UnitGroup; +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.openhab.binding.visualcrossing.internal.api.dto.WeatherResponse; +import org.openhab.core.automation.annotation.ActionInput; +import org.openhab.core.automation.annotation.RuleAction; +import org.openhab.core.thing.binding.ThingActions; +import org.openhab.core.thing.binding.ThingActionsScope; +import org.openhab.core.thing.binding.ThingHandler; + +/** + * @author Martin Grzeslowski - Initial contribution + */ +@ThingActionsScope(name = BINDING_ID) +@NonNullByDefault +public class WeatherCrossingActions implements ThingActions { + private @Nullable VisualCrossingHandler handler; + + @Override + public void setThingHandler(ThingHandler thingHandler) { + this.handler = (VisualCrossingHandler) thingHandler; + } + + @Override + public @Nullable ThingHandler getThingHandler() { + return handler; + } + + @RuleAction(label = "@text/action.timeline.label", description = "@text/action.timeline.description") + @Nullable + public WeatherResponse timeline( + @ActionInput(name = "location", label = "@text/action.label.location", description = "@text/action.description.location") @Nullable String location, + @ActionInput(name = "unitGroup", label = "@text/action.label.unitGroup", description = "@text/action.description.unitGroup") @Nullable UnitGroup unitGroup, + @ActionInput(name = "lang", label = "@text/action.label.lang", description = "@text/action.description.lang") @Nullable String lang, + @ActionInput(name = "dateFrom", label = "@text/action.label.dateFrom", description = "@text/action.description.dateFrom") @Nullable String dateFrom, + @ActionInput(name = "dateTo", label = "@text/action.label.dateTo", description = "@text/action.description.dateTo") @Nullable String dateTo) + throws VisualCrossingAuthException, VisualCrossingApiException, VisualCrossingRateException { + var localHandler = handler; + if (localHandler == null) { + return null; + } + return localHandler.timeline(location, unitGroup, lang, dateFrom, dateTo); + } + + public static void timeline(@Nullable ThingActions actions, @Nullable String location, + @Nullable UnitGroup unitGroup, @Nullable String lang, @Nullable String dateFrom, @Nullable String dateTo) + throws VisualCrossingAuthException, VisualCrossingApiException, VisualCrossingRateException { + ((VisualCrossingHandler) requireNonNull(actions)).timeline(location, unitGroup, lang, dateFrom, dateTo); + } + + @RuleAction(label = "@text/action.timeline.label", description = "@text/action.timeline.description") + @Nullable + public WeatherResponse timeline() + throws VisualCrossingAuthException, VisualCrossingApiException, VisualCrossingRateException { + return timeline(null, null, null, null, null); + } + + public static void timeline(@Nullable ThingActions actions) + throws VisualCrossingAuthException, VisualCrossingApiException, VisualCrossingRateException { + ((VisualCrossingHandler) requireNonNull(actions)).timeline(null, null, null, null, null); + } +} diff --git a/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApi.java b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApi.java new file mode 100644 index 0000000000000..1049e9ba6f59a --- /dev/null +++ b/bundles/org.openhab.binding.visualcrossing/src/main/java/org/openhab/binding/visualcrossing/internal/api/VisualCrossingApi.java @@ -0,0 +1,181 @@ +/** + * 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.nio.charset.StandardCharsets.UTF_8; +import static java.util.Objects.requireNonNull; +import static org.openhab.binding.visualcrossing.internal.api.VisualCrossingApi.UnitGroup.METRIC; + +import java.net.URLEncoder; +import java.util.concurrent.atomic.AtomicLong; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.visualcrossing.internal.api.dto.Cost; +import org.openhab.binding.visualcrossing.internal.api.dto.WeatherResponse; +import org.openhab.binding.visualcrossing.internal.api.rest.RestClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; + +/** + * Documentation: https://www.visualcrossing.com/resources/documentation/weather-api/timeline-weather-api/ + * + * @author Martin Grzeslowski - Initial contribution + */ +@NonNullByDefault +public class VisualCrossingApi { + private final Logger logger = LoggerFactory.getLogger(VisualCrossingApi.class); + private final AtomicLong cost = new AtomicLong(); + private final String baseUrl; + private final String apiKey; + private final RestClient restClient; + private final Gson gson; + + public VisualCrossingApi(String baseUrl, String apiKey, RestClient restClient, Gson gson) { + this.baseUrl = baseUrl; + this.apiKey = apiKey; + this.restClient = restClient; + this.gson = gson; + } + + /** + * 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. + *

+ * 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: + *

    + *
  1. Current weather conditions
  2. + *
  3. Daily historical, forecast and statistical forecast data (depending on dates requested)
  4. + *
  5. Hourly historical observations and 15-day forecast
  6. + *
  7. Weather alerts
  8. + *
  9. Astronomical observations including sunrise, sunset and moon phase.
  10. + *
+ *

+ * 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.verisure org.openhab.binding.vesync org.openhab.binding.vigicrues + org.openhab.binding.visualcrossing org.openhab.binding.vitotronic org.openhab.binding.vizio org.openhab.binding.volvooncall