Using Contact and Motion Sensors to Trigger Alexa Routines (DTH in post 97) (Official Amazon Feature)

Simulated Switches and Contacts did not work for me, but the uDTH Universal Device Type did work if I removed the Lock and Door capabilities. Maybe @Mike_Maxwell can create a uDTHlite version that does not have these features so they can be used by Alexa.

If Alexa can see a simulated temperature device then you can average out those two temps in webCoRE and send it to to the virtual temp device. I am not home to test it.

Is this actually working in the UK or is it US only at the moment?

All my devices are showing up in the Alexa app (I can ask her for the temperatures of my contact sensors etc) but I can’t create any routines with a device:

I’m running iOS with all the latest app updates etc


This would just compound the problem as there would then be three temperature reporting devices in the bedroom.

I’m not sure about the UK, but I’m in the US and had the same experience as you did. If you can see your sensors in Alexa’s smart home devices, but don’t see the option to use sensors in the routines, try signing out of the Alexa app and signing back in. (Restarting the phone, or killing the app doesn’t help.)


I combined two device handlers into one, so that the device can be triggered like a switch (I used it to turn the switch on when I arrive home, and off when I leave), but is also recognized in alexa as a contact sensor so that it can trigger an alexa routine. I only put this together as a proof of concept, so the code can probably be cleaned up, but it appears to be working.

The two device handlers I combined were the simulated switch:

and joshualyon’s simulated contact sensor:


 *  Copyright 2015 SmartThings
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 *  in compliance with the License. You may obtain a copy of the License at:
 *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
 *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
 *  for the specific language governing permissions and limitations under the License.
metadata {

    definition (name: "Alexa Switch", namespace: "bjpierron", author: "bjpierron", runLocally: false, mnmn: "SmartThings", vid: "generic-switch") {
        capability "Switch"
        capability "Relay Switch"
        capability "Sensor"
        capability "Actuator"
        capability "Health Check"
        capability "Contact Sensor"

        command    "markDeviceOnline"
        command    "markDeviceOffline"
    simulator {
		status "open": "contact:open"
		status "closed": "contact:closed"

    tiles {
        standardTile("switch", "device.switch", width: 2, height: 2, canChangeIcon: true) {
            state "off", label: '${currentValue}', action: "switch.on", icon: "", backgroundColor: "#ffffff"
            state "on", label: '${currentValue}', action: "", icon: "st.switches.switch.on", backgroundColor: "#00A0DC"
        standardTile("deviceHealthControl", "device.healthStatus", decoration: "flat", width: 1, height: 1, inactiveLabel: false) {
            state "online",  label: "ONLINE", backgroundColor: "#00A0DC", action: "markDeviceOffline", icon: "st.Health & Wellness.health9", nextState: "goingOffline", defaultState: true
            state "offline", label: "OFFLINE", backgroundColor: "#E86D13", action: "markDeviceOnline", icon: "st.Health & Wellness.health9", nextState: "goingOnline"
            state "goingOnline", label: "Going ONLINE", backgroundColor: "#FFFFFF", icon: "st.Health & Wellness.health9"
            state "goingOffline", label: "Going OFFLINE", backgroundColor: "#FFFFFF", icon: "st.Health & Wellness.health9"
        main "switch"

def installed() {
    log.trace "Executing 'installed'"

def updated() {
    log.trace "Executing 'updated'"

def markDeviceOnline() {

def markDeviceOffline() {

private setDeviceHealth(String healthState) {
    log.debug("healthStatus: ${device.currentValue('healthStatus')}; DeviceWatch-DeviceStatus: ${device.currentValue('DeviceWatch-DeviceStatus')}")
    // ensure healthState is valid
    List validHealthStates = ["online", "offline"]
    healthState = validHealthStates.contains(healthState) ? healthState : device.currentValue("healthStatus")
    // set the healthState
    sendEvent(name: "DeviceWatch-DeviceStatus", value: healthState)
    sendEvent(name: "healthStatus", value: healthState)

private initialize() {
    log.trace "Executing 'initialize'"
    sendEvent(name: "DeviceWatch-Enroll", value: [protocol: "cloud", scheme:"untracked"].encodeAsJson(), displayed: false)

def parse(description) {

def on() {
    log.debug "$version on()"
    sendEvent(name: "switch", value: "on")
    sendEvent(name: "contact", value: "open")

def off() {
    log.debug "$version off()"
    sendEvent(name: "switch", value: "off")
    sendEvent(name: "contact", value: "closed")

private getVersion() {

How do you tell webCoRE to ‘open virtual contact’. I’m trying to create this in the webCoRE inside of my smartthings app.

What I want to do is: If a switch is turned “on”, then change the virtual contact to “open”.

I get all the way through, but there is no option to set the state of the virtual contact to “open”.

The last step = Using ‘Virtual Contact Sensor 01’… Add a Task… but there is nothing in the task list to set the state to “open”.

I’ve searched over on webCoRE and found nothing.

Any help would be greatly appreciated.

Check the device handler you’re using in the ide. Mine has close and open as available actions/command.


1 Like

Thank you! I had ‘Contact Sensor’ selected, instead of Simulated.

It’s working now.

Thank you!!


Thanks for the suggestion, didnt work for me sadly. Maybe this is US only at the moment then.

I have the same as you, in the UK, sensors recognised and able to query their state, but no option to include them in routines.

The app has updated twice in the last week, but that particular ability hasn’t…

Glad it’s not just me then, thought I was going mad.

Roll on an update, think this will be quite useful

It’s good to see improvements in Alexa, but the thought of creating a Simulated Switch for each and every canned response sounds like we currently only have two choices :

  • Make the phrases simplistic, or
  • Make a TON of SimSwitches.

For example, if I wanted Alexa to announce this statement (with 5 variables):

The time is 4:00 P.M . It’s 79 degrees and Partly Cloudy outdoors.
Tonight’s low is 50 degrees. It is a comfortable 73 degrees inside.

it would require over one billion SimSwitches to cover all possible announcements.
(1440 * 68 * 20 * 38 * 14 = 1,041,868,800)

I think I will stick with this method to get total freedom in my announcements. (and only one line of code in webCoRE)

I’m sure Amazon will continue to add new features in the future.

Meanwhile, you can already include a weather report in a routine if you want to. It may not be exactly the format that you prefer, but it will be a lot easier than custom code. :sunglasses:

I’ve done a lot of testing over the last few days. Alexa only seems to detect actual Motion Sensors at the moment. Simulated anything doesn’t work. Actual Contact Sensors do not work.

I’m awaiting the updates to this feature…

My actual contact sensors (visonic MCT-340 running SmartSense Open-Close DTH) are working reliably in Alexa.

Edited to add: Alexa is successfully announcing my garage door opening with my ST multi-purpose sensor set to tilt, too.

I’ve got the new SmartThings Multipurpose Sensors, and Alexa is not catching the ‘open’ command.

Right now, I have the larger piece on the wall, and the magnet piece on the garage door.

Is that backwards?

shouldn’t matter. are the open/close events being logged properly in the device history?