First Alert Smoke Detector and Carbon Monoxide Alarm Setup

What a neat tool! I didn’t know that existed.

It doesn’t show any errors, and it resolves as expected. Here’s the result string:

## Upstairs First Alert (Gen 2 Zwave Plus)
- platform: template
  sensors:
    smoke_upstairs_status:
      friendly_name: 'Smoke Upstairs Status'
      value_template: >-
        
          Idle
        
      icon_template: >-
        
          mdi:smoke-detector
        
- platform: template
  sensors:
    smoke_upstairs_health:
      friendly_name: 'Smoke Upstairs Health'
      value_template: >-
        
          Healthy
        
      icon_template: >-

Looks like there’s no icon for the Healthy or Malfunction Clear state, but that’s probably not relevant.

Maybe it’s something wrong with my main config file? I don’t have all of my sensors in the sensors/template.yaml file yet, for example.

I just checked the logs and found this little gem (I must have missed this before):

YAML file /config/configuration.yaml contains duplicate key "sensor". Check lines 14 and 31

Here’s my configuration.yam (elided for brevity):

# Include my sensors directory. Templates are located here: sensors/templates.yaml
sensor: !include_dir_merge_list sensors

# Add a date time sensor
sensor:
  - platform: time_date
    display_options:
      - 'time'
      - 'date'
      - 'date_time'
      - 'date_time_utc'
      - 'date_time_iso'
      - 'time_date'
      - 'time_utc'
      - 'beat'

So I guess the second sensor entry is overriding the first? Seems like that should be an error, not a warning.

Anyway, I moved the time_date sensor to a new sensors/sensors.yaml and that solved it.

Thanks for the tips!

:partying_face: glad you got it working.

Also, the include_dir_merge_list directive means that you can have multiple files in your sensors directory for easier management. You don’t need to stuff everything into a templates.yaml file. For example:

sensors/
├── datetime.yaml
└── smoke.yaml
1 Like

Nice! I like that organization approach much better.

Thanks to everyone’s help on this thread I’ve got my single, proof of concept second gen First Alert working. The right info shows up in Lovelace. When I put it in test mode, it shows the correct text and icons. And I’ve got it wired up with Node-Red for push notifications via Pushover. Very cool!

Since this proof of concept works, I plan to buy more First Alert units to outfit the rest of the house. But to get there, I’d like to streamline the Node-Red implementation.

Here’s a view of my current smoke alarm flow:

Basically the event state goes into the detector, which performs a switch based on the sensor text value to the appropriate function, which in turn specifies the message text that is handed to the PushOver node to be sent. All pretty simple.

The issue though is that I want the messages to contain the location of smoke alarm that originated the state change. As it is, that means duplicating everything to the left of the PushOver node where the only text change is the smoke alert location. Seems like a lot of code (er, ‘node’) duplication.

What I really would like to do is come up with a way to pass the alarm location from the event state node through the rest of the sequence then substitute its value in the message strings handed to the PushOver node. Hopefully that makes sense…

Since I’m new to Node-Red I did some searching. Looks like there are ways to access flow-wide variables. But what I’m interested in is a variable available to the sequence, originating from the event state originator.

I think that means adding a custom field to the msg that can be sent through to the function nodes. Then the function nodes would need to expand the value of that custom field into the JSON that makes up the message text provided to the PushOver node.

While I get the concept, I’m not sure how to actually do it. It would be great to get some advice on this.

I realize that this is really more of a Node-Red question, and not directly related to this thread. But it seems like anyone who wants to use Node-Red to handle more than a few smoke alarms would benefit from a simpler flow.

I’ll keep poking at this, but thanks in advance for any suggestions for a best practices solution.

I think I figured it out. The trick was to inject the location into the msg object with a “change” node, then use that in the downstream construction of the notification text.

Here’s what my Node-Red feed looks like now:

The “Set Upstairs” node that injects the alarm location looks like this:

Here’s an example of one of the function nodes consuming the injected location in preparation for passing on the text to the notification node:

For those that are interested, here’s the text of the function node:

var locationStr = msg.smoke_location;
var topicStr = locationStr + " Smoke Alarm - Test"
var payloadStr = "The " + locationStr.toLowerCase() + " smoke alarm was tested. Feel free to ignore this."
msg = {
    topic: topicStr,
    payload: payloadStr,
    priority: 0
}
return msg;

So as this stands, I can reuse every node from the “Detector Status” node to the right. I only need to add new event state and change nodes to the left in order to add new smoke alarm units.

Note that this has had minimal testing, and I have no idea if this is best practices or not, but it does seem to work.

Good luck to everyone in the new year!

2 Likes

I have the old version, and have it working based on the great info in this thread. My devices have a wakeup interval of 3600 (seconds?) so I figured they would update the battery frequently. According to HA, the battery updates are several days or more apart; now I’m wondering if this is just HA polling the device every so often but getting no response? I haven’t fiddled with them in a long time; I’ll do a test and see if the battery updates. They are all still showing 100% which seems suspect after many months, and I don’t think the wakeup actually works at all.

Could you please post the whole thing ? Awesome work !

Do you mean the whole Node-Red flow? If so, here it is:

[{"id":"7c4db192.60eb1","type":"tab","label":"Smoke Alarms","disabled":false,"info":""},{"id":"759468aa.dd262","type":"server-state-changed","z":"7c4db192.60eb1","name":"Upstairs Status","server":"c85449ee.1d2f08","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.smoke_upstairs_status","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":100,"y":100,"wires":[["61f4d322.ff4b54"]]},{"id":"38305119.cd581e","type":"switch","z":"7c4db192.60eb1","name":"Status","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"Smoke","vt":"str"},{"t":"eq","v":"CO","vt":"str"},{"t":"eq","v":"Silenced","vt":"str"},{"t":"eq","v":"CO_EOL","vt":"str"},{"t":"eq","v":"Test","vt":"str"},{"t":"eq","v":"Idle","vt":"str"}],"checkall":"false","repair":false,"outputs":6,"x":510,"y":140,"wires":[["33ca2650.533b1a"],["4a0f4a6f.78322c"],["ee62a50d.cde3d8"],["6bd03bc.8b06bc4"],["f9388939.471ff8"],[]]},{"id":"33ca2650.533b1a","type":"function","z":"7c4db192.60eb1","name":"Smoke","func":"var locationStr = msg.smoke_location;\nvar topicStr = locationStr + \" Smoke Alarm - Smoke Detected\"\nvar payloadStr = \"The \" + locationStr.toLowerCase() + \" smoke alarm has detected smoke! Call 911!\"\nmsg = {\n    topic: topicStr,\n    payload: payloadStr,\n    priority: 0\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":680,"y":60,"wires":[["d99d9a5d.3d49d"]]},{"id":"d99d9a5d.3d49d","type":"pushover","z":"7c4db192.60eb1","name":"Notify Status","device":"","title":"","priority":0,"sound":"persistent","url":"","url_title":"","html":false,"x":890,"y":140,"wires":[]},{"id":"4a0f4a6f.78322c","type":"function","z":"7c4db192.60eb1","name":"CO","func":"var locationStr = msg.smoke_location;\nvar topicStr = locationStr + \" Smoke Alarm - Carbon Monoxide\"\nvar payloadStr = \"The \" + locationStr.toLowerCase() + \" smoke alarm has detected Carbon Monoxide! Get out of there! Save the cats!\"\nmsg = {\n    topic: topicStr,\n    payload: payloadStr,\n    priority: 0\n}\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":670,"y":100,"wires":[["d99d9a5d.3d49d"]]},{"id":"ee62a50d.cde3d8","type":"function","z":"7c4db192.60eb1","name":"Silenced","func":"var locationStr = msg.smoke_location;\nvar topicStr = locationStr + \" Smoke Alarm - Silenced\"\nvar payloadStr = \"The \" + locationStr.toLowerCase() + \" smoke alarm has been Silenced. Must have been a false alarm. Whew!\"\nmsg = {\n    topic: topicStr,\n    payload: payloadStr,\n    priority: 0\n}\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":680,"y":140,"wires":[["d99d9a5d.3d49d"]]},{"id":"6bd03bc.8b06bc4","type":"function","z":"7c4db192.60eb1","name":"CO EOL","func":"var locationStr = msg.smoke_location;\nvar topicStr = locationStr + \" Smoke Alarm - CO EOL\"\nvar payloadStr = \"The \" + locationStr.toLowerCase() + \" smoke alarm's CO detector is end of lifed. This unit should be replaced.\"\nmsg = {\n    topic: topicStr,\n    payload: payloadStr,\n    priority: 0\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":680,"y":180,"wires":[["d99d9a5d.3d49d"]]},{"id":"f9388939.471ff8","type":"function","z":"7c4db192.60eb1","name":"Test","func":"var locationStr = msg.smoke_location;\nvar topicStr = locationStr + \" Smoke Alarm - Test\"\nvar payloadStr = \"The \" + locationStr.toLowerCase() + \" smoke alarm was tested. Feel free to ignore this.\"\nmsg = {\n    topic: topicStr,\n    payload: payloadStr,\n    priority: 0\n}\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":670,"y":220,"wires":[["d99d9a5d.3d49d"]]},{"id":"61f4d322.ff4b54","type":"change","z":"7c4db192.60eb1","name":"Set Upstairs","rules":[{"t":"set","p":"smoke_location","pt":"msg","to":"Upstairs","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":100,"wires":[["38305119.cd581e"]]},{"id":"bcca34ed.dabec8","type":"server-state-changed","z":"7c4db192.60eb1","name":"Upstairs Health","server":"c85449ee.1d2f08","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.smoke_upstairs_health","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":100,"y":300,"wires":[["8c6caa35.f90318"]]},{"id":"4d676eb4.bca8","type":"switch","z":"7c4db192.60eb1","name":"Health","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"Malfunction Detected","vt":"str"},{"t":"eq","v":"Malfunction Clear","vt":"str"},{"t":"eq","v":"Healthy","vt":"str"}],"checkall":"false","repair":false,"outputs":3,"x":510,"y":320,"wires":[["6af67184.53e13"],["f3ff7726.ef9f88"],[]]},{"id":"40d6aa02.f322e4","type":"pushover","z":"7c4db192.60eb1","name":"Notify Health","device":"","title":"","priority":0,"sound":"gamelan","url":"","url_title":"","html":false,"x":890,"y":320,"wires":[]},{"id":"6af67184.53e13","type":"function","z":"7c4db192.60eb1","name":"Malfunction","func":"var locationStr = msg.smoke_location;\nvar topicStr = locationStr + \" Smoke Alarm - Malfunction Detected\"\nvar payloadStr = \"The \" + locationStr.toLowerCase() + \" smoke alarm has detected a malfunction!\"\nmsg = {\n    topic: topicStr,\n    payload: payloadStr,\n    priority: 0\n}\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":690,"y":300,"wires":[["40d6aa02.f322e4"]]},{"id":"f3ff7726.ef9f88","type":"function","z":"7c4db192.60eb1","name":"Cleared","func":"var locationStr = msg.smoke_location;\nvar topicStr = locationStr + \" Smoke Alarm - Malfunction Cleared\"\nvar payloadStr = \"The \" + locationStr.toLowerCase() + \" smoke alarm malfunction has been cleared.\"\nmsg = {\n    topic: topicStr,\n    payload: payloadStr,\n    priority: 0\n}\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":680,"y":340,"wires":[["40d6aa02.f322e4"]]},{"id":"8c6caa35.f90318","type":"change","z":"7c4db192.60eb1","name":"Set Upstairs","rules":[{"t":"set","p":"smoke_location","pt":"msg","to":"Upstairs","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":300,"wires":[["4d676eb4.bca8"]]},{"id":"679ebea0.2b6ef","type":"server-state-changed","z":"7c4db192.60eb1","name":"Upstairs Battery","server":"c85449ee.1d2f08","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.first_alert_upstairs_battery_level","entityidfiltertype":"exact","outputinitially":true,"state_type":"num","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":100,"y":460,"wires":[["df09463a.05c358"]]},{"id":"404bc0fa.320928","type":"switch","z":"7c4db192.60eb1","name":"Battery","property":"payload","propertyType":"msg","rules":[{"t":"lt","v":"10","vt":"str"}],"checkall":"false","repair":false,"outputs":1,"x":520,"y":480,"wires":[["7e38e20.af437a"]]},{"id":"7e38e20.af437a","type":"function","z":"7c4db192.60eb1","name":"Low","func":"var locationStr = msg.smoke_location;\nvar topicStr = locationStr + \" Smoke Alarm - Low Battery\"\nvar payloadStr = \"The \" + locationStr.toLowerCase() + \" smoke alarm has a battery level of less than 10%. Consider replacing the batteries.\"\nmsg = {\n    topic: topicStr,\n    payload: payloadStr,\n    priority: 0\n}\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":670,"y":480,"wires":[["3572e5f5.de6c42"]]},{"id":"df09463a.05c358","type":"change","z":"7c4db192.60eb1","name":"Set Upstairs","rules":[{"t":"set","p":"smoke_location","pt":"msg","to":"Upstairs","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":460,"wires":[["404bc0fa.320928"]]},{"id":"3572e5f5.de6c42","type":"pushover","z":"7c4db192.60eb1","name":"Notify Battery","device":"","title":"","priority":0,"sound":"intermission","url":"","url_title":"","html":false,"x":900,"y":480,"wires":[]},{"id":"a8a224ad.aa73e8","type":"server-state-changed","z":"7c4db192.60eb1","name":"MBR Entrance Status","server":"c85449ee.1d2f08","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.smoke_mbr_entrance_status","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":120,"y":160,"wires":[["3d4da32b.e8a754"]]},{"id":"3d4da32b.e8a754","type":"change","z":"7c4db192.60eb1","name":"Set MBR Entrance","rules":[{"t":"set","p":"smoke_location","pt":"msg","to":"Master Bedroom Entrance","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":330,"y":160,"wires":[["38305119.cd581e"]]},{"id":"74d2caf9.224c3c","type":"server-state-changed","z":"7c4db192.60eb1","name":"MBR Entrance Health","server":"c85449ee.1d2f08","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.smoke_mbr_entrance_health","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":120,"y":360,"wires":[["176438a7.eabeb7"]]},{"id":"176438a7.eabeb7","type":"change","z":"7c4db192.60eb1","name":"Set MBR Entrance","rules":[{"t":"set","p":"smoke_location","pt":"msg","to":"Master Bedroom Entrance","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":330,"y":360,"wires":[["4d676eb4.bca8"]]},{"id":"8ffa5705.707988","type":"server-state-changed","z":"7c4db192.60eb1","name":"MBR Entrance Battery","server":"c85449ee.1d2f08","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.first_alert_mbr_entrance_battery_level","entityidfiltertype":"exact","outputinitially":true,"state_type":"num","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":120,"y":520,"wires":[["1fb94b78.3f3855"]]},{"id":"1fb94b78.3f3855","type":"change","z":"7c4db192.60eb1","name":"Set MBR Entrance","rules":[{"t":"set","p":"smoke_location","pt":"msg","to":"Master Bedroom Entrance","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":330,"y":520,"wires":[["404bc0fa.320928"]]},{"id":"c85449ee.1d2f08","type":"server","name":"Home Assistant","addon":true}]

I wasn’t sure if this exposed my Pushover user key or application API key. But I searched for them in the exported text and didn’t see them, so hopefully I’m safe. I guess Node-Red stores keys like that elsewhere. Maybe it’s possible to get it to use the HA secrets file?

Anyway, hope this helps.

Now that I have notifications working, I’ve noticed that I’m seeing “Malfunction Clear” events with my generation 2 smoke alarms when no malfunction exists. That is, there was never a preceding “Malfunction Detected” event. I think it might be related to restarting Home Assistant, or restarting the Z-Wave network.

I suspect what’s happening is that the smoke detectors are asleep when the restart has happened and won’t wake up until their 70 minute timeout has expired. During that time the smoke alarms seem to be considered by HA to be in “initializing” mode (probably because it can’t talk to them because they’re asleep).

When the smoke alarms wake up, maybe HA sends some sort of reset command, which causes the health sensor to indicate "Malfunction Clear”, after which it goes to sleep again.

I’m tempted to just ignore the "Malfunction Clear” event because it seems to be unhelpful. But for now I’m leaving it in while installing the remaining detectors. If they all behave this way (which I suspect will be the case), then it’s probably safe to ignore this event.

I think others have posted that they only see a battery change when they test the unit. If so, that’s pretty irritating and real design flaw.

It matches my experience with the second gen model though. My first unit showed 98% for months. After testing it, the reported value was 88%.

It would be much better if HA could get an updated battery level when a given unit wakes up. Even if it only did that once a week, it would be helpful.

I am also curious about this. Did you ever figure out if there is a way to trigger these? Using them for security would be nice, but I would also like to interlink them, so if one goes off, all of them will go off.

Reading through this thread it is only for the First Alert Z-Wave models.

I just recently purchased the First Alert Onelink smoke & CO2 detectors. They’re currently in iOS HomeKit but I couldn’t get HomeKit Controller (in Home Assistant) to detect them (removed from HomeKit first).

Just wondering if anybody knows a good method to connect to First Alert Onelink?

https://onelink.firstalert.com

Since these units sleep for a long time (70 minutes for the gen 2 model), I don’t think interlinking is possible. If one goes off, there’s no mechanism to wake the other units up.

What I’m thinking about is replacing our ancient alarm system with a Konnected.io. Then I’ll add automation that triggers our siren if any given smoke detector goes off. The siren is plenty loud enough to wake the whole house.

I have several of these first gen smoke/CO2 detectors. I thought it would be a pain to configure them all separately so I wrote a short node.js script to generate their configs automatically. You can get it at https://gist.github.com/yariv/42fad622bf8f6ab4554d7de51fbaf7f5. You can run it by copying it to your .homeassistant directory and run it with node [file name].js. (I’m sure there’s a more elegant way to solve it but this does the job.) It’ll output to console the configs that you can copy verbatim to you configuration.yaml file. As a bonus, this script also outputs configs that link the devices’ battery levels in HomeKit.

If you use HomeKit, you should know that HomeAssistant has a bug where if you have multiple HomeKit bridges under your HomeKit integration, the bridge configured through the UI interferes with the bridge configured from configuration.yaml. This bug disables syncing the smoke detectors’ battery levels to HomeKit. If you have multiple instances of HomeKit bridges, I recommend deleting the one that’s not configured from the YAML file (you could identify it by clicking on its ‘options’ link and seeing if you get a message that this bridge can only be configured from YAML).

Hope it helps and thanks for sharing your solutions so far!

Are there any go-to recommendations for zwave smoke detectors now that these zcombo devices have been discontinued?

Looks like they are still available on Amazon at least for now…

Does anyone know what the advantages (if any) are with getting the 2nd generation vs the 1st generation? I have a first-gen device and thanks to the work of everyone else in this thread I have it configured and working great in HA. However, I’d like to add a few more and am not sure if I should get the first or second gen.

My first two were first gen… just added a second gen one and it was nice to have all the entities created automatically… it also completed the interview on the first try instead of repeatedly pulling battery and pressing button like I have to do with the old model. I believe the Zwave plus model should be better on battery life as well. But I haven’t had them all long enough to really compare just yet.

1 Like

I have a ZCOMBO in the basement, but for the main house where I have wired smoke detectors, I just got one of these relay modules:

And then wired it into the internal screw terminals on one of these:

https://www.amazon.com/Z-Wave-Magnets-Window-Sensor-DWZWAVE2-5-ECO/dp/B01N5HB4U5

Those door sensors have handy screw terminals in parallel with the reed switch so you can wire other things directly into them without needing to solder anything:

So then I have the door sensor report if the alarms are triggered or not. Obviously only a solution if you have wired smoke alarms but simpler and cheaper than wrangling a bunch of zwave smoke detectors.

1 Like

Hello all,

Over the weekend end I set off my fir alert zwave smoke detector cooking bacon, and to my surprise the smoke alarm automations didn’t trigger. I am not sure if this had to do the transition to Zwavejs or not but I noticed my alarm type when normal is 13 with a level of 255.

When the smoke alarm triggered it went to alarm type 1 and level of 0 instead of what I thought was 255

Has anyone else seen this? I plan to make the smoke alarm automations more sensitive to the type changes, would almost rather have false positives.

I also noticed similar behavior but thought it was because I silenced it right away… meant to test again but haven’t yet cuz my dogs don’t like it going off… but it seemed to be 255 as expected then went to 0 after silencing (but as I said never verified)