Tempest
The WeatherFlow Tempest is a consumer all-in-one weather station that reports through the vendor’s cloud. The adapter reads WeatherFlow’s REST observation endpoint and normalizes the latest observation into a wire document.
Configuration
Section titled “Configuration”vendor: "tempest" selects this adapter. The entry is validated by
tempestStationConfigSchema, exported from @azohra/meteo.station/server.
| Field | Type | Meaning |
|---|---|---|
id | string, required | Your feed-local station id, the value ?station= and primaryStationId name. |
name | string, required | The display name carried on the wire. |
stationId | positive integer, required | The WeatherFlow station id, which is the number in tempestwx.com/station/<id>. |
token | string, required | A WeatherFlow personal access token, created in the Tempest app or at tempestwx.com. Sent as the token query parameter. |
latitude, longitude, elevationM | numbers, optional | Position claims used only as fallbacks. When the observation payload carries elevation, latitude, or longitude, the payload’s values win. |
timeZone | IANA zone, optional | Carried on the wire for display. Observations are epoch-stamped, so parsing does not need it. |
pageUrl | http(s) URL, optional | Overrides the default https://tempestwx.com/station/<stationId>. |
Capabilities
Section titled “Capabilities”{ gustLull: true, temperature: true, conditions: true, history: false }.
live and battery are undeclared. On the wire, an undeclared capability
key reads as false
(evolution rules).
The hardware carries the full sensor suite, so gust/lull, temperature, and
the extended conditions block are always declared. History is declared
false because the REST observations endpoint serves only the latest
observation. The adapter reports only what this endpoint carries, so
history is null on every document. samplingWindowSeconds and
recommendedPollSeconds are both 60.
What your hardware shows maps these declarations to your page’s surfaces.
The wire contract’s conditions block is
WeatherFlow-shaped, and this
adapter is the one that fills every field of it.
Endpoint and the token-free cache key
Section titled “Endpoint and the token-free cache key”GET https://swd.weatherflow.com/swd/rest/observations/station/<stationId>?token=….
The observationsUrl direct-adapter option overrides the base URL, for
tests and proxies.
Responses cache for 60 seconds under the key tempest/<stationId>. The
token is left out of the key so the credential does not land in a shared
cache. Multi-tenant hosts should read
the cache trust model.
What the adapter guards
Section titled “What the adapter guards”- The response’s
station_idmust match the configured station. A response for another station throws rather than serving someone else’s wind. - The first
obsentry is the observation. A response without one throws. - Wind speeds are validated as plausible m/s (0–140), since the vendor’s
units are already SI. Direction is validated 0–360 and normalized, and a
calm reading carries a null direction.
wind_lullis nullable. preciparrives as mm/min and is converted (×60) toprecipitationRateMmPerHour.- The lightning last-strike epoch becomes an ISO instant. Strike distance (km) and the one-hour strike count must be non-negative, and the count must be an integer.
relative_humiditymust be 0–100 andsea_level_pressurepositive. Solar radiation and UV must be non-negative.pressure_trendmust be one offalling,rising,steady,unknown.- Latitude and longitude from the payload are range-checked. A longitude of exactly 180 normalizes to −180.
- Every conditions field is nullable. A null from the vendor travels as null rather than zero.
import { createStationFeedHandler } from "@azohra/meteo.station/server";
const handler = createStationFeedHandler({ stations: [ { vendor: "tempest", id: "meadow", name: "Ridge Meadow", stationId: 12345, token: process.env.TEMPEST_TOKEN!, // a WeatherFlow personal access token }, ],});
export default { fetch: handler };Where next
Section titled “Where next”To render the station, getting started § 2 mounts the card against your feed, in React or as custom elements, and theming matches it to your site.