mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 12:17:07 +00:00
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:
parent
aa8b36c4e2
commit
3cfb2d557f
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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"]
|
||||||
}
|
}
|
||||||
|
@ -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."""
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user