Smoke and CO alarm: egress lighting, unlock, and silencing the HVAC
When any interconnected alarm sounds, the house lights the egress path to 100 %, unlocks the front door, opens the garage, stops the HVAC fan and silences the boiler — in that order, all within 4 seconds, and independently of any cloud service.
# HearthNodes recipe 25 - smoke and CO egress
alias: "Safety - smoke and CO egress sequence"
id: hn_safety_smoke_co_egress
description: "Egress lighting, unlock, garage, HVAC off, all within 4 seconds"
mode: single
max_exceeded: queued
trigger:
- platform: state
entity_id: binary_sensor.smoke_alarm_any
to: "on"
id: smoke
- platform: state
entity_id: binary_sensor.co_alarm_any
to: "on"
id: co
variables:
egress_lights:
- light.egress_hall
- light.egress_stairs
- light.egress_landing
- light.porch
air_handling:
- climate.hvac_fan
- climate.boiler
condition:
- condition: template
value_template: "{{ is_state_attr(trigger.entity_id, 'sounder_active', true) }}"
- condition: state
entity_id: input_boolean.alarm_test_mode
state: "off"
action:
- service: light.turn_on
target:
entity_id: "{{ egress_lights }}"
data:
brightness_pct: 100
- service: lock.unlock
target:
entity_id: lock.front_door
- service: cover.open_cover
target:
entity_id: cover.garage
- service: climate.turn_off
target:
entity_id: "{{ air_handling }}"
- service: notify.all_devices
data:
title: >-
{{ 'SMOKE' if trigger.id == 'smoke' else 'CARBON MONOXIDE' }} alarm
message: >-
{{ trigger.entity_id }} on
{{ state_attr(trigger.entity_id, 'floor') }}.
Egress lit, front door unlocked, garage open, air handling stopped.
priority: high
- service: timer.start
target:
entity_id: timer.egress_relock
data:
duration: "00:10:00"
# Every stage runs on the LAN; nothing here needs a cloud service. The alarms'
# own 85 dB sounders and the interconnect wire are the safety device, and they
# keep working with the hub unpowered. Quarterly full test, weekly silent test.
Trigger · state
binary_sensor.smoke_alarm_any · binary_sensor.co_alarm_any
Any interconnected smoke or CO alarm changes to 'active'.
Step-by-step
- light.egress_*Light every egress zone to full, including the stairwell and the outside light over the front door; do this first, before anything else in the sequence.
turn_on · 100 % · all zones - lock.front_door · cover.garageUnlock the front door and open the garage — an egress path that requires a key is not an egress path.
unlock · open - climate.hvac_fan · climate.boilerStop the HVAC fan and the boiler, which is what prevents smoke and CO from being distributed through the house.
off - notify.all_devicesSend a high-priority notification naming the triggering sensor and its floor, but never rely on the notification as the primary alert.
send · priority high · which sensor · which floor
Light the path first, then everything else
In a smoke event, visibility is the limiting factor for escape, so the lighting action must be first in the sequence and must not depend on any condition other than the alarm itself. Order matters more than completeness here: a sequence that opens the garage in 10 seconds but lights the stairs in 40 has the order wrong.
Never let the smart layer be the alarm
Interconnected alarms with their own sounders are the safety device; the automation is an enhancement. If the hub is down, every alarm still sounds because the interconnect wire does not route through it. Verify this by cutting the hub's power during a test and confirming all units still sound.
Stop the air handling, not just the heating
A running HVAC fan distributes smoke into bedrooms faster than it would spread on its own. Stopping the fan is more important than stopping the boiler. If the system has a 'fireplace' or 'circulate' mode, make sure it cannot be re-enabled by a scene.
Hardware
| Model | Protocol | Link | Role in this chain |
|---|---|---|---|
| Z-Wave interconnected smoke and CO alarms | zwave |
wired | Mains-powered with battery backup and a Z-Wave radio; the interconnect wire is what makes all of them sound, not the smart layer. |
| Fail-secure smart lock with a mechanical override | zwave |
wired | Must unlock on power loss or on command; a lock that fails locked would trap people in a fire. |
| Garage door controller with a local radio | zwave |
wired | Opens on command even with the internet down, since the automation never leaves the LAN. |
When it fails
This recipe is designed to work with the hub offline: the alarm interconnect wire still sounds every unit, and the alarms' own 85 dB sounders are the primary alert. If the hub is unreachable, the egress lighting falls back to its own non-smart emergency circuit driven by a local relay. Nothing in this recipe depends on a cloud service, and a weekly test verifies the whole chain at 11:00 on Sundays with a silent flag set.