24V thermostats: mode, fan mode, humidity and cooling setpoint are received but never surfaced
- Dominant language
- Python
- Stars
- 248
- Forks
- 46
- Avg merge
- 4h 4m
- Merged PRs (30d)
- 26
Description
## Summary
For 24 V thermostats (`LowVoltageThermostat`, e.g. a Honeywell T10 enrolled in Hilo), the climate entity is permanently stuck on `hvac_modes: ['heat']` with the **heating** setpoint, even while the system is actively cooling. Mode, fan mode, ambient humidity and the cooling setpoint are all **received from the Hilo API and stored as readings** — they are simply never surfaced.
I own this hardware and can test and support the feature, which I understand has been the blocker on similar requests (#824, #473).
## Environment
- Home Assistant Core 2026.7.4 (HAOS 18.2)
- `hilo` 2026.8.1 (HACS)
- `python-hilo` 2026.3.5
- Device: Honeywell T10, reported by Hilo as a low voltage thermostat (heat pump with auxiliary heat)
## What happens
The Hilo app itself offers Auto / Heat / Emergency Heat / Cool / Off, three fan modes and ambient humidity. Home Assistant shows:
```
climate.thermostat_central
state : heat # hardcoded
hvac_modes : ['heat']
temperature : 21 # heating setpoint, while cooling to 24
current_temperature: 24
supported_features : 1
```
## Root cause
The data does arrive. Dumping `device.readings` for this thermostat gives:
```
['CoolTemperatureSet', 'CurrentState', 'CurrentTemperature', 'Disconnected', 'FanMode',
'FanSpeed', 'GdState', 'Heating', 'Humidity', 'MaxCoolSetpoint', 'MaxTempSetpoint',
'MinCoolSetpoint', 'MinTempSetpoint', 'Power', 'TargetTemperature',
'Thermostat24VAllowedFanMode', 'Thermostat24VAllowedMode', 'Thermostat24VMode',
'ThermostatAllowedModes', 'ThermostatMode', 'Unpaired', 'Version', 'ZigbeeVersion']
```
Two independent problems:
**1. `climate.py` hardcodes heating.** `_attr_hvac_modes = [HVACMode.HEAT]`, `hvac_mode` returns `HVACMode.HEAT`, and `set_hvac_mode()` is an empty `return`.
**2. Those attributes cannot be read back through `get_value()`.** The 24 V attribute names are built by `graphql_value_mapper` but are **absent from the static registry in `pyhilo/const.py`** (only `Humidity` is present there). `HiloDevice.get_value()` resolves names through `API.dev_atts()`, which — for an unregistered name and with no `value_type` — returns the **plain string** instead of a `DeviceAttribute`. `_get_attribute()` then compares that string against `reading.device_attribute` objects, never matches, and returns `None`. The value is lost **silently**, with no warning.
Readings themselves are fine, because `build_attribute()` passes `valueType`, which makes `dev_atts()` take its fallback branch and construct a proper `DeviceAttribute`.
## Fix and result
Reading the values directly off `device.readings` (matching on `reading.device_attribute.hilo_attribute`) and deriving the modes from `Thermostat24VAllowedMode` gives, on the same device, with no library change:
```
state : cool
hvac_modes : ['heat', 'off', 'cool', 'heat_cool']
fan_mode : ON
fan_modes : ['ON', 'AUTO', 'CIRCULATE']
current_humidity : 53
temperature : 24 # cooling setpoint while in cool mode
supported_features : 393
```
Everything is gated on the 24 V readings being present, so baseboard thermostats keep the exact previous behaviour (`['heat']`, `TARGET_TEMPERATURE` only).
I would be happy to open a PR with this if you are open to it.
## Related: writes are refused on these devices
While testing the setters I found that Hilo advertises:
```
settable_attributes = ['Disconnected']
```
so `HiloDevice._set_attribute()` drops every command — mode, fan **and temperature**. I believe this is the actual cause of #937 (temperature changes working in the Hilo app but not from Home Assistant on a Sinopé 24 V), and it cannot be fixed from `climate.py`. I have posted the details there.
In the meantime my setters raise an explicit `HomeAssistantError` rather than failing silently, so the UI does not offer a control that quietly does nothing.
Contributor guide
Research direction
Start in climate.py at the hardcoded HVAC mode, fan, humidity, setpoint, and setter handling, then inspect pyhilo/const.py and HiloDevice.get_value() for the 24 V attributes. Use device.readings and the listed 24 V attribute names as the data reference; done means 24 V thermostats expose the reported modes, fan data, humidity, and mode-appropriate setpoint while existing baseboard behavior remains unchanged.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- api, backend
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 74/100