[FIXED] Unable to "Show Thermostat Controller"

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 :joy:

3 Likes

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.

1 Like

Ecobee on Android after latest update, nice!

2 Likes

Not necessary, but coloring the heating and cooling setpoints would be a nice addition.

Like this ? :slight_smile:

3 Likes