Google Home not Setting Thermostat Temp

Thanks for the tip. Can you guide me on how to do that in RM? PM if you want so we don't derail this topic too much. I took a quick look this morning before work, but couldn't find anything about that.

I will definitely look in to the logs.

Thanks!

You bet. After I'm home from work I'll show you how I do it. Would be the same as how I refresh Life 360 every 5 minutes (I think).

1 Like

So a couple of things I have found:

  1. No updates are sent with temperature changes. This is confirmed watching the log.
  2. I was playing around with refresh. Here's the weird thing. If I go and change the the temperature, say to 84 directly at the thermostat, and I hit refresh in HE, it reverts back to 76 on the thermostat, which I believe is the temp in the schedule on the thermostat.

I forgot about this the other day...

Here is my TRIGGER based RM rule to refresh Life 360. Same could be done for your refresh. Obviously you would change the action to refresh, instead of push button.

I would still encourage you to submit this to support, though, and work through the root cause.

Thanks. I'll play with it more, but you're right, something more underlying is happening. Actually, it might be simple as the thermostat doesn't send updates.

Ok something more interesting is installed this driver: [Port] Enhanced Z-Wave Thermostat (CT-100 w/ Humidity and Time Update)

Now what happens is I can Poll the thermostat under HE and get all the correct information, and it leaves the set temperature and what I manually input on the thermostat, but when I go over to Google home, it doesn't display the correct temperature, and it doesn't update the Thermostat.

I'm still very new to HE, 3 weeks in, having transitioned from IRIS to ST for a month then HE. One of the main issues I had with both ST, and now HE involves the CT101 and the Google home devices I added. It the CT101 is in Auto mode instead of Heat or Cool, all bets are off on how the google home app sees the thermostat, and what will happen if you tell google to set a temperature. It may change the cooling set point, the heating set point, or change nothing at all, and what it will change it to may or may not have anything to do with the value you told it to change to. Having a wife that really likes using google to control things is at the age where a comfortable temperature changes on an daily, if not hourly basis, I make sure to always have the thermostat in a specific heat or cooling mode rather than auto even though it's that time of year when it changes day to day as to which mode I need.

Probably not related to your issues, but it's worth checking to see if you only have issues when trying to use google with the thermostat set to Auto.

I'm not running auto, only specific heat or cool mode. The issue is that the stat doesn't appear to be sending updates to HE. If I do a refresh it resets the temperature to what I think is the schedule on the stat

I'm not going to look through the code, as I don't have one of these thermostats. But from my experience integrating the GoControl thermostat with Hubitat and Google Home, here are a few thoughts.

Does whatever driver you are using have the "thermostatSetpoint" and "lastRunningMode" variables properly implemented? Both of those are needed for a HE driver to integrate with with Google Home in Hubitat - per the HE developers. I know I had to add them to my Enhanced GoControl driver to make GH integration work.

Also, make sure that the thermostat/driver can handle GH sending back setpoints with a decimal (happens a lot if you use the "slider circle" to adjust temperature setpoint on the GH side) - some thermostats can handle decimal setpoints when in Fahrenheit mode, and some can not. For the ones that can not you have to round/massage the setpoint in the driver to a whole number before sending it to the thermostat.

Here is how I handled that part in my driver:

def p = (state.precision == null) ? 0 : state.precision

if (p==0) {
degrees2 = Math.rint(degrees)
} else {
degrees2 = (Double)degrees
degrees2 = degrees2.round(p)
}

For lastRunningMode I did something like this:

def tos = getDataValue("thermostatOperatingState")
def tm = getDataValue("thermostatMode")
def lrm = getDataValue("lastRunningMode")

if (lrm == null) {
if (tm == "cool") {
updateDataValue("lastRunningMode", "cool")
lrm = "cool"
} else {
if (tm == "heat") {
updateDataValue("lastRunningMode", "heat")
lrm = "heat"
} else {
if (tm == "auto") {
updateDataValue("lastRunningMode", "heat")
lrm = "heat"
}
}
}
}

I don't know how to look in to the stock driver for the CT101. There are no issues with GH working with it. It works perfect. The issue is there is no refresh or updates coming from the thermostat. But if I manually refresh from HE, it resets the temperature to the schedule.

Here is a copy of the log from a refresh. It shows the the cooing temp is set at correctly, but after the refresh, it resets the temp, in this case, back to 76.

dev:1612019-05-05 01:35:12.957 pm infoThermostat fan is auto

dev:1612019-05-05 01:35:12.950 pm debugcmd:ThermostatFanModeReport(fanMode:0), desc:zw device: 08, command: 4403, payload: 00 , isMulticast: false

dev:1612019-05-05 01:35:12.068 pm infoThermostat mode is cool

dev:1612019-05-05 01:35:12.062 pm debugcmd:ThermostatModeReport(mode:2), desc:zw device: 08, command: 4003, payload: 02 , isMulticast: false

dev:1612019-05-05 01:35:11.248 pm infoThermostat is idle

dev:1612019-05-05 01:35:11.244 pm debugcmd:ThermostatOperatingStateReport(operatingState:0), desc:zw device: 08, command: 4203, payload: 00 , isMulticast: false

dev:1612019-05-05 01:35:10.473 pm infoThermostat thermostatSetpoint was set to 78°F

dev:1612019-05-05 01:35:10.468 pm infoThermostat coolingSetpoint was set to 78°F

dev:1612019-05-05 01:35:10.431 pm debugcmd:ThermostatSetpointReport(setpointType:2, precision:0, scale:1, size:1, value:[78], scaledValue:78), desc:zw device: 08, command: 4303, payload: 02 09 4E , isMulticast: false

dev:1612019-05-05 01:35:09.662 pm debugcmd:ThermostatSetpointReport(setpointType:1, precision:0, scale:1, size:1, value:[69], scaledValue:69), desc:zw device: 08, command: 4303, payload: 01 09 45 , isMulticast: false

dev:1612019-05-05 01:35:08.938 pm infoThermostat temperature is 73.0°F

dev:1612019-05-05 01:35:08.916 pm debugcmd:SensorMultilevelReport(precision:1, scale:1, sensorType:1, sensorValue:[2, 218], size:2, scaledSensorValue:73.0), desc:zw device: 08, command: 3105, payload: 01 2A 02 DA , isMulticast: false

dev:1612019-05-05 01:35:08.878 pm infoThermostat temperature is 73.0°F

dev:1612019-05-05 01:35:08.858 pm debugcmd:SensorMultilevelReport(precision:1, scale:1, sensorType:1, sensorValue:[2, 218], size:2, scaledSensorValue:73.0), desc:zw device: 08, command: 3105, payload: 01 2A 02 DA , isMulticast: false

dev:1612019-05-05 01:35:07.902 pm inforefresh...

Update with the CT101 Driver:

So I discovered 2 things: 1) The thermostat would not send updates to HE and 2) If I manually changed the temperature at the thermostat, whenever I'd use refresh the thermostat would revert back to the scheduled temp.

My next step. The thermostat has a "Simple Mode". Basically in this mode, the thermostat becomes "dumb" and ignores the schedule. Here's where things get weird. When I put the stat in "Simple" mode, if I make a change at the stat it IMMEDIATELY sends the update to HE. So no need to refresh it. One step closer. If I do happen to hit refresh, everything remains as it should. Now we're on to something.

So my final resolve: I'm keeping the stat dumb and running the schedules through the HE scheduler. Something has to be wonky with the stat, but I have it running just fine now and have the ability to use Google Home and Home Hub with stat.

i have 2 sleepy z-wave trvs, they worked in GH when i was on smartthingings, ive moved them over with the driver, and they work in HE fine, but when i 'tick' them for google home intergration, clcik done, they dont get added, going back to google intergration they have become unticked.

reading above i have - createEvent(name: "thermostatSetpoint", value: radiatorTemperature, unit: getTemperatureScale(), descriptionText:discText)
Any ideas -

could the data be stored and accessed by googl;e using an attribute and send event?

You just need to include the update line when your driver first loads (to set an initial value):
updateDataValue("lastRunningMode", "heat"):
and if you use both heat and cool, you can update it anytime you switch too.
If you add that to the initialize event, make sure to re-initialise your existing devices that are using that driver before trying to add them to Google Home again.

If it's still not working, check you've included all the attributes and commands from the Thermostat capability, and set default values on them (see docs, or see a mostly bare bones thermostat example I made that works with GH).

1 Like

Thanks for that, that's what I've been looking for

it didnt work!
found the issue, it had the capability switch as well!!!! it worked fine in ST with it

capability "Actuator"
        capability "Sensor"
		capability "Thermostat"
		capability "Battery"
		capability "Configuration"

    	command "temperatureUp"
		command "temperatureDown"
		
    	attribute "nextHeatingSetpoint", "number"
        attribute "lastseen", "string"
        attribute "lastRunningMode", "string"

and

sendEvent(name:"minHeatingSetpoint", value: "4", unit: "°C", displayed: false)
	sendEvent(name:"maxHeatingSetpoint", value: "28", unit: "°C", displayed: false)
    
    sendEvent(name: "supportedThermostatFanModes", value: ["off"], isStateChange: true)
    sendEvent(name: "thermostatFanMode", value: "off", isStateChange: true)
    
    sendEvent(name: "supportedThermostatModes", value: ["off", "heat"] , isStateChange: true)

with a

updateDataValue("lastRunningMode", "cool") or heat

dont know what is the minimum but thats what i have and works. The popp dosnt report temp so im faking it with the setpoint

Hi @mark.cockcroft, is your drive still working with google home? I tried to do exactly what you wrote but I can't get my driver to integrate with google home :frowning:

Yea its working fine
Try this driver for inspiration
Not sure what GH wants but its working
https://raw.githubusercontent.com/Mark-C-uk/Hubitat/master/Danfoss%20Living%20Connect%20and%20POPP%20Radiator%20Thermostat

Thanks for your reply! I tried but it didn't work. I tried to add your code (same capabilities and attributes). Removed my thermostat and re-added but it didn't work. Tried with both options below:
updateDataValue("lastRunningMode", "heat")
state.lastRunningMode = "heat"

I tried adding your driver even though I don't have your thermostat but it didn't work either (expected?). The "Virtual Thermostat" provided by Hubitat worked flowless so I don't know what is the problem now :frowning:

I don't know if it's worth mentioning but my thermostat is a child under a hub parent driver. I tried to set isComponent to false and true when creating the child but it didn't change anything.

If someone is struggling with this, this is the minimum functionally you need to make the integration work with google home:

metadata {
    definition (name: "Test Google Home Thermostat Integration", namespace: "community", author: "test") {
        capability "Actuator"
        capability "Sensor"
        capability "Temperature Measurement"
        capability "Thermostat"
		
		command "setThermoStuff"
    }
}
preferences {
}

def installed() {
    log.warn "installed..."
    initialize()
}

def updated() {
    log.info "updated..."
    initialize()
}

def uninstalled() {
    log.info "uninstalled..."
}

def initialize() {
    log.info "initialize..."
    setThermoStuff()
}

//empty funcs for thermostat capability 
def setThermoStuff() {
	sendEvent(name: "supportedThermostatFanModes", value: ["auto"], isStateChange: true)
	sendEvent(name: "supportedThermostatModes", value: ["off", "auto", "heat"] , isStateChange: true)
	sendEvent(name: "thermostatMode", value: "off", isStateChange: true)
	sendEvent(name: "thermostatFanMode", value: "auto", isStateChange: true)
	sendEvent(name: "thermostatOperatingState", value: "idle", isStateChange: true)
	sendEvent(name: "thermostatSetpoint", value: 18, isStateChange: true)
	sendEvent(name: "heatingSetpoint", value: 18, isStateChange: true)
	sendEvent(name: "coolingSetpoint", value: 30, isStateChange: true)
    sendEvent(name: "temperature", value: 20, isStateChange: true)
	updateDataValue("lastRunningMode", "heat")	
} 
def auto() {}
def cool() {}
def heat() {}
def off() {}
def fanCirculate() {}
def fanOn() {}
def fanAuto() {}
def emergencyHeat() {}
def setCoolingSetpoint(temperature) {}
def setHeatingSetpoint(temperature) {}
def setSchedule(schedule) {} 
def setThermostatFanMode(fanmode) {}
def setThermostatMode(thermostatmode) {} 
2 Likes