Skip to content

feat(hot-water): ASHW cylinder support validated on an EDL200UK-630RF - #128

Open
Mista-P wants to merge 4 commits into
KRoperUK:mainfrom
Mista-P:feat/ashw-cylinder
Open

Mista-P wants to merge 4 commits into
KRoperUK:mainfrom
Mista-P:feat/ashw-cylinder

Conversation

@Mista-P

@Mista-P Mista-P commented Oct 11, 2026 •

Copy link
Copy Markdown

Summary

Support for air-source heat pump hot water cylinders (ASHW Cylinder), from a live EDL200UK-630RF compared against the official app at the same moment.

Stacked on #127 (integer ErrorCode/WarningCode), which the cylinder needs: it is the appliance that sends them as integers. Please merge #127 first; this PR's own changes are the last three commits.

fix(capabilities): a cylinder is not room climate. The cylinder reports its water target (45 °C) in ActiveSetPointTemperature, so capabilities_for called it room climate and kept every room-heater feature. A client then shows a thermostat with a 7–30 °C range plus room temperature, open window, EcoStart and setback. Now only a RoomTemperature makes a hot-water appliance room climate. Without one, the room-heater features default to off unless the status reports them (this cylinder sends null for all of them), and so do setpoint_write/setback_write. Room heaters are unchanged, and test_status_marks_features_and_hot_water still holds.

feat(hot-water):

  • ApplianceStatus declares the cylinder fields the overview already carries: Capacity, HeatingUp, IsGreenEnergyActive, HygieneFrequency, HygieneTemperature, HolidayNumOfDays, plus the always-null rest. AvailableHotWater turns out to be litres, since the app shows "336 L Hot water" for 336.
  • get_heat_pump_hot_water_schedule now returns a new HeatPumpHwcSchedule. The real reply is {HubId, ApplianceId, TimerPeriods: [{DayOfWeek, StartTime: 0, Mode: 2}]}: no TimerMode, integer start times, a mode per period. Parsing it as TimerModeSettings raised on real hardware.
  • New set_hot_water_holiday(hub_id, appliance_ids, until, *, enable, heat_pump). Verified live: SetApplianceModeHeatPumpHwc with ApplianceModes=8, Status=1 moved the status 8192 → 8200 with HolidayNumOfDays set and heating stopped, and Status=0 restored 8192. The cylinder counts whole days, so until is also sent as a rounded-up NumberOfDays.
  • set_heat_pump_hot_water_schedule is unchanged but now documents that UpdateHeatPumpHwcSchedulePeriods answered 403 to every body tried: wrapped in TimerModeSettings or Settings, with or without TimerMode, integer or HH:MM:SS times, app_version up to 3.0.0. Unwrapped bodies got 400. The app's own request hasn't been captured.

docs: the decompiled API reference, OpenAPI summaries and README now say what was validated on the cylinder and what still wasn't (temperature, boost and hygiene writes).

Still unknown: what the schedule's Mode values mean (only 2 seen), whether StartTime is minutes after midnight, and how the app derives the fill percentage it shows.

Testing

  • New tests built from the live replies: capabilities for the cylinder (with and without a room temperature), ApplianceStatus with every cylinder field, the schedule read, and the holiday request bodies (on, off, non-heat-pump endpoint, missing end).
  • ruff check, ruff format --check, mypy, pytest (207 passed) and pre-commit run --all-files pass.
  • The Home Assistant integration PR runs on the same cylinder with these findings.

🤖 Generated with Claude Code

Mista-P and others added 4 commits October 11, 2026 13:08
GetApplianceOverview returns ErrorCode and WarningCode as integers (0 when
the appliance is healthy), but ApplianceStatus types them as str, so
model_validate raised a ValidationError for every status poll. Coerce ints
to str in a before-validator so the public type is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A live ASHW cylinder (EDL200UK-630RF) reports its water target, 45 °C, in
ActiveSetPointTemperature, which made capabilities_for call it room
climate and keep every room-heater feature. Clients then gave it a
thermostat with a 7-30 °C range, room temperature, open window, EcoStart
and setback.

Only a room temperature now makes a hot-water appliance room climate.
Without one, the room-heater features default to off unless its status
reports them (the live cylinder sends null for all of them), and so do the
room setpoint and setback writes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From a live ASHW cylinder (EDL200UK-630RF):

- ApplianceStatus declares the cylinder fields the overview carries:
  Capacity, HeatingUp, IsGreenEnergyActive, HygieneFrequency,
  HygieneTemperature, HolidayNumOfDays and the always-null rest.
- get_heat_pump_hot_water_schedule returns HeatPumpHwcSchedule. The reply
  has no TimerMode and one {DayOfWeek, StartTime, Mode} per period, so the
  TimerModeSettings parse failed on real hardware.
- set_hot_water_holiday engages or clears Holiday. Verified: status 8192 ->
  8200 with HolidayNumOfDays set and heating stopped, then back to 8192.
- set_heat_pump_hot_water_schedule documents that the endpoint answers
  403 to every body tried.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mark the heat-pump cylinder endpoints with what was validated live on an
EDL200UK-630RF (holiday, schedule read) and what was not (schedule write
answers 403; the temperature, boost and hygiene writes are untested).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant