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:
- Server:
wss://mqtt.wxalerts.org/mqtt. Awss://address makes Node-RED connect over WebSocket with TLS. - Security: your Home Assistant username and password.
- 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.

