When are "Hard Wired" Smoke detectors going to be supported by Smart Things

You can integrate indirectly with IFTTT. Leeo sends an SMS and a call. IFTTT can read the SMS and activate actions in SmartThings: Switch on, Switch off, Lock, Unlock, Activate siren/strobe, Deactivate siren/strobe.

But then, its all cloud based, delays can happen, and you dont want that if it’s an actual fire. If IFTTT were instantaneous, that would be different.

Or if it’s the router that caught fire…? Then what. :smile:

First Alert has a Zcombo tht would be great if they were hardwired. … But they do have some WiFi enabled hardwired ones now

I think the First Alert One Link Wifi should be the one they get to support. Shouldn’t be too hard, it was built for this

iOS only at this point. You need an iPhone to set one up!

Halo is still awaiting UL certification. Assuming things go smoothly, reports are they’re targeting April availability. The Halo works with the ZigBee, Iris, and iControl protocols, and they’re hoping to add Apple HomeKit and Control4 as well.

One of the images in the Digital Trends article shows the night light controls (with hue, brightness and timer controls). It would be really cool if SmartThings could also control the Halo as a light.

I hope the Halo works out of the box with ST. I have 8 of them on order. However with the Roost smart battery you can connect it to ST through ifttt. So essentially you can get your hard wired smoke detectors to work with ST that is what I am using currently until my Halos ship.

I’m not sure if it has already been mentioned, but I confirmed with halo via email that it is zigbee HA 1.2 so even if it won’t connect right off the bat someone smarter than me should be able to get a device handler for it.

2 Likes

Yes, but the only thing the Smart Battery does is notify you of an alarm sounding . No real details and you would have to buy one for each smoke detector @ $35 each to distinguish which detector is going off and alarming.
It would work, but the relay on the Hardwired lead of a smoke detector would do the same …

1 Like

I still like the kidde remote Lync - no need to rip and replace existing detectors and it can tell the difference between smoke and co

Leeo announced IFTTT ability today.

people like Kidde provide a relay add-on which is triggered on the interface wire.
I’m just testing code I’ve modified for the Fibaro door/sensor to be a smoke alarm trigger for hard wired systems. The door sensor can be set to act as alarm as a smoke detector (or various other types of alarms). Parameter 5 in instructions.

It works fine and as I would expect. ST sees it as a smoke detector and not a door contact, which is good.

Just want to do some more testing with temperature probe as I think it might also be possible to trigger on rapid heat rise. (but not sure)

Will post in next two weeks.

This is the code I ended up getting to work for me. Took a few hours to finally get it to work perfectly, but it does. Reads as a smoke detector, shows up in the SHM, and works every time I test it. I’m more than happy with this fix. Sure is better than rewiring a whole houses worth of detectors. Cheap too.

/**

  • Z-Wave Door/Window Sensor
  • Author: SmartThings
  • Date: 2013-11-3
    */

// for the UI
metadata {
// Automatically generated. Make future change here.
definition (name: “Monoprice Door/Window Sensor as Smoke Detector v2”, namespace: “trostc”, author: “trostc”) {
//capability "Contact Sensor"
capability "Smoke Detector"
capability "Sensor"
capability “Battery”
//0 0 0x2001 0 0 0 7 0x71 0x85 0x80 0x72 0x30 0x86 0x84
fingerprint deviceId: “0x2001”, inClusters: “0x71, 0x85, 0x80, 0x72, 0x30, 0x86, 0x84”
}

// simulator metadata
simulator {
// status messages
status “clear”: "command: 2001, payload: FF"
status “detected”: “command: 2001, payload: 00”
}

// UI tile definitions
tiles(scale: 2) {
multiAttributeTile(name:“smoke”, type: “lighting”, width: 6, height: 4){
tileAttribute (“device.smoke”, key: “PRIMARY_CONTROL”) {
attributeState “clear”, label:’${name}’, icon:“st.alarm.smoke.clear”, backgroundColor:"#79b821"
attributeState “detected”, label:’${name}’, icon:“st.particulate.particulate.particulate”, backgroundColor:"#ff1f1f"
}
}

	valueTile("battery", "device.battery", inactiveLabel: false, width: 2, height: 2) {
		state "battery", label:'${currentValue}% battery', unit:""
	}

	standardTile("refresh", "device.refresh", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
		state "default", action:"refresh.refresh", icon:"st.secondary.refresh"
	}

	main "smoke"
	details(["smoke","battery","refresh"])

}

}

def parse(String description) {
log.debug "parse:${description}"
def result = null
if (description.startsWith(“Err”)) {
result = createEvent(descriptionText:description)
} else if (description == “updated”) {
if (!state.MSR) {
result = [
response(zwave.wakeUpV1.wakeUpIntervalSet(seconds:4*3600, nodeid:zwaveHubNodeId)),
response(zwave.manufacturerSpecificV2.manufacturerSpecificGet()),
]
}
} else {
def cmd = zwave.parse(description, [0x20: 1, 0x25: 1, 0x30: 1, 0x31: 5, 0x80: 1, 0x84: 1, 0x71: 3, 0x9C: 1])
log.debug "parse:cmd = ${cmd}"
if (cmd) {
result = zwaveEvent(cmd)
}
}
return result
}

def sensorValueEvent(value) {
log.debug "sensorValueEvent:value = ${value}"
def result = null
if (value) {
result = createEvent(name: “smoke”, value: “clear”, descriptionText: “$device.displayName smoke is clear”)
} else {
result = createEvent(name: “smoke”, value: “detected”, descriptionText: “$device.displayName detected smoke”)
}
return result
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd)
{
sensorValueEvent(cmd.value)
}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd)
{
sensorValueEvent(cmd.value)
}

def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd)
{
sensorValueEvent(cmd.value)
}

def zwaveEvent(physicalgraph.zwave.commands.sensorbinaryv1.SensorBinaryReport cmd)
{
sensorValueEvent(cmd.sensorValue)
}

def zwaveEvent(physicalgraph.zwave.commands.sensoralarmv1.SensorAlarmReport cmd)
{
sensorValueEvent(cmd.sensorState)
}

def zwaveEvent(physicalgraph.zwave.commands.notificationv3.NotificationReport cmd)
{
def result = []
if (cmd.notificationType == 0x06 && cmd.event == 0x16) {
result << sensorValueEvent(1)
} else if (cmd.notificationType == 0x06 && cmd.event == 0x17) {
result << sensorValueEvent(0)
} else if (cmd.notificationType == 0x07) {
if (cmd.v1AlarmType == 0x07) { // special case for nonstandard messages from Monoprice door/window sensors
result << sensorValueEvent(cmd.v1AlarmLevel)
} else if (cmd.event == 0x01 || cmd.event == 0x02) {
result << sensorValueEvent(1)
} else if (cmd.event == 0x03) {
result << createEvent(descriptionText: “$device.displayName covering was removed”, isStateChange: true)
result << response(zwave.wakeUpV1.wakeUpIntervalSet(seconds:4*3600, nodeid:zwaveHubNodeId))
if(!state.MSR) result << response(zwave.manufacturerSpecificV2.manufacturerSpecificGet())
} else if (cmd.event == 0x05 || cmd.event == 0x06) {
result << createEvent(descriptionText: “$device.displayName detected glass breakage”, isStateChange: true)
} else if (cmd.event == 0x07) {
if(!state.MSR) result << response(zwave.manufacturerSpecificV2.manufacturerSpecificGet())
result << createEvent(name: “motion”, value: “active”, descriptionText:"$device.displayName detected motion")
}
} else if (cmd.notificationType) {
def text = “Notification $cmd.notificationType: event ${([cmd.event] + cmd.eventParameter).join(”, ")}"
result << createEvent(name: “notification$cmd.notificationType”, value: “$cmd.event”, descriptionText: text, displayed: false)
} else {
def value = cmd.v1AlarmLevel == 255 ? “active” : cmd.v1AlarmLevel ?: "inactive"
result << createEvent(name: “alarm $cmd.v1AlarmType”, value: value, displayed: false)
}
result
}

def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd)
{
def result = [createEvent(descriptionText: “${device.displayName} woke up”, isStateChange: false)]
if (!state.lastbat || (new Date().time) - state.lastbat > 5360601000) {
result << response(zwave.batteryV1.batteryGet())
result << response(“delay 1200”)
}
if (!state.MSR) {
result << response(zwave.wakeUpV1.wakeUpIntervalSet(seconds:4
3600, nodeid:zwaveHubNodeId))
result << response(zwave.manufacturerSpecificV2.manufacturerSpecificGet())
result << response(“delay 1200”)
}
result << response(zwave.wakeUpV1.wakeUpNoMoreInformation())
result
}

def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
def map = [ name: “battery”, unit: “%” ]
if (cmd.batteryLevel == 0xFF) {
map.value = 1
map.descriptionText = "${device.displayName} has a low battery"
map.isStateChange = true
} else {
map.value = cmd.batteryLevel
}
state.lastbat = new Date().time
[createEvent(map), response(zwave.wakeUpV1.wakeUpNoMoreInformation())]
}

def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
def result = []

def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId)
log.debug "msr: $msr"
updateDataValue(“MSR”, msr)

retypeBasedOnMSR()

result << createEvent(descriptionText: “$device.displayName MSR: $msr”, isStateChange: false)

if (msr == “011A-0601-0901”) { // Enerwave motion doesn’t always get the associationSet that the hub sends on join
result << response(zwave.associationV1.associationSet(groupingIdentifier:1, nodeId:zwaveHubNodeId))
} else if (!device.currentState(“battery”)) {
result << response(zwave.batteryV1.batteryGet())
}

result

}

def zwaveEvent(physicalgraph.zwave.Command cmd) {
createEvent(descriptionText: “$device.displayName: $cmd”, displayed: false)
}

def retypeBasedOnMSR() {
switch (state.MSR) {
case “0086-0002-002D”:
log.debug(“Changing device type to Z-Wave Water Sensor”)
setDeviceType(“Z-Wave Water Sensor”)
break
case “011F-0001-0001”: // Schlage motion
case “014A-0001-0001”: // Ecolink motion
case “0060-0001-0002”: // Everspring SP814
case “0060-0001-0003”: // Everspring HSP02
case “011A-0601-0901”: // Enerwave ZWN-BPC
log.debug(“Changing device type to Z-Wave Motion Sensor”)
setDeviceType(“Z-Wave Motion Sensor”)
break

}

}

mine works fine too.
so that is two sensors now working.

forgot to say…

with Kidde smoke detectors in the UK you need to use the smk23ru
http://www.kiddesafetyeurope.co.uk/Documents/DS_SMK23U_SMK23RU_2015.pdf

in the USA I guess it is this relay…

you wire the relay to the door sensor which has the external triggers and use the code above depending on your choice of door sensor.

On the Fibaro you can add the temperature sensor and this also works. What I haven’t looked at it rapid increase in temperature causing an alarm… but then a thermometer like this is not meant to be a heat sensing alarm so I don’t want to enter that territory and set people up with false expectations!
So all the Fibaro will do is tell you how hot it is and if necessary that it is very hot in the room!!!

FYI, the RemoteLyncs are on sale at Home Depot for $59, down from $99. They also have a review of 3.2 out of 5. Personally I have 2 Leeo’s, and really like them. I use IFTTT with them to tell me the current forecast. They are $50 at Best Buy.

Not to dig up a dead horse, but what’s everyone doing in regards to wire smoke detectors? I’m in the middle of a major renovation and will be adding smoke detectors to my house. It looks like the most feasible option is the Nest Protect wired version. Has anyone come up with something better or more tightly integrated to ST?

Cheers!

This is still not available in my area and there is no current ST integration but there is now a wired ZigBee smoke detector available. Halo and Halo+. Only a matter of time before someone creates a DTH. Maybe I’ll give it a try if I have the time.

So it looks like my Lowe’s has the hardwired version of the Halo for $129. I’ve got a $50 off $250 coupon so it would bring them down to $105 each. Tempting…

I’m assuming that the Nest Protect integrates into ST via an API and does not actually support zigbee or zwave?

Nest Protect uses Thread (similar to ZigBee IP) which is not compatible with ST. However they do have an API and a DTH has been written to support it. I do believe that some of the Nest Protect features (such as motion detection) are blocked from the API.

It does also appear that you can use Halo with other wired smoke detectors unlike Nest (i.e. one goes off they all do) but if you want ST integration today I would go with Nest

2 Likes

There are some work around ways to integrate the Halo. If you were to use a roost battery which has an Ifttt channel then what you could do is when the roost detects that the Halo has gone off it could trigger lights such as the lifx to flash red or orange. The Halo is not only a smoke detector but also carbon monoxide. I know that Halo has plans to integrate with different platforms. It currently is integrated with Lowes Iris. However I think something as critical as smoke detection should be left as a sand alone platform given the history with ST.