WeatherFlow Tempest
Cloud REST integration for the WeatherFlow Tempest all-in-one weather station. Polls live observations (temperature, humidity, wind, pressure, solar / UV, lightning, precipitation, derived feels-like) plus the "Better Forecast" hourly + daily payload for each station on a Tempest account. Surfaces both metric and imperial copies of the headline fields as zone attributes so dashboards, the weather automation variable, and macros can read live data without re-hitting the cloud.
What this driver is for
The Tempest is a solar-powered weather station that publishes ~1-minute
observations through WeatherFlow's cloud. Most homeowners have a single
station; commercial sites occasionally have two or three across a campus.
GEM treats one Tempest account as one device and each station on that account
as a zone, addressed by the station's numeric station_id.
Read-only — the driver is a polling consumer. There is nothing to "control" on a weather station. The value is making the station's live readings available to:
- Macros that should only run when, say, outside temperature is below 5 °C or wind gust exceeds 15 m/s ("close the awning if it's gusty").
- Dashboards (the built-in
weatherwidget can be pointed at a Tempest zone and will read every field listed below). - The
weatherautomation variable, which can pull from any zone that publishes the standard temperature / humidity / wind attributes.
Prerequisites
| Item | Notes |
|---|---|
| Tempest commissioned in the WeatherFlow app | Wi-Fi onboarding is mobile-only. |
| Personal Access Token (PAT) | Minted at tempestwx.com → Settings → Personal Access Tokens. Long-lived, one-time-shown. Use a per-deployment token so you can revoke without breaking other integrations. |
Outbound HTTPS to swd.weatherflow.com | The driver makes ~1 request per minute per station to the observations endpoint and ~1 every 15 min to the forecast endpoint. |
Setup
-
Commission the station in the WeatherFlow Tempest mobile app and confirm it is reporting on the dashboard at
tempestwx.com. -
Mint a Personal Access Token.
- Sign in to tempestwx.com.
- Navigate to Settings → Personal Access Tokens → Create Token.
- Give it a descriptive name (e.g.
GEM controller — main house). - Copy the token immediately — the dashboard only shows it once.
-
Add the device in GEM.
- Navigate to
/admin/devices→ Add Device. - Driver:
weatherflow_tempest. - Paste the PAT into
api_key. - Optionally pin
units_systemtometricorimperialif you only want one unit set on the zones (default isboth).
- Navigate to
-
Discover the station id. Once the device shows as connected, run the
get_stationscommand. The response includes astations[]array; each entry has astation_id(integer),name,latitude,longitude, and the attached hub / sensor hardware ids. -
Create one zone per station.
- Subsystem: typically
weather(or any subsystem you use for environmental sensors). zone.address= thestation_idfrom step 4 (a plain integer).- The driver populates the zone's attributes on every poll — no further configuration needed.
- Subsystem: typically
Attributes
Device attributes
| Name | Required | Default | Description |
|---|---|---|---|
api_key | yes | — | Tempest Personal Access Token (stored encrypted). |
api_base | no | https://swd.weatherflow.com/swd/rest | Override the cloud root. Leave empty unless WeatherFlow support directs otherwise. |
units_system | no | both | metric (°C / m/s / mm), imperial (°F / mph / inches), or both. |
status_interval | no | 60000 | Observation poll interval in ms. Tempest emits a new observation every ~1 minute; polling faster wastes API calls and risks throttling. |
forecast_interval | no | 900000 | Better Forecast poll interval. Upstream service updates every ~15 minutes. |
request_timeout | no | 15000 | Per-request HTTP timeout in ms. |
Zone attributes (populated by the driver)
Current observation
| Attribute | Unit | Notes |
|---|---|---|
temperature_c / temperature_f | °C / °F | Ambient air. |
humidity | % | Relative humidity. |
pressure_mb / pressure_in_hg | mb / inHg | Station pressure at ground level. |
sea_level_pressure_mb | mb | Sea-level corrected pressure (for weather charts). |
pressure_trend | string | rising, falling, or steady. |
wind_avg_mps / wind_avg_mph | m/s / mph | Rolling 1-minute wind average. |
wind_gust_mps / wind_gust_mph | m/s / mph | Peak in the last observation window. |
wind_lull_mps | m/s | Minimum in the last observation window. |
wind_direction_deg | degrees | 0 = North, 90 = East. |
solar_radiation_wm2 | W/m² | Total irradiance. |
uv_index | index | UV index, 0–11+. |
brightness_lux | lux | Ambient brightness. |
precip_mm_min | mm / min | Rate at the moment of observation. |
precip_1hr_mm / precip_1hr_in | mm / in | Accumulated last hour. |
precip_today_mm / precip_today_in | mm / in | Accumulated today (local-time). |
precip_yesterday_mm | mm | Accumulated yesterday. |
lightning_count / lightning_count_1hr / lightning_count_3hr | count | Strike counts. |
lightning_last_distance_km | km | Distance to most recent strike. |
feels_like_c / feels_like_f | °C / °F | WeatherFlow's combined heat-index / wind-chill calc. |
dew_point_c / dew_point_f | °C / °F | Dew point. |
heat_index_c | °C | Heat index (only above ~26 °C). |
wind_chill_c | °C | Wind chill (only below ~10 °C). |
wet_bulb_c | °C | Wet-bulb temperature. |
air_density_kgm3 | kg/m³ | Air density. |
observation_timestamp | unix s | Useful for staleness checks. |
Forecast (refreshed every ~15 min)
| Attribute | Description |
|---|---|
forecast_conditions | Short string ("Mostly Cloudy"). |
forecast_icon | Icon slug used by the WeatherFlow app. |
forecast_high_c / forecast_high_f | Today's forecast high. |
forecast_low_c / forecast_low_f | Today's forecast low. |
forecast_precip_probability | Today's precipitation probability (%). |
Commands
| Name | Args | Description |
|---|---|---|
get_stations / get_devices | — | Enumerate stations on the account. Returns station_id, name, lat/long, and attached hub / sensor ids. |
get_status / get_observation | address | Read the most recent observation for the addressed station. Updates zone attributes. |
get_forecast | address | Pull the Better Forecast (current_conditions + hourly[] + daily[]) for the addressed station. |
refresh | address (optional) | Force an immediate poll for the addressed station, or for every station if omitted. |
Zone address format
The zone.address is a plain integer — the station_id returned from
get_stations. Example: 12345.
If a Tempest account has multiple stations (rare in residential, more common
on commercial campuses), create one zone per station and set each
zone.address accordingly. Each zone gets its own observation + forecast
attribute set.
Known limitations
- Cloud-only path. This driver polls the WeatherFlow cloud. If the GEM controller loses internet, observations stop updating until connectivity returns. A future companion driver on the local UDP broadcast (port 50222) would close that gap — flagged as a candidate, not yet built.
- Read-only. Nothing to control; the driver only consumes.
- No PMM / rapid-wind sub-minute fields. WeatherFlow publishes some fields (rapid-wind 3-second readings) only via the UDP broadcast and the WebSocket push channel. The polling REST endpoint exposes 1-minute resolution.
- No event history. The driver writes the current observation onto the
zone attribute. If you want trended history, enable history on each
attribute in
/admin/attributesso they are sampled into the long-term store.
Troubleshooting
| Symptom | What to check |
|---|---|
connect error: login HTTP 401 | PAT invalid or revoked. Mint a new one at tempestwx.com/settings/tokens and update the api_key. |
get_stations returns empty | The PAT is for a different account, or the station hasn't been claimed in the app yet. Confirm at tempestwx.com. |
observation_timestamp is hours behind real time | The Tempest itself is offline (no Wi-Fi, dead battery, sensor fault). Check the Tempest mobile app for the station's connectivity state. The driver surfaces the last known observation until the cloud catches up. |
| Forecast fields are stale | The forecast service updates every ~15 min upstream. If forecast_high_c stays unchanged for more than an hour, check the station's lat/long in the Tempest app — a station with no geolocation gets a degraded forecast. |
| HTTP 429 in logs | You polled faster than 30 s. Raise status_interval to 60000 (default) or higher. |
See also
- Automation variables — the
weathervariable can be pointed at a Tempest zone instead of an external API. - USGS Water Data — another read-only environmental data feed, available as an automation variable rather than a device driver.