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. The companion WeatherFlow Tempest (Local UDP) driver closes that gap by listening to the hub's LAN broadcast on port 50222.
- 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 — use the local UDP driver for those.
- 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
- WeatherFlow Tempest (Local UDP) — the companion driver for the same hardware over the LAN broadcast. No token, no internet, 3-second wind, but no forecast. Running both against one station is the full-coverage setup; give each driver its own zone.
- 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.