|
Home IO Control
ESPHome add-on for IO-Homecontrol devices
|
Status: Accepted · Recorded: 2026-09
The experimental 2W heating/climate support (CMD_WRITE_PRIVATE 0x20 — Atlantic / Thermor / Sauter "Cozytouch" radiators) adds one hub transmit method, IOHomeControlComponent::send_heating_command(), plus an IOHomeClimate entity and a heating_control hub action that both call it. Two existing hub mechanisms were candidates to reuse and were deliberately not used.
execute_request_and_update_() is the shared send-and-settle helper for covers, lights, switches and locks. It decodes the reply through update_device_status_() and schedules poll backoff. Both behaviours are cover/position-shaped: a heater reports no position, has no status poll, and feeding a 0x21 write-private ack into the status decoder would be the same category error ADR 0024 keeps the diagnostic-probe path away from. The heating protocol also has no readback at all — the set_* functions are write-only, and power_on / midnight_sync are register reads whose ack payload is logged at DEBUG but never decoded into a field.
The ADR 0030 optimistic-state overlay (OptimisticState on IoDevice, apply_optimistic_* / rollback_optimistic()) exists to hold a hub prediction apart from a competing device observation, withdrawing the prediction on command failure so it can never corrupt a real reading. Its fields are target / tilt / motion — cover-shaped, with no temperature or HVAC-mode slot — and, more fundamentally, heating has no observation stream for a prediction to sit against. There is nothing to overlay, nothing to be superseded, and nothing a rollback-vs-observation split would mean. Adding heating fields to OptimisticState would put values in it that can never be superseded by real data, weakening ADR 0030's invariant.