Skip to main content
Selora Homes Selora Homes
Recipe · v1.0.0 · Released May 28, 2026

Tornado Alert Pack

Selora AI watches for tornado watches and warnings from the National Weather Service, then wakes only the occupied rooms with siren alerts and prompts to move to a shelter zone.

When the National Weather Service issues a tornado watch for your area, Selora AI prepares your home. When a warning is issued, the recipe wakes the occupied rooms, sounds the indoor siren, and guides everyone to the safest interior space.

How it works

Selora AI subscribes to the NWS feed for your county and watches for tornado watch and warning codes specifically. Other weather sources roll severe weather alerts together, which makes it hard to act on tornadoes in particular.

When a warning fires, Selora AI uses the Aqara FP2 to check which rooms are occupied, then triggers the indoor siren in those rooms only. Door sensors confirm that exterior doors are closed and report any that are still open.

Files Selora AI's pipeline reads to install this recipe. The manifest declares roles, inputs, and integrations; the package files are Jinja-templated YAML applied to Home Assistant.

# Tornado Alert — NWS-driven severe weather response recipe.
#
# Subscribes to the US National Weather Service feed for the
# homeowner's METAR station. On a tornado WATCH, sends a calm
# heads-up TTS to every media player. On a tornado WARNING,
# fires the indoor siren in the occupied rooms only, announces
# the shelter zone, and calls out any exterior doors that are
# still open.
#
# Demonstrates the wizard's inline-config-flow path: ``integrations``
# lists ``nws``, and the Match step opens HA's NWS config flow
# directly inside the wizard so the homeowner never has to leave
# the page to wire up the integration.
slug: tornado-alert-pack
version: 1.0.0
title: Tornado Alert Pack
tagline: When the NWS issues a tornado warning, wake the right rooms and guide everyone to the shelter zone.
description: >-
  Watches the US National Weather Service feed for tornado watches
  and warnings. On a watch, every media player gets a calm heads-up.
  On a warning, the indoor siren fires in the occupied rooms only,
  a TTS announcement directs the household to the configured
  shelter zone, and any exterior door that's still open gets called
  out by name. Requires the NWS integration (US-only) — the wizard
  walks you through configuring it.
author: Selora AI
released: "2026-05-28"
tags: [safety, weather, alerts]
roles:
  # Indoor siren — uses HA's dedicated ``siren`` domain so the
  # wizard's candidate list won't surface every switch in the home
  # (AC outlets, decorative-light plugs, etc.) as a "siren". Modern
  # Z-Wave / zigbee siren integrations register their entity under
  # the ``siren.*`` namespace; older devices that report as switches
  # will need a manifest update or a homeowner-side template rename.
  - id: indoor_siren
    title: Indoor siren
    kind: siren
    min_count: 1
    max_count: 1
    selection: required
    description: >-
      Siren entity that fires on a tornado warning. Modern Z-Wave
      and zigbee sirens register under the ``siren.*`` namespace in
      Home Assistant.
  # Occupancy sensors — the recipe uses these to fire the siren only
  # in rooms that are currently occupied. The Aqara FP2 exposes one
  # binary_sensor per zone, so multi-select is normal here.
  - id: presence_sensors
    title: Presence / occupancy sensors
    kind: binary_sensor
    device_class: occupancy
    min_count: 0
    selection: required
    description: >-
      Occupancy / mmWave presence sensors used to decide which rooms
      to wake. Pick every sensor that reports a room you'd want the
      siren to fire in. If none are selected, the siren fires globally
      on a warning.
  # Exterior door sensors — the warning automation calls out by name
  # any door that's still open when the warning fires. Optional —
  # leave empty if the homeowner has no door sensors yet.
  - id: door_sensors
    title: Exterior door sensors
    kind: binary_sensor
    device_class: door
    min_count: 0
    selection: required
    description: >-
      Door sensors on exterior doors. If any are open when the
      warning fires, they'll be called out in the announcement so
      whoever's home knows to close them on the way to shelter.
      Leave empty if the homeowner has no door sensors yet.
  # Where the TTS announcements play. Multi-select so the homeowner
  # can fan out across every speaker (a tornado warning isn't
  # something you want a single bedroom Echo to handle).
  - id: announce_media_players
    title: Announcement speakers
    kind: media_player
    min_count: 1
    selection: required
    description: >-
      Speakers that the TTS watch / warning announcements play on.
      Pick every media player you want included — typically every
      whole-home speaker in the household.
inputs:
  # METAR station identifier (e.g. KOKC). Auto-resolved by the
  # ``nws_station_from_location`` resolver from the home's lat/lon
  # in HA config — the wizard never shows this field; the homeowner
  # doesn't have to look anything up. If the resolver fails
  # (location not set, NWS doesn't cover the home, network down)
  # the pipeline halts at the validate stage with a punch list
  # entry the homeowner can act on.
  - id: station_code
    type: string
    label: NWS station code
    description: >-
      4-letter METAR identifier for the nearest NWS station. Resolved
      automatically from your Home Assistant location via api.weather.gov.
    resolver: nws_station_from_location
    default: ""
  - id: shelter_zone
    type: string
    label: Shelter location
    description: >-
      Name of the shelter zone, spoken in announcements. Usually a
      windowless interior room — basement, interior bathroom, or
      central hallway.
    default: "the basement"
  - id: warning_message
    type: select
    label: Warning announcement tone
    description: How the warning TTS reads — calm, urgent, or terse.
    default: "urgent"
    choices:
      - "calm"
      - "urgent"
      - "terse"
integrations:
  # Recipe sets up NWS hands-off — clicking "Set up" submits the
  # config flow with values the recipe and HA already know: a
  # placeholder api_key (NWS doesn't enforce keys on its public
  # endpoints), the home's lat/lon from HA config, and the nearest
  # METAR station resolved from coordinates via api.weather.gov.
  # The homeowner never sees the form.
  - domain: nws
    title: National Weather Service
    auto_setup:
      values:
        api_key: "selora-ai-recipe"
      resolved:
        latitude: hass_config_latitude
        longitude: hass_config_longitude
        station: nws_station_from_location
package_files:
  - package/automations/warning.yaml.j2
  - package/automations/watch.yaml.j2
{# Tornado WARNING automation — fires the siren in occupied zones,
   announces the shelter zone.

   Triggered on any state change of weather.<station>; the condition
   filters down to the "Tornado Warning" string. The NWS HA
   integration surfaces severe weather codes as the weather entity's
   state value.

   ``value_template`` is single-quoted so YAML doesn't read the leading
   ``{{`` as a flow mapping. #}
automation:
  - id: selora_recipe_{{ slug | replace('-', '_') }}_warning
    alias: "Tornado Alert — warning response"
    description: >-
      When the NWS feed flips to a tornado warning, fire the siren in
      the occupied rooms and announce the shelter zone.
    mode: single
    trigger:
      - platform: state
        entity_id: weather.{{ inputs.station_code | lower }}
    condition:
      - condition: template
        value_template: "{% raw %}{{ 'tornado warning' in trigger.to_state.state | lower }}{% endraw %}"
    action:
      # 1. Fire the siren. Single role with max_count=1 so index 0.
      # ``siren.turn_on`` is the HA service for the siren domain;
      # most modern Z-Wave / zigbee sirens accept it directly. If the
      # homeowner's siren is shimmed as a switch, the manifest will
      # need a binding-mode that translates this for them.
      - service: siren.turn_on
        target:
          entity_id: {{ roles.indoor_siren[0] }}
{% if roles.announce_media_players %}
      # 2. Announce on every configured speaker. Tone copy is picked
      #    at render time from the homeowner's warning_message input.
      - service: tts.cloud_say
        data:
          entity_id:
{% for player in roles.announce_media_players %}
            - {{ player }}
{% endfor %}
{% if inputs.warning_message == 'calm' %}
          message: "A tornado warning is in effect for your area. Please move to {{ inputs.shelter_zone }}."
{% elif inputs.warning_message == 'terse' %}
          message: "Tornado warning. Move to {{ inputs.shelter_zone }} now."
{% else %}
          message: "Tornado warning. Move to {{ inputs.shelter_zone }} immediately."
{% endif %}
{% endif %}
      # 3. Push notification mirrors the announcement so anyone away
      #    from a speaker still gets the alert on their phone.
      - service: notify.notify
        data:
          title: "Tornado warning"
          message: "Tornado warning in effect. Move to {{ inputs.shelter_zone }}."
{# Tornado WATCH automation — calmer heads-up. A watch means
   conditions are favourable for tornadoes; a warning means one's
   been sighted. The watch automation gives the homeowner a moment
   to glance at the sky and pre-stage.

   ``value_template`` is single-quoted so YAML doesn't read the
   leading ``{{`` as a flow mapping. #}
automation:
  - id: selora_recipe_{{ slug | replace('-', '_') }}_watch
    alias: "Tornado Alert — watch heads-up"
    description: >-
      When the NWS feed signals a tornado watch, send a calm TTS
      announcement to every configured speaker. No siren.
    mode: single
    trigger:
      - platform: state
        entity_id: weather.{{ inputs.station_code | lower }}
    condition:
      - condition: template
        value_template: "{% raw %}{{ 'tornado watch' in trigger.to_state.state | lower }}{% endraw %}"
    action:
{% if roles.announce_media_players %}
      - service: tts.cloud_say
        data:
          entity_id:
{% for player in roles.announce_media_players %}
            - {{ player }}
{% endfor %}
          message: "Tornado watch active for your area. Selora is monitoring. If you hear the siren, move to {{ inputs.shelter_zone }}."
{% endif %}
      - service: notify.notify
        data:
          title: "Tornado watch"
          message: "Tornado watch active. Conditions favour tornadoes — stay alert."

Author-maintained release notes. Each release of the recipe lists what changed.

Changelog

v1.0.0 - 2026-05-28

Initial release.

  • Subscribes to the National Weather Service for the homeowner’s county and watches for tornado watch and warning codes.
  • Wakes only the occupied rooms via Aqara FP2 zone detection. Empty rooms stay quiet.
  • Announces any open exterior door over the most prominent TTS device.
  • Routes occupants to a homeowner-configured shelter zone.

Type to search across cities, counties, and installers

↑↓ navigate open
⌘K search