Yes the commands for the controlled thermostat work fine. And setThermostatFanMode(mode) and setThermostatMode(mode) will properly change both the controller and the controlled device, so seems like it's a problem in the controller code.
Oh, never mind. Those commands are not supported on the controller thermostat device. The controller thermostat device is used as a conduit from the app to the controlled thermostat. Those commands are not part of that functionality, so are not implemented in the the controller thermostat driver.
You aren't supposed to be using the Controlled Thermostat device separately from the app. The app doesn't use those commands.
It's not a bug, it's the way it was designed. There is no point in carrying code that isn't used, and this device is only used by Thermostat Controller.
If it really is only intended to be used by the app, you should not implement any of the capabilities, then there is no confusion there and nobody will tamper with the device.
With your "app only" design:
If I want to make small temporary adjustments like increase the temperature slightly, turn off the thermostat, or change the fan mode, I need to go into the App UI.
Usage in dashboards is unsupported since it's not the app.
Zero flexibility to use it in rules or other apps.
That seems rather silly to me, since the code to set the mode using the UI vs the device should be pretty much the same so there's no reason why you could not support device commands besides your "app only" philosophy. I think most users would prefer the device being the source of truth and being able to use it like a normal thermostat.
But pretty much sounds like the design philosophy is at odds, so I'll probably just go and write my own app.
I'm sorry, there's a misunderstanding, and that's my fault.
The device can be used outside the app. For example, it can be used by Thermostat Scheduler, or other apps could command it.
Those commands were not implemented for the reason stated: not to have unneeded code . The real failure here is the inflexibility of the device page UI where it shows commands that are not actually implemented by the device. These commands all come from the thermostat capability, and there is no choice in that regard -- that's a shortcoming also. Not all thermostats implement all of the capability defined commands, and this particular thermostat is one of them. The ability of the UI to adjust to this is missing.
And, you're right, implementing those commands would not represent a huge burden, as each just calls the implemented commands with a specific parameter (except for schedule()), thusly: