First Alert Smoke Detector and Carbon Monoxide Alarm Setup

@Turbo4door I’ve tried to reset them without any luck, unfortunately.

There is another thread about issues pairing with this device. Summary:

  1. Pair it as stated in the manual. It will go to sleep before finishing, and HA will report “initializing”.
  2. Pull the battery tray out, wait a few seconds. Push test button and keep depressed, insert battery tray. Release button immediately when the device beeps.
  3. Repeat step 2 until HA reports “sleeping” for the device. At this point, I only had a battery_level sensor.
  4. Restart HA. You should now see _alarm_level and _alarm_type sensors for this node.

Hope that helps.

8 Likes

Just got some of these, and have successfully ish set up the first one with HA. I got the node’s query stage to show as sleeping for a bit. However, when I would test the smoke detector, to confirm that the entity was changing as expected, it would change to a code of 12, but it would never change back. Anyone else see this behaviour?

Now after power cycling the smoke detector and restarting HA I am back to the initializing thing for some reason.

Yeah, they’re weird like that. That doesn’t matter if you’re using my binary sensor that I have listed above. It’s basically “your house is on fire” versus anything else.

McNutty195: However, when I would test the smoke detector, to confirm that the entity was changing as expected, it would change to a code of 12, but it would never change back.

These appear to not wake up often, so after the test it will sit about an hour then change back. At least… that’s what mine do in just a few tests. That’s my guess on waking up… when healing the network these may go a day and stay “initializing” but if I manually wake them up they chime in and the controller puts them back in “sleeping” mode.

It may hang in initializing after power-up for an extended time. Just do the “batteries out, test button, batteries in” maneuver so it wakes up and it should be put to sleep. Good luck… it’s amazing to me how differently these different devices behave.

Thanks for the reply. Yeah it isn’t really a big deal, just wondered if anyone else was seeing this behavior.

Understood. Yeah, can’t really say I’m a fan of Z-wave devices. They all seem to be really irritable and finiky. I have a z-wave lock and now these smoke alarms. Even the old door sensors I had for my smartthings system before HA were all this way.

They seem to work once you get them set up for the most part, but the initial setup seems to to always be pretty cumbersome.

1 Like

They’re in sleep mode almost the entire time. This was both for SmartThings and OpenZWave. Minus actual alerts or the test button, they rarely seem to send anything. I’ve also had to pop the batteries out and put them back in just to get the battery percentage to update. That being said, I’ve never had them fail to send an alert when I’ve tested them.

That’s good to know. Yeah, the sleep settings seem a little over zealous. Then again, changing batteries less is nice and aggressive sleep settings is about the only way to accomplish that without hardwiring something.

Is there a way to stop the sounding alarm (e.g. when it goes off during cooking) from HA?

1 Like

No, the alarm does not receive any commands like that.

I followed all the instructions here and have been able to get the smoke/co2 detector out of init and through dynamic. I also have the new states in lovelace.

However I in the Automations tab I only see Do something when battery level changes. I don’t see any alerts for the Co2 or Smoke.

How am I suppose to trigger events if the alerts don’t show up as triggers? I now have two of these devices connected to my zwave network.

Thanks!

You’ll have to write the automations out without using the device automation editor.

Thanks for the overview but do you know how to get the naming conventions correct? I assume most people are using this to send alerts when the fire or CO2 alerts are sent to HA.

I ended up calling mine smoke alarm 1 & smoke alarm 2 since when I paired them I wasn’t sure where I was putting them.

Since then I put one in my livinroom and one in my basement.

Here is the code for displaying the status of the detectors in the UI and for sending me notifications on an alarm if I’m not home.

sensor:
  platform: template
  sensors:
    basement_smoke_alarm_status:
      friendly_name: 'Basement Smoke Alarm Status'
      value_template: >-
        {% if is_state("sensor.smoke_co_alarm_1_alarm_level", "255") and is_state("sensor.smoke_co_alarm_1_alarm_type", "1")%}
          Smoke!
        {% elif is_state("sensor.smoke_co_alarm_1_alarm_level", "255") and is_state("sensor.smoke_co_alarm_1_alarm_type", "2")%}
          CO!
        {% elif is_state("sensor.smoke_co_alarm_1_alarm_level", "0") and is_state("sensor.smoke_co_alarm_1_alarm_type", "12")%}
          Testing
        {% else %}
          OK
        {% endif %}
      icon_template: >-
        {% if is_state("sensor.smoke_co_alarm_1_alarm_level", "255") and is_state("sensor.smoke_co_alarm_1_alarm_type", "1")%}
          mdi:fire
        {% elif is_state("sensor.smoke_co_alarm_1_alarm_level", "255") and is_state("sensor.smoke_co_alarm_1_alarm_type", "2")%}
          mdi:cloud-outline
        {% else %}
          mdi:smoke-detector
        {% endif %}
    livingroom_smoke_alarm_status:
      friendly_name: 'Livingroom Smoke Alarm Status'
      value_template: >-
        {% if is_state("sensor.smoke_co_alarm_2_alarm_level", "255") and is_state("sensor.smoke_co_alarm_2_alarm_type", "1")%}
          Smoke!
        {% elif is_state("sensor.smoke_co_alarm_2_alarm_level", "255") and is_state("sensor.smoke_co_alarm_2_alarm_type", "2")%}
          CO!
        {% elif is_state("sensor.smoke_co_alarm_2_alarm_level", "0") and is_state("sensor.smoke_co_alarm_2_alarm_type", "12")%}
          Testing
        {% else %}
          OK
        {% endif %}
      icon_template: >-
        {% if is_state("sensor.smoke_co_alarm_2_alarm_level", "255") and is_state("sensor.smoke_co_alarm_2_alarm_type", "1")%}
          mdi:fire
        {% elif is_state("sensor.smoke_co_alarm_2_alarm_level", "255") and is_state("sensor.smoke_co_alarm_2_alarm_type", "2")%}
          mdi:cloud-outline
        {% else %}
          mdi:smoke-detector
        {% endif %}
      
automation:
  - alias: Notification Smoke Alarm Basement
    initial_state: 'off'
    trigger:
      platform: template
      value_template: >
        {% if (is_state("sensor.smoke_co_alarm_1_alarm_level", "255") and is_state("sensor.smoke_co_alarm_1_alarm_type", "1")) 
           or (is_state("sensor.smoke_co_alarm_1_alarm_level", "255") and is_state("sensor.smoke_co_alarm_1_alarm_type", "2"))%}
          true
        {% else %}
          false
        {% endif %}
    action:
      - service: notify.pushbullet_notify
        data_template:
          message: >
            {% if (is_state("sensor.smoke_co_alarm_1_alarm_level", "255") and is_state("sensor.smoke_co_alarm_1_alarm_type", "1")) %}
              'Smoke Alarm 1 is Going Off For Smoke!'
            {% elif (is_state("sensor.smoke_co_alarm_1_alarm_level", "255") and is_state("sensor.smoke_co_alarm_1_alarm_type", "2")) %}
              'Smoke Alarm 1 is Going Off For CO!'
            {% endif %}
          
  - alias: Notification Smoke Alarm Livingroom
    initial_state: 'off'
    trigger:
      platform: template
      value_template: >
        {% if (is_state("sensor.smoke_co_alarm_2_alarm_level", "255") and is_state("sensor.smoke_co_alarm_2_alarm_type", "1")) 
           or (is_state("sensor.smoke_co_alarm_2_alarm_level", "255") and is_state("sensor.smoke_co_alarm_2_alarm_type", "2"))%}
          true
        {% else %}
          false
        {% endif %}
    action:
      - service: notify.pushbullet_notify
        data_template:
          message: >
            {% if (is_state("sensor.smoke_co_alarm_2_alarm_level", "255") and is_state("sensor.smoke_co_alarm_2_alarm_type", "1")) %}
              'Smoke Alarm 2 is Going Off For Smoke!'
            {% elif (is_state("sensor.smoke_co_alarm_2_alarm_level", "255") and is_state("sensor.smoke_co_alarm_2_alarm_type", "2")) %}
              'Smoke Alarm 2 is Going Off For CO!'
            {% endif %}

  - alias: Notification Smoke Alarm Testing
    initial_state: 'off'
    trigger:
      - platform: state
        entity_id: sensor.basement_smoke_alarm_status
        to: 'Testing'
      - platform: state
        entity_id: sensor.livingroom_smoke_alarm_status
        to: 'Testing'
    action:
      - service: notify.pushbullet_notify
        data_template:
          message: >
            {% if trigger.to_state.entity_id == 'sensor.basement_smoke_alarm_status' %}
              'Testing the Basement Smoke Alarm'
            {% elif trigger.to_state.entity_id == 'sensor.livingroom_smoke_alarm_status' %}
              'Testing the Livingroom Smoke Alarm'
            {% endif %}
            
  - alias: Delay Smoke Alarm Notify After Homeassistant Startup
    initial_state: 'on'
    trigger:
      platform: event
      event_type: zwave.network_ready
    action:
      - service: automation.turn_on
        entity_id:
          - automation.notification_smoke_alarm_basement
          - automation.notification_smoke_alarm_livingroom
          - automation.notification_smoke_alarm_testing
                  
  - alias: Delay Smoke Alarm Notify After Automation Reload
    initial_state: 'on'
    trigger:
      platform: event
      event_type: call_service
      event_data:
        domain: automation
        service: reload
    action:
      - delay: '00:00:10'
      - service: automation.trigger
        entity_id: automation.delay_smoke_alarm_notify_after_homeassistant_startup

I needed to put the notification delay in after restart or automation reload because I was getting spurious notifications at those times.

I’m not sure if this is what you were asking but it should hopefully help.

4 Likes

Thanks so much. That looks really good so far. I do have one more question about the automation. If I put this in the configuration yaml then I don’t think I would need an automation ID. However the configuration can get messy (so I’m told) and I believe I can add this directly to the automations.yaml, however I am not sure how to create a valid ID.

Can you suggest a way to add this to either the configuration.yaml or the automations.yaml? I would like to create good habits now to make things easier in the future!

You don’t need an id: unless you plan on editing the automation with the automation editor.

However, if that is your plan then the actual id: doesn’t matter as long as it is unique. it can be id: 11111 or id: abc123 or whatever you want it to be.

I don’t use the automation editor so none of my automations have an id:.

1 Like

Just bought the First Alert alarm and followed the above. Seems to be fine except that my Lovelace entities report out level 255 and type 13 rather than converting to easy to understand text as I believe the zwcfg entry is supposed to do.

Here is what I have in zwcfgXXXXXXX.xml (and confirmed entry is there after HA restart) - this is the last entry:

	<Node id="15" name="" location="" basic="4" generic="161" specific="0" type="Alarm Sensor" listening="false" frequentListening="false" beaming="true" routing="true" max_baud_rate="40000" version="4" secured="true" query_stage="CacheLoad">
		<Manufacturer id="138" name="First Alert (BRK Brands Inc)">
			<Product type="1" id="2" name="ZCombo Smoke and Carbon Monoxide Detector" />
		</Manufacturer>
		<CommandClasses>
			<CommandClass id="32" name="COMMAND_CLASS_BASIC" version="1" request_flags="4" after_mark="true" innif="true" mapping="113">
				<Instance index="1" />
			</CommandClass>
			<CommandClass id="112" name="COMMAND_CLASS_CONFIGURATION" version="1" request_flags="4" innif="true">
				<Instance index="1" />
				<Value type="list" genre="config" instance="1" index="1" label="Send double alarm messages" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" vindex="0" size="1">
					<Help>Causes the device to send double alarm messages.</Help>
					<Item label="Disable" value="0" />
					<Item label="Enable" value="1" />
				</Value>
			</CommandClass>
			<CommandClass id="113" name="COMMAND_CLASS_ALARM" version="1" request_flags="2" innif="true">
				<Instance index="1" />
				<Value type="byte" genre="user" instance="1" index="0" label="Alarm Type" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="13" />
				<Value type="byte" genre="user" instance="1" index="1" label="Alarm Level" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="255" />
			</CommandClass>
			<CommandClass id="114" name="COMMAND_CLASS_MANUFACTURER_SPECIFIC" version="1" request_flags="4" innif="true">
				<Instance index="1" />
			</CommandClass>
			<CommandClass id="128" name="COMMAND_CLASS_BATTERY" version="1" request_flags="4" innif="true">
				<Instance index="1" />
				<Value type="byte" genre="user" instance="1" index="0" label="Battery Level" units="%" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="100" />
			</CommandClass>
			<CommandClass id="132" name="COMMAND_CLASS_WAKE_UP" version="1" request_flags="6">
				<Instance index="1" />
				<Value type="int" genre="system" instance="1" index="0" label="Wake-up Interval" units="Seconds" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="3600" />
			</CommandClass>
			<CommandClass id="133" name="COMMAND_CLASS_ASSOCIATION" version="1" request_flags="4" innif="true">
				<Instance index="1" />
				<Associations num_groups="1">
					<Group index="1" max_associations="1" label="Lifeline" auto="true">
						<Node id="1" />
					</Group>
				</Associations>
			</CommandClass>
			<CommandClass id="134" name="COMMAND_CLASS_VERSION" version="1" request_flags="4" innif="true">
				<Instance index="1" />
				<Value type="string" genre="system" instance="1" index="0" label="Library Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="6" />
				<Value type="string" genre="system" instance="1" index="1" label="Protocol Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="3.52" />
				<Value type="string" genre="system" instance="1" index="2" label="Application Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="0.05" />
			</CommandClass>
		</CommandClasses>
	</Node>
</Driver>

And in configuration.yaml I have

  - platform: template
    sensors:
      smoke_upstairs_status:
        friendly_name: upstairs smoke status
        value_template: >-
          {% if is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_level', '255') and is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_type', '1') %}
            smoke
          {% elif is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_level', '255') and is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_type', '2') %}
            co
          {% elif is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_level', '0') and is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_type', '12') %}
            test
          {% elif is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_level', '255') and is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_type', '13') %}
            idle
          {% endif %}
        icon_template: >- 
          {% if is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_level', '255') and is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_type', '1') %}
            mdi:fire
          {% elif is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_level', '255') and is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_type', '2') %}
            mdi:cloud-outline
          {% elif is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_level', '0') and is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_type', '12') %}
            mdi:alert-octagram
          {% elif is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_level', '255') and is_state('sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_type', '13') %}
            mdi:smoke-detector
          {% endif %}

Am I missing something?

Thanks!

Which entity/entities are you displaying in lovelace?

Thanks for writing back. Here is my Entities card config:

entities:
  - entity: >-
      sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_level
  - entity: >-
      sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_alarm_type
  - entity: >-
      sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_battery_level
title: Smoke
type: entities

Thanks for the hint
Went into Developer Tools - States and typed in ‘smoke’ only to find a new entry. I changed the Entiities card to:

entities:
  - entity: sensor.smoke_upstairs_status
  - entity: >-
      sensor.first_alert_brk_brands_inc_zcombo_smoke_and_carbon_monoxide_detector_battery_level
title: Smoke
type: entities

Works perfectly now

1 Like

That’s exactly where I was headed. Glad you got there on your own. :slight_smile:

But yes every time you create a sensor or any other thing in configuration (with minor exceptions) then it creates an entity in your states list to use in other places.