Bump evohome-async to 0.4.4 (#103084)

* initial commit

* use correct attr

* fix hass-logger-period

* initial commit

* reduce footprint

* reduce footprint 2

* reduce footprint 3

* reduce footprint 4

* reduce footprint 6

* reduce footprint 7

* reduce footprint 8

* reduce footprint 9

* bump client to 0.4.1

* missing commit - changed method name

* bump client to 0.4.3

* bump client to 0.4.4
This commit is contained in:
David Bonnes 2023-11-06 10:10:28 +01:00 committed by GitHub
parent aa8b36c4e2
commit 3cfb2d557f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 65 additions and 54 deletions

View File

@ -10,7 +10,6 @@ import logging
import re import re
from typing import Any from typing import Any
import aiohttp.client_exceptions
import evohomeasync import evohomeasync
import evohomeasync2 import evohomeasync2
import voluptuous as vol import voluptuous as vol
@ -144,7 +143,7 @@ def _handle_exception(err) -> None:
try: try:
raise err raise err
except evohomeasync2.AuthenticationError: except evohomeasync2.AuthenticationFailed:
_LOGGER.error( _LOGGER.error(
( (
"Failed to authenticate with the vendor's server. Check your username" "Failed to authenticate with the vendor's server. Check your username"
@ -155,19 +154,18 @@ def _handle_exception(err) -> None:
err, err,
) )
except aiohttp.ClientConnectionError: except evohomeasync2.RequestFailed:
# this appears to be a common occurrence with the vendor's servers if err.status is None:
_LOGGER.warning( _LOGGER.warning(
( (
"Unable to connect with the vendor's server. " "Unable to connect with the vendor's server. "
"Check your network and the vendor's service status page. " "Check your network and the vendor's service status page. "
"Message is: %s" "Message is: %s"
), ),
err, err,
) )
except aiohttp.ClientResponseError: elif err.status == HTTPStatus.SERVICE_UNAVAILABLE:
if err.status == HTTPStatus.SERVICE_UNAVAILABLE:
_LOGGER.warning( _LOGGER.warning(
"The vendor says their server is currently unavailable. " "The vendor says their server is currently unavailable. "
"Check the vendor's service status page" "Check the vendor's service status page"
@ -219,7 +217,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
try: try:
await client_v2.login() await client_v2.login()
except (aiohttp.ClientError, evohomeasync2.AuthenticationError) as err: except evohomeasync2.AuthenticationFailed as err:
_handle_exception(err) _handle_exception(err)
return False return False
finally: finally:
@ -452,7 +450,7 @@ class EvoBroker:
"""Call a client API and update the broker state if required.""" """Call a client API and update the broker state if required."""
try: try:
result = await api_function result = await api_function
except (aiohttp.ClientError, evohomeasync2.AuthenticationError) as err: except evohomeasync2.EvohomeError as err:
_handle_exception(err) _handle_exception(err)
return return
@ -475,15 +473,27 @@ class EvoBroker:
try: try:
temps = list(await self.client_v1.temperatures(force_refresh=True)) temps = list(await self.client_v1.temperatures(force_refresh=True))
except aiohttp.ClientError as err: except evohomeasync.InvalidSchema as exc:
_LOGGER.warning(
(
"Unable to obtain high-precision temperatures. "
"It appears the JSON schema is not as expected, "
"so the high-precision feature will be disabled until next restart."
"Message is: %s"
),
exc,
)
self.temps = self.client_v1 = None
except evohomeasync.EvohomeError as exc:
_LOGGER.warning( _LOGGER.warning(
( (
"Unable to obtain the latest high-precision temperatures. " "Unable to obtain the latest high-precision temperatures. "
"Check your network and the vendor's service status page. " "Check your network and the vendor's service status page. "
"Proceeding with low-precision temperatures. " "Proceeding without high-precision temperatures for now. "
"Message is: %s" "Message is: %s"
), ),
err, exc,
) )
self.temps = None # these are now stale, will fall back to v2 temps self.temps = None # these are now stale, will fall back to v2 temps
@ -513,10 +523,11 @@ class EvoBroker:
else: else:
self.temps = {str(i["id"]): i["temp"] for i in temps} self.temps = {str(i["id"]): i["temp"] for i in temps}
_LOGGER.debug("Temperatures = %s", self.temps) finally:
if session_id != get_session_id(self.client_v1):
await self.save_auth_tokens()
if session_id != get_session_id(self.client_v1): _LOGGER.debug("Temperatures = %s", self.temps)
await self.save_auth_tokens()
async def _update_v2_api_state(self, *args, **kwargs) -> None: async def _update_v2_api_state(self, *args, **kwargs) -> None:
"""Get the latest modes, temperatures, setpoints of a Location.""" """Get the latest modes, temperatures, setpoints of a Location."""
@ -524,8 +535,8 @@ class EvoBroker:
loc_idx = self.params[CONF_LOCATION_IDX] loc_idx = self.params[CONF_LOCATION_IDX]
try: try:
status = await self.client.locations[loc_idx].status() status = await self.client.locations[loc_idx].refresh_status()
except (aiohttp.ClientError, evohomeasync2.AuthenticationError) as err: except evohomeasync2.EvohomeError as err:
_handle_exception(err) _handle_exception(err)
else: else:
async_dispatcher_send(self.hass, DOMAIN) async_dispatcher_send(self.hass, DOMAIN)
@ -542,11 +553,14 @@ class EvoBroker:
operating mode of the Controller and the current temp of its children (e.g. operating mode of the Controller and the current temp of its children (e.g.
Zones, DHW controller). Zones, DHW controller).
""" """
if self.client_v1:
await self._update_v1_api_temps()
await self._update_v2_api_state() await self._update_v2_api_state()
if self.client_v1:
try:
await self._update_v1_api_temps()
except evohomeasync.EvohomeError:
self.temps = None # these are now stale, will fall back to v2 temps
class EvoDevice(Entity): class EvoDevice(Entity):
"""Base for any evohome device. """Base for any evohome device.
@ -618,11 +632,13 @@ class EvoChild(EvoDevice):
@property @property
def current_temperature(self) -> float | None: def current_temperature(self) -> float | None:
"""Return the current temperature of a Zone.""" """Return the current temperature of a Zone."""
if ( if self._evo_device.TYPE == "domesticHotWater":
self._evo_broker.temps dev_id = self._evo_device.dhwId
and self._evo_broker.temps[self._evo_device.zoneId] != 128 else:
): dev_id = self._evo_device.zoneId
return self._evo_broker.temps[self._evo_device.zoneId]
if self._evo_broker.temps and self._evo_broker.temps[dev_id] is not None:
return self._evo_broker.temps[dev_id]
if self._evo_device.temperatureStatus["isAvailable"]: if self._evo_device.temperatureStatus["isAvailable"]:
return self._evo_device.temperatureStatus["temperature"] return self._evo_device.temperatureStatus["temperature"]
@ -695,7 +711,7 @@ class EvoChild(EvoDevice):
async def _update_schedule(self) -> None: async def _update_schedule(self) -> None:
"""Get the latest schedule, if any.""" """Get the latest schedule, if any."""
self._schedule = await self._evo_broker.call_client_api( self._schedule = await self._evo_broker.call_client_api(
self._evo_device.schedule(), update_state=False self._evo_device.get_schedule(), update_state=False
) )
_LOGGER.debug("Schedule['%s'] = %s", self.name, self._schedule) _LOGGER.debug("Schedule['%s'] = %s", self.name, self._schedule)

View File

@ -167,9 +167,7 @@ class EvoZone(EvoChild, EvoClimateEntity):
async def async_zone_svc_request(self, service: str, data: dict[str, Any]) -> None: async def async_zone_svc_request(self, service: str, data: dict[str, Any]) -> None:
"""Process a service request (setpoint override) for a zone.""" """Process a service request (setpoint override) for a zone."""
if service == SVC_RESET_ZONE_OVERRIDE: if service == SVC_RESET_ZONE_OVERRIDE:
await self._evo_broker.call_client_api( await self._evo_broker.call_client_api(self._evo_device.reset_mode())
self._evo_device.cancel_temp_override()
)
return return
# otherwise it is SVC_SET_ZONE_OVERRIDE # otherwise it is SVC_SET_ZONE_OVERRIDE
@ -264,18 +262,14 @@ class EvoZone(EvoChild, EvoClimateEntity):
self._evo_device.set_temperature(self.min_temp, until=None) self._evo_device.set_temperature(self.min_temp, until=None)
) )
else: # HVACMode.HEAT else: # HVACMode.HEAT
await self._evo_broker.call_client_api( await self._evo_broker.call_client_api(self._evo_device.reset_mode())
self._evo_device.cancel_temp_override()
)
async def async_set_preset_mode(self, preset_mode: str) -> None: async def async_set_preset_mode(self, preset_mode: str) -> None:
"""Set the preset mode; if None, then revert to following the schedule.""" """Set the preset mode; if None, then revert to following the schedule."""
evo_preset_mode = HA_PRESET_TO_EVO.get(preset_mode, EVO_FOLLOW) evo_preset_mode = HA_PRESET_TO_EVO.get(preset_mode, EVO_FOLLOW)
if evo_preset_mode == EVO_FOLLOW: if evo_preset_mode == EVO_FOLLOW:
await self._evo_broker.call_client_api( await self._evo_broker.call_client_api(self._evo_device.reset_mode())
self._evo_device.cancel_temp_override()
)
return return
temperature = self._evo_device.setpointStatus["targetHeatTemperature"] temperature = self._evo_device.setpointStatus["targetHeatTemperature"]
@ -352,7 +346,7 @@ class EvoController(EvoClimateEntity):
"""Set a Controller to any of its native EVO_* operating modes.""" """Set a Controller to any of its native EVO_* operating modes."""
until = dt_util.as_utc(until) if until else None until = dt_util.as_utc(until) if until else None
await self._evo_broker.call_client_api( await self._evo_broker.call_client_api(
self._evo_tcs.set_status(mode, until=until) self._evo_tcs.set_mode(mode, until=until)
) )
@property @property

View File

@ -5,5 +5,5 @@
"documentation": "https://www.home-assistant.io/integrations/evohome", "documentation": "https://www.home-assistant.io/integrations/evohome",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["evohomeasync", "evohomeasync2"], "loggers": ["evohomeasync", "evohomeasync2"],
"requirements": ["evohome-async==0.3.15"] "requirements": ["evohome-async==0.4.4"]
} }

View File

@ -46,9 +46,10 @@ async def async_setup_platform(
_LOGGER.debug( _LOGGER.debug(
"Adding: DhwController (%s), id=%s", "Adding: DhwController (%s), id=%s",
broker.tcs.hotwater.zone_type, broker.tcs.hotwater.TYPE,
broker.tcs.hotwater.zoneId, broker.tcs.hotwater.dhwId,
) )
new_entity = EvoDHW(broker, broker.tcs.hotwater) new_entity = EvoDHW(broker, broker.tcs.hotwater)
async_add_entities([new_entity], update_before_add=True) async_add_entities([new_entity], update_before_add=True)
@ -95,7 +96,7 @@ class EvoDHW(EvoChild, WaterHeaterEntity):
Except for Auto, the mode is only until the next SetPoint. Except for Auto, the mode is only until the next SetPoint.
""" """
if operation_mode == STATE_AUTO: if operation_mode == STATE_AUTO:
await self._evo_broker.call_client_api(self._evo_device.set_dhw_auto()) await self._evo_broker.call_client_api(self._evo_device.reset_mode())
else: else:
await self._update_schedule() await self._update_schedule()
until = dt_util.parse_datetime(self.setpoints.get("next_sp_from", "")) until = dt_util.parse_datetime(self.setpoints.get("next_sp_from", ""))
@ -103,28 +104,28 @@ class EvoDHW(EvoChild, WaterHeaterEntity):
if operation_mode == STATE_ON: if operation_mode == STATE_ON:
await self._evo_broker.call_client_api( await self._evo_broker.call_client_api(
self._evo_device.set_dhw_on(until=until) self._evo_device.set_on(until=until)
) )
else: # STATE_OFF else: # STATE_OFF
await self._evo_broker.call_client_api( await self._evo_broker.call_client_api(
self._evo_device.set_dhw_off(until=until) self._evo_device.set_off(until=until)
) )
async def async_turn_away_mode_on(self) -> None: async def async_turn_away_mode_on(self) -> None:
"""Turn away mode on.""" """Turn away mode on."""
await self._evo_broker.call_client_api(self._evo_device.set_dhw_off()) await self._evo_broker.call_client_api(self._evo_device.set_off())
async def async_turn_away_mode_off(self) -> None: async def async_turn_away_mode_off(self) -> None:
"""Turn away mode off.""" """Turn away mode off."""
await self._evo_broker.call_client_api(self._evo_device.set_dhw_auto()) await self._evo_broker.call_client_api(self._evo_device.reset_mode())
async def async_turn_on(self): async def async_turn_on(self):
"""Turn on.""" """Turn on."""
await self._evo_broker.call_client_api(self._evo_device.set_dhw_on()) await self._evo_broker.call_client_api(self._evo_device.set_on())
async def async_turn_off(self): async def async_turn_off(self):
"""Turn off.""" """Turn off."""
await self._evo_broker.call_client_api(self._evo_device.set_dhw_off()) await self._evo_broker.call_client_api(self._evo_device.set_off())
async def async_update(self) -> None: async def async_update(self) -> None:
"""Get the latest state data for a DHW controller.""" """Get the latest state data for a DHW controller."""

View File

@ -785,7 +785,7 @@ eufylife-ble-client==0.1.8
# evdev==1.6.1 # evdev==1.6.1
# homeassistant.components.evohome # homeassistant.components.evohome
evohome-async==0.3.15 evohome-async==0.4.4
# homeassistant.components.faa_delays # homeassistant.components.faa_delays
faadelays==2023.9.1 faadelays==2023.9.1