tempest · git:20260826.2619ba3 · 2026-08-26 · sha256 3ee34aa5242260f2

tempest git:20260826.2619ba3A

Immutable. This exact content is served forever at /api/v1/blob/3ee34aa5242260f2.

---
name: tempest
description: 'Query hyper-local weather from a WeatherFlow Tempest station: current
  conditions, 7-day forecast, historical observations, and real-time UDP broadcasts.
  Use when the user asks about the weather, temperature, rain, wind, humidity, forecast,
  or wants conditions from their own station rather than a generic weather service.'
license: MIT
compatibility: Requires TEMPEST_TOKEN env var (free from weatherflow.com), Python
  3.8+, and the `requests` library.
metadata:
  tags: weather, tempest, forecast, weatherflow, station, hyper-local
  sources: https://weatherflow.com, https://swd.weatherflow.com/swd/rest
---

# tempest — Hyper-Local Weather from Your Tempest Station

Query live weather data from a WeatherFlow Tempest station. Supports REST API access to current conditions, forecasts, and history via the cloud, plus local UDP broadcast reception from your hub on the same LAN.

## Setup

1. Get a personal access token at [weatherflow.com](https://weatherflow.com) (Account → API Tokens)
2. Set it in your environment:

```bash
export TEMPEST_TOKEN="your-token-here"
```

The CLI reads `TEMPEST_TOKEN` from the environment. It also falls back to reading `~/.tempest.env` if the env var is not set (for agent subprocesses that don't inherit env vars). `--help` and `--dry-run` work without a token.

## Essential Commands

### current — Current conditions

```bash
tempest current                                             # human-readable
tempest current --station-id 12345 --device-id 67890        # specific hardware
tempest current --json                                      # machine-readable
```

If you have one station, it auto-selects it and picks the best sensor (ST > SKY > AIR, skips the HB hub). Pass `--station-id` or `--device-id` to override.

### forecast — Multi-day forecast (+ current conditions + hourly)

```bash
tempest forecast                        # current + 5-day daily + 12-hour hourly
tempest forecast --days 3               # fewer days
tempest forecast --station-id 12345     # specific station
tempest forecast --json                 # machine-readable
```

### stations — List your stations and devices

```bash
tempest stations                    # shows station names, IDs, device types, serials
tempest stations --json             # full device inventory
```

Use this first if you don't know your station ID or want to see what sensors are online.

### obs — Historical observations

```bash
tempest obs --device-id 67890 --days 1       # last 24 hours
tempest obs --device-id 67890 --days 7       # last week
tempest obs --device-id 67890 --json         # machine-readable
```

### udp listen — Real-time broadcasts from the hub

```bash
tempest udp listen                          # listen indefinitely (Ctrl-C to stop)
tempest udp listen --timeout 30             # auto-stop after 30s
tempest udp listen --show-all               # include hub_status messages
```

Requires being on the same LAN as the hub (port 50222 UDP broadcast). Receives observations, rapid wind updates, lightning strike events, and precipitation start events in real time.

## Data Reference

### obs_st field layout (Tempest all-in-one)

Observations from the Tempest sensor arrive as positional arrays. The CLI decodes them, but if you're reading raw JSON output, this map tells you what each index means:

| Index | Field | Units | Notes |
|-------|-------|-------|-------|
| 0 | epoch | seconds UTC | |
| 1 | wind_lull | m/s | Minimum 3-second sample |
| 2 | wind_avg | m/s | Average over report interval |
| 3 | wind_gust | m/s | Maximum 3-second sample |
| 4 | wind_direction | degrees | 0=N |
| 5 | wind_sample_interval | seconds | |
| 6 | station_pressure | MB | |
| 7 | air_temperature | C | CLI converts to °F |
| 8 | relative_humidity | % | |
| 9 | illuminance | lux | |
| 10 | uv | index | |
| 11 | solar_radiation | W/m² | |
| 12 | rain_accumulation | mm | Over last interval |
| 13 | precipitation_type | enum | 0=none 1=rain 2=hail |
| 14 | avg_strike_distance | km | Lightning |
| 15 | strike_count | count | Lightning |
| 16 | battery | volts | ~2.6V normal, ~2.5V low |
| 17 | report_interval | minutes | |
| 18 | local_day_rain_accumulation | mm | |

See [references/tempest-api-field-layouts.md](references/tempest-api-field-layouts.md) for the full obs_air and obs_sky field layouts.

### Unit conversions the CLI applies

| Input | Output | Conversion |
|-------|--------|------------|
| °C | °F | `c * 9/5 + 32` |
| m/s | mph | `mps * 2.237` |
| MB | inHg | `mb * 0.02953` |
| mm | in | `mm / 25.4` |
| degrees | cardinal | N, NNE, NE, ..., NNW |

## Known Gotchas

### The API is metric-native

All raw observation data comes in metric (Celsius, m/s, MB, mm). The CLI converts for human display. If you're parsing raw `--json` output, expect metric values. The `better_forecast` endpoint returns unit-converted values based on station preferences — check the `units` key in the response — but **temperatures are always in Celsius** regardless.

### Timestamps are epoch integers, not strings

The API returns Unix epoch timestamps, not ISO 8601 strings. The `daily[].day_start_local` field is an `int`, not `"2026-05-10T00:00:00"`. Hourly objects have `local_hour` (int 0-23) and `local_day` (int) — there is **no** `local_time` or `time_string` field. The CLI handles this, but raw JSON consumers need to convert with `datetime.fromtimestamp(ts)`.

### Nested forecast response

The `better_forecast` endpoint nests daily and hourly arrays under a `forecast` wrapper key, not at the top level:

```python
# Correct path:
fc = data.get("forecast", {})
days = fc.get("daily", [])
hours = fc.get("hourly", [])
```

The top-level keys are: `current_conditions` (dict), `forecast` (dict with `daily` + `hourly`), `station` (metadata), `units`, `status`, `timezone`.

### Device type filtering

A station returns all devices including the hub (device_type `HB`). The hub cannot serve observations. The CLI auto-filters HB devices and prefers ST > SKY > AIR. If you're bypassing the CLI and calling the API directly, always filter out device_type `HB` before querying observation endpoints.

### Global flags in any position

`--json`, `--dry-run`, `--quiet`, and `--verbose` work anywhere in the command:

```bash
tempest --json current --device-id 67890        # flag before subcommand
tempest current --device-id 67890 --json         # flag after subcommand
```

## References

- [references/tempest-api-field-layouts.md](references/tempest-api-field-layouts.md) — Full field index maps for obs_st, obs_air, and obs_sky observation arrays. Read when decoding raw JSON output or building on top of the Tempest API.
- [scripts/tempest](scripts/tempest) — The CLI binary itself. Designed following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, idempotent, dual-output via `emit()`, and structured logging.

## When not to use

Do not use this skill for weather questions that do not involve a personal WeatherFlow station (a public forecast service serves those better), for aviation METAR/TAF data, or for hardware from other vendors — every endpoint here requires a Tempest account token and talks to WeatherFlow's consumer API.