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 <marhje52@gmail.com>

* reverting unique_id and depricated vClimateEntityFeature.AUX_HEAT

* Update homeassistant/components/ephember/climate.py

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
This commit is contained in:
Maksim Doroshko 2025-04-16 09:43:39 +01:00 committed by GitHub
parent 50796a6a77
commit c96bb45940
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 34 additions and 27 deletions

2
CODEOWNERS generated
View File

@ -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

View File

@ -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):

View File

@ -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"]
}

2
requirements_all.txt generated
View File

@ -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