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. A value that is not a positive number (blank, 0, negative, text) or is larger than 2147483647 uses the default; anything from 1 to 999 is read as 1000. |
forecast_interval | no | 900000 | Better Forecast poll interval in ms. Upstream service updates every ~15 minutes. Invalid values use the default, as for status_interval. |
request_timeout | no | 15000 | Per-request HTTP timeout in ms. A value that is not a positive number uses the default. |
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 observation poll for the addressed station, or for every station if omitted. The forecast keeps its own forecast_interval cadence. |
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.
Connection state
The device shows connected once the station listing succeeds and stays connected while the cloud keeps answering with JSON. It shows disconnected when the cloud cannot be reached at all, or when it rejects the token (HTTP 401/403), so a revoked PAT raises the usual device-offline alarm. A reply about one request, such as a 404 for a mistyped station id or a 429 throttle, does not take the device offline. A 5xx from a command does, as before; a 5xx during a poll leaves the state alone.
If every station's observation request fails for three polls in a row, the
driver slows down: the wait doubles from status_interval up to every
5 minutes (or status_interval, if that is longer). Normal polling resumes as
soon as any station answers. A failing request is logged once while it keeps
failing, not on every poll.
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. |
retrying connect in … ms | The first station listing failed (cloud unreachable or PAT rejected). The driver keeps retrying on its own, starting at status_interval (at least 15 s) and doubling up to every 15 minutes, and begins polling as soon as a listing succeeds. No reload is needed once the cause is fixed, though a reload retries immediately. |
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. |
cloud not answering, polling backed off | Every station's request failed three polls in a row (no internet, DNS, or a rejected token). The driver keeps trying at a slower rate, up to every 5 minutes, and goes back to status_interval as soon as a reply arrives. |
unfilled address token | A command was sent with a literal [@zone.address] instead of a station id, usually from a macro that targets the device rather than a zone. Target the station zone, or pass the numeric station id. |
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.