# Ambient Weather Binding
The Ambient Weather binding integrates weather station data that's stored on the Ambient Weather online service. The binding uses Ambient Weather's real-time API, so updates from weather stations are delivered to the binding in near real-time.
# Supported Things
The binding currently supports weather data from these weather stations.
Thing | ID |
---|---|
Account | bridge |
WS-0900-IP | ws0900ip |
WS-1400-IP / WS-1401-IP | ws1400ip |
WS-2902A / WS2902C | ws2902a |
WS-2902B | ws2902b |
WS-8482 | ws8482 |
WS-0265 | ws0265 |
Other stations can be added relatively easily with changes in just several places in the source code.
# Discovery
Automatic discovery is currently not supported due to the lack of weather station model information in the Ambient Weather API.
# Thing Configuration
# Account
Parameter | Parameter ID | Required/Optional | Description |
---|---|---|---|
API Key | apiKey | Required | Obtain the API key on the My Account page of your ambientweather.net dashboard. |
Application Key | apiKey | Required | Obtain the Application key on the My Account page of your ambientweather.net dashboard. |
# Weather Station
Parameter | Parameter ID | Required/Optional | Description |
---|---|---|---|
MAC Address | macAddress | Required | This is the weather station's MAC address. It must be configured in your ambientweather.net dashboard. |
# Channels
The following channels are supported by the binding. Note that specific weather station models may support only some or all of these channels.
Channel Group ID | Channel ID | Item Type | Description |
---|---|---|---|
station | name | String | Station name given by the user |
station | location | String | Location of the station given by the user |
weatherData<station-type> | observationTime | DateTime | Time that the conditions were observed |
weatherData<station-type> | batteryIndicator | String | Battery condition indicator (1 Good, 0 Not good) |
weatherData<station-type> | temperature | Number:Temperature | Actual observed temperature |
weatherData<station-type> | feelingTemperature | Number:Temperature | "Real feel" temperature |
weatherData<station-type> | dewPoint | Number:Temperature | Dew point |
weatherData<station-type> | relativeHumidity | Number:Dimensionless | Relative humidity |
weatherData<station-type> | pressureAbsolute | Number:Pressure | Absolute barometric pressure |
weatherData<station-type> | pressureRelative | Number:Pressure | Relative barometric pressure |
weatherData<station-type> | pressureTrend | String | 3-hour trend (FALLING RAPIDLY ... STEADY ... RISING RAPIDLY |
weatherData<station-type> | windSpeed | Number:Speed | Wind speed |
weatherData<station-type> | windDirectionDegrees | Number:Angle | Wind direction in degrees |
weatherData<station-type> | windDirection | String | Wind direction |
weatherData<station-type> | windSpeedMaxDaily | Number:Speed | Maximum daily wind speed |
weatherData<station-type> | windGust | Number:Speed | Wind gust |
weatherData<station-type> | windGustMaxDaily | Number:Speed | Maximum daily wind gust |
weatherData<station-type> | windSpeedAvg2Minute | Number:Speed | Two-minute wind speed average |
weatherData<station-type> | windDirectionDegreesAvg2Min | Number:Angle | Two-minute wind direction average |
weatherData<station-type> | windDirectionAvg2Min | String | Two-minute wind direction average |
weatherData<station-type> | windSpeedAvg10Minute | Number:Speed | Ten-minute wind speed average |
weatherData<station-type> | windDirectionDegreesAvg10Min | Number:Angle | Ten-minute wind direction average |
weatherData<station-type> | windDirectionAvg10Min | String | Ten-minute wind direction average |
weatherData<station-type> | rainHourlyRate | Number:Speed | Hourly rate of rainfall |
weatherData<station-type> | rainDay | Number:Length | Rainfall amount for the day |
weatherData<station-type> | rainWeek | Number:Length | Rainfall amount for the week |
weatherData<station-type> | rainMonth | Number:Length | Rainfall amount for the month |
weatherData<station-type> | rainYear | Number:Length | Rainfall amount for the year |
weatherData<station-type> | rainTotal | Number:Length | Rainfall amount since last weather station reset |
weatherData<station-type> | rainEvent | Number:Length | Rainfall for most recent rain event |
weatherData<station-type> | rainLastTime | DateTime | Last time it rained |
weatherData<station-type> | solarRadiation | Number:Intensity | Solar radiation |
weatherData<station-type> | uvIndex | Number:Dimensionless | UV index |
indoorSensor | temperature | Number:Temperature | Temperature |
indoorSensor | humidity | Number:Dimensionless | Humidity |
indoorSensor | batteryIndicator | String | Battery indicator |
remoteSensor<1-10> | temperature | Number:Temperature | Temperature |
remoteSensor<1-10> | dewPoint | Number:Temperature | Dew Point |
remoteSensor<1-10> | feelingTemperature | Number:Temperature | "Real feel" temperature |
remoteSensor<1-10> | humidity | Number:Dimensionless | Humidity |
remoteSensor<1-10> | batteryIndicator | String | Battery indicator |
remoteSensor<1-10> | co2 | Number:Dimensionless | Carbon Dioxide level |
remoteSensor<1-10> | relay | Switch | Relay |
remoteSensor<1-10> | soilTemperature | Number:Temperature | Soil temperature |
remoteSensor<1-10> | soilMoisture | Number:Dimensionless | Soil moisture |
remoteSensor<1-10> | soilMoistureLevel | String | Soil moisture level (VERY DRY ... VERY WET) |
# Example
# Things
Bridge ambientweather:bridge:account "Ambient Weather Account" [ applicationKey="bd7eb3fe87f74e9.....", apiKey="efe88d6202be43e6a40....." ] {
Thing ws1400ip 1400 "Ambient Weather WS-1400-IP" [ macAddress="00:ab:cd:00:00:01" ]
Thing ws8482 8482 "Ambient Weather WS-8482" [ macAddress="00:ab:cd:00:00:02" ]
}
# Items
// WS-1400-IP Weather Station
String WS1400IP_StationName "Station Name [%s]" { channel="ambientweather:ws1400ip:account:1400:station#name" }
String WS1400IP_StationLocation "Station Location [%s]" { channel="ambientweather:ws1400ip:account:1400:station#location" }
DateTime WS1400IP_ObservationTime "Station Observation Time [%s]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#observationTime" }
String WS1400IP_StationBattery "Station Battery [MAP(ambient-battery.map):%s]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#batteryIndicator" }
Number:Temperature WS1400IP_Temperature "Temperature [%.1f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#temperature" }
Number:Temperature WS1400IP_DewPoint "Dew Point [%.1f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#dewPoint" }
Number:Temperature WS1400IP_RealFeel "RealFeel [%.1f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#feelingTemperature" }
Number:Dimensionless WS1400IP_Humidity "Humidity [%.1f %%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#relativeHumidity" }
Number:Pressure WS1400IP_PressureAbsolute "Pressure Absolute [%.1f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#pressureAbsolute" }
Number:Pressure WS1400IP_PressureRelative "Pressure Relative [%.1f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#pressureRelative" }
String WS1400IP_PressureTrend "Pressure Trend [%s]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#pressureTrend" }
Number:Speed WS1400IP_WindSpeed "Wind Speed [%.0f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#windSpeed" }
Number:Angle WS1400IP_WindDirectionDegrees "Wind Direction Degrees [%d %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#windDirectionDegrees" }
String WS1400IP_WindDirection "Wind Direction [%s]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#windDirection" }
Number:Speed WS1400IP_WindGust "Wind Gust [%.0f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#windGust" }
Number:Speed WS1400IP_WindGustDailyMax "Wind Gust Max Daily [%.0f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#windGustMaxDaily" }
// Use this if your units are SI
Number:Speed WS1400IP_RainHourlyRate "Rain Hourly Rate [%.1f mm/h]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#rainHourlyRate" }
// Use this if your units are Imperial
Number:Speed WS1400IP_RainHourlyRate "Rain Hourly Rate [%.2f in/h]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#rainHourlyRate" }
Number:Length WS1400IP_RainDaily "Rain Daily [%.2f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#rainDay" }
Number:Length WS1400IP_RainWeekly "Rain Weekly [%.2f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#rainWeek" }
Number:Length WS1400IP_RainMonthly "Rain Monthly [%.2f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#rainMonth" }
Number:Length WS1400IP_RainYearly "Rain Yearly [%.2f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#rainYear" }
Number:Length WS1400IP_RainTotal "Rain Total [%.2f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#rainTotal" }
Number:Length WS1400IP_RainEvent "Rain Event [%.2f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#rainEvent" }
DateTime WS1400IP_RainLastTime "Rain Last Time [%s]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#rainLastTime" }
Number:Intensity WS1400IP_SolarRadiation "Solar Radiation [%.0f %unit%]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#solarRadiation" }
Number WS1400IP_UVIndex "UV Index [%.0f]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#uvIndex" }
String WS1400IP_UVDanger "UV Danger Level [%s]" { channel="ambientweather:ws1400ip:account:1400:weatherDataWs1400ip#uvDanger" }
Number:Temperature WS1400IP_IndoorTemperature "Indoor Temperature [%.1f %unit%]" { channel="ambientweather:ws1400ip:account:1400:indoorSensor#temperature" }
Number:Dimensionless WS1400IP_IndoorHumidity "Indoor Humidity [%.1f %%]" { channel="ambientweather:ws1400ip:account:1400:indoorSensor#relativeHumidity" }
String WS1400IP_IndoorBattery "Indoor Battery [MAP(ambient-battery.map):%s]" { channel="ambientweather:ws1400ip:account:1400:indoorSensor#batteryIndicator" }
// WS-8482 Weather Station
String WS8482_StationName "Station Name [%s]" { channel="ambientweather:ws8482:ws8482:station#name" }
String WS8482_StationLocation "Station Location [%s]" { channel="ambientweather:ws8482:ws8482:station#location" }
DateTime WS8482_ObservationTime "Observation Time [%s]" { channel="ambientweather:ws8482:account:8482:weatherDataWs8482#observationTime" }
Number:Temperature WS8482_IndoorTemperature "Indoor Temperature [%.1f %unit%]" { channel="ambientweather:ws8482:account:8482:weatherDataWs8482#temperature" }
Number:Dimensionless WS8482_IndoorHumidity "Indoor Humidity [%.1f %%]" { channel="ambientweather:ws8482:account:8482:weatherDataWs8482#relativeHumidity" }
String WS8482_StationBattery "Station Battery [MAP(ambient-battery.map):%s]" { channel="ambientweather:ws8482:account:8482:weatherDataWs8482#batteryIndicator" }
Number:Temperature WS8482_RemoteTemperature "Remote Temperature [%.1f %unit%]" { channel="ambientweather:ws8482:account:8482:remoteSensor1#temperature" }
Number:Dimensionless WS8482_RemoteHumidity "Remote Humidity [%.1f %%]" { channel="ambientweather:ws8482:account:8482:remoteSensor1#relativeHumidity" }
String WS8482_RemoteBattery "Remote Battery [MAP(ambient-battery.map):%s]" { channel="ambientweather:ws8482:account:8482:remoteSensor1#batteryIndicator" }
Number:Temperature WS8482_SoilTemperature "Soil Temperature [%.1f %unit%]" { channel="ambientweather:ws8482:account:8482:remoteSensor2#soilTemperature" }
Number:Dimensionless WS8482_SoilMoisture "Soil Moisture [%.1f %%]" { channel="ambientweather:ws8482:account:8482:remoteSensor2#soilMoisture" }
String WS8482_SoilMoistureLevel "Soil Moisture Level [%s]" { channel="ambientweather:ws8482:account:8482:remoteSensor2#soilMoistureLevel" }
String WS8482_SoilSensorBattery "Remote Battery [MAP(ambient-battery.map):%s]" { channel="ambientweather:ws8482:account:8482:remoteSensor2#batteryIndicator" }
# Transforms
# File ambient-battery.map
-=UNKNOWN
NULL=UNKNOWN
1=GOOD
0=REPLACE
# Sitemap
Text label="Weather Station" icon="sun_clouds" {
Frame {
Text item=WS1400IP_ObservationTime label="Observation Time [%1$tm/%1$td %1$tl:%1$tM %1$tp]"
}
Frame {
Text item=WS1400IP_Temperature
Text item=WS1400IP_RealFeel
Text item=WS1400IP_DewPoint
Text item=WS1400IP_Humidity
Text item=WS1400IP_PressureRelative
Text item=WS1400IP_PressureTrend
}
Frame {
Text item=WS1400IP_WindSpeed
Text item=WS1400IP_WindDirection
Text item=WS1400IP_WindGust
Text item=WS1400IP_WindGustDailyMax
}
Frame {
Text item=WS1400IP_SolarRadiation
Text item=WS1400IP_SolarRadiationDailyMax
Text item=WS1400IP_UVDanger
}
Frame {
Text item=WS1400IP_RainHourlyRate
Text item=WS1400IP_RainDaily
Text item=WS1400IP_RainWeekly
Text item=WS1400IP_RainMonthly
Text item=WS1400IP_RainYearly
Text item=WS1400IP_RainTotal
Text item=WS1400IP_RainEvent
Text item=WS1400IP_RainLastTime label="Last Rain [%1$tm/%1$td %1$tl:%1$tM %1$tp]"
}
Frame {
Text item=WS1400IP_IndoorTemperature
Text item=WS1400IP_IndoorHumidity
}
Frame {
Text item=WS1400IP_StationBattery
Text item=WS1400IP_IndoorBattery
}
}
# How To Add Another Weather Station Type
Adding support for a new weather station type involves changes to the source code in just a few places.
# Add a New Thing Type in AmbientWeatherBindingConstants.java
Define a new ThingTypeUID
for the new station and add it to the SUPPORTED_THING_TYPES_UIDS
Collection.
Add a channel group for the new station.
# Create OH-INF/thing/<station-model>.xml
Add thing type and channel group specific to the data elements supported by this weather station. Modeling this after an existing thing type that shares many of the channels is the easiest starting point. You can determine the weather data elements returned for the weather station by putting the binding into debug mode and reviewing the JSON object returned by the Ambient Weather API.
# Create Processor Class Processor
Add a class in org.openhab.binding.ambientweather.internal.processor
that defines the channels supported by this station type.
Add the following two methods.
Again, the easiest approach is to model this class after a class for a similar weather station type.
# Method: processInfoUpdate
Updates the channels for station name and location.
# Method: processWeatherData
Updates channels for weather data.
# Update ProcessorFactory.java
Add new Processor class definition to ProcessorFactory.java
, and add a new case to the switch statement to return the new processor.