Community. Driven. Weather. Data. | Always Ad-Free | Developer FriendlyChecking statusDiscord
Become a supporter
Sign in
Home Assistant

MQTT topics

Your account's places, storm cells and feed status as retained MQTT topics, for Node-RED or any MQTT client.


The Home Assistant integration reads a small set of topics that belong to your account. Any MQTT client can read them too, so Node-RED, a script or a dashboard of your own gets the same storm cell alerts.

To get a login for your own client, open the Home Assistant card of your account, expand Advanced: create credentials manually, give it a name and press Create. Copy the username and password; the password is shown once. Each login counts as one Home Assistant instance on your Supporter plan, and can be revoked from the same card.

Connecting

URL wss://mqtt.wxalerts.org/mqtt
Host and port mqtt.wxalerts.org, 443
Transport MQTT over WebSocket, path /mqtt, TLS
Username The username from the card, starting ha-
Password The password shown when you created it
Topic prefix wxalerts/u/<username>/

The login can subscribe to your own prefix and to the public alert tree, wxalerts/nws/v1/#, described on the MQTT alerts feed page. Publishing is denied.

Use a client id that is unique to each client. Two clients sharing one will keep disconnecting each other.

Topics

Everything under your prefix is retained and published at QoS 1, so a client that subscribes gets the current state at once.

Topic Payload
wxalerts/u/<username>/places Your saved places
wxalerts/u/<username>/status Whether the server is running, refreshed every 120 seconds
wxalerts/u/<username>/storms/place/<place_id>/<storm_id> One storm cell threatening one place

Subscribe to everything with wxalerts/u/<username>/#, or only storm cells with wxalerts/u/<username>/storms/place/+/+.

places

A list of the places on your account. id is a string and matches the <place_id> in the storm topics. same is the county code, when the place has one.

[
  { "id": "412", "name": "Home", "lat": 30.6327, "lon": -87.0397, "same": "012113" },
  { "id": "418", "name": "Cabin", "lat": 34.8712, "lon": -85.5091, "same": "013083" }
]

status

{ "online": true, "updated_at": "2026-11-08T21:14:00Z" }

If updated_at is more than a few minutes old, or online is false, treat the storm topics as stale rather than as an all clear.

storms

One retained message per storm cell per place. An empty retained message on the same topic means the cell no longer threatens that place, so delete it on your side.

{
  "storm_id": "781234",
  "kind": "cell",
  "place_id": "412",
  "place_name": "Home",
  "episode": "open",
  "eta_min": 18,
  "rung": 40,
  "rung_label": "Thunderstorm Risk",
  "hazards": ["hail", "wind"],
  "prob_severe": 46,
  "prob_tor": 3,
  "prob_hail": 38,
  "prob_wind": 22,
  "speed_kmh": 52.0,
  "bearing_deg": 64,
  "distance_km": 15.6,
  "issued_at": "2026-11-08T21:02:11Z",
  "updated_at": "2026-11-08T21:12:40Z"
}
Field Meaning
storm_id Stable id for the cell. A rotation has an id starting couplet-.
kind cell for a storm cell, couplet for a rotation.
episode open when it first threatens the place, escalate when the threat level rises, update for anything else.
eta_min Minutes to arrival. 0 when it has arrived, null when it is not moving.
rung, rung_label The threat level as a number and in words. Higher is worse.
hazards What the cell threatens, such as hail, wind or tornado.
prob_severe, prob_tor, prob_hail, prob_wind Probabilities in percent.
speed_kmh, bearing_deg Motion, toward a compass bearing.
distance_km Distance from the place.
issued_at, updated_at When the episode began and when it was last refreshed.

Alert on open and escalate. An update is the same storm with new numbers.

Node-RED

Add an mqtt in node and a new broker config:

  1. Server: wss://mqtt.wxalerts.org/mqtt. A wss:// address makes Node-RED connect over WebSocket with TLS.
  2. Security: your Home Assistant username and password.
  3. Back on the node, Topic: wxalerts/u/<username>/storms/place/+/+, QoS 1, Output: a parsed JSON object.

Follow it with a switch node on msg.payload.episode that passes open and escalate.

An empty payload (the storm has cleared) arrives as an empty string, so check for it before reading fields.

May we use Microsoft Clarity to see how pages are used (clicks, scrolling and replays of a visit, with anything you type hidden), plus a random ID linking that to crash reports? Only to find bugs and confusing screens. Never advertising, never sold.