On the latest build 257 (Android & MACOS), I have some tiles configured for my A/C. In a prior version, when I tapped the tile, it would “Show Thermostat Controller” but now it just does nothing. I’ve tested changing it to something else like “Show Temp Slider” which works fine, so its something specific to the Thermostat Controller.
I also see this on both my androids and ios devices.
I think I may know what’s causing this - I added the capability for the Fan and Thermostat to honour the supportedThermostatFanModes
and supportedThermostatModes
- but the driver of the device is required to output the correct format string of what is described as a JSON object. I don’t think hubitat itself actually checks to ensure the output is valid, and send whatever the driver author thinks meets that requirement - as such, I might be getting some bad data/stuff and its crashing the dialog.
So… any chance you can do a raw MakerAPI dump of the device json output and send me to show me what you’re sending out of your hub for the supportedThermostatFanModes
and supportedThermostatModes
?? You might be able to show me in the Info table in hubVue, but I can’t be sure it will be readable or enough for me to fix/troubleshoot.
Here is the output from MakerAPI for the specific device
{
"id": "123",
"name": "A/C Node: ACONNECT_123",
"label": "A/C Node: ACONNECT_123",
"type": "Actron Connect AirConditioner",
"room": "03-AirCon",
"attributes": [
{
"name": "heatingSetpoint",
"currentValue": 21.5,
"dataType": "NUMBER"
},
{
"name": "thermostatFanMode",
"currentValue": "High",
"dataType": "ENUM",
"values": [
"on",
"circulate",
"auto"
]
},
{
"name": "errorCode",
"currentValue": "A2",
"dataType": "STRING"
},
{
"name": "compressorActivity",
"currentValue": 0,
"dataType": "NUMBER"
},
{
"name": "thermostatOperatingState",
"currentValue": "heating",
"dataType": "ENUM",
"values": [
"heating",
"pending cool",
"pending heat",
"vent economizer",
"idle",
"cooling",
"fan only"
]
},
{
"name": "coolingSetpoint",
"currentValue": 21.5,
"dataType": "NUMBER"
},
{
"name": "fanSpeed",
"currentValue": 2,
"dataType": "NUMBER"
},
{
"name": "temperature",
"currentValue": 20.8,
"dataType": "NUMBER"
},
{
"name": "roomTemp_oC",
"currentValue": 20.8,
"dataType": "NUMBER"
},
{
"name": "temperature",
"currentValue": 20.8,
"dataType": "NUMBER"
},
{
"name": "switch",
"currentValue": "on",
"dataType": "ENUM",
"values": [
"on",
"off"
]
},
{
"name": "isInESP_Mode",
"currentValue": "true",
"dataType": "STRING"
},
{
"name": "supportedThermostatModes",
"currentValue": "[Auto, Heat, Cool, Fan Only, Off]",
"dataType": "JSON_OBJECT",
"values": [
"auto",
"off",
"heat",
"emergency heat",
"cool"
]
},
{
"name": "thermostatMode",
"currentValue": "heat",
"dataType": "ENUM",
"values": [
"auto",
"off",
"heat",
"emergency heat",
"cool"
]
},
{
"name": "thermostatSetpoint",
"currentValue": 21.5,
"dataType": "NUMBER"
},
{
"name": "isOn",
"currentValue": "true",
"dataType": "ENUM",
"values": [
"true",
"false"
]
},
{
"name": "lastupdate",
"currentValue": null,
"dataType": "DATE"
},
{
"name": "fanIsCont",
"currentValue": 0,
"dataType": "NUMBER"
},
{
"name": "setPoint",
"currentValue": 21.5,
"dataType": "NUMBER"
},
{
"name": "supportedThermostatFanModes",
"currentValue": "[Low, Med, High]",
"dataType": "JSON_OBJECT",
"values": [
"on",
"circulate",
"auto"
]
},
{
"name": "mode",
"currentValue": 1,
"dataType": "NUMBER"
}
],
"capabilities": [
"Initialize",
"TemperatureMeasurement",
{
"attributes": [
{
"name": "temperature",
"dataType": null
}
]
},
"Switch",
{
"attributes": [
{
"name": "switch",
"dataType": null
}
]
},
"Thermostat",
{
"attributes": [
{
"name": "temperature",
"dataType": null
},
{
"name": "heatingSetpoint",
"dataType": null
},
{
"name": "coolingSetpoint",
"dataType": null
},
{
"name": "thermostatSetpoint",
"dataType": null
},
{
"name": "thermostatMode",
"dataType": null
},
{
"name": "thermostatFanMode",
"dataType": null
},
{
"name": "thermostatOperatingState",
"dataType": null
},
{
"name": "supportedThermostatModes",
"dataType": null
},
{
"name": "supportedThermostatFanModes",
"dataType": null
}
]
}
],
"commands": [
"auto",
"cool",
"emergencyHeat",
"fanAuto",
"fanCirculate",
"fanOn",
"heat",
"initialize",
"off",
"on",
"poll",
"setCoolingSetpoint",
"setHeatingSetpoint",
"setThermostatFanMode",
"setThermostatMode",
"webSocketClose",
"webSocketOpen",
"webSocketPing"
]
}```
Yeah… that’s really annoying as that’s not a JSON object - or at least not a valid JSON object. It should look like this…
["Auto", "Heat", "Cool", "Fan Only", "Off"]
I’m not sure what to do, and maybe I can write a BadJson decoder for cases where driver authors don’t think about sending correctly valid json data. I really think hubitat should check for this stuff, and either fix it, or error on it so that driver developers fix their code
Where did you get the driver source from?
Honeywell t6 pro z-wave thermostat
id | 1082 |
name | Advanced Honeywell T6 Pro Thermostat |
label | Main floor thermostat |
type | Advanced Honeywell T6 Pro Thermostat |
room | null |
attributes | |
0 | |
name | thermostatOperatingState |
currentValue | idle |
dataType | ENUM |
values | |
0 | heating |
1 | pending cool |
2 | pending heat |
3 | vent economizer |
4 | idle |
5 | cooling |
6 | fan only |
1 | |
name | thermostatMode |
currentValue | auto |
dataType | ENUM |
values | |
0 | heat |
1 | cool |
2 | emergency heat |
3 | auto |
4 | off |
2 | |
name | heatingSetpoint |
currentValue | 64 |
dataType | NUMBER |
3 | |
name | thermostatSetpoint |
currentValue | 74 |
dataType | NUMBER |
4 | |
name | heatingSetpoint |
currentValue | 64 |
dataType | NUMBER |
5 | |
name | powerSource |
currentValue | mains |
dataType | ENUM |
values | |
0 | battery |
1 | dc |
2 | mains |
3 | unknown |
6 | |
name | temperature |
currentValue | 74 |
dataType | NUMBER |
7 | |
name | battery |
currentValue | 95 |
dataType | NUMBER |
8 | |
name | thermostatFanMode |
currentValue | auto |
dataType | ENUM |
values | |
0 | on |
1 | circulate |
2 | auto |
9 | |
name | thermostatMode |
currentValue | auto |
dataType | ENUM |
values | |
0 | auto |
1 | off |
2 | heat |
3 | emergency heat |
4 | cool |
10 | |
name | supportedThermostatModes |
currentValue | [off, heat, cool, emergency heat] |
dataType | JSON_OBJECT |
values | |
0 | auto |
1 | off |
2 | heat |
3 | emergency heat |
4 | cool |
11 | |
name | humidity |
currentValue | 59 |
dataType | NUMBER |
12 | |
name | temperature |
currentValue | 74 |
dataType | NUMBER |
13 | |
name | thermostatFanMode |
currentValue | auto |
dataType | ENUM |
values | |
0 | auto |
1 | circulate |
2 | on |
14 | |
name | thermostatSetpoint |
currentValue | 74 |
dataType | NUMBER |
15 | |
name | thermostatOperatingState |
currentValue | idle |
dataType | ENUM |
values | |
0 | vent economizer |
1 | pending cool |
2 | cooling |
3 | heating |
4 | pending heat |
5 | fan only |
6 | idle |
16 | |
name | coolingSetpoint |
currentValue | 74 |
dataType | NUMBER |
17 | |
name | currentSensorCal |
currentValue | 0 |
dataType | NUMBER |
18 | |
name | supportedThermostatFanModes |
currentValue | [auto, on] |
dataType | JSON_OBJECT |
values | |
0 | on |
1 | circulate |
2 | auto |
19 | |
name | idleBrightness |
currentValue | 0 |
dataType | NUMBER |
20 | |
name | coolingSetpoint |
currentValue | 74 |
dataType | NUMBER |
capabilities | |
0 | RelativeHumidityMeasurement |
1 | |
attributes | |
0 | |
name | humidity |
dataType | null |
2 | ThermostatFanMode |
3 | |
attributes | |
0 | |
name | thermostatFanMode |
dataType | null |
4 | PowerSource |
5 | |
attributes | |
0 | |
name | powerSource |
dataType | null |
6 | Refresh |
7 | Battery |
8 | |
attributes | |
0 | |
name | battery |
dataType | null |
9 | ThermostatHeatingSetpoint |
10 | |
attributes | |
0 | |
name | heatingSetpoint |
dataType | null |
11 | ThermostatCoolingSetpoint |
12 | |
attributes | |
0 | |
name | coolingSetpoint |
dataType | null |
13 | ThermostatSetpoint |
14 | |
attributes | |
0 | |
name | thermostatSetpoint |
dataType | null |
15 | ThermostatOperatingState |
16 | |
attributes | |
0 | |
name | thermostatOperatingState |
dataType | null |
17 | Configuration |
18 | Actuator |
19 | ThermostatMode |
20 | |
attributes | |
0 | |
name | thermostatMode |
dataType | null |
21 | TemperatureMeasurement |
22 | |
attributes | |
0 | |
name | temperature |
dataType | null |
23 | Thermostat |
24 | |
attributes | |
0 | |
name | temperature |
dataType | null |
1 | |
name | heatingSetpoint |
dataType | null |
2 | |
name | coolingSetpoint |
dataType | null |
3 | |
name | thermostatSetpoint |
dataType | null |
4 | |
name | thermostatMode |
dataType | null |
5 | |
name | thermostatFanMode |
dataType | null |
6 | |
name | thermostatOperatingState |
dataType | null |
7 | |
name | supportedThermostatModes |
dataType | null |
8 | |
name | supportedThermostatFanModes |
dataType | null |
25 | Sensor |
commands | |
0 | IdleBrightness |
1 | SensorCal |
2 | auto |
3 | configure |
4 | cool |
5 | emergencyHeat |
6 | fanAuto |
7 | fanCirculate |
8 | fanOn |
9 | heat |
10 | off |
11 | refresh |
12 | setCoolingSetpoint |
13 | setHeatingSetpoint |
14 | setThermostatFanMode |
15 | setThermostatMode |
16 | syncClock |
so I wrote the actual drive for the thermostat, and its been working fine for a couple of years now. But let’s forget about my driver, and use one of the built in Hubitat drivers on a new device.
I just created a new device in Hubitat, and set it to use the built in virtual thermostat driver. Here is the output from Maker API for the device, and you’ll see that it’s presenting in the same format that you’re saying is bad. This device also exhibits the same issue in that it won’t show the thermostat controller when tapped.
{
"id": "1696",
"name": "aaaaa virtual thermostat",
"label": "aaaaa",
"type": "Virtual Thermostat",
"room": null,
"attributes": [
{
"name": "coolingSetpoint",
"currentValue": 23.9,
"dataType": "NUMBER"
},
{
"name": "supportedThermostatFanModes",
"currentValue": "[auto, circulate, on]",
"dataType": "JSON_OBJECT",
"values": [
"on",
"circulate",
"auto"
]
},
{
"name": "thermostatMode",
"currentValue": "off",
"dataType": "ENUM",
"values": [
"auto",
"off",
"heat",
"emergency heat",
"cool"
]
},
{
"name": "temperature",
"currentValue": 20.0,
"dataType": "NUMBER"
},
{
"name": "hysteresis",
"currentValue": 0.5,
"dataType": "NUMBER"
},
{
"name": "thermostatFanMode",
"currentValue": "auto",
"dataType": "ENUM",
"values": [
"on",
"circulate",
"auto"
]
},
{
"name": "heatingSetpoint",
"currentValue": 20.0,
"dataType": "NUMBER"
},
{
"name": "supportedThermostatModes",
"currentValue": "[auto, cool, emergency heat, heat, off]",
"dataType": "JSON_OBJECT",
"values": [
"auto",
"off",
"heat",
"emergency heat",
"cool"
]
},
{
"name": "temperature",
"currentValue": 20.0,
"dataType": "NUMBER"
},
{
"name": "supportedThermostatFanModes",
"currentValue": "[auto, circulate, on]",
"dataType": "JSON_OBJECT"
},
{
"name": "thermostatOperatingState",
"currentValue": "idle",
"dataType": "ENUM",
"values": [
"heating",
"pending cool",
"pending heat",
"vent economizer",
"idle",
"cooling",
"fan only"
]
},
{
"name": "thermostatSetpoint",
"currentValue": 20.0,
"dataType": "NUMBER"
},
{
"name": "supportedThermostatModes",
"currentValue": "[auto, cool, emergency heat, heat, off]",
"dataType": "JSON_OBJECT"
}
],
"capabilities": [
"Actuator",
"TemperatureMeasurement",
{
"attributes": [
{
"name": "temperature",
"dataType": null
}
]
},
"Thermostat",
{
"attributes": [
{
"name": "temperature",
"dataType": null
},
{
"name": "heatingSetpoint",
"dataType": null
},
{
"name": "coolingSetpoint",
"dataType": null
},
{
"name": "thermostatSetpoint",
"dataType": null
},
{
"name": "thermostatMode",
"dataType": null
},
{
"name": "thermostatFanMode",
"dataType": null
},
{
"name": "thermostatOperatingState",
"dataType": null
},
{
"name": "supportedThermostatModes",
"dataType": null
},
{
"name": "supportedThermostatFanModes",
"dataType": null
}
]
},
"Sensor"
],
"commands": [
"auto",
"cool",
"emergencyHeat",
"fanAuto",
"fanCirculate",
"fanOn",
"heat",
"off",
"setCoolingSetpoint",
"setHeatingSetpoint",
"setSupportedThermostatFanModes",
"setSupportedThermostatModes",
"setTemperature",
"setThermostatFanMode",
"setThermostatMode",
"setThermostatOperatingState",
"setThermostatSetpoint"
]
}
I just asked the Hubitat developers on a thread on their forum and they admitted it is wrong in their hub and will be fixed in a future release. So my app is technically correct in terms of what it expects based on their documentation, but wrong in that almost everyone (including themselves) wrote it incorrectly and not to their own specifications…. How annoying hey !!
I’ll write a decoder to handle both cases for now and the future when Hubitat gets updated.
So bad news is that it doesn’t work for now, but good news is that when Hubitat updates in the future, it will be already fixed to work
Working on a fix for this now. Hope to push out to the stores ASAP but unfortunately Apple will be 24 hours due to their slow review process.
Not necessary, but coloring the heating and cooling setpoints would be a nice addition.