First Alert Z-Wave Smoke / Carbon Monoxide Detectors don't show up in Home-Assistant

Are you sure it is paired correctly? Can you see in in OZWCP? IF it is paired correctly it WILL show up in HASS. I had trouble with mine showing up because it wasn’t successfully pairing, I ended up pairing it through OZWCP because the manual pairing method of button pushing wasn’t working.

I paired three of them through OZWCP and they show up with the correct name. I’m not sure what’s wrong.

do they show up in < >?

No they don’t.

I’m having the same issue with a First Alert combo smoke/CO detector. Model ZCOMBO-G. Shows up in OZWCP, but doesn’t show up anywhere in HomeAssistant.

OZWCP shows Alarm Sensor First Alert ZCombo Smoke and Carbon Monoxide Detector and the value updates correctly if I press the Test button on the alarm.

HomeAssistant doesn’t show this device anywhere on the frontend, or in the development tools < >

Any ideas?

I had the same problem with the first alert detector, solution was to remove the alarm from the network and then add it through HA. From my understanding, the alarm only sends out it’s identifying information once so if you add it with OZWCP you won’t see it next time you launch HA. A restart of HA may also be needed after adding the alarm to get the entity IDs updated.
For the alarm types, 1 is fire alarm, 2 is CO, 12 is the test button, and 13 is stand by, the value seems to normally be 255, if you press the test button the type will change to 12, after the test is over the value will change to 0. After some time, the type changes back to 13 and the value changes to 255. Note: I haven’t confirmed 1 is fire and 2 is CO, I just read that on another forum, I have my alarm go off if the type ever isn’t 13 just to be safe.

Hope that helps!

Kip

3 Likes

Kip, does the alarm report its battery level?

It appears to be, under state attributes for the alarm type and level I get:

“battery_level”: 98,

I’ve only had the alarm for a couple of months so I don’t know if that’s realistic or not.

1 Like

For anyone who’s interested, this is the sensor template I use to show the alarm status (thanks to the information provided by @Kip).

sensor:
- platform: template
  sensors:
    status_smoke_co_alarm:
      value_template: >-
          {%- if is_state("sensor.first_alert_zcombo_smoke_and_carbon_monoxide_detector_alarm_type_4", "13") %}
              Idle
          {%- elif is_state("sensor.first_alert_zcombo_smoke_and_carbon_monoxide_detector_alarm_type_4", "1") %}
              Fire Detected
          {%- elif is_state("sensor.first_alert_zcombo_smoke_and_carbon_monoxide_detector_alarm_type_4", "2") %}
              Carbon Monoxide Detected
          {%- elif is_state("sensor.first_alert_zcombo_smoke_and_carbon_monoxide_detector_alarm_type_4", "12") %}
              Alarm Testing
          {% else %}
              Unknown
          {%- endif %}
      friendly_name: 'Smoke/CO Alarm'

And for getting battery status:

sensor:
- platform: template
  sensors:
    battery_level_smoke_co_alarm:
      value_template: '{{states.sensor.first_alert_zcombo_smoke_and_carbon_monoxide_detector_alarm_type_4.attributes.battery_level}}'
      friendly_name: 'Smoke/CO Alarm Battery'
      unit_of_measurement: '%'

The first_alert_zcombo_smoke_and_carbon_monoxide_detector_alarm_type_4 string will vary based on the node ID given by your zwave network. I had to wait some time and/or restart Home Assistant before I got an entity name that included “first_alert_zcombo_smoke_and_carbon_monoxide_detector”. When I first initially included the alarm on the network it just had some generic sensor alarm entity name.

7 Likes

Great template @c32817812, thanks!

Just an update on this. The reason they didn’t show up in HA is because the Command Class wasn’t in there. This is what I have now and it works.

<Node id="3" name="MY ALARM 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" query_stage="Probe">
		<Manufacturer id="138" name="First Alert Z-Wave Smoke and Carbon Monoxide Alarm">
			<Product type="1" id="2" name="" />
		</Manufacturer>
		<CommandClasses>
			<CommandClass id="32" name="COMMAND_CLASS_BASIC" version="1" after_mark="true" mapping="113">
				<Instance index="1" />
			</CommandClass>
			<CommandClass id="113" name="COMMAND_CLASS_ALARM" version="1" request_flags="2">
				<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="0" />
				<Value type="list" genre="user" instance="1" index="1" label="Alarm Report" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
			</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="2">
				<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>
		</CommandClasses>
	</Node>
2 Likes

Are you sure it’s not supposed to be the alarm_report that ha the values, 1, 2, 12, and 13? I tested my alarm and the alarm_report is what changed to 12. The alarm_type changed to 255.

Mine was different again - alarm_level goes to 255 when there is an alarm and alarm_type gives the type. After the alarm is over, alarm_level resets to 255, but alarm_type stays at the last value. It also seems possible for alarm_level to go to 255 and alarm_type to go to 13 to represent an idle state. I built this sensor as a result - but I think the lesson here is test the device and see what you actually get!

- platform: template
  sensors:
    upstairs_smoke:
      value_template: '{%- if is_state("sensor.upstairs_smoke_alarm_alarm_level_47_1", "0") %}
                        Idle
                        {%else%}
                          {%- if is_state("sensor.upstairs_smoke_alarm_alarm_type_47_0", "1") %}
                          Fire
                          {%- elif is_state("sensor.upstairs_smoke_alarm_alarm_type_47_0", "2") %}
                          C02
                          {%- elif is_state("sensor.upstairs_smoke_alarm_alarm_type_47_0", "12") %}
                          Testing
                          {%- elif is_state("sensor.upstairs_smoke_alarm_alarm_type_47_0", "13") %}
                          Idle
                          {% else %}
                          Unknown
                          {%- endif %}
                        {%endif%}'
      friendly_name: 'Upstairs Smoke Alarm'
3 Likes

I also wrote a simple AppDaemon App to monitor it, send a notification and turn lights on when it goes off:

import appdaemon.appapi as appapi

#
# App to send notification when a sensor changes state
#
# Args:
#
# sensor: sensor to monitor e.g. sensor.upstairs_smoke
# idle_state - normal state of sensor e.g. Idle
# turn_on - scene or device to activate when sensor changes e.g. scene.house_bright
# Release Notes
#
# Version 1.0:
#   Initial Version

class SensorNotification(appapi.AppDaemon):

  def initialize(self):
    if "sensor" in self.args:
      for sensor in self.split_device_list(self.args["sensor"]):
        self.listen_state(self.state_change, sensor)
    
  def state_change(self, entity, attribute, old, new, kwargs):
    self.log("{} is in state {}".format(self.friendly_name(entity), new))
    self.notify("{} is in state {}".format(self.friendly_name(entity), new), name="ios")    
    if new != self.args["idle_state"] and "turn_on" in self.args:
      self.turn_on(self.args["turn_on"])
3 Likes

And a final point - I bought 1 of these then another 2. The first one fought me with the pairing until I figured it out, the second 2 were flawless when I had the exact sequence down - now very happy with these.

The sequence I used for ZWave pairing was exactly as follows:

  1. Using Open ZWave Control Panel, activate “Add Device”
  2. Only then, hold the test button and close the battery door, wait for the beep, release the button
  3. That’s it - OZWCP will find the device and fill in all details, command classes etc.

Don’t power the device on before pairing, don;t change the order of the above and it should work fine.

4 Likes

Has anyone actually observed the alarm type for smoke or CO? I do get 13 for a test, but have not seen it be a 1 or 2 for smoke or CO yet. Need to do some kind of test I guess.

I tested it by burning some tissue paper and it turned to a 1 for smoke.

For me, this is what worked to get the battery level:

  battery_level_bedroom_smoke_co_alarm:
    value_template: '{{states.zwave.bedroom_smoke_detector.attributes.battery_level}}'
    friendly_name: 'Bedroom Smoke/CO Battery'
    unit_of_measurement: '%'

Wonderful! thanks guys

@aimc I took your awesome template and app and put it to work tonight. But I also added tts with it for my sonos. I did this in SmartThings with the webcore component to speak announcements for my smoke alarms. Worked great for my kiddos. I have this one setup to fire off the initial announcement and then it will repeat itself every 30 seconds as long as the condition remains. Thank you.

import appdaemon.plugins.hass.hassapi as hass

#
# App to send notification when a sensor changes state
#
# Args:
#
# sensor: sensor to monitor e.g. sensor.upstairs_smoke
# idle_state - normal state of sensor e.g. Idle
# turn_on - scene or device to activate when sensor changes e.g. scene.house_bright
# Release Notes
#
# Version 1.0:
#   Initial Version

class SensorNotification(hass.Hass):

  def initialize(self):
    if "sensor" in self.args:
      for sensor in self.split_device_list(self.args["sensor"]):
        self.listen_state(self.state_change, sensor)
    self.media_player = 'group.speakers'

  def state_change(self, entity, attribute, old, new, kwargs):
    self.log("{} is in state {}".format(self.friendly_name(entity), new))
    #self.notify("{} is in state {}".format(self.friendly_name(entity), new), name="ios")
    if new != self.args["idle_state"] and "turn_on" in self.args:
      self.turn_on(self.args["turn_on"])
    if new == "Fire":
        while new == "Fire":
            self.fire_announcement(deviceID=entity)
            self.fire_handle = self.run_in(self.fire_announcement, 30, deviceID=entity)
        else:
            self.cancel_timer(self.fire_handle)
    if new == "CO2":
        while new == "CO2":
            self.co2_announcement(deviceID=entity)
            self.co2_handle = self.run_in(self.co2_announcement, 30, deviceID=entity
        else:
            self.cancel_timer(self.fire_handle)


    def fire_announcement(self,kwargs):
        friendly_name = self.get_state(kwargs['deviceID'], attribute='friendly_name')
        message = "The {} has detected smoke.  Please exit the house immediately through the safest path." .format(friendly_name)
        self.call_service("media_player/volume_set", entity_id=self.media_player, volume_level = 100)
        self.call_service("tts/google_say", entity_id=self.media_player, message=message)

    def co2_announcement(self,kwargs):
        friendly_name = self.get_state(kwargs['deviceID'], attribute='friendly_name')
        message = "The {} has detected carbon monoxide.  Please exit the house immediately through the safest path." .format(friendly_name)
        self.call_service("media_player/volume_set", entity_id=self.media_player, volume_level = 100)
        self.call_service("tts/google_say", entity_id=self.media_player, message=message)

edit: I commented out the notify for the moment while I’m still figuring out which notification platform I want to use. I’m probably also going to do a web call with IFTTT to call my cell phone and my wifes if we’re not home.

1 Like