| Developer: | Glenn's Plugins Like this plugin? Show your appreciation! |
| Category: | Weather and Environmental Sensors |
| Github: | Github Repo |
| Assistance: | Get help! Check the online documentation |
| Plugin ID: | com.GlennNZ.indigoplugin.weatherflowtempest |
| Latest release: | v2.5.3 released on May 26, 2026 |
| Release downloaded: | 5 times |
| Requires: | Indigo v2023.2.0 or higher |
| (Check the Releases tab below for older releases that may have different requirements) | |
| Download latest release |

Receives live weather data from WeatherFlow Tempest stations via local UDP broadcast and maps all sensor observations to Indigo device states. No cloud account is required for basic operation. An optional WeatherFlow Web API token unlocks authoritative rain totals, rain duration, conditions text, hourly lightning counts, and a web-only mode that works even when the hub is on a different network.
New in v2.5.0: Public Tempest Station — monitor any publicly-shared WeatherFlow station without an account or token. Add as many as you like to build a network of weather reference points around your Indigo location, each with precise distance and direction states.
See Wiki: https://github.com/Ghawken/WeatherFlowTempest/wiki


Indigo device states for a Tempest Weather Station showing live sensor readings, web-sourced rain totals, and unit labels.

| Category | What you get |
|---|---|
| Temperature | Ambient, feels-like, dew point, wet bulb, wind chill, heat index, delta-T |
| Atmospheric | Station pressure, sea-level pressure, relative humidity, vapour pressure, air density |
| Wind | Instantaneous speed/direction (rapid-wind, ~3 s), 1-minute average, gust, lull, cardinal, sample interval |
| Rain | Per-minute accumulation, rain rate, intensity label, daily total, yesterday's total, Rain Check status |
| Rain (web) | Authoritative rain-check-corrected totals, last-1-hour rain, daily/yesterday rain duration in minutes |
| Lightning | Strike count, average distance, last-strike distance, energy and timestamp |
| Lightning (web) | Hourly and 3-hour strike counts |
| Conditions (web) | Weather conditions text and icon name from WeatherFlow forecast engine |
| Light | Illuminance (lux), solar radiation (W/m²), UV index |
| Battery | Voltage and percentage; power-save mode label; report interval |
| Derived | Cloud base, freezing level (both require altitude to be set) |
| Diagnostics | RSSI, firmware version, sensor fault flags, silence detection |
| Hub | Firmware, Wi-Fi RSSI, uptime, reset reasons |
| Public Stations | Monitor any public tempestwx.com station — full weather dataset plus distance and bearing from your Indigo server |

| Page | Contents |
|---|---|
| Installation | Requirements and install steps |
| Plugin Configuration | UDP port, Web API token, log levels, device auto-generation |
| Web API | Web API setup, web-only mode, extra states |
| Tempest Device Configuration | Unit selection, altitude, device picker, web-only mode |
| Public Tempest Station | Monitor public stations, distance and direction states, building a weather network |
| Device States | Every state — what it means, units, notes |
| Triggers | Lightning, rain-start, and rapid-wind triggers |
| Rain Data | How daily rain is sourced and why power-save mode matters |
| Troubleshooting | Common problems and fixes |
| Architecture | Internal design: UDP → asyncio → Indigo |

| Requirement | Version |
|---|---|
| Indigo | 2025.2 or later (ServerApiVersion 3.4) |
| WeatherFlow hub | Any — must be on the same subnet as the Indigo Mac (or use web-only mode) |

WeatherFlowTempest.indigoPlugin).For web API features, see Plugin Configuration below.
See the Installation wiki page for full details.

Open Plugins → WeatherFlow Tempest Weather Station → Configure.

Click Generate Devices to auto-create Indigo devices for every Tempest and Hub currently broadcasting on the network. Re-press whenever new hardware is added.
| Setting | Description |
|---|---|
| UDP Port | Port the hub broadcasts on (default: 50222) |
| Listen Address | Network interface to listen on (default: 0.0.0.0 = all interfaces) |
Saving the preferences automatically restarts the UDP listener.
| Setting | Description |
|---|---|
| Enable Web API | Tick to activate web-based data polling |
| API Token | Your Personal Use Token from tempestwx.com → Settings → Data Authorizations |
When enabled the plugin polls the WeatherFlow REST API to supplement UDP data with:
The web API is polled every 5 minutes when UDP data is active (slow-changing supplemental data only), or every 60 seconds in web-only mode (all states come from web).
Getting a token: Log in to tempestwx.com, go to Settings → Data Authorizations, and generate a Personal Use Token. It is free and tied to your WeatherFlow account.
Note: The personal Web API authenticates by account — it only serves stations registered to the token's owner. To monitor other people's public stations, use the Public Tempest Station device type instead — no token required.
| Setting | Description |
|---|---|
| Indigo Log Level | Verbosity of messages in the Indigo Event Log |
| File Log Level | Verbosity of messages written to the plugin log file |

Tip: If the device dropdown is empty, the hub has not yet sent a broadcast. Wait 30–60 seconds and use the Reload button in the dialog to refresh the list.


| Field | Description |
|---|---|
| Tempest Device | Serial number of the Tempest (ST-xxxxxxxx), discovered automatically from UDP |
| Web-only (hub on different network) | Tick to bypass UDP and use the web API exclusively — see below |
| Altitude (m) | Station elevation in metres above sea level. Used to calculate sea-level pressure, cloud base, and freezing level. Set to 0 to omit those derived states. |
| Temperature | °C or °F |
| Pressure | hPa (mbar), mmHg, or inHg |
| Wind Speed | m/s, km/h, mph, or knots |
| Rainfall | mm or inches |
| Altitude unit | Metres or feet (for cloud base and freezing level) |
Unit selections are independent — mix and match as needed. Changes take effect on the next sensor observation. Active unit labels are stored in the unit_temperature, unit_pressure, unit_wind, and unit_rain device states.
Enable Web-only (hub on different network) when the Tempest hub is on a separate network from the Indigo Mac (e.g. a remote property, a neighbour's setup with shared access, or a different VLAN where UDP broadcast doesn't reach).
When web-only is ticked, one additional field appears:
| Field | Description |
|---|---|
| Station ID | Numeric WeatherFlow station ID — found in the WeatherFlow app under station Settings |
The Web API must be enabled and a valid token entered in Plugin Preferences. The device is polled every 60 seconds and all sensor states (temperature, pressure, wind, rain, UV, lightning, conditions) are populated from the web. The deviceStatus state shows Active (web) when data is flowing.
Station ID: Open the WeatherFlow app, tap your station name, then tap Settings. The station ID is the number shown in the Station Information section.

The Public Tempest Station device type lets you monitor any publicly-shared WeatherFlow station on tempestwx.com — no personal API token and no WeatherFlow account required.
tempestwx.com/station/130809/ → 130809).The device polls every 120 seconds and populates a full weather dataset including temperature, wind, rain, lightning, UV, and pressure — identical in breadth to a locally-connected Tempest.

Each device automatically calculates the station's position relative to your Indigo server (requires latitude and longitude set in Indigo → Preferences → Location):
| State | Example | Description |
|---|---|---|
distance_km |
14.32 |
Distance in kilometres |
distance_mi |
8.90 |
Distance in miles |
bearing |
22.5 |
Bearing from Indigo to station in degrees (0 = North, clockwise) |
bearing_cardinal |
NNE |
16-point compass — N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW |
distance_description |
14.3 km NNE |
Human-readable combined label; auto-scales to metres / feet at short range |
The bearing is measured from your Indigo server toward the station — NNE means the station lies to your north-north-east. The distance_description state can be placed directly in Control Pages or notification messages.

You can add as many Public Tempest Station devices as you like — there is no limit. Each polls independently on its own 120-second cycle. Common uses:
lightning_count_last_1hr and lightning_count_last_3hr states across multiple stations to gauge storm approach directiondistance_descriptionSee the Public Tempest Station wiki page for the full state reference, failure handling, and detailed examples.

| State | Description |
|---|---|
air_temperature |
Ambient temperature |
temperature |
Alias for air_temperature |
feels_like_temperature |
Apparent / feels-like temperature |
dew_point_temperature |
Dew point |
wet_bulb_temperature |
Wet bulb temperature |
wind_chill_temperature |
Wind chill |
heat_index |
Heat index |
delta_t |
Delta-T (dry bulb minus wet bulb) |
| State | Description |
|---|---|
relative_humidity |
Relative humidity (%) |
station_pressure |
Raw station pressure |
sea_level_pressure |
Sea-level corrected pressure (requires altitude > 0) |
vapor_pressure |
Vapour pressure |
air_density |
Air density (kg/m³, always metric) |
| State | Description |
|---|---|
cloud_base |
Estimated cloud base height above station |
freezing_level |
Estimated freezing level height above station |
| State | Description |
|---|---|
illuminance |
Illuminance (lux) |
solar_radiation |
Solar irradiance (W/m²) |
uv |
UV index |
| State | Source | Description |
|---|---|---|
rain_accumulation_previous_minute |
UDP | Rain accumulated in the previous minute |
rain_rate |
UDP | Current rain rate (mm/h or in/h) |
rain_intensity |
UDP | None / Very Light / Light / Moderate / Heavy / Violent |
rain_today |
UDP + Web | Total rain since local midnight (web value is rain-check corrected) |
rain_yesterday |
UDP + Web | Yesterday's total rain |
rain_check |
UDP | WeatherFlow Rain Check verification status (none / on / off) |
precipitation_type |
UDP | none, rain, hail, or rain_hail |
last_rain_start |
UDP | Timestamp of the most recent rain-start event (UTC) |
rain_last_1hr |
Web only | Rain accumulated in the last 60 minutes |
rain_duration_today |
Web only | Minutes of measurable rain today |
rain_duration_yesterday |
Web only | Minutes of measurable rain yesterday |
| State | Source | Description |
|---|---|---|
lightning_strike_count |
UDP | Strikes detected in the last 3 minutes |
lightning_strike_average_distance |
UDP | Average distance of recent strikes |
last_strike_distance |
UDP | Distance of the most recent strike |
last_strike_energy |
UDP | Energy of the most recent strike |
last_strike_time |
UDP | Timestamp of the most recent strike (UTC) |
lightning_count_last_1hr |
Web only | Strikes in the last 60 minutes |
lightning_count_last_3hr |
Web only | Strikes in the last 3 hours |
| State | Description |
|---|---|
conditions |
Current weather description (e.g. "Partly Cloudy") |
weather_icon |
Icon name from WeatherFlow's forecast engine (e.g. partly-cloudy-day) |
| State | Description |
|---|---|
wind_speed |
Instantaneous wind speed (rapid-wind, ~3 s interval) |
wind_average |
1-minute average wind speed |
wind_gust |
1-minute wind gust |
wind_lull |
1-minute wind lull |
wind_direction |
Instantaneous wind direction (°) |
wind_direction_average |
1-minute average wind direction (°) |
wind_direction_cardinal |
Instantaneous cardinal direction (N, NE, …) |
wind_direction_average_cardinal |
Average cardinal direction |
wind_sample_interval |
Wind measurement window (seconds) |
| State | Description |
|---|---|
unit_temperature |
Active temperature unit label (e.g. °C) |
unit_pressure |
Active pressure unit label (e.g. hPa) |
unit_wind |
Active wind speed unit label (e.g. km/h) |
unit_rain |
Active rain unit label (e.g. mm) |
| State | Description |
|---|---|
battery |
Battery voltage (V) |
battery_percent |
Battery level (%) |
power_save_mode |
Active power-save mode name |
report_interval |
Observation reporting frequency (minutes) |
| State | Description |
|---|---|
rssi |
Tempest RF signal strength (dBm) |
hub_rssi |
Hub RF signal strength (dBm) |
firmware_revision |
Tempest firmware version |
hub_sn |
Hub serial number |
up_since |
Device power-on timestamp (UTC) |
last_report |
Timestamp of the most recent observation (UTC) |
sensor_status |
Sensor fault flags, or OK |
deviceStatus |
Active (UDP), Active (web) (web-only), Waiting for data on startup, No data — last seen N min ago if silent |
| State | Description |
|---|---|
firmware_revision |
Hub firmware version |
rssi |
Hub Wi-Fi signal strength (dBm) |
up_since |
Hub power-on timestamp (UTC) |
uptime |
Seconds since last boot |
reset_flags |
Reason(s) for the last reset (comma-separated) |
deviceStatus |
Connection status |
| State | Description |
|---|---|
distance_km |
Distance from Indigo server to station (km) |
distance_mi |
Distance from Indigo server to station (miles) |
bearing |
Bearing from Indigo to station (degrees, 0 = North) |
bearing_cardinal |
Cardinal abbreviation: N, NNE, NE, ENE … NNW |
distance_description |
Human-readable combined label, e.g. 14.3 km NNE |
| State | Description |
|---|---|
station_name |
Station display name |
latitude |
Station latitude |
longitude |
Station longitude |
elevation |
Station elevation (metres) |
All temperature, atmospheric, light, wind, rain, and lightning states mirror the Tempest Weather Station state set above. Rain totals are rain-check corrected. Full details on the Public Tempest Station wiki page.

Three custom trigger types are available under Triggers → New Trigger → WeatherFlow Tempest Weather Station.
Each trigger includes a Tempest Device picker so it can be scoped to a specific station when you have more than one.
Fires whenever the selected Tempest detects a lightning strike.
| Field | Description |
|---|---|
| Tempest Device | The Tempest station to watch. Leave blank to fire for any station. |
The last_strike_distance, last_strike_energy, and last_strike_time device states are updated before the trigger fires.
Use cases: push notification with distance and energy; flash a light; log strikes to a variable.
Fires when the Tempest detects the onset of precipitation (the first rain-start event after a dry period).
Note: This trigger fires from the Tempest's dedicated rain-start event, which is sent immediately when the sensor detects rain — independent of the 1-minute observation cycle. It fires once per rain onset, not repeatedly while rain continues.
The last_rain_start device state is updated when this trigger fires.
Use cases: close roof vents; retract a pergola awning; send a notification.
Fires when an instantaneous wind reading meets or exceeds a configurable speed. Rapid-wind readings arrive approximately every 3 seconds.
| Field | Description |
|---|---|
| Tempest Device | The Tempest station to watch. |
| Threshold (m/s) | Minimum wind speed (in m/s) required to fire the trigger. |
The threshold is always compared against the raw m/s magnitude regardless of the display unit. Convert if needed: 1 m/s = 3.6 km/h = 2.237 mph = 1.944 kn.
Use cases: close greenhouse vents above 10 m/s; retract a sail shade above 15 m/s.

The plugin monitors each Tempest station for data dropouts. If no observation is received for more than 5 minutes:
deviceStatus state is updated to "No data — last seen N min ago".When data resumes, deviceStatus returns to "Active" automatically and a recovery notice is logged.
The plugin also monitors the UDP listener itself — if the background socket task crashes, the listener is restarted automatically within 60 seconds. The web API poller is similarly monitored and restarted if it exits unexpectedly.

Plugins → WeatherFlow Tempest Weather Station exposes two menu commands:

Device dropdown is empty / "No devices discovered yet" - Confirm the WeatherFlow hub is on the same subnet as the Indigo Mac. UDP broadcast does not cross router boundaries. - Check that nothing is blocking UDP port 50222 (macOS firewall, managed switch, VLAN separation). - Wait 60 seconds — hubs broadcast a status packet roughly once per minute — then use the Reload button in the device dialog. - If the hub is on a different network, use Web-only mode in the device configuration instead.
deviceStatus shows "No data — last seen N min ago"
- The station has not sent an observation in over 5 minutes. Check the hub's power and Wi-Fi connection, and confirm the Tempest is within RF range.
- Use Plugins → WeatherFlow → Restart UDP Listener to retry without reloading the plugin.
Web API returns 401 Unauthorized - Verify the API token is correct in Plugin Preferences (Plugins → Configure). - Ensure the Station ID in the device config matches a station registered to the token's account. Find your station ID in the WeatherFlow app under station Settings. - After 3 consecutive 401 errors for a station, polling is suspended. Correct the station ID and save the device to resume.
rain_last_1hr, conditions, weather_icon are always empty
- These states require the Web API to be enabled. Tick Enable Web API in Plugin Preferences and enter a valid token.
sea_level_pressure, cloud_base, freezing_level are missing
- Set Altitude (m) to a non-zero value in the Tempest device configuration.
sensor_status shows all sensors failed
- This is a known firmware quirk (seen in firmware 181) where the hardware register is read before sensor self-test completes. The plugin detects this pattern and displays OK instead. A subset of sensors listed as failed is a genuine fault.
Debug logging
- Set Indigo Log Level to Debugging Messages in Plugin Preferences for verbose output.
- The plugin log file is at ~/Library/Application Support/Perceptive Automation/Indigo 2025.x/Logs/. Set File Log Level to Detailed Debugging Messages for maximum detail.

by Nathan Spencer (@natekspencer)
The core UDP library that handles all communication with the WeatherFlow hub. Provides an event-based async interface, parses every WeatherFlow message type, and exposes sensor values as typed properties with full unit support. All derived meteorological calculations (dew point, wet bulb, heat index, feels-like, vapour pressure, air density, sea-level pressure, cloud base, freezing level) are provided by this library.
Licensed under MIT. Consider supporting Nathan on Ko-fi.
Physical quantity handling with units. All sensor values carry their native unit and are converted to the user's chosen display unit using Pint's unit registry.
Psychrometric calculations used by pyweatherflowudp to derive wet bulb temperature and related humidity metrics.

MIT — see LICENSE for details.
Developed by GlennNZ.
| v2.5.3 | Requires Indigo v2023.2.0+ | Released May 26, 2026 | 2.5.3 Offline detection rewritten — the 2.5.1 implementation used a better_forecast field that prove |
| Released on: | May 26, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 5 times |
| Download this release | |

Released: 2026-05-26 Minimum Indigo version: 2025.2

Two improvements to how the plugin handles an offline personal Tempest station:
better_forecast field that proved unreliable; a correct documented API endpoint is now used instead.
Problem (2.5.1 regression): The 2.5.1 fix for stale web data worked correctly for Public Tempest Station devices but not for personal stations. The personal web poller used better_forecast.current_conditions.time as the observation timestamp — a field that always reflects the time WeatherFlow generated the API response (2–3 seconds ago), not when the Tempest device last transmitted. Additionally, better_forecast.station.is_station_online returns True even when the device has a completely flat battery.
The result: the 10-minute age gate in 2.5.1 never fired for personal stations, and stale cached data continued to be written to Indigo states when a station was offline.
Investigation: A complete audit of available WeatherFlow REST API endpoints was performed against a live flat-battery device:
| Endpoint / Field | Value when offline | Reliable? |
|---|---|---|
better_forecast → current_conditions.time |
Always 2–3 s | ❌ API generation time |
better_forecast → station.is_station_online |
True |
❌ Always true |
better_forecast → station.state |
1 |
❌ Static config value |
/stations/{id} → device fields |
No status fields | ❌ Config metadata only |
/diagnostics/{id} |
Accurate | ❌ Requires partner API key |
/observations/stn/{id} → obs |
[] (empty list) |
✅ Definitive offline signal |
Fix: Every web poll cycle now makes two API calls:
better_forecast — unchanged, provides current conditions data for device states./observations/stn/{station_id}?api_key={token}&bucket=1 — the documented personal station observations endpoint. bucket=1 returns the latest 1-minute record only. When the station is offline, obs: [] is returned.Offline detection logic:
obs: [] → station has no recent observations — update is rejected.obs[-1][0] → timestamp of the most recent observation record. If more than 10 minutes old, update is also rejected (secondary age gate).station 183063: /observations/stn status={'status_code': 0, 'status_message': 'SUCCESS'} obs count=1
My Tempest: web observation age 47 s (0.8 min)Note on endpoint naming: /observations/stn is the documented personal station endpoint in the WeatherFlow API reference. /observations/station (used for public stations) also returns obs: [] when offline, but is the public-facing endpoint. Using the correct personal endpoint avoids any reliance on undocumented behaviour.

When a personal station's data is stale or absent, the plugin now marks the Indigo device with an error state so it is immediately visible in the Indigo client UI (device row turns red, status column shows the error string).
Two thresholds:
| Stale duration | deviceStatus state |
Indigo error state |
|---|---|---|
| < 10 minutes | unchanged | none |
| 10 – 30 minutes | Stale data |
Stale data (device turns red) |
| > 30 minutes | Offline |
Offline (device turns red) |
Recovery is automatic — on the next successful poll after the station comes back online, the error state is cleared and all device states resume updating normally. No manual action required.
Cleared at startup — if the plugin is reloaded or Indigo restarts while a station is offline, any lingering error state from the previous session is cleared immediately on deviceStartComm and set fresh once the first poll completes.
Log output during an offline event:
Warning: My Tempest: station offline — no recent observations (stale 0 min)
Warning: My Tempest: station offline — no recent observations (stale 12 min) ← device now shows "Stale data"
Warning: My Tempest: station offline — no recent observations (stale 31 min) ← device now shows "Offline"
My Tempest: web observation age 43 s (0.7 min) ← station recovered, error cleared


Released: 2026-05-26 Minimum Indigo version: 2025.2

Two improvements to how the plugin handles an offline personal Tempest station:
better_forecast field that proved unreliable; a correct documented API endpoint is now used instead.
Problem (2.5.1 regression): The 2.5.1 fix for stale web data worked correctly for Public Tempest Station devices but not for personal stations. The personal web poller used better_forecast.current_conditions.time as the observation timestamp — a field that always reflects the time WeatherFlow generated the API response (2–3 seconds ago), not when the Tempest device last transmitted. Additionally, better_forecast.station.is_station_online returns True even when the device has a completely flat battery.
The result: the 10-minute age gate in 2.5.1 never fired for personal stations, and stale cached data continued to be written to Indigo states when a station was offline.
Investigation: A complete audit of available WeatherFlow REST API endpoints was performed against a live flat-battery device:
| Endpoint / Field | Value when offline | Reliable? |
|---|---|---|
better_forecast → current_conditions.time |
Always 2–3 s | ❌ API generation time |
better_forecast → station.is_station_online |
True |
❌ Always true |
better_forecast → station.state |
1 |
❌ Static config value |
/stations/{id} → device fields |
No status fields | ❌ Config metadata only |
/diagnostics/{id} |
Accurate | ❌ Requires partner API key |
/observations/stn/{id} → obs |
[] (empty list) |
✅ Definitive offline signal |
Fix: Every web poll cycle now makes two API calls:
better_forecast — unchanged, provides current conditions data for device states./observations/stn/{station_id}?api_key={token}&bucket=1 — the documented personal station observations endpoint. bucket=1 returns the latest 1-minute record only. When the station is offline, obs: [] is returned.Offline detection logic:
obs: [] → station has no recent observations — update is rejected.obs[-1][0] → timestamp of the most recent observation record. If more than 10 minutes old, update is also rejected (secondary age gate).station 183063: /observations/stn status={'status_code': 0, 'status_message': 'SUCCESS'} obs count=1
My Tempest: web observation age 47 s (0.8 min)Note on endpoint naming: /observations/stn is the documented personal station endpoint in the WeatherFlow API reference. /observations/station (used for public stations) also returns obs: [] when offline, but is the public-facing endpoint. Using the correct personal endpoint avoids any reliance on undocumented behaviour.

When a personal station's data is stale or absent, the plugin now marks the Indigo device with an error state so it is immediately visible in the Indigo client UI (device row turns red, status column shows the error string).
Two thresholds:
| Stale duration | deviceStatus state |
Indigo error state |
|---|---|---|
| < 10 minutes | unchanged | none |
| 10 – 30 minutes | Stale data |
Stale data (device turns red) |
| > 30 minutes | Offline |
Offline (device turns red) |
Recovery is automatic — on the next successful poll after the station comes back online, the error state is cleared and all device states resume updating normally. No manual action required.
Cleared at startup — if the plugin is reloaded or Indigo restarts while a station is offline, any lingering error state from the previous session is cleared immediately on deviceStartComm and set fresh once the first poll completes.
Log output during an offline event:
Warning: My Tempest: station offline — no recent observations (stale 0 min)
Warning: My Tempest: station offline — no recent observations (stale 12 min) ← device now shows "Stale data"
Warning: My Tempest: station offline — no recent observations (stale 31 min) ← device now shows "Offline"
My Tempest: web observation age 43 s (0.7 min) ← station recovered, error cleared

| v2.5.1 | Requires Indigo v2023.2.0+ | Released May 24, 2026 | 2.5.1 Bug fixes older devices and stale web data rejected after 10 minutes, Air device rain state er |
| Released on: | May 24, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 6 times |
| Download this release | |

Released: 2026-05-24 Minimum Indigo version: 2025.2

This is a bug-fix release addressing three issues: stale web data being written to device states when a station goes offline, Indigo state errors on older Air and Sky devices, and duplicate polling on plugin startup.

Problem: When UDP communication to a local Tempest went down, the web backup poller would take over and push all sensor states from the WeatherFlow cloud API. If the station itself was also offline, WeatherFlow's API returns its last cached observation indefinitely — meaning the plugin would keep writing hour-old (or older) temperature, wind, pressure, and rain values to Indigo device states on every poll cycle.
The same issue affected Public Tempest Station devices: if a public station went offline, its last cached data would keep refreshing in Indigo as though it were live.
Fix: Both the personal web API poller and the public station poller now check the age of the observation timestamp before committing any states:
current_conditions.time from the better_forecast endpoint is the actual observation timestamp (confirmed from WeatherFlow's own REST API library). If the observation is more than 10 minutes old, the update is skipped entirely.obs[0].timestamp from the /observations/station/{id} endpoint. Same 10-minute threshold.When data is rejected, a warning is written to the Indigo log:
My Tempest: web observation is 47.2 min old (obs_time=1748030400) — skipping update
My Public Station: public observation is 23.8 min old (timestamp=1748031600) — skipping update
On every successful web poll, the observation age is now written to the plugin log at Debug level. This makes it straightforward to confirm data freshness and to spot a station going stale before it crosses the rejection threshold:
My Tempest: web observation age 3 s (0.1 min)
My Public Station: public observation age 47 s (0.8 min)
Problem: Users with older WeatherFlow Air (AR-) devices saw a stream of Indigo state errors on every observation:
Error device "WeatherFlow Air AR-XXXXXXXX" state key rain_intensity not defined (ignoring update request)
Error device "WeatherFlow Air AR-XXXXXXXX" state key rain_today not defined (ignoring update request)
Error device "WeatherFlow Air AR-XXXXXXXX" state key rain_today_raw_mm not defined (ignoring update request)
Error device "WeatherFlow Air AR-XXXXXXXX" state key rain_today_date not defined (ignoring update request)
The Air sensor has no rain hardware, so its device type does not define rain states. However the observation state builder was writing rain states unconditionally for all device types. A secondary issue caused the daily rain accumulator to compute a spurious 0.0 mm value for Air (because both rain properties return None, summing to 0.0), which passed a not None check and attempted to write rain_today and rain_today_raw_mm.
Fix: All rain-related states (rain_intensity, rain_today, rain_today_raw_mm, rain_today_date, rain_yesterday, rain_rate, rain_accumulation_previous_minute, precipitation_type) are now guarded by a SkySensorType check. Sky and Tempest devices both satisfy this check and are unaffected. The daily rain accumulation calculation is also skipped entirely for Air, so no spurious 0.0 value is computed.
Problem: On plugin startup, the public station poller and web API poller could each spawn two concurrent polling tasks, resulting in every API call and every log line being doubled:
Fix: A second guard check was added inside the scheduled callback, which runs on the event loop and is therefore strictly serial. By the time the second callback executes, the first has already assigned the task, so the duplicate creation is suppressed. The same fix was applied to the web API poller. The "poller started" log message was also moved inside the callback so it only appears when a task is actually created.

| Released on: | May 23, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 4 times |
| Download this release | |

Released: 2026-05-23 Minimum Indigo version: 2025.2

This release introduces the Public Tempest Station — a new device type that lets you monitor any publicly-shared WeatherFlow station without a personal API token or WeatherFlow account. Add as many as you like to build a network of weather reference points surrounding your Indigo location. Each device includes distance and direction states that tell you precisely where the station sits relative to your Indigo server.

A new Public Tempest Station device type is now available alongside the existing Tempest Weather Station and WeatherFlow Hub.
To add one:
1. Go to Devices → New Device → WeatherFlow Tempest Weather Station.
2. Choose Public Tempest Station.
3. Enter the station ID from its tempestwx.com URL (e.g. tempestwx.com/station/130809/ → 130809).
4. Select your preferred units and click Save.
No API token is required. Any station marked as public on tempestwx.com can be monitored. The device polls every 120 seconds.

Each Public Tempest Station device automatically calculates where the station sits relative to your Indigo server (uses the latitude and longitude set in Indigo → Preferences → Location):
| State | Example | Description |
|---|---|---|
distance_km |
14.32 |
Great-circle distance to the station in kilometres |
distance_mi |
8.90 |
Same distance in miles |
bearing |
22.5 |
Bearing from Indigo to the station (0° = North, clockwise) |
bearing_cardinal |
NNE |
16-point compass: N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW |
distance_description |
14.3 km NNE |
Human-readable label — auto-scales (metres below 1 km, feet below 0.1 miles) |
The bearing_cardinal represents the direction from your Indigo server toward the station — NNE means the station is to your north-north-east.
The distance_description state is designed for direct use in Control Pages and notifications without any scripting.

Public Tempest Station devices expose the same comprehensive weather data as a local Tempest device:
All values are rain-check corrected where applicable and arrive already in the user's chosen units.
Because each Public Tempest Station is a standalone Indigo device, you can add as many as needed. Suggested uses:
distance_description
runConcurrentThread detects if the public poller exits unexpectedly and restarts it automatically, consistent with the existing web poller pattern

| Released on: | May 23, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 4 times |
| Download this release | |

Released: 2026-05-23 Minimum Indigo version: 2022.1

This release adds an optional WeatherFlow Web API integration that unlocks nine new device states unavailable from UDP, including rain-check corrected totals, rolling rain and lightning counts, and current weather conditions. It also introduces web-only mode — a way to monitor a Tempest hub on a different network by sourcing all data from the cloud API.

Enable in Plugin Preferences → Enable Web API with a free Personal Use Token from your WeatherFlow account. When active, the plugin polls the WeatherFlow REST API every 5 minutes to supplement local UDP data.
Nine new device states are added:
| State | Source | Description |
|---|---|---|
rain_today |
Web API | Authoritative daily total — rain-check corrected by WeatherFlow servers |
rain_yesterday |
Web API | Authoritative yesterday total, rain-check corrected |
rain_last_1hr |
Web API | Rolling 60-minute rainfall total |
rain_duration_today |
Web API | Minutes of measurable rain today |
rain_duration_yesterday |
Web API | Minutes of measurable rain yesterday |
conditions |
Web API | Current weather description, e.g. "Partly Cloudy" |
weather_icon |
Web API | Icon name from WeatherFlow's forecast engine |
lightning_count_last_1hr |
Web API | Strikes in the last 60 minutes |
lightning_count_last_3hr |
Web API | Strikes in the last 3 hours |
When UDP and the Web API are both active, real-time sensor readings (temperature, wind, pressure, etc.) continue to come from UDP. Web API updates rain totals and provides the web-exclusive states above.
Devices can now be configured for web-only mode — tick Web-only (hub on different network) in the device configuration and enter your Station ID. Use this when:
In web-only mode, all sensor readings come from the REST API, polled every 60 seconds. deviceStatus displays Active (web) when data is flowing.
Web-only devices require only a Station ID — no serial number entry is needed.
If a UDP station goes silent for more than 5 minutes, the web API automatically provides all standard sensor readings (including temperature, wind, pressure, etc.) until UDP resumes. This ensures states remain current even during temporary network interruptions.

runConcurrentThread detects if the web poll task exits unexpectedly and restarts it automatically_degrees_to_cardinal helper
wiki/ from the main repo to the GitHub wiki on every push
| v1.2.0 | Requires Indigo v2023.2.0+ | Released May 23, 2026 | 1.2.0 Weatherflow Tempest Weather Station Plugin |
| Released on: | May 23, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 4 times |
| Download this release | |

Receives live weather data from WeatherFlow Tempest stations via local UDP broadcast and maps all sensor observations to Indigo device states. No cloud account or API key is required. Everything runs on your local network.
See Wiki https://github.com/Ghawken/WeatherFlowTempest/wiki


Indigo device states for a Tempest Weather Station showing live sensor readings and unit labels.

| Category | What you get |
|---|---|
| Temperature | Ambient, feels-like, dew point, wet bulb, wind chill, heat index, delta-T |
| Atmospheric | Station pressure, sea-level pressure, relative humidity, vapour pressure, air density |
| Wind | Instantaneous speed/direction (rapid-wind, ~3 s), 1-minute average, gust, lull, cardinal, sample interval |
| Rain | Per-minute accumulation, rain rate, intensity label, daily total, yesterday's total, Rain Check status |
| Lightning | Strike count, average distance, last-strike distance, energy and timestamp |
| Light | Illuminance (lux), solar radiation (W/m²), UV index |
| Battery | Voltage and percentage; power-save mode label; report interval |
| Derived | Cloud base, freezing level (both require altitude to be set) |
| Diagnostics | RSSI, firmware version, sensor fault flags, silence detection |
| Hub | Firmware, Wi-Fi RSSI, uptime, reset reasons |

| Page | Contents |
|---|---|
| [[Installation]] | Requirements and install steps |
| [[Plugin-Configuration]] | UDP port, log levels, device auto-generation |
| [[Tempest-Device-Configuration]] | Unit selection, altitude, device picker |
| [[Device-States]] | Every state — what it means, units, notes |
| [[Triggers]] | Lightning, rain-start, and rapid-wind triggers |
| [[Rain-Data]] | How daily rain is sourced and why power-save mode matters |
| [[Troubleshooting]] | Common problems and fixes |
| [[Architecture]] | Internal design: UDP → asyncio → Indigo |

| Requirement | Version |
|---|---|
| Indigo | 2025.2 or later (ServerApiVersion 3.4) |
| WeatherFlow hub | Any — must be on the same subnet as the Indigo Mac |

WeatherFlowTempest.indigoPlugin).See [[Installation]] for full details.

Indigo device states for a Tempest Weather Station, showing live sensor readings and unit labels.
| Requirement | Version |
|---|---|
| Indigo | 2025.2 or later (ServerApiVersion 3.4) |
| WeatherFlow hub | Any — must be on the same subnet as the Indigo Mac |
WeatherFlowTempest.indigoPlugin and double-click it to install.Tip: If the device dropdown is empty, the hub has not yet sent a broadcast. Wait 30–60 seconds and use the Reload button in the dialog to refresh the list.
| Field | Description |
|---|---|
| Tempest Device | Serial number of the Tempest (ST-xxxxxxxx), discovered automatically |
| Altitude (m) | Station elevation in metres above sea level. Used to calculate sea-level pressure, cloud base, and freezing level. Set to 0 to omit those derived states. |
| Units — Temperature | °C or °F |
| Units — Pressure | hPa (mbar), mmHg, or inHg |
| Units — Wind Speed | m/s, km/h, mph, or knots |
| Units — Rain | mm or inches |
Unit selections are independent — mix and match as needed. Changes take effect on the next sensor observation (within ~1 minute). Active unit labels are reflected in the unit_temperature, unit_pressure, unit_wind, and unit_rain device states.
| State | Description |
|---|---|
air_temperature |
Ambient temperature |
feels_like_temperature |
Apparent / feels-like temperature |
dew_point_temperature |
Dew point |
wet_bulb_temperature |
Wet bulb temperature |
wind_chill_temperature |
Wind chill |
heat_index |
Heat index |
delta_t |
Delta-T (dry bulb minus wet bulb) |
| State | Description |
|---|---|
relative_humidity |
Relative humidity (%) |
station_pressure |
Raw station pressure |
sea_level_pressure |
Sea-level corrected pressure (requires altitude > 0) |
vapor_pressure |
Vapour pressure |
air_density |
Air density (kg/m³, always metric) |
| State | Description |
|---|---|
cloud_base |
Estimated cloud base height above station |
freezing_level |
Estimated freezing level height above station |
| State | Description |
|---|---|
illuminance |
Illuminance (lux) |
solar_radiation |
Solar irradiance (W/m²) |
uv |
UV index |
| State | Description |
|---|---|
rain_accumulation_previous_minute |
Rain accumulated in the previous minute |
rain_rate |
Current rain rate (mm/h or in/h) |
precipitation_type |
none, rain, hail, or rain_hail |
last_rain_start |
Timestamp of the most recent rain-start event (UTC) |
| State | Description |
|---|---|
lightning_strike_count |
Strikes detected in the last 3 minutes |
lightning_strike_average_distance |
Average distance of recent strikes |
last_strike_distance |
Distance of the most recent strike |
last_strike_energy |
Energy of the most recent strike |
| State | Description |
|---|---|
wind_speed |
Instantaneous wind speed (rapid-wind, ~3 s interval) |
wind_average |
1-minute average wind speed |
wind_gust |
1-minute wind gust |
wind_lull |
1-minute wind lull |
wind_direction |
Instantaneous wind direction (°) |
wind_direction_average |
1-minute average wind direction (°) |
wind_direction_cardinal |
Instantaneous cardinal direction (N, NE, …) |
wind_direction_average_cardinal |
Average cardinal direction |
| State | Description |
|---|---|
unit_temperature |
Active temperature unit label (e.g. °C) |
unit_pressure |
Active pressure unit label (e.g. hPa) |
unit_wind |
Active wind speed unit label (e.g. km/h) |
unit_rain |
Active rain unit label (e.g. mm) |
| State | Description |
|---|---|
battery |
Battery voltage (V) |
battery_percent |
Battery level (%) |
power_save_mode |
Active power-save mode name |
| State | Description |
|---|---|
rssi |
Tempest RF signal strength (dBm) |
hub_rssi |
Hub RF signal strength (dBm) |
firmware_revision |
Tempest firmware version |
hub_sn |
Hub serial number |
up_since |
Device power-on timestamp (UTC) |
last_report |
Timestamp of the most recent observation (UTC) |
sensor_status |
Sensor fault flags, or OK |
deviceStatus |
Active when data is flowing; Waiting for data on startup; No data — last seen N min ago if the station goes silent |
| State | Description |
|---|---|
firmware_revision |
Hub firmware version |
rssi |
Hub Wi-Fi signal strength (dBm) |
up_since |
Hub power-on timestamp (UTC) |
uptime |
Seconds since last boot |
reset_flags |
Reason(s) for the last reset (comma-separated) |
deviceStatus |
Connection status |
Three custom trigger types are available under Triggers → New Trigger → WeatherFlow Tempest Weather Station.
Each trigger includes a Tempest Device picker so it can be scoped to a specific station when you have more than one.

Fires whenever the selected Tempest detects a lightning strike.
Configuration:
| Field | Description |
|---|---|
| Tempest Device | The Tempest station to watch. Leave blank to fire for any station. |
Use cases: - Send a push notification with distance and energy. - Flash a light or sound an alert. - Log strikes to a variable for counting.
Available at trigger time: The last_strike_distance, last_strike_energy, and last_strike_time device states are updated before the trigger fires, so you can read them in trigger actions.

Fires when the Tempest detects the onset of precipitation (the first rain-start event after a dry period).
Configuration:
| Field | Description |
|---|---|
| Tempest Device | The Tempest station to watch. |
Use cases: - Close roof vents or skylights. - Retract a pergola awning. - Send a "rain started" notification.
Note: This trigger fires from the Tempest's dedicated rain-start event, which is sent immediately when the sensor detects rain — independent of the 1-minute observation cycle. It fires once per rain onset, not repeatedly while rain continues.
The last_rain_start device state is updated when this trigger fires.

Fires when an instantaneous wind reading meets or exceeds a configurable speed.
Rapid-wind readings arrive approximately every 3 seconds, giving near-real-time wind monitoring.
Configuration:
| Field | Description |
|---|---|
| Tempest Device | The Tempest station to watch. |
| Threshold (m/s) | Minimum wind speed (in m/s) required to fire the trigger. |
Use cases: - Close greenhouse vents above 10 m/s. - Retract a sail shade above 15 m/s. - Log wind gusts to a time-stamped variable.
The threshold is always compared against the raw m/s magnitude regardless of the display unit set in the device configuration. Convert your target speed if needed: 1 m/s = 3.6 km/h = 2.237 mph = 1.944 kn.

wind_speed state still updates from the 1-minute observation, but at a lower frequency.The plugin monitors each Tempest station for data dropouts. If no observation is received for more than 5 minutes:
deviceStatus state is updated to "No data — last seen N min ago", making the outage visible in the Indigo device list without checking logs.When data resumes, deviceStatus returns to "Active" automatically on the next observation, and a recovery notice is logged.
The plugin also monitors the UDP listener itself. If the background socket task crashes for any reason, the listener is restarted automatically within 60 seconds.
Open Plugins → WeatherFlow Tempest Weather Station → Configure.
| Setting | Description |
|---|---|
| Generate Devices | Auto-create Indigo devices for all discovered WeatherFlow hardware |
| UDP Port | Port the hub broadcasts on (default: 50222) |
| Listen Address | Network interface to listen on (default: 0.0.0.0 = all interfaces) |
| Indigo Log Level | Verbosity of messages in the Indigo Event Log |
| File Log Level | Verbosity of messages written to the plugin log file |
Saving the preferences automatically restarts the UDP listener.
Plugins → WeatherFlow Tempest Weather Station exposes two menu commands:
Device dropdown is empty / "No devices discovered yet" - Confirm the WeatherFlow hub is on the same subnet as the Indigo Mac. UDP broadcast does not cross router boundaries. - Check that nothing is blocking UDP port 50222 (macOS firewall, managed switch, VLAN separation). - Wait 60 seconds — hubs broadcast a status packet roughly once per minute — then use the Reload button in the device dialog.
deviceStatus shows "No data — last seen N min ago"
- The station has not sent an observation in over 5 minutes. Check the hub's power and Wi-Fi connection, and confirm the Tempest is within RF range.
- Check the Indigo Event Log for listener errors. Use Plugins → WeatherFlow → Restart UDP Listener to retry without reloading the plugin.
sea_level_pressure, cloud_base, freezing_level are missing
- Set Altitude (m) to a non-zero value in the Tempest device configuration.
sensor_status shows all sensors failed
- This is a known reporting quirk in some Tempest firmware versions where the raw hardware register value is broadcast before the sensor self-test completes. The plugin detects this pattern and displays OK instead. If only a subset of sensors are listed as failed, that is a genuine fault.
Debug logging
- Set Indigo Log Level to Debugging Messages in Plugin Preferences for verbose output in the Event Log.
- The plugin log file is written independently to ~/Library/Application Support/Perceptive Automation/Indigo 2025.x/Logs/. Set File Log Level to Detailed Debugging Messages for maximum detail.
This plugin is built on several excellent open-source libraries bundled within the plugin package:
by Nathan Spencer (@natekspencer)
The core UDP library that handles all communication with the WeatherFlow hub. It provides an event-based asynchronous interface, parses every WeatherFlow message type (observations, rapid wind, lightning strikes, rain events, device status), and exposes sensor values as typed properties with full unit support.
All derived meteorological calculations in the plugin — dew point, wet bulb temperature, heat index, feels-like temperature, vapour pressure, air density, sea-level pressure, cloud base, and freezing level — are provided by this library.
Licensed under MIT. If you find it useful, consider supporting Nathan on Ko-fi.
Physical quantity handling with units. All sensor values from pyweatherflowudp carry their native unit (e.g. metres per second, millibars) and are converted to the user's chosen display unit using Pint's unit registry. This ensures unit conversions are numerically correct and the original precision is preserved.
Psychrometric calculations used by pyweatherflowudp to derive wet bulb temperature and related humidity metrics from the raw sensor readings.
MIT — see LICENSE for details.
Developed by GlennNZ.