dvd-dev / dvd-dev/hilo

24V thermostats: mode, fan mode, humidity and cooling setpoint are received but never surfaced

Open
#998 9 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.