Alexa skill support for thermostats?

Not complaining about the use of development time - the last two updates have obviously represented a lot of work and were big improvements for a large fraction of the user base. But I'm wondering if there are plans (or better yet, work done) to improve the Alexa skill.

Specifically:

  • Support for thermostats, which is just about the only feature I miss from smartthings, and
  • If possible, improved responsiveness. With Hubitat, the Alexa app says "waiting for Hubitat" a lot, and takes a while (minutes) to update all the statuses when it's first launched. I had much less lag with ST, so I'm hopeful this is an optimizable area in HE rather than a more fundamental problem with Alexa/Amazon.

Any words of hope?

Something is wrong on your system. I’ve never heard waiting for Hubitat. Always responds instantly

Mine as well. Only have a few devices (4 dimmers and 2 light groups) but response is very fast. Never heard that message. I find the skill very easy to use. Once new device is added to Alexa devices it shows up on Alexa immediately, no discovery needed after original Alexa linking.

I've had it happen, but only when doing something in app. With voice control, it rarely times out.

1 Like

Ah, sorry @sesummers, it didn’t read your post correctly. It sounds like you’re using the Alexa app as a kind of Dashboard? That’s Amazon’s issue. Both instances are running on Amazon servers. They should not be slow, but a lot of stuff it. It’s not just Hubitat. The Alexa app is garbage. Hubitat Dashboard will work much better for that type of control.

Possibly, or it may be quantity of devices, or having two Lutron hubs. I have 70+ devices, most of them Caseta dimmers, in 25 (overlapping) groups. But I didn't add that many when I upgraded to HE from ST, and it slowed down a LOT. It went from showing the status of all of the devices after just a few seconds with ST, to taking at least a couple minutes before all the devices' statuses are shown, if ever. Sometimes devices will just show "Device is unresponsive" and not show status at all. But if I select the device and turn it on, it will work, and then start showing the status. I didn't have that problem with ST either.

Bottom line is that while I agree that "The Alexa app is garbage", it is a pretty decent dashboard app, even with its problems, and I need Alexa for voice control so it makes sense to use it as a dashboard too. But it would be nice if I could ask it the thermostat setting and tell it to raise it two degrees, again.

Using ST as a barometer isn't a good thing as Alexa to ST is a cloud-to-cliud integration. On HE, we have to factor in our upstream speed PLUS any latency our ISPs might introduce. Plus, if HE is using cloud-to-cloud with Alexa (which is what I suspect), they still need to query our local hubs for device status and such.

There's more than a few questions here.

1 Like

Same here! Alexa bugs a lot since I've migrated to Hubitat. But, to correct you, ST did too, the bugs are just different.

Have you also seen the issue below?

  • It'll say "device_name" is not responding, but still send effectively the command through (or not, depends).

In the mean time, regarding thermostats, I wrote a small app that allows to set temperature with a dimmer. It's not perfect but if you name it properly, it should work. I also use RM to raise or lower temperature based on a virtual temporary switch (the same one that I use to adjust temperature with a dimmer; it works both as a temporary switch and a dimmer). RM recognize it changed state (from "idle" to "on" or "off") and if "on" then raise temp, if off lower temp.

The app that allows you to use a dimmer is below:

definition(
    name: "Adjust Thermostat With Dimmer",
    namespace: "elfege",
    author: "ELFEGE",

    description: """Adjust a thermostat's set point from a dimmer level -""",

    category: "Green Living",
    iconUrl: "https://www.philonyc.com/assets/penrose.jpg",
    iconX2Url: "https://www.philonyc.com/assets/penrose.jpg",
    iconX3Url: "https://www.philonyc.com/assets/penrose.jpg", 
    image: "https://www.philonyc.com/assets/penrose.jpg"
)

preferences {

    page name: "MainPage"

}
def MainPage(){
    def pageProperties = [
        name:       "MainPage",
        title:      "MainPage",
        nextPage:   null,
        install:    true,
        uninstall:  true
    ]

    return dynamicPage(pageProperties) {

        section("")
        {
            input(name: "Thermostat", type: "capability.thermostat", title: "select a thermostat", required: true, multiple: true, description: null, submitOnChange:true)           
            input(name: "dimmer", type: "capability.switchLevel", title: "Select a dimmer", required:true, submitOnChange:true)
            input(name: "outside", type: "capability.temperatureMeasurement", title: "Select a weather station to get outside temperature", required:false, submitOnChange:true)

            if(!outside)
            {
                paragraph "NOTE: $Thermostat won't be adjusted when it's off if you do not select an outside temperature measurement"
            }
        }


        section([mobileOnly:true]) {
            label title: "Assign a name", required: false
            mode title: "Set for specific mode(s)", required: false, uninstall: true
        }
    }
}
def installed() {
    log.debug "Installed with settings: ${settings}"
    initialize()
}

def updated() {
    log.debug "updated with settings: ${settings}"
    unsubscribe()
    unschedule()
    initialize()
}

def initialize() {

    subscribe(dimmer, "level", dimmerHandler)
    subscribe(Thermostat, "temperature", thermostatHandler)
    //subscribe(location, "mode", ChangedModeHandler)	

    log.debug "initialization ok"

}

def dimmerHandler(evt)
{
    log.debug "$evt.device set to $evt.value"


    int s = Thermostat.size()
    int i = 0

    for(s>0;i<s;i++)
    {
        def ThermCurrMode = Thermostat[i].currentValue("thermostatMode")

        if(ThermCurrMode == "cool")
        {
            Thermostat[i].setCoolingSetpoint(evt.value)
            log.debug "${Thermostat[i]}'s cooling set point set to $evt.value 6e4f"
        }
        else if(ThermCurrMode == "heat")
        {
            Thermostat[i].setHeatingSetpoint(evt.value)
            log.debug "${Thermostat[i]}'s heating set point set to $evt.value 6e4f"
        }
        else if(ThermCurrMode == "auto")
        {
            if(outside)
            {
                def outsideTemp = outside?.currentValue("temperature")

                if(outsideTemp > 60)
                {
                    Thermostat[i].setCoolingSetpoint(evt.value)
                    log.debug "${Thermostat[i]}'s cooling set point set to $evt.value 8e7f"
                }
                else 
                {
                    Thermostat[i].setHeatingSetpoint(evt.value)
                    log.debug "${Thermostat[i]}'s heating set point set to $evt.value 8e7f"
                }

            }
            else 
            {
                def h = evt.value.toInteger() + 2
                def c = evt.value.toInteger() - 2
                Thermostat[i].setCoolingSetpoint(c)
                log.debug "${Thermostat[i]}'s cooling set point set to $evt.value 4f5e"
                Thermostat[i].setHeatingSetpoint(h)
                log.debug "${Thermostat[i]}'s heating set point set to $evt.value 4f5e"
            }
        }
        else if(ThermCurrMode == "off")
        {
            def outsideTemp = outside?.currentValue("temperature")

            if(outside)
            {
                if(outsideTemp > 60)
                {                     
                    Thermostat[i].setThermostatMode("cool")
                    Thermostat[i].setCoolingSetpoint(evt.value)
                    log.debug "${Thermostat[i]}'s cooling set point set to $evt.value 4e5f"

                }
                else 
                {
                    Thermostat[i].setThermostatMode("heat")
                    //log.debug "pausing execution waiting for ${Thermostat[i]}"
                    //pauseExecution(4000)
                    Thermostat[i].setHeatingSetpoint(evt.value)
                    log.debug "${Thermostat[i]}'s heating set point set to $evt.value 4e5f"
                }
            }
        }

    }
}
3 Likes

Found this because I was trying to achieve the Alexa -> dimmer -> thermostat result with RM4.0, but for the life of me I cannot figure out how to pull the value of the the dimmer device to either set the thermostat directly or put into a global variable. This little applet looks more promising. :slight_smile:

Great! Let me know how this applet works for you.

Actually, I couldn't get it to work. I tried modifying the code a bit but kept running into syntax and runtime errors.

RM doesn't seem capable of this either, but I'll keep playing with it.

New here, wanted to say thank you! Worked great. For the newbies (and not sure if this is how it's intended to work), I had to create a virtual dimmer (called Thermostat), then used the app with the thermostat pointed to my thermostat and the dimmer pointed to the virtual dimmer called Thermostat, shared the virtual dimmer with the Alexa skill, and it works like a charm.

You can also let Alexa set cool/heat mode and turn the thermostat off by creating virtual switched (called AC and Heat), and creating rules, for example trigger event AC virtual switch turns on, action to run Thermostat to mode cool.

I'd like to do something like this to support setting my water heater temp as well, but the problem there is the values I want are all over 100 where a virtual dimmer maxes out.
Anybody know of another device type that uses a suitable scale?

You can modify a code that converts the level value (0-100) to whatever scale you need using a linear equation.

Which water heater do you have, a Rheem? Hybrid or otherwise?

Do you want a couple temperatures, or fine control? With just a couple temps, you probably could use a virtual switch. One switch for High and one for Low setting. You could even name them water heater 130 degrees or whatever if you wanted to.

From there it would be a matter of setting a rule that if virtual switch XYZ "changes", then set water heater to 130 degrees or whatever.

You probably could do as many virtual switches as you could remember the name for.

Yeah it's a rheem tankless. I was hoping to be able to call the temp out by number, like, "alexa set the hot water to 120".

I don't think the linear equation method would work in that case because alexa won't accept anything over 100 as an input value so I'd have to remember what the sub-100 numbers correspond to.

The lame thing is there's an rheem skill for alexa that does everything I want, but I can't get it to work for more than a few hours at a time without having to disable then re-enable it. After a couple of hours it just says, "sorry something is wrong. Try disabling and re-enabling the skill".

It's been broken like this for almost 2 years so it seems unlikely that rheem is going to fix it. Software is garbage.

If it won't take numbers higher than 100, just subtract the 100. Instead of 120, you would just say set to 20. :smiley:

I don't think that naming a virtual switch method will limit you by number though. The switch itself would be named water heater 120. The command would be slightly different, rather than "set to 120", you would say "turn on water heater 120".

Even if you had to do 5 virtual switches( 115 through 135 with 5 degree increments for example), it shouldn't be that bad. Clone the rules, and just change the setpoint.

Forgot to add, yea that has been broken forever. I thought it was just me or something I was doing wrong, but apparently not. I can get the app to pair and it looks like it is connected, but the voice control gives the same error you see. I even deleted and re-added the skill with no change.

I've actually been thinking about how I can automate disabling/enabling the f*cking skill every hour.

After reading up on other people having a similar experience to what I was having with the econet skill with their sonos skill, I decided to try one of their solutions, which was to disable the skill, delete all devices in alexa, rediscover all devices, then re-add the skill.

We'll see if that works, but in the meantime I lost EVERY SINGLE group and routine I had in alexa. This is something like 50+ groups and routines. The routines are actually still there but all of the actions are gone so they all have to be redone. That's only going to take hours poking at my god damn phone, since you can't even program routines from the web interface.

What sort of idiot designs a platform that encourages users to program it and then provides no facility for backing up or versioning that users's work? F*CK YOU AMAZON.