| 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.8 released on June 18, 2026 |
| Release downloaded: | 7 times |
| Requires: | Indigo v2023.2.0 or higher |
| (Check the Releases tab below for older releases that may have different requirements) | |
| Download release v2.5.0 |

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.8 | Requires Indigo v2023.2.0+ | Released June 18, 2026 | Fix Public Tempest Station ignoring unit preferences (always showed metric); fix `last_strike_distan |
| Released on: | June 18, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 7 times |
| Download this release | |

Released: 2026-06-08 Minimum Indigo version: 2025.2

Fixes three separate bugs that caused last_strike_distance and last_strike_time to remain empty or stale during active thunderstorms.
Fixes Public Tempest Station unit conversion — temperature, wind, pressure, and rain states were always displayed in metric regardless of device configuration.
Also adds a Distance Display unit preference (km / mi) to Tempest, Sky, and Air device configuration.
NB: Lightning states are very confusing (at least to me) Check the Wiki for information

last_strike_distance gated behind include_standard (web API path)Root cause: The web API field lightning_strike_last_distance was only read inside the include_standard block. That block only runs when UDP observations are inactive (stale / web-only mode). With a working UDP device, evt_strike UDP packets are supposed to keep last_strike_distance current — but evt_strike is a separate UDP event that can be silently lost even when normal obs_st observations are flowing normally. When that happens, the state never updates from either path and stays permanently empty.
Fix: Moved last_strike_distance to the always-runs section of _build_web_observation_states, identical to where lightning_count_last_1hr / lightning_count_last_3hr already sit. It now refreshes on every web poll regardless of whether UDP is active.
last_strike_time had no web source at allRoot cause: The WeatherFlow REST API provides lightning_strike_last_epoch — a Unix timestamp of the most recent strike — in every observation response. The plugin never read this field. last_strike_time could only ever be populated by UDP evt_strike packets. If those don't arrive (see bug 1), the state stays permanently empty with no fallback.
Fix: Added lightning_strike_last_epoch → last_strike_time extraction in the always-runs section, converting the Unix epoch to a UTC datetime string.
Root cause: The _on_strike handler emitted its summary at DEBUG level. In normal (non-debug) operation, there was no log evidence that evt_strike UDP packets were arriving at all, making it impossible to distinguish "strikes are happening but states aren't updating" from "no strike packets are arriving."
Fix: Promoted to INFO — every UDP strike now logs distance=X energy=Y at INFO level.

Root cause: _build_public_obs_states assumed the observations/station/{id} API would honour unit query parameters (units_temp=f, units_wind=mph, etc.) and return values already in the user's preferred units. In practice the endpoint returns metric values regardless of what unit parameters are sent — meaning a Public Station configured for Fahrenheit, mph, and inches still displayed °C, m/s, and mm.
Fix: Aligned the Public Tempest Station path with how personal stations have always worked:
| Before | After | |
|---|---|---|
| API fetch | Dynamic unit params sent, API expected to convert | Always requests metric (units_temp=c, units_wind=mps, units_pressure=mb, units_precip=mm, units_distance=km) |
| Conversion | Assumed done by API; values written as-is | Plugin converts via _add_u / Pint — identical to _build_web_observation_states |
last_strike_distance |
Hardcoded km symbol |
_add_u with "distance" category — converts to km or mi per device setting |
Affected states (now correctly converted):
| State | API field | Metric unit in | Converts to |
|---|---|---|---|
air_temperature |
air_temperature |
°C | °C or °F |
dew_point_temperature |
dew_point |
°C | °C or °F |
wet_bulb_temperature |
wet_bulb_temperature |
°C | °C or °F |
feels_like_temperature |
feels_like |
°C | °C or °F |
heat_index |
heat_index |
°C | °C or °F |
wind_chill_temperature |
wind_chill |
°C | °C or °F |
delta_t |
delta_t |
Δ°C | Δ°C or Δ°F |
station_pressure |
station_pressure |
hPa | hPa, mmHg, or inHg |
sea_level_pressure |
sea_level_pressure |
hPa | hPa, mmHg, or inHg |
wind_average / wind_speed |
wind_avg |
m/s | m/s, km/h, kn, or mph |
wind_gust |
wind_gust |
m/s | m/s, km/h, kn, or mph |
wind_lull |
wind_lull |
m/s | m/s, km/h, kn, or mph |
rain_today |
precip_accum_local_day |
mm | mm or in |
rain_yesterday |
precip_accum_local_yesterday |
mm | mm or in |
rain_last_1hr |
precip_accum_last_1hr |
mm | mm or in |
last_strike_distance |
lightning_strike_last_distance |
km | km or mi |
Fixed-unit states (UV, solar radiation, illuminance, relative humidity, elevation, air density) are unchanged.
Existing devices: No configuration changes required. Values will now display in whatever units are set in Edit Device — if you've had the device configured for Fahrenheit/mph/inches all along, they will now correctly show those units after the plugin reloads.

Problem: last_strike_distance and lightning_strike_average_distance were always displayed in kilometres, regardless of how the device was otherwise configured. The Public Tempest Station device type already had a Distance Display preference; Tempest, Sky, and Air did not.
Fix:
_get_unit_prefs() now reads distUnit from the device's saved properties (defaulting to "km" for existing devices).Existing devices default to km — no action required unless you want miles.

The WeatherFlow lightning sensor uses radio frequency detection to identify return strokes. Its data reaches the plugin through three separate pathways that update at different times and answer different questions — mixing them up is the source of most lightning-related confusion.

obs_st packet)| State | Typical value | What it means |
|---|---|---|
lightning_strike_count |
0 most of the time; 1–5+ during active storms | Number of strikes detected within the current 1-minute observation window. Resets to 0 at the start of every new observation. This is a window count, not a running total. |
lightning_strike_average_distance |
0 when no strikes; 1–40 during storms | Average distance (in your chosen unit) of all strikes within that same 1-minute window. Only meaningful when lightning_strike_count > 0. Reads 0 whenever the count is zero — not the same as a strike at 0 km. |
lightning_strike_count = 0between strike-active minutes is completely normal. The sensor reports a fresh window count every minute; if no strike was detected in that minute, the count is 0. For "is there a storm right now?", uselightning_count_last_1hr(requires Web API token).
These states are written by two sources that now both feed the same states:
evt_strike packets arrive separately from observations and can occasionally be lost even when obs_st packets are flowing normally.lightning_strike_last_distance and lightning_strike_last_epoch are present in every observation response and now always update these states as a fallback.| State | Source | Typical value | What it means |
|---|---|---|---|
last_strike_distance |
UDP + Web† | Blank until first strike, then persists | Distance of the single most recent strike. Stays set after the storm ends — always read alongside last_strike_time to judge how recent it is. Blank if the sensor could not determine range (minimum reliable detection ~1 km; very close strikes may report null). |
last_strike_energy |
UDP only | Blank until first strike, then persists | A dimensionless relative intensity value from the sensor hardware. Not joules or watts — it's an internal metric roughly proportional to return-stroke intensity. Useful for comparing strikes within a storm; meaningless as an absolute number. Blank when the sensor reported null. |
last_strike_time |
UDP + Web† | Blank until first strike, then persists | UTC timestamp of the most recent detected strike. Persists until the next strike — use this to determine whether last_strike_distance is from a current storm or a storm days ago. |
† Web API fallback requires a valid API token in Plugin Preferences. Without a token, these states are only populated by UDP
evt_strikepackets.
Requires a valid API token. These are quality-controlled by the WeatherFlow cloud.
| State | Typical value | What it means |
|---|---|---|
lightning_count_last_1hr |
0 most of the time; accumulates during storms | Count of all strikes in the rolling last 60 minutes. The most reliable indicator of current storm activity. Use this in triggers: "if lightning_count_last_1hr > 0". |
lightning_count_last_3hr |
0 most of the time; higher during extended activity | 3-hour rolling window. Useful for tracking an approaching or receding storm system. |
| Question | State to use |
|---|---|
| Is there lightning happening right now? | lightning_count_last_1hr > 0 |
| How far away was the most recent strike? | last_strike_distance (with last_strike_time to confirm it's current) |
| How many strikes were in the last minute? | lightning_strike_count |
| How close is the storm on average? | lightning_strike_average_distance (when lightning_strike_count > 0) |
| How intense was the last strike? | last_strike_energy (relative comparison only) |
| Is the storm getting closer or moving away? | Compare lightning_count_last_1hr vs lightning_count_last_3hr |

last_strike_distance, last_strike_time) now populate from the web API even when UDP strike events are not arriving — requires an API token.| Released on: | June 4, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 4 times |
| Download this release | |

Released: 2026-06-04 Minimum Indigo version: 2025.2

Completes the unit-label cleanup started in 2.5.6. The Conditions menu (used when adding conditions to Triggers and Schedules) no longer shows hardcoded metric unit annotations alongside state names.

ControlPageLabelBackground: Indigo uses two separate label fields in Devices.xml:
| Field | Used by |
|---|---|
TriggerLabel |
Triggers tab — state picker when creating a trigger based on a device state change |
ControlPageLabel |
Conditions tab — state picker when adding an "if device" condition to a Trigger or Schedule |
Release 2.5.6 removed hardcoded metric units from TriggerLabel but did not touch ControlPageLabel. As a result, the Conditions tab still showed entries like "Air Temp °C", "Wind Speed m/s", "Pressure mbar" regardless of the device's unit setting.
Fix: Removed the hardcoded unit suffix from all variable-unit ControlPageLabel entries across the Tempest, Sky, Air, and Public Station device blocks.
Examples:
| Before | After |
|---|---|
Air Temp °C |
Air Temp |
Wind Speed m/s |
Wind Speed |
Pressure mbar |
Pressure |
SLP mbar |
Sea Level Pressure |
Vapor Press mbar |
Vapor Pressure |
Rain Accum mm |
Rain Accum |
Rain Rate mm/h |
Rain Rate |
Lightning Dist km |
Lightning Dist |
Last Strike km |
Last Strike Dist |
Wind Avg m/s |
Wind Avg |
Wind Gust m/s |
Wind Gust |
Wind Lull m/s |
Wind Lull |
Heat Index °C |
Heat Index |
Delta T °C |
Delta T |
Fixed-unit labels (%, W/m², lx, UV, V, dBm, °) are unchanged. Existing conditions and triggers continue to work without modification.

| v2.5.6 | Requires Indigo v2023.2.0+ | Released June 3, 2026 | Heat index and wind chill show blank (not 0) when conditions are not met; trigger/condition menus no |
| Released on: | June 3, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 4 times |
| Download this release | |

Released: 2026-06-03 Minimum Indigo version: 2025.2

heat_index and wind_chill_temperature now show blank when conditions are not met. Trigger/condition menus no longer show hardcoded °C, mbar, m/s, or mm unit labels.

pyweatherflowudp returns None for these states when conditions are outside the calculation range:
| State | Returns None when |
|---|---|
heat_index |
temperature < 80 °F or relative humidity < 40 % |
wind_chill_temperature |
temperature > 50 °F or wind speed < 3 mph |
Previously, when the value was None the plugin skipped writing the state entirely — leaving whatever value was last recorded. This meant a stale reading persisted indefinitely, and a unit preference change (e.g. Celsius → Fahrenheit) would never be reflected until conditions happened to come back into range.
The plugin now always writes the state when None is received, storing None as the value with a blank display string:
| Situation | value |
Display |
|---|---|---|
| Conditions met — valid reading | 95.3 |
95.3 °F |
Conditions not met — None returned |
None |
(blank) |
The None write is immediate — no stale value lingers after a weather change or unit preference update. Because these states are not typically used in numeric triggers, the None value is appropriate; the blank display clearly communicates "not applicable" rather than a misleading 0.
The Indigo trigger and condition UI shows the state's TriggerLabel from Devices.xml in the state picker dropdown. These labels were annotated with hardcoded metric units — (°C), (mbar), (m/s), (mm) — regardless of the device's actual unit setting. A device set to Fahrenheit would show "Air Temperature (°C)" in the trigger dropdown, creating confusion about what unit to enter for the comparison threshold.
The unit suffix has been removed from all variable-unit TriggerLabel entries across the Tempest, Sky, Air, and Public Station device blocks. Fixed-unit labels (%, W/m², lx, UV, V, dBm, °) are unchanged.
Examples:
| Before | After |
|---|---|
Air Temperature (°C) |
Air Temperature |
Wind Speed (m/s) |
Wind Speed |
Station Pressure (mbar) |
Station Pressure |
Rain Rate (mm/h) |
Rain Rate |
Heat Index (°C) |
Heat Index |
Delta T (°C) |
Delta T |
The active unit is always visible in the state's current uiValue (e.g. 32.8 °F) and is also stored in the unit_temperature, unit_pressure, unit_wind, and unit_rain states.

TriggerLabel changes take effect after plugin reload — existing triggers continue to work unchanged.heat_index and wind_chill_temperature will show blank if conditions are not currently met, clearing any stale reading.| v2.5.5 | Requires Indigo v2023.2.0+ | Released May 31, 2026 | 2.5.5 Fix `delta_t` and `heat_index` ignoring temperature unit preference — both now correctly displ |
| Released on: | May 31, 2026 |
| Requires: | Indigo v2023.2.0+ |
| Downloaded: | 22 times |
| Download this release | |

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

Rain accumulation is now cleanly separated into two independent tracks. The web API provides rain-check corrected daily totals in rain_today / rain_yesterday. The device provides raw local totals in rain_today_local / rain_yesterday_local. Neither track can corrupt the other.

Background: Two independent paths were writing to the same rain_today state:
Precipitation Failed appears in sensor_status).precip_accum_local_day from WeatherFlow, which is always rain-check corrected and typically the more accurate total.With both paths writing rain_today, the state alternated every ~60 seconds between the raw local value and the web value. In power-save mode this was especially visible: local showed "accumulated" while web showed a slightly different corrected total.
Additionally, the fallback accumulation used rain_today_raw_mm as its running baseline — the same state the web API wrote to. Each web poll would shift the baseline, causing the next per-minute delta to be added on top of a different starting point.
Fix — fully separated write ownership:
| State | Written by | Contains |
|---|---|---|
rain_today |
Web API only | Rain-check corrected daily total |
rain_today_raw_mm |
Web API only | Same, in raw mm |
rain_yesterday |
Web API only | Rain-check corrected yesterday total |
rain_today_local |
UDP only | Device daily total (not rain-check corrected) |
rain_today_local_raw_mm |
UDP only | Same, in raw mm — accumulation baseline |
rain_yesterday_local |
UDP only | Device yesterday total (captured at midnight) |
rain_today_source |
UDP only | "hub" or "accumulated" |
rain_today_source values:
| Value | Meaning |
|---|---|
hub |
Hub index 18 present — device's own authoritative daily counter |
accumulated |
Hub index 18 absent (power-save / sensor fault) — plugin accumulating per-minute values as fallback |
Web API is the primary source for most users. rain_today shows the rain-check corrected total and is the recommended state for automations. rain_today_local is available when you want the raw device value or need a value independent of web availability.
Midnight rollover: at midnight the plugin captures rain_today_local_raw_mm into rain_yesterday_local. The web API writes rain_yesterday from precip_accum_local_yesterday. Both yesterday states update independently.

rain_today and rain_yesterday now update only when the web API polls (~60 s). They no longer update every UDP observation. Existing automations using these states are unaffected — values are the same, just sourced exclusively from web.rain_today as a real-time per-minute counter, switch to rain_today_local for that use case.&&&&
Released: 2026-05-31 Minimum Indigo version: 2025.2

delta_t and heat_index now correctly honour the device temperature unit preference. Previously both states always displayed in Celsius regardless of whether the device was set to Fahrenheit.

delta_t temperature unit conversionProblem: delta_t (the difference between air temperature and wet-bulb temperature) was listed in _FIXED_SPECS with a hardcoded Δ°C label, so it never converted to Δ°F even when the device's temperature unit was set to Fahrenheit.
Fix: Moved delta_t out of _FIXED_SPECS and into the standard unit conversion pipeline:
| Temperature preference | Value | Display |
|---|---|---|
| Celsius | Raw Δ°C from pyweatherflowudp | 2.1 Δ°C |
| Fahrenheit | Δ°C × 1.8 (differential — no +32 offset) | 3.8 Δ°F |
The public station path also hardcoded Δ°C; that is corrected to match the device's temperature unit preference.
Why ×1.8 and not a Pint .to("degF") call?
delta_t is a temperature differential, not an absolute temperature. Converting Δ1 °C → Δ°F requires multiplying by 1.8. Using Pint's .to("degF") on a degC quantity would add the 32 °F offset, producing a wrong result. The manual factor of 1.8 avoids this.
heat_index stale Celsius when conditions are not metProblem: pyweatherflowudp returns None for heat_index when the temperature is below 80 °F or relative humidity is below 40 %. When that happens the plugin skips writing the state entirely, leaving whatever value was last written. If the user had previously been in Celsius mode and then switched to Fahrenheit while conditions were below the heat index threshold, the state would show the stale Celsius reading indefinitely.
Fix: When device.heat_index is None, the plugin now explicitly writes 0 with the correct unit symbol for the current temperature preference. This clears any stale reading.
| Condition | State written |
|---|---|
device.heat_index is a valid value |
Converted to °C or °F per preference |
device.heat_index is None (below threshold) |
0 °C or 0 °F — stale value cleared |

delta_t and heat_index will update with correctly converted values.delta_t had previously been showing Δ°C and you are set to Fahrenheit, it will now show Δ°F from the next UDP observation.heat_index will show 0 °F (or 0 °C) when conditions are not met, rather than the previous valid reading.| 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: | 20 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: | 19 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: | 17 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: | 20 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: | 17 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.