From c96bb4594010a633c3293b864a03a2d342178422 Mon Sep 17 00:00:00 2001 From: Maksim Doroshko Date: Wed, 16 Apr 2025 09:43:39 +0100 Subject: [PATCH] Use pyephember2 library in ephember (#140459) * multiple homes support, all zones visible * Update homes and zones * set zone, target temp, curent temp, hot water type fixes * Hotwater devices added * Mode ajust * next version could be 0.4.4 * depricated climate feature removed ClimateEntityFeature * Migrate to pyephember2 * HEAT_COOL mode * Revert EPH_TO_HA_STATE to HEAT_COOL * homes and ember declaretion removed * cleaning try catch blocks, flatten list on zones * refactored * Version updated * try catch returned * pyephember2==0.4.12 * Update homeassistant/components/ephember/climate.py Co-authored-by: Martin Hjelmare * reverting unique_id and depricated vClimateEntityFeature.AUX_HEAT * Update homeassistant/components/ephember/climate.py Co-authored-by: Martin Hjelmare --------- Co-authored-by: Martin Hjelmare --- CODEOWNERS | 2 +- homeassistant/components/ephember/climate.py | 51 +++++++++++-------- .../components/ephember/manifest.json | 6 +-- requirements_all.txt | 2 +- 4 files changed, 34 insertions(+), 27 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index d36741bfbad..1ac564a6991 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -432,7 +432,7 @@ build.json @home-assistant/supervisor /homeassistant/components/entur_public_transport/ @hfurubotten /homeassistant/components/environment_canada/ @gwww @michaeldavie /tests/components/environment_canada/ @gwww @michaeldavie -/homeassistant/components/ephember/ @ttroy50 +/homeassistant/components/ephember/ @ttroy50 @roberty99 /homeassistant/components/epic_games_store/ @hacf-fr @Quentame /tests/components/epic_games_store/ @hacf-fr @Quentame /homeassistant/components/epion/ @lhgravendeel diff --git a/homeassistant/components/ephember/climate.py b/homeassistant/components/ephember/climate.py index f92be005db6..dbd7ab9e25d 100644 --- a/homeassistant/components/ephember/climate.py +++ b/homeassistant/components/ephember/climate.py @@ -6,13 +6,13 @@ from datetime import timedelta import logging from typing import Any -from pyephember.pyephember import ( +from pyephember2.pyephember2 import ( EphEmber, ZoneMode, zone_current_temperature, zone_is_active, zone_is_boost_active, - zone_is_hot_water, + zone_is_hotwater, zone_mode, zone_name, zone_target_temperature, @@ -69,14 +69,18 @@ def setup_platform( try: ember = EphEmber(username, password) - zones = ember.get_zones() - for zone in zones: - add_entities([EphEmberThermostat(ember, zone)]) except RuntimeError: - _LOGGER.error("Cannot connect to EphEmber") + _LOGGER.error("Cannot login to EphEmber") + + try: + homes = ember.get_zones() + except RuntimeError: + _LOGGER.error("Fail to get zones") return - return + add_entities( + EphEmberThermostat(ember, zone) for home in homes for zone in home["zones"] + ) class EphEmberThermostat(ClimateEntity): @@ -85,33 +89,35 @@ class EphEmberThermostat(ClimateEntity): _attr_hvac_modes = OPERATION_LIST _attr_temperature_unit = UnitOfTemperature.CELSIUS - def __init__(self, ember, zone): + def __init__(self, ember, zone) -> None: """Initialize the thermostat.""" self._ember = ember self._zone_name = zone_name(zone) self._zone = zone - self._hot_water = zone_is_hot_water(zone) + + # hot water = true, is immersive device without target temperature control. + self._hot_water = zone_is_hotwater(zone) self._attr_name = self._zone_name - self._attr_supported_features = ( - ClimateEntityFeature.TARGET_TEMPERATURE | ClimateEntityFeature.AUX_HEAT - ) - self._attr_target_temperature_step = 0.5 if self._hot_water: self._attr_supported_features = ClimateEntityFeature.AUX_HEAT self._attr_target_temperature_step = None - self._attr_supported_features |= ( - ClimateEntityFeature.TURN_OFF | ClimateEntityFeature.TURN_ON - ) + else: + self._attr_target_temperature_step = 0.5 + self._attr_supported_features = ( + ClimateEntityFeature.TURN_OFF + | ClimateEntityFeature.TURN_ON + | ClimateEntityFeature.TARGET_TEMPERATURE + ) @property - def current_temperature(self): + def current_temperature(self) -> float | None: """Return the current temperature.""" return zone_current_temperature(self._zone) @property - def target_temperature(self): + def target_temperature(self) -> float | None: """Return the temperature we try to reach.""" return zone_target_temperature(self._zone) @@ -133,12 +139,12 @@ class EphEmberThermostat(ClimateEntity): """Set the operation mode.""" mode = self.map_mode_hass_eph(hvac_mode) if mode is not None: - self._ember.set_mode_by_name(self._zone_name, mode) + self._ember.set_zone_mode(self._zone["zoneid"], mode) else: _LOGGER.error("Invalid operation mode provided %s", hvac_mode) @property - def is_aux_heat(self): + def is_aux_heat(self) -> bool: """Return true if aux heater.""" return zone_is_boost_active(self._zone) @@ -167,7 +173,7 @@ class EphEmberThermostat(ClimateEntity): if temperature > self.max_temp or temperature < self.min_temp: return - self._ember.set_target_temperture_by_name(self._zone_name, temperature) + self._ember.set_zone_target_temperature(self._zone["zoneid"], temperature) @property def min_temp(self): @@ -188,7 +194,8 @@ class EphEmberThermostat(ClimateEntity): def update(self) -> None: """Get the latest data.""" - self._zone = self._ember.get_zone(self._zone_name) + self._ember.get_zones() + self._zone = self._ember.get_zone(self._zone["zoneid"]) @staticmethod def map_mode_hass_eph(operation_mode): diff --git a/homeassistant/components/ephember/manifest.json b/homeassistant/components/ephember/manifest.json index 547ab2918f5..7d78149d068 100644 --- a/homeassistant/components/ephember/manifest.json +++ b/homeassistant/components/ephember/manifest.json @@ -1,10 +1,10 @@ { "domain": "ephember", "name": "EPH Controls", - "codeowners": ["@ttroy50"], + "codeowners": ["@ttroy50", "@roberty99"], "documentation": "https://www.home-assistant.io/integrations/ephember", "iot_class": "local_polling", - "loggers": ["pyephember"], + "loggers": ["pyephember2"], "quality_scale": "legacy", - "requirements": ["pyephember==0.3.1"] + "requirements": ["pyephember2==0.4.12"] } diff --git a/requirements_all.txt b/requirements_all.txt index a7096b9ec61..36f556c533d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1957,7 +1957,7 @@ pyenphase==1.25.5 pyenvisalink==4.7 # homeassistant.components.ephember -pyephember==0.3.1 +pyephember2==0.4.12 # homeassistant.components.everlights pyeverlights==0.1.0