mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 03:07:37 +00:00
Add error translations for Sensibo (#105600)
This commit is contained in:
parent
6dc8c2c370
commit
65514fbd73
@ -22,7 +22,7 @@ from homeassistant.const import (
|
|||||||
UnitOfTemperature,
|
UnitOfTemperature,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.exceptions import HomeAssistantError
|
from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
|
||||||
from homeassistant.helpers import config_validation as cv, entity_platform
|
from homeassistant.helpers import config_validation as cv, entity_platform
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
from homeassistant.util.unit_conversion import TemperatureConverter
|
from homeassistant.util.unit_conversion import TemperatureConverter
|
||||||
@ -314,11 +314,17 @@ class SensiboClimate(SensiboDeviceBaseEntity, ClimateEntity):
|
|||||||
"""Set new target temperature."""
|
"""Set new target temperature."""
|
||||||
if "targetTemperature" not in self.device_data.active_features:
|
if "targetTemperature" not in self.device_data.active_features:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
"Current mode doesn't support setting Target Temperature"
|
"Current mode doesn't support setting Target Temperature",
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="no_target_temperature_in_features",
|
||||||
)
|
)
|
||||||
|
|
||||||
if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
|
if (temperature := kwargs.get(ATTR_TEMPERATURE)) is None:
|
||||||
raise ValueError("No target temperature provided")
|
raise ServiceValidationError(
|
||||||
|
"No target temperature provided",
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="no_target_temperature",
|
||||||
|
)
|
||||||
|
|
||||||
if temperature == self.target_temperature:
|
if temperature == self.target_temperature:
|
||||||
return
|
return
|
||||||
@ -334,10 +340,17 @@ class SensiboClimate(SensiboDeviceBaseEntity, ClimateEntity):
|
|||||||
async def async_set_fan_mode(self, fan_mode: str) -> None:
|
async def async_set_fan_mode(self, fan_mode: str) -> None:
|
||||||
"""Set new target fan mode."""
|
"""Set new target fan mode."""
|
||||||
if "fanLevel" not in self.device_data.active_features:
|
if "fanLevel" not in self.device_data.active_features:
|
||||||
raise HomeAssistantError("Current mode doesn't support setting Fanlevel")
|
raise HomeAssistantError(
|
||||||
|
"Current mode doesn't support setting Fanlevel",
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="no_fan_level_in_features",
|
||||||
|
)
|
||||||
if fan_mode not in AVAILABLE_FAN_MODES:
|
if fan_mode not in AVAILABLE_FAN_MODES:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Climate fan mode {fan_mode} is not supported by the integration, please open an issue"
|
f"Climate fan mode {fan_mode} is not supported by the integration, please open an issue",
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="fan_mode_not_supported",
|
||||||
|
translation_placeholders={"fan_mode": fan_mode},
|
||||||
)
|
)
|
||||||
|
|
||||||
transformation = self.device_data.fan_modes_translated
|
transformation = self.device_data.fan_modes_translated
|
||||||
@ -379,10 +392,17 @@ class SensiboClimate(SensiboDeviceBaseEntity, ClimateEntity):
|
|||||||
async def async_set_swing_mode(self, swing_mode: str) -> None:
|
async def async_set_swing_mode(self, swing_mode: str) -> None:
|
||||||
"""Set new target swing operation."""
|
"""Set new target swing operation."""
|
||||||
if "swing" not in self.device_data.active_features:
|
if "swing" not in self.device_data.active_features:
|
||||||
raise HomeAssistantError("Current mode doesn't support setting Swing")
|
raise HomeAssistantError(
|
||||||
|
"Current mode doesn't support setting Swing",
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="no_swing_in_features",
|
||||||
|
)
|
||||||
if swing_mode not in AVAILABLE_SWING_MODES:
|
if swing_mode not in AVAILABLE_SWING_MODES:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Climate swing mode {swing_mode} is not supported by the integration, please open an issue"
|
f"Climate swing mode {swing_mode} is not supported by the integration, please open an issue",
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="swing_not_supported",
|
||||||
|
translation_placeholders={"swing_mode": swing_mode},
|
||||||
)
|
)
|
||||||
|
|
||||||
transformation = self.device_data.swing_modes_translated
|
transformation = self.device_data.swing_modes_translated
|
||||||
|
@ -26,15 +26,27 @@ def async_handle_api_call(
|
|||||||
async def wrap_api_call(entity: _T, *args: _P.args, **kwargs: _P.kwargs) -> None:
|
async def wrap_api_call(entity: _T, *args: _P.args, **kwargs: _P.kwargs) -> None:
|
||||||
"""Wrap services for api calls."""
|
"""Wrap services for api calls."""
|
||||||
res: bool = False
|
res: bool = False
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
assert isinstance(entity.name, str)
|
||||||
try:
|
try:
|
||||||
async with asyncio.timeout(TIMEOUT):
|
async with asyncio.timeout(TIMEOUT):
|
||||||
res = await function(entity, *args, **kwargs)
|
res = await function(entity, *args, **kwargs)
|
||||||
except SENSIBO_ERRORS as err:
|
except SENSIBO_ERRORS as err:
|
||||||
raise HomeAssistantError from err
|
raise HomeAssistantError(
|
||||||
|
str(err),
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="service_raised",
|
||||||
|
translation_placeholders={"error": str(err), "name": entity.name},
|
||||||
|
) from err
|
||||||
|
|
||||||
LOGGER.debug("Result %s for entity %s with arguments %s", res, entity, kwargs)
|
LOGGER.debug("Result %s for entity %s with arguments %s", res, entity, kwargs)
|
||||||
if res is not True:
|
if res is not True:
|
||||||
raise HomeAssistantError(f"Could not execute service for {entity.name}")
|
raise HomeAssistantError(
|
||||||
|
f"Could not execute service for {entity.name}",
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="service_result_not_true",
|
||||||
|
translation_placeholders={"name": entity.name},
|
||||||
|
)
|
||||||
if (
|
if (
|
||||||
isinstance(key := kwargs.get("key"), str)
|
isinstance(key := kwargs.get("key"), str)
|
||||||
and (value := kwargs.get("value")) is not None
|
and (value := kwargs.get("value")) is not None
|
||||||
|
@ -106,9 +106,16 @@ class SensiboSelect(SensiboDeviceBaseEntity, SelectEntity):
|
|||||||
async def async_select_option(self, option: str) -> None:
|
async def async_select_option(self, option: str) -> None:
|
||||||
"""Set state to the selected option."""
|
"""Set state to the selected option."""
|
||||||
if self.entity_description.key not in self.device_data.active_features:
|
if self.entity_description.key not in self.device_data.active_features:
|
||||||
|
hvac_mode = self.device_data.hvac_mode if self.device_data.hvac_mode else ""
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Current mode {self.device_data.hvac_mode} doesn't support setting"
|
f"Current mode {self.device_data.hvac_mode} doesn't support setting"
|
||||||
f" {self.entity_description.name}"
|
f" {self.entity_description.name}",
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="select_option_not_available",
|
||||||
|
translation_placeholders={
|
||||||
|
"hvac_mode": hvac_mode,
|
||||||
|
"key": self.entity_description.key,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
await self.async_send_api_call(
|
await self.async_send_api_call(
|
||||||
|
@ -478,5 +478,37 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"exceptions": {
|
||||||
|
"no_target_temperature_in_features": {
|
||||||
|
"message": "Current mode doesn't support setting target temperature"
|
||||||
|
},
|
||||||
|
"no_target_temperature": {
|
||||||
|
"message": "No target temperature provided"
|
||||||
|
},
|
||||||
|
"no_fan_level_in_features": {
|
||||||
|
"message": "Current mode doesn't support setting fan level"
|
||||||
|
},
|
||||||
|
"fan_mode_not_supported": {
|
||||||
|
"message": "Climate fan mode {fan_mode} is not supported by the integration, please open an issue"
|
||||||
|
},
|
||||||
|
"no_swing_in_features": {
|
||||||
|
"message": "Current mode doesn't support setting swing"
|
||||||
|
},
|
||||||
|
"swing_not_supported": {
|
||||||
|
"message": "Climate swing mode {swing_mode} is not supported by the integration, please open an issue"
|
||||||
|
},
|
||||||
|
"service_result_not_true": {
|
||||||
|
"message": "Could not execute service for {name}"
|
||||||
|
},
|
||||||
|
"service_raised": {
|
||||||
|
"message": "Could not execute service for {name} with error {error}"
|
||||||
|
},
|
||||||
|
"select_option_not_available": {
|
||||||
|
"message": "Current mode {hvac_mode} doesn't support setting {key}"
|
||||||
|
},
|
||||||
|
"climate_react_not_available": {
|
||||||
|
"message": "Use Sensibo Enable Climate React Service once to enable switch or the Sensibo app"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -184,7 +184,9 @@ class SensiboDeviceSwitch(SensiboDeviceBaseEntity, SwitchEntity):
|
|||||||
if self.device_data.smart_type is None:
|
if self.device_data.smart_type is None:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
"Use Sensibo Enable Climate React Service once to enable switch or the"
|
"Use Sensibo Enable Climate React Service once to enable switch or the"
|
||||||
" Sensibo app"
|
" Sensibo app",
|
||||||
|
translation_domain=DOMAIN,
|
||||||
|
translation_key="climate_react_not_available",
|
||||||
)
|
)
|
||||||
data: dict[str, Any] = {"enabled": value}
|
data: dict[str, Any] = {"enabled": value}
|
||||||
result = await self._client.async_enable_climate_react(self._device_id, data)
|
result = await self._client.async_enable_climate_react(self._device_id, data)
|
||||||
|
@ -55,7 +55,7 @@ from homeassistant.const import (
|
|||||||
STATE_UNKNOWN,
|
STATE_UNKNOWN,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.exceptions import HomeAssistantError
|
from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
|
||||||
from homeassistant.util import dt as dt_util
|
from homeassistant.util import dt as dt_util
|
||||||
|
|
||||||
from tests.common import async_fire_time_changed
|
from tests.common import async_fire_time_changed
|
||||||
@ -438,7 +438,7 @@ async def test_climate_temperature_is_none(
|
|||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.sensibo.util.SensiboClient.async_set_ac_state_property",
|
"homeassistant.components.sensibo.util.SensiboClient.async_set_ac_state_property",
|
||||||
), pytest.raises(ValueError):
|
), pytest.raises(ServiceValidationError):
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
CLIMATE_DOMAIN,
|
CLIMATE_DOMAIN,
|
||||||
SERVICE_SET_TEMPERATURE,
|
SERVICE_SET_TEMPERATURE,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user