Skip to content

Add support for Cairox R-AQUA HPB R290 (HPB-S 300A) - #119

Open
zagguan wants to merge 3 commits into
radical-squared:Custom-componentfrom
zagguan:r290-support
Open

zagguan wants to merge 3 commits into
radical-squared:Custom-componentfrom
zagguan:r290-support

Conversation

@zagguan

@zagguan zagguan commented Jun 11, 2026

Copy link
Copy Markdown

Adds support for the Cairox R-AQUA HPB R290 (HPB-S 300A), product_id
1726502484782837760 (PHNIX/Hitemp OEM, water-heater only).

This product:

  • Reports raw "Mode": "3" which isn't part of the default cool/heat/auto
    mapping, causing get_device_hvac_mode() to crash with
    "ValueError: None is not a valid HVACMode".
  • Uses R01 as the heat target/setpoint (vs. R02 for default products).
  • Reports "Max heat [R11]" as 0, which made the climate entity's
    max_temp invalid and rejected all set_temperature calls.

Changes:

  1. get_device_hvac_mode(): fall back to HVACMode.HEAT (with a warning)
    instead of raising when the device mode value isn't in the
    hvac_modes mapping. Relevant for water-heater-only devices.
  2. New parameters/mapping.1726502484782837760.json + PRODUCT_IDS entry
    for this product (mode/power = Mode/Power, target = R01,
    current_temperature = T03, hvac_modes = off/heat only).
  3. New PRODUCT_TEMPERATURE_OVERRIDES in consts.py: per-product fallback
    min/max temperature, applied only when the device-reported R10/R11
    is missing or <= 0. For this product, maximum is overridden to 60.0.

Tested on a live device: reading (161 entities), HVAC mode reporting,
and climate.set_temperature all work correctly after these changes.

Willem (zagguan) added 3 commits June 11, 2026 20:39
get_device_hvac_mode() raised ValueError('None is not a valid HVACMode')
when the device's raw 'Mode' value (e.g. '3') is not present in the
product's hvac_modes reverse mapping. This left climate.<device> stuck
in 'off' and prevented any writes (set_temperature, set_hvac_mode).

Fall back to HVACMode.HEAT for unmapped mode values - appropriate for
water-heater-only devices (Cairox R-AQUA HPB R290 / PHNIX HPB-S 300A)
that only support off/heat.
…82837760)

- Register product_id 1726502484782837760 in PRODUCT_IDS so the
  per-product mapping file gets loaded (set_device() otherwise falls
  back to 'default').
- Add parameters/mapping.1726502484782837760.json:
  - mode/power pc keys 'Mode'/'Power' (matches default, kept explicit)
  - target/current temperature mapped to R01 (Cooling set / target
    setpoint) and T03 (Outlet water Temp) per device diagnostics
  - heat-only hvac_modes (off/heat) with set='3' matching the device's
    observed Mode value, min/max heat = R10/R11
- This is the heat-only counterpart to mapping.1245226668902080512.json
  but uses this device's actual Mode/Power field names instead of
  mode_real/MO6.
…R290 max_temp=0)

The Cairox R-AQUA HPB R290 (HPB-S 300A, product_id 1726502484782837760)
reports 'Max heat [R11]' as 0 on the device. get_device_maximum_temperature()
then returned 0, causing the climate entity's max_temp to be 0 and rejecting
any set_temperature call (e.g. 'Provided temperature 50.0 is not valid.
Accepted range is 25.0 to 0.0.').

Adds PRODUCT_TEMPERATURE_OVERRIDES in consts.py: a per-product_id map of
fallback min/max temperatures, applied only when the device-reported value
is missing or <= 0. For this product, maximum is overridden to 60.0.

Also adds AquaTempConfigManager.get_product_id() helper.
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