Integrating Kidde Smoke / CO Sensors into SmartThings Properly

I’m sure this has been done before but I know I’ve seen lots of discussions on the best way to integrate existing smoke/CO sensors into SmartThings. After lots of research I did what I thought was the best way for my situation and figured I’d write up what I did in case it could help someone else. Cost me less then $100 and about 6 - 8 hours of work, probably less if I didn’t write this up and take pictures. The way I did it also does not interfere with the existing sensor operation which was my main concern.

My house was built two years ago and has sensors to meet code. That means smoke in each of the three bedrooms, a combination smoke/CO in the upstairs hallway, a smoke in the first floor hallway near the kitchen, and another smoke in the basement. They are all Kidde brand and interconnected. Because of this I wanted to see what I could do to tap into them without adding additional sensors. To that end Kidde makes a module that connects to the existing 3 wires (hot, neutral, and signal) that goes to each detector and give you a normally closed or open contact. So here was my material list:

1x Kidde SM120X Smoke Relay Module ($13 on Amazon)
1x Kidde CO120X Carbon Monoxide Relay Module ($12 on Amazon)
2x Ecolink Door & Window Sensors DWZWAVE2-ECO (2-pack for $54 on Amazon)
1x 4x4 electrical box (or bigger work box) and a cover ($4 at Home Depot)
Some 18ga or 20ga wire
Some 12/3 Romex to extend the nearest sensor to somewhere I can work with

I went with the Ecolink sensors because they have a input already on board. Perfect for wiring the relays to without anything special having to be done:

First I got kinda lucky that they mounted a detector about 4’ from my unfinished storage room so that’s obviously the sensor I tapped off of. If I didn’t have easy access I’d go up into the attic and tap off of the second floor sensor. I already have GE Z-Wave dimmers throughout the house so I wasn’t too worried about the signal getting through the house either way:

I started by pairing each EcoLink into SmartThings. Both were a PITA for some reason, both had to have the batteries pulled and retried twice. But they pulled in. So first thing once they were pulled in was testing those external connections, no use mounting and wiring if it doesn’t work. So I shorted them out and nothing happened. I put the magnet up to them and nothing happened then either. After fumbling with it I found that the tamper switch next to the LED will cause it to say “Open” whenever the case isn’t on it. So I held that down and tried again and the external contacts worked fine for open and close, almost instantaneous response. Once that was verified I felt confident in proceeding.

The Kiddie modules were identical to each other wiring wise except for one wire. Both had three wires to connect to the existing smoke/CO detectors (AC Hot, AC Neutral, and Interconnect Signal) and three more for the contact. The Smoke however had a extra 9v DC out which I would not be using. For simplicity I cut that wire (gray) short and the normally closed wire (yellow) as I would be using the normally open that closes on signal. I then tried to test fit them…it’s a tight fit but the shrink wrap they use is flexible on the ends, kinda keeps them in place:

I bought a white nylon cover plate so I could drill it for the wires to get to the EcoLink sensors. I figured they shouldn’t be jammed into the box with the 120v and would transmit better outside. So I laid them out and marked up the cover for drilling then mounted the bases to the cover plate. Thankfully the circuit boards can be removed relatively easily making it a lot easier:

The wires coming off the relays were a bit too big to get through the back cover of the sensor but I found 18ga wire to be a perfect fit:

After mounting and getting the wires through I had something that actually didn’t look half bad:

Next was to mount the box in the ceiling and get the wires run over to it. I knew it was going to be slightly tight in the box…in retrospect I should have went with a three gang box. The power and signal wire are wire nutted and it’s ready to have the sensors connected.

Once I connected the EcoLink sensors to the relay outputs I mounted the cover plate and it’s all done.

And here is the room in SmartThings

Now the only thing I may do is change the default device type and modify it to say “Normal” and “Alarm” instead of Open and Close.

Hopefully someone will find this useful.



Couldn’t take seeing “open” and “closed” so modified the device type to show Normal in green or Alarm in red along with the standard ST icon of a smoke detector. It’s NOT identified as a actual smoke or CO detector, just the labels and icons are updated although I plan on trying to figure out how to do that next.

GitHub: vseven - SmartThings_VSeven - master


Thanks for posting. I just did the same thing a few weekends ago and documented it as well:

It’s great having them connected!

1 Like

If anyone needs I updated the device types to conform to a actual Smoke and CO sensor so now the smoke can be used within Smart Home Monitor. I’m sure you can use it as a example for any contact closure also.

vseven - SmartThings_VSeven - master


Hi Allan,

Thank you for posting this. Detector integration and script are working great. The only problem I have is, that once the sensor is in alarm it stays stuck. It shows up as DETECTED. The only way to clear it, is to exclude and include back into the system. Is there a timeout function or could you include a reset function? How is working on your system?


EDIT: Totally my mistake, used the ‘normally closed’ wire instead of ‘normal open’ one. Should have figured that out earlier lol. I guess it threw me off that the test was working since the it would receive the opposite signal as well, just in reverse order. DOH! :rolling_eyes:

I’m glad you figured it ouy because I was going to say I have no idea what would be wrong since it was working for me. :slight_smile:

First off thanks for sharing!

Trying to leverage your work here with the Aeotec Dry Contact Sensor but I want closed to be the “clear” condition. That way, if a wire comes loose or something fails, the circuit is broken and I’m alerted. This was all based on your description that you were using the normally open wire.

But when I hooked it up, I found that it worked exactly like I wanted. But now I’m confused as to how you were using the normally open wire for this.

In the end, it’s working perfectly but I’m curious as to what I missed above.

Oh and, by the way, thanks to your observations, I grabbed an old new constriction plastic 3-gang junction box I had laying around and used that for the relay and sensor. Still have enough room to add the CO relay and another sensor. Just need a cover!

The Kidde has both a normally open and a normally closed. Your sensor, and the device type I wrote, are looking for a closure. So if you wire it how I did it should be on normally open (closes on alarm). It sounds like you wired it to normally closed and then reversed the code in the device type which should also work.

Well, I started to reverse the code…but that’s what confused me. I tested the sensor in detail first to make sure that when the contacts were closed, the output read open, which is the default. So initially, I thought I would need to reverse the code - here’s what the standard value is vs your code:

Standard (“Z-Wave Door/Window Sensor”)
def sensorValueEvent(value) {
if (value) {
createEvent(name: “contact”, value: “open”, descriptionText: “$device.displayName is open”)
} else {
createEvent(name: “contact”, value: “closed”, descriptionText: “$device.displayName is closed”)

And here’s your code
def sensorValueEvent(value) {
if (value) {
createEvent(name: “smoke”, value: “clear”, descriptionText: “$device.displayName is Normal”)
} else {
createEvent(name: “smoke”, value: “detected”, descriptionText: “$device.displayName is in Alarm”)

As it turns out, this is a by-product of using the Aeotec Dry Contact Sensor (ZW097), which seems to operate opposite the ecolink sensor. With the Aeotec, when the contact sensors are “shorted” (IE normally closed), then the sensor reports itself as open normally. If I read the ecolink information correctly, it works the opposite, where if the terminals are shorted together, it is closed.

So it really boils down to what throws a value. In my case, with the contacts open, the sensor is considered “off”, so it throws a zero, meaning it’s closed. However, for the ecolink, when the contacts are open, the sensor is considered open, so it throws a value. In other words, the ecolink and the aeotec report completely opposite of each other. In effect, when I chose to wire normally closed, I “reversed” it back to make up the difference.

And now, after reading about the ecolink, I kinda wish I had bought that instead! The Aeotec says up to 1 year life based on 48 triggers a day. But in my case, it will constantly be “triggered”. In the meantime, the ecolink says a battery life of 3 years with 50 openings/closings a day. They use the same battery so I don’t quite get that or if using the battery is done by changing state or being in the on state. They’re also cheaper. Hard to get a real gauge on the size based on published specs but your pics tell me it should be about the same size. I may change them out. :slight_smile:

My girlfriend, making dinner last week, overheated some oil in a pan that started to smoke and then hit a smoke sensor in the hallway. This of course set it of which then set off all the others which then set off the relay which closed the contact. Within about 3 seconds of the alarm going off all the lights in my house (what I set it for) turned on and we both got notification alerts from SHM.

All I can say is try a real world test.



I’m trying to follow all this. But getting confused. I’ve got the Ecolink door/window sensor and I think I have it wired correctly, but in a normal state, it shows as ‘detected’ or ‘smoke’, but when I push the test button on the smoke detector, it goes to clear and triggers ST to alert me. So it seems the reverse is happening from what it should. I don’t understand what is meant by wiring the ‘normally closed’ wire instead of the ‘normal open’ one. There are two wires going into my Door sensor, should I reverse those? There was also a third wire coming from my relay (I think grey) that is never wired to anything, should I have used that one? I tried changing some of the code in the device handler, but nothing seems to change anything. But I really don’t know what I’m doing. Any help would be appreciated.

Okay - the first thing is which wires you are using. The only wires from the SM120 relay you should wire into the sensor are the blue and either the yellow or orange.

The blue is what’s known as the common so it has to be wired to the sensor. The yellow wire is normally closed and the orange one is normally open. What that means is when the alarm trips, the yellow wire will “open” and the orange one will “close”

The bottom line is this: if you use vseven’s device handler, you’ll need to use the working on orange wire.

Feel free to PM me or reply back here if you need more help.

BTW, I’m working on a new device handler myself where you can simply flip this via the settings for the device.

Well, I think I have a slightly different setup, because I didn’t use a SM120, mine is a BRK Brands RM4 used for First Alert.
So I don’t have those color wires you mentioned. So I might be out of luck for your help. So the only colors I have coming from the relay to the door sensor are blue, brown and a grey (not currently wired to anything). The black, white and orange wires from the relay, I had going into the wires to the smoke detector. Somewhere along this thread, someone had the color wires I had and the sensor, so I followed that picture. Hopefully I don’t have the relay reversed. I’ve even tried two different device handlers but with the same result. Both default to the ‘open’ or ‘smoke’ in a normal clear state, but when I test with the button they go to ‘closed’ or ‘no smoke’. The handler I copied for right now is MikeMaxwell (vseven had a CO2 which I don’t have).

Looking at the relay literature, it says the blue wire is normally open contact and the gray is normally closed contact. So should I change out the blue wire I have currently in the sensor for the gray one? And leave the handler alone?

I looked up that relay and the brown is supposed to be “common” and the blue is supposed to be normally open, so it looks like you have it wired right on that side, assuming you have it wired right to the smoke detector. The only thing that makes sense to me is if it’s wired backwards on the smoke detector side but it doesn’t really sound like it.

What you probably should do is meter your relay outputs and see what you have and when. In the meantime, you can use this device handler if you want. It’s based on vseven’s handler which I used initially, then built my own for a different purpose. But the advantage it has is in the preferences, there’s an input toggle. So whether you have it wired normally open or normally closed doesn’t really matter - you can just flip the toggle if you’re not getting the results you expect instead of having to rewire it.

1 Like

Thanks! I’m giving that handler a try now. Replaced with that one and it initially came on with a status of ‘detected’. So then I went into the ‘gear’ on the device and found the toggle, I switched the toggle but it is still showing ‘detected’. Surprised me when the toggle didn’t seem to do anything. Not sure if I have to refresh anything, but I can’t test the smoke detector yet since the family is still asleep :slight_smile: .

As far as if I have something wired wrong on the smoke detector side I have the white with white, black with black and color with color, so hoping that is right.

At this point I’m getting close to just using the default door/window sensor handler and live with the open/close and just do an automation when it ‘closes’ (since normal state is open).

Thanks again,

What I’ve noticed is that after you make a change like that, you have to trip it a couple of times for it to sort of take effect and reflect the right status, even when doing it via hardware instead of in the handler. So try testing it a couple more times and see if the result flips the way you expect.

I just tested it on a contact I had sitting here so it should work, you’ll just have to trip it again for it to recognize the flip.

Sorry I didn’t mention that before - I’ve been playing around with these so much, I forgot. :slight_smile:

1 Like

Thanks for all the help…I think it is working fine now. After my first few triggers, it was still reporting reverse, so I went back in and toggled back to the original and triggered a few more times and now it works as expected. Thanks for the help!! So what is the handler you are making for this? What will it do differently than this one?


At this point, nothing. :slight_smile: What you have is perfect. Roll with it! Glad you got it working!!

I just submitted a pull request that updates these 2 device types for the newer SmartThings UI. Everything is moving this way so wanted to keep things consistent.

Accept, reject, whatever you want but thought anyone using these would appreciate the continuity.

1 Like