Help with Contact Sensor's label text (open, closed) to (armed, disarmed). Icon Type

(Michael Langkilde) #1

Okay, I connected a Fibaro window/door sensor and tried modifying it so that instead of displaying open and closed, I am using the sensor connected to my security system to its’ trigger output to know the status of being Armed and Disarmed.

I see that I could use Hello Home to change the modes when “Something opens or closes”. If I changed the text of the device type from Open, close to armed, disarmed. Will that not work because the “something opens and closes” is looking for the text open, close?

I switch the status of the contact and Hello Home does not seem to change. Thanks for any of yours’ help.

( co-founder Terry @ActionTiles; GitHub: @cosmicpuppy) #2

Hi Michael,

Can you be more specific as to what you changed? in regard to "armed / disarmed"

A SmartApp (or Hello Home Action) uses a “capability” to decide what device(s) the user can select at installation time.

Each Capability technically has strict rules for what Attributes, Attribute Values, and Commands that any Device Type that claims that Capability must provide.

For an open/close Contact Sensor, it is this Capability that is searched for and used. And these are it’s specifications – i.e., it must have an Attribute “contact” with values "open", "closed". It has no Commands.

(Michael Langkilde) #3

// for the UI
metadata {
// Automatically generated. Make future change here.
definition (name: “Z-Wave Alarm Status Input”, namespace: “smartthings”, author: “SmartThings”) {
capability "Contact Sensor"
capability "Sensor"
capability “Battery”

	fingerprint deviceId: "0x2001", inClusters: "0x30,0x80,0x84,0x70,0x85,0x86,0x72"
	fingerprint deviceId: "0x07", inClusters: "0x30"
	fingerprint deviceId: "0x0701", inClusters: "0x5E,0x86,0x72,0x98", outClusters: "0x5A,0x82"

// simulator metadata
simulator {
	// status messages
	status "Alarmed":  "command: 2001, payload: FF"
	status "Disarmed": "command: 2001, payload: 00"

// UI tile definitions
tiles {
	standardTile("contact", "", width: 2, height: 2) {
		state "Disarmed", label: '${name}', icon: "st.Home.home3", backgroundColor: "##79b821"
		state "Armed", label: '${name}', icon: "st.Home.home3", backgroundColor: "#e86d13"
    valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat") {
		state "battery", label:'${currentValue}% battery', unit:""

	main "contact"
	details(["contact", "battery"])


def parse(String description) {
def result = null
if (description.startsWith(“Err”)) {
result = createEvent(descriptionText:description)
} else {
def cmd = zwave.parse(description, [0x20: 1, 0x25: 1, 0x30: 1, 0x31: 5, 0x80: 1, 0x84: 1, 0x71: 3, 0x9C: 1])
if (cmd) {
result = zwaveEvent(cmd)
return result

def updated() {
zwave.wakeUpV1.wakeUpIntervalSet(seconds:4*3600, nodeid:zwaveHubNodeId).format(),

def sensorValueEvent(value) {
if (value) {
createEvent(name: “contact”, value: “Disarmed”, descriptionText: “$device.displayName is Disarmed”)
} else {
createEvent(name: “contact”, value: “Armed”, descriptionText: “$device.displayName is Armed”)

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd)

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd)

def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd)

def zwaveEvent(physicalgraph.zwave.commands.sensorbinaryv1.SensorBinaryReport cmd)

def zwaveEvent(physicalgraph.zwave.commands.sensoralarmv1.SensorAlarmReport cmd)

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)

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

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)


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")) {
	if(msr == "0086-0102-0059") state.sec = 1
	result << response(batteryGetCommand())



def zwaveEvent(physicalgraph.zwave.commands.securityv1.SecurityMessageEncapsulation cmd) {
def encapsulatedCommand = cmd.encapsulatedCommand([0x20: 1, 0x85: 2, 0x70: 1])
// log.debug "encapsulated: $encapsulatedCommand"
if (encapsulatedCommand) {
state.sec = 1

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

def batteryGetCommand() {
def cmd = zwave.batteryV1.batteryGet()
if (state.sec) {
cmd = zwave.securityV1.securityMessageEncapsulation().encapsulate(cmd)

def retypeBasedOnMSR() {
switch (state.MSR) {
case “0086-0002-002D”:
log.debug(“Changing device type to Z-Wave Water Sensor”)
setDeviceType(“Z-Wave Water Sensor”)
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”)



(Michael Langkilde) #4

For that I modified, forgive me for I am still slowly learning how to do programming, to be able to show on the tile the alarmed and disarmed text. For what I have done, it changes states and shows correctly. But I guess what I did, hello home does not recognized it. So what do I need to do to show on the tile armed and disarmed but still have hello home recognize it?

(Kevin Tierney) #5

What if you changed the labels to Disarmed and Armed, but left the state to match the original opened/closed

(Michael Langkilde) #6

Still does not seem to change hello home.

(Michael Langkilde) #7

Okay, I did the compare and fixed everything and used the label as you showed me and made sure the colors were correct and text and now it is working. Thanks for the help.

(Michael Langkilde) #8

How do I get my Disarmed like the Locked?

( co-founder Terry @ActionTiles; GitHub: @cosmicpuppy) #9

I’m not sure I understand what you are asking / what you mean?

Do you want the same icon? That can be changed in the Device Type code like the label.

The current setting is: icon: "st.Home.home3"

(Michael Langkilde) #10

How the text locked is closer to the bottom and has that darker green area around it.

( co-founder Terry @ActionTiles; GitHub: @cosmicpuppy) #11

This type of Icon represents an active / functional “Button” Tile

i.e., If you tap it, it will “unlock” (send an unlock command to the door), and tap it again, it will “lock”.

This type of Icon is read-only “Status” Tile, but you may find options touching the “Gear” portion.

(Michael Langkilde) #12

Okay, so no way to get the inner with a status only? If not, okay. That is fine. I just like that look of the inner how the text is.

( co-founder Terry @ActionTiles; GitHub: @cosmicpuppy) #13


That “inner” or “shadow” look to the Tile is an important feature of the User Interface to indicate that the Tile is a functional “Tap Button”, rather than a read-only “Status” Tile.