mirror of
https://github.com/home-assistant/core.git
synced 2025-07-20 19:57:07 +00:00
String formatting and max line length - Part 5 (#84501)
Co-authored-by: jjlawren <jjlawren@users.noreply.github.com>
This commit is contained in:
parent
139dd22ce6
commit
f39f3b612a
@ -108,8 +108,7 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
version = entry.version = 2
|
version = entry.version = 2
|
||||||
config_entries.async_update_entry(entry, data=data)
|
config_entries.async_update_entry(entry, data=data)
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"PlayStation 4 Config Updated: \
|
"PlayStation 4 Config Updated: Region changed to: %s",
|
||||||
Region changed to: %s",
|
|
||||||
country,
|
country,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -140,8 +139,7 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
)
|
)
|
||||||
entry.version = 3
|
entry.version = 3
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"PlayStation 4 identifier for entity: %s \
|
"PlayStation 4 identifier for entity: %s has changed",
|
||||||
has changed",
|
|
||||||
entity_id,
|
entity_id,
|
||||||
)
|
)
|
||||||
config_entries.async_update_entry(entry)
|
config_entries.async_update_entry(entry)
|
||||||
|
@ -81,9 +81,11 @@ class RecorderPool(SingletonThreadPool, NullPool): # type: ignore[misc]
|
|||||||
|
|
||||||
def _do_get_db_connection_protected(self) -> Any:
|
def _do_get_db_connection_protected(self) -> Any:
|
||||||
report(
|
report(
|
||||||
|
(
|
||||||
"accesses the database without the database executor; "
|
"accesses the database without the database executor; "
|
||||||
f"{ADVISE_MSG} "
|
f"{ADVISE_MSG} "
|
||||||
"for faster database operations",
|
"for faster database operations"
|
||||||
|
),
|
||||||
exclude_integrations={"recorder"},
|
exclude_integrations={"recorder"},
|
||||||
error_if_core=False,
|
error_if_core=False,
|
||||||
)
|
)
|
||||||
|
@ -2434,8 +2434,8 @@ def correct_db_schema(
|
|||||||
# Using LOCK=EXCLUSIVE to prevent the database from corrupting
|
# Using LOCK=EXCLUSIVE to prevent the database from corrupting
|
||||||
# https://github.com/home-assistant/core/issues/56104
|
# https://github.com/home-assistant/core/issues/56104
|
||||||
text(
|
text(
|
||||||
"ALTER TABLE statistics_meta CONVERT TO "
|
"ALTER TABLE statistics_meta CONVERT TO CHARACTER SET utf8mb4"
|
||||||
"CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, LOCK=EXCLUSIVE"
|
" COLLATE utf8mb4_unicode_ci, LOCK=EXCLUSIVE"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -225,9 +225,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
|||||||
keepalive_idle_timer = config[DOMAIN][CONF_KEEPALIVE_IDLE]
|
keepalive_idle_timer = config[DOMAIN][CONF_KEEPALIVE_IDLE]
|
||||||
if keepalive_idle_timer < 0:
|
if keepalive_idle_timer < 0:
|
||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
|
(
|
||||||
"A bogus TCP Keepalive IDLE timer was provided (%d secs), "
|
"A bogus TCP Keepalive IDLE timer was provided (%d secs), "
|
||||||
"it will be disabled. "
|
"it will be disabled. "
|
||||||
"Recommended values: 60-3600 (seconds)",
|
"Recommended values: 60-3600 (seconds)"
|
||||||
|
),
|
||||||
keepalive_idle_timer,
|
keepalive_idle_timer,
|
||||||
)
|
)
|
||||||
keepalive_idle_timer = None
|
keepalive_idle_timer = None
|
||||||
|
@ -282,8 +282,10 @@ async def _async_create_bridge_with_updated_data(
|
|||||||
|
|
||||||
if model_requires_encryption(model) and method != METHOD_ENCRYPTED_WEBSOCKET:
|
if model_requires_encryption(model) and method != METHOD_ENCRYPTED_WEBSOCKET:
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
|
(
|
||||||
"Detected model %s for %s. Some televisions from H and J series use "
|
"Detected model %s for %s. Some televisions from H and J series use "
|
||||||
"an encrypted protocol but you are using %s which may not be supported",
|
"an encrypted protocol but you are using %s which may not be supported"
|
||||||
|
),
|
||||||
model,
|
model,
|
||||||
host,
|
host,
|
||||||
method,
|
method,
|
||||||
|
@ -503,9 +503,11 @@ class SamsungTVWSBridge(
|
|||||||
return RESULT_SUCCESS
|
return RESULT_SUCCESS
|
||||||
except ConnectionClosedError as err:
|
except ConnectionClosedError as err:
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
"Working but unsupported config: %s, error: '%s'; this may "
|
(
|
||||||
"be an indication that access to the TV has been denied. Please "
|
"Working but unsupported config: %s, error: '%s'; this may be"
|
||||||
"check the Device Connection Manager on your TV",
|
" an indication that access to the TV has been denied. Please"
|
||||||
|
" check the Device Connection Manager on your TV"
|
||||||
|
),
|
||||||
config,
|
config,
|
||||||
err,
|
err,
|
||||||
)
|
)
|
||||||
@ -590,8 +592,10 @@ class SamsungTVWSBridge(
|
|||||||
self._remote = None
|
self._remote = None
|
||||||
except ConnectionFailure as err:
|
except ConnectionFailure as err:
|
||||||
LOGGER.warning(
|
LOGGER.warning(
|
||||||
|
(
|
||||||
"Unexpected ConnectionFailure trying to get remote for %s, "
|
"Unexpected ConnectionFailure trying to get remote for %s, "
|
||||||
"please report this issue: %s",
|
"please report this issue: %s"
|
||||||
|
),
|
||||||
self.host,
|
self.host,
|
||||||
repr(err),
|
repr(err),
|
||||||
)
|
)
|
||||||
@ -633,8 +637,10 @@ class SamsungTVWSBridge(
|
|||||||
message := data.get("message")
|
message := data.get("message")
|
||||||
) == "unrecognized method value : ms.remote.control":
|
) == "unrecognized method value : ms.remote.control":
|
||||||
LOGGER.error(
|
LOGGER.error(
|
||||||
|
(
|
||||||
"Your TV seems to be unsupported by SamsungTVWSBridge"
|
"Your TV seems to be unsupported by SamsungTVWSBridge"
|
||||||
" and needs a PIN: '%s'. Updating config entry",
|
" and needs a PIN: '%s'. Updating config entry"
|
||||||
|
),
|
||||||
message,
|
message,
|
||||||
)
|
)
|
||||||
self._notify_update_config_entry(
|
self._notify_update_config_entry(
|
||||||
@ -780,7 +786,10 @@ class SamsungTVEncryptedBridge(
|
|||||||
else:
|
else:
|
||||||
if self._model and not self._power_off_warning_logged:
|
if self._model and not self._power_off_warning_logged:
|
||||||
LOGGER.warning(
|
LOGGER.warning(
|
||||||
"Unknown power_off command for %s (%s): sending KEY_POWEROFF and KEY_POWER",
|
(
|
||||||
|
"Unknown power_off command for %s (%s): sending KEY_POWEROFF"
|
||||||
|
" and KEY_POWER"
|
||||||
|
),
|
||||||
self._model,
|
self._model,
|
||||||
self.host,
|
self.host,
|
||||||
)
|
)
|
||||||
|
@ -69,7 +69,8 @@ def valid_schedule(schedule: list[dict[str, str]]) -> list[dict[str, str]]:
|
|||||||
for time_range in schedule:
|
for time_range in schedule:
|
||||||
if time_range[CONF_FROM] >= time_range[CONF_TO]:
|
if time_range[CONF_FROM] >= time_range[CONF_TO]:
|
||||||
raise vol.Invalid(
|
raise vol.Invalid(
|
||||||
f"Invalid time range, from {time_range[CONF_FROM]} is after {time_range[CONF_TO]}"
|
f"Invalid time range, from {time_range[CONF_FROM]} is after"
|
||||||
|
f" {time_range[CONF_TO]}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check if the from time of the event is after the to time of the previous event
|
# Check if the from time of the event is after the to time of the previous event
|
||||||
|
@ -142,7 +142,8 @@ class ScreenLogicClimate(ScreenlogicEntity, ClimateEntity, RestoreEntity):
|
|||||||
await self._async_refresh()
|
await self._async_refresh()
|
||||||
else:
|
else:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Failed to set_temperature {temperature} on body {self.body['body_type']['value']}"
|
f"Failed to set_temperature {temperature} on body"
|
||||||
|
f" {self.body['body_type']['value']}"
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
|
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
|
||||||
@ -156,7 +157,8 @@ class ScreenLogicClimate(ScreenlogicEntity, ClimateEntity, RestoreEntity):
|
|||||||
await self._async_refresh()
|
await self._async_refresh()
|
||||||
else:
|
else:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Failed to set_hvac_mode {mode} on body {self.body['body_type']['value']}"
|
f"Failed to set_hvac_mode {mode} on body"
|
||||||
|
f" {self.body['body_type']['value']}"
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_set_preset_mode(self, preset_mode: str) -> None:
|
async def async_set_preset_mode(self, preset_mode: str) -> None:
|
||||||
@ -170,7 +172,8 @@ class ScreenLogicClimate(ScreenlogicEntity, ClimateEntity, RestoreEntity):
|
|||||||
await self._async_refresh()
|
await self._async_refresh()
|
||||||
else:
|
else:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Failed to set_preset_mode {mode} on body {self.body['body_type']['value']}"
|
f"Failed to set_preset_mode {mode} on body"
|
||||||
|
f" {self.body['body_type']['value']}"
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_added_to_hass(self) -> None:
|
async def async_added_to_hass(self) -> None:
|
||||||
|
@ -129,7 +129,9 @@ class ScreenlogicConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
vol.Required(GATEWAY_SELECT_KEY): vol.In(
|
vol.Required(GATEWAY_SELECT_KEY): vol.In(
|
||||||
{
|
{
|
||||||
**unconfigured_gateways,
|
**unconfigured_gateways,
|
||||||
GATEWAY_MANUAL_ENTRY: "Manually configure a ScreenLogic gateway",
|
GATEWAY_MANUAL_ENTRY: (
|
||||||
|
"Manually configure a ScreenLogic gateway"
|
||||||
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,8 @@ def async_load_screenlogic_services(hass: HomeAssistant):
|
|||||||
)
|
)
|
||||||
):
|
):
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Failed to call service '{SERVICE_SET_COLOR_MODE}'. Config entry for target not found"
|
f"Failed to call service '{SERVICE_SET_COLOR_MODE}'. Config entry for"
|
||||||
|
" target not found"
|
||||||
)
|
)
|
||||||
color_num = SUPPORTED_COLOR_MODES[service_call.data[ATTR_COLOR_MODE]]
|
color_num = SUPPORTED_COLOR_MODES[service_call.data[ATTR_COLOR_MODE]]
|
||||||
for entry_id in screenlogic_entry_ids:
|
for entry_id in screenlogic_entry_ids:
|
||||||
|
@ -104,7 +104,8 @@ class SensiboSelect(SensiboDeviceBaseEntity, SelectEntity):
|
|||||||
"""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:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Current mode {self.device_data.hvac_mode} doesn't support setting {self.entity_description.name}"
|
f"Current mode {self.device_data.hvac_mode} doesn't support setting"
|
||||||
|
f" {self.entity_description.name}"
|
||||||
)
|
)
|
||||||
|
|
||||||
await self.async_send_api_call(
|
await self.async_send_api_call(
|
||||||
|
@ -184,7 +184,8 @@ class SensiboDeviceSwitch(SensiboDeviceBaseEntity, SwitchEntity):
|
|||||||
"""Make service call to api for setting Climate React."""
|
"""Make service call to api for setting Climate React."""
|
||||||
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 Sensibo app"
|
"Use Sensibo Enable Climate React Service once to enable switch or the"
|
||||||
|
" Sensibo app"
|
||||||
)
|
)
|
||||||
new_state = bool(self.device_data.smart_on is False)
|
new_state = bool(self.device_data.smart_on is False)
|
||||||
data: dict[str, Any] = {"enabled": new_state}
|
data: dict[str, Any] = {"enabled": new_state}
|
||||||
|
@ -756,11 +756,12 @@ class SensorEntity(Entity):
|
|||||||
report_issue = self._suggest_report_issue()
|
report_issue = self._suggest_report_issue()
|
||||||
# This should raise in Home Assistant Core 2022.5
|
# This should raise in Home Assistant Core 2022.5
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
|
(
|
||||||
"Entity %s (%s) with state_class %s has set last_reset. Setting"
|
"Entity %s (%s) with state_class %s has set last_reset. Setting"
|
||||||
"last_reset for entities with state_class other than 'total' is "
|
" last_reset for entities with state_class other than 'total'"
|
||||||
"not supported. "
|
" is not supported. Please update your configuration if"
|
||||||
"Please update your configuration if state_class is manually "
|
" state_class is manually configured, otherwise %s"
|
||||||
"configured, otherwise %s",
|
),
|
||||||
self.entity_id,
|
self.entity_id,
|
||||||
type(self),
|
type(self),
|
||||||
self.state_class,
|
self.state_class,
|
||||||
@ -968,10 +969,12 @@ class SensorEntity(Entity):
|
|||||||
|
|
||||||
# This should raise in Home Assistant Core 2023.6
|
# This should raise in Home Assistant Core 2023.6
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
|
(
|
||||||
"Entity %s (%s) is using native unit of measurement '%s' which "
|
"Entity %s (%s) is using native unit of measurement '%s' which "
|
||||||
"is not a valid unit for the device class ('%s') it is using; "
|
"is not a valid unit for the device class ('%s') it is using; "
|
||||||
"Please update your configuration if your entity is manually "
|
"Please update your configuration if your entity is manually "
|
||||||
"configured, otherwise %s",
|
"configured, otherwise %s"
|
||||||
|
),
|
||||||
self.entity_id,
|
self.entity_id,
|
||||||
type(self),
|
type(self),
|
||||||
native_unit_of_measurement,
|
native_unit_of_measurement,
|
||||||
|
@ -202,9 +202,11 @@ def _normalize_states(
|
|||||||
f"({old_metadata['unit_of_measurement']})"
|
f"({old_metadata['unit_of_measurement']})"
|
||||||
)
|
)
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"The unit of %s is changing, got multiple %s, generation of long term "
|
(
|
||||||
"statistics will be suppressed unless the unit is stable%s. "
|
"The unit of %s is changing, got multiple %s, generation of"
|
||||||
"Go to %s to fix this",
|
" long term statistics will be suppressed unless the unit is"
|
||||||
|
" stable%s. Go to %s to fix this"
|
||||||
|
),
|
||||||
entity_id,
|
entity_id,
|
||||||
all_units,
|
all_units,
|
||||||
extra,
|
extra,
|
||||||
@ -226,11 +228,12 @@ def _normalize_states(
|
|||||||
if entity_id not in hass.data[WARN_UNSUPPORTED_UNIT]:
|
if entity_id not in hass.data[WARN_UNSUPPORTED_UNIT]:
|
||||||
hass.data[WARN_UNSUPPORTED_UNIT].add(entity_id)
|
hass.data[WARN_UNSUPPORTED_UNIT].add(entity_id)
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"The unit of %s (%s) can not be converted to the unit of previously "
|
(
|
||||||
"compiled statistics (%s). Generation of long term statistics "
|
"The unit of %s (%s) can not be converted to the unit of"
|
||||||
"will be suppressed unless the unit changes back to %s or a "
|
" previously compiled statistics (%s). Generation of long term"
|
||||||
"compatible unit. "
|
" statistics will be suppressed unless the unit changes back to"
|
||||||
"Go to %s to fix this",
|
" %s or a compatible unit. Go to %s to fix this"
|
||||||
|
),
|
||||||
entity_id,
|
entity_id,
|
||||||
state_unit,
|
state_unit,
|
||||||
statistics_unit,
|
statistics_unit,
|
||||||
@ -291,9 +294,11 @@ def warn_dip(
|
|||||||
if domain in ["energy", "growatt_server", "solaredge"]:
|
if domain in ["energy", "growatt_server", "solaredge"]:
|
||||||
return
|
return
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Entity %s %shas state class total_increasing, but its state is "
|
(
|
||||||
"not strictly increasing. Triggered by state %s (%s) with last_updated set to %s. "
|
"Entity %s %shas state class total_increasing, but its state is not"
|
||||||
"Please %s",
|
" strictly increasing. Triggered by state %s (%s) with last_updated set"
|
||||||
|
" to %s. Please %s"
|
||||||
|
),
|
||||||
entity_id,
|
entity_id,
|
||||||
f"from integration {domain} " if domain else "",
|
f"from integration {domain} " if domain else "",
|
||||||
state.state,
|
state.state,
|
||||||
@ -311,8 +316,10 @@ def warn_negative(hass: HomeAssistant, entity_id: str, state: State) -> None:
|
|||||||
hass.data[WARN_NEGATIVE].add(entity_id)
|
hass.data[WARN_NEGATIVE].add(entity_id)
|
||||||
domain = entity_sources(hass).get(entity_id, {}).get("domain")
|
domain = entity_sources(hass).get(entity_id, {}).get("domain")
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
|
(
|
||||||
"Entity %s %shas state class total_increasing, but its state is "
|
"Entity %s %shas state class total_increasing, but its state is "
|
||||||
"negative. Triggered by state %s with last_updated set to %s. Please %s",
|
"negative. Triggered by state %s with last_updated set to %s. Please %s"
|
||||||
|
),
|
||||||
entity_id,
|
entity_id,
|
||||||
f"from integration {domain} " if domain else "",
|
f"from integration {domain} " if domain else "",
|
||||||
state.state,
|
state.state,
|
||||||
@ -472,11 +479,13 @@ def _compile_statistics( # noqa: C901
|
|||||||
if entity_id not in hass.data[WARN_UNSTABLE_UNIT]:
|
if entity_id not in hass.data[WARN_UNSTABLE_UNIT]:
|
||||||
hass.data[WARN_UNSTABLE_UNIT].add(entity_id)
|
hass.data[WARN_UNSTABLE_UNIT].add(entity_id)
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"The unit of %s (%s) can not be converted to the unit of previously "
|
(
|
||||||
"compiled statistics (%s). Generation of long term statistics "
|
"The unit of %s (%s) can not be converted to the unit of"
|
||||||
"will be suppressed unless the unit changes back to %s or a "
|
" previously compiled statistics (%s). Generation of long"
|
||||||
"compatible unit. "
|
" term statistics will be suppressed unless the unit"
|
||||||
"Go to %s to fix this",
|
" changes back to %s or a compatible unit. Go to %s to fix"
|
||||||
|
" this"
|
||||||
|
),
|
||||||
entity_id,
|
entity_id,
|
||||||
statistics_unit,
|
statistics_unit,
|
||||||
old_metadata[1]["unit_of_measurement"],
|
old_metadata[1]["unit_of_measurement"],
|
||||||
@ -531,13 +540,19 @@ def _compile_statistics( # noqa: C901
|
|||||||
):
|
):
|
||||||
if old_state is None:
|
if old_state is None:
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"Compiling initial sum statistics for %s, zero point set to %s",
|
(
|
||||||
|
"Compiling initial sum statistics for %s, zero point"
|
||||||
|
" set to %s"
|
||||||
|
),
|
||||||
entity_id,
|
entity_id,
|
||||||
fstate,
|
fstate,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"Detected new cycle for %s, last_reset set to %s (old last_reset %s)",
|
(
|
||||||
|
"Detected new cycle for %s, last_reset set to %s (old"
|
||||||
|
" last_reset %s)"
|
||||||
|
),
|
||||||
entity_id,
|
entity_id,
|
||||||
last_reset,
|
last_reset,
|
||||||
old_last_reset,
|
old_last_reset,
|
||||||
@ -557,8 +572,11 @@ def _compile_statistics( # noqa: C901
|
|||||||
):
|
):
|
||||||
reset = True
|
reset = True
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"Detected new cycle for %s, value dropped from %s to %s, "
|
(
|
||||||
"triggered by state with last_updated set to %s",
|
"Detected new cycle for %s, value dropped from %s"
|
||||||
|
" to %s, triggered by state with last_updated set"
|
||||||
|
" to %s"
|
||||||
|
),
|
||||||
entity_id,
|
entity_id,
|
||||||
new_state,
|
new_state,
|
||||||
state.last_updated.isoformat(),
|
state.last_updated.isoformat(),
|
||||||
|
@ -98,7 +98,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
# value, so if host isn't present, config entry will not be configured.
|
# value, so if host isn't present, config entry will not be configured.
|
||||||
if not entry.data.get(CONF_HOST):
|
if not entry.data.get(CONF_HOST):
|
||||||
LOGGER.warning(
|
LOGGER.warning(
|
||||||
"The config entry %s probably comes from a custom integration, please remove it if you want to use core Shelly integration",
|
(
|
||||||
|
"The config entry %s probably comes from a custom integration, please"
|
||||||
|
" remove it if you want to use core Shelly integration"
|
||||||
|
),
|
||||||
entry.title,
|
entry.title,
|
||||||
)
|
)
|
||||||
return False
|
return False
|
||||||
|
@ -265,7 +265,8 @@ class BlockSleepingClimate(
|
|||||||
except DeviceConnectionError as err:
|
except DeviceConnectionError as err:
|
||||||
self.coordinator.last_update_success = False
|
self.coordinator.last_update_success = False
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Setting state for entity {self.name} failed, state: {kwargs}, error: {repr(err)}"
|
f"Setting state for entity {self.name} failed, state: {kwargs}, error:"
|
||||||
|
f" {repr(err)}"
|
||||||
) from err
|
) from err
|
||||||
except InvalidAuthError:
|
except InvalidAuthError:
|
||||||
self.coordinator.entry.async_start_reauth(self.hass)
|
self.coordinator.entry.async_start_reauth(self.hass)
|
||||||
|
@ -347,7 +347,8 @@ class ShellyBlockEntity(CoordinatorEntity[ShellyBlockCoordinator]):
|
|||||||
except DeviceConnectionError as err:
|
except DeviceConnectionError as err:
|
||||||
self.coordinator.last_update_success = False
|
self.coordinator.last_update_success = False
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Setting state for entity {self.name} failed, state: {kwargs}, error: {repr(err)}"
|
f"Setting state for entity {self.name} failed, state: {kwargs}, error:"
|
||||||
|
f" {repr(err)}"
|
||||||
) from err
|
) from err
|
||||||
except InvalidAuthError:
|
except InvalidAuthError:
|
||||||
self.coordinator.entry.async_start_reauth(self.hass)
|
self.coordinator.entry.async_start_reauth(self.hass)
|
||||||
@ -399,11 +400,13 @@ class ShellyRpcEntity(CoordinatorEntity[ShellyRpcCoordinator]):
|
|||||||
except DeviceConnectionError as err:
|
except DeviceConnectionError as err:
|
||||||
self.coordinator.last_update_success = False
|
self.coordinator.last_update_success = False
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Call RPC for {self.name} connection error, method: {method}, params: {params}, error: {repr(err)}"
|
f"Call RPC for {self.name} connection error, method: {method}, params:"
|
||||||
|
f" {params}, error: {repr(err)}"
|
||||||
) from err
|
) from err
|
||||||
except RpcCallError as err:
|
except RpcCallError as err:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Call RPC for {self.name} request error, method: {method}, params: {params}, error: {repr(err)}"
|
f"Call RPC for {self.name} request error, method: {method}, params:"
|
||||||
|
f" {params}, error: {repr(err)}"
|
||||||
) from err
|
) from err
|
||||||
except InvalidAuthError:
|
except InvalidAuthError:
|
||||||
self.coordinator.entry.async_start_reauth(self.hass)
|
self.coordinator.entry.async_start_reauth(self.hass)
|
||||||
|
@ -53,7 +53,9 @@ def async_describe_events(
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
LOGBOOK_ENTRY_NAME: "Shelly",
|
LOGBOOK_ENTRY_NAME: "Shelly",
|
||||||
LOGBOOK_ENTRY_MESSAGE: f"'{click_type}' click event for {input_name} Input was fired",
|
LOGBOOK_ENTRY_MESSAGE: (
|
||||||
|
f"'{click_type}' click event for {input_name} Input was fired"
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
async_describe_event(DOMAIN, EVENT_SHELLY_CLICK, async_describe_shelly_click_event)
|
async_describe_event(DOMAIN, EVENT_SHELLY_CLICK, async_describe_shelly_click_event)
|
||||||
|
@ -117,7 +117,8 @@ class BlockSleepingNumber(ShellySleepingBlockAttributeEntity, NumberEntity):
|
|||||||
except DeviceConnectionError as err:
|
except DeviceConnectionError as err:
|
||||||
self.coordinator.last_update_success = False
|
self.coordinator.last_update_success = False
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Setting state for entity {self.name} failed, state: {params}, error: {repr(err)}"
|
f"Setting state for entity {self.name} failed, state: {params}, error:"
|
||||||
|
f" {repr(err)}"
|
||||||
) from err
|
) from err
|
||||||
except InvalidAuthError:
|
except InvalidAuthError:
|
||||||
self.coordinator.entry.async_start_reauth(self.hass)
|
self.coordinator.entry.async_start_reauth(self.hass)
|
||||||
|
@ -264,7 +264,8 @@ class ShoppingData:
|
|||||||
# so all items left in the mapping should be checked items.
|
# so all items left in the mapping should be checked items.
|
||||||
if all_items_mapping[key]["complete"] is False:
|
if all_items_mapping[key]["complete"] is False:
|
||||||
raise vol.Invalid(
|
raise vol.Invalid(
|
||||||
"The item ids array doesn't contain all the unchecked shopping list items."
|
"The item ids array doesn't contain all the unchecked shopping list"
|
||||||
|
" items."
|
||||||
)
|
)
|
||||||
new_items.append(all_items_mapping[key])
|
new_items.append(all_items_mapping[key])
|
||||||
self.items = new_items
|
self.items = new_items
|
||||||
|
@ -151,7 +151,8 @@ class SignalNotificationService(BaseNotificationService):
|
|||||||
> attachment_size_limit
|
> attachment_size_limit
|
||||||
):
|
):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Attachment too large (Content-Length reports {}). Max size: {} bytes".format(
|
"Attachment too large (Content-Length reports {}). Max size: {}"
|
||||||
|
" bytes".format(
|
||||||
int(str(resp.headers.get("Content-Length"))),
|
int(str(resp.headers.get("Content-Length"))),
|
||||||
CONF_MAX_ALLOWED_DOWNLOAD_SIZE_BYTES,
|
CONF_MAX_ALLOWED_DOWNLOAD_SIZE_BYTES,
|
||||||
)
|
)
|
||||||
@ -163,9 +164,8 @@ class SignalNotificationService(BaseNotificationService):
|
|||||||
size += len(chunk)
|
size += len(chunk)
|
||||||
if size > attachment_size_limit:
|
if size > attachment_size_limit:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Attachment too large (Stream reports {}). Max size: {} bytes".format(
|
"Attachment too large (Stream reports {}). Max size: {}"
|
||||||
size, CONF_MAX_ALLOWED_DOWNLOAD_SIZE_BYTES
|
" bytes".format(size, CONF_MAX_ALLOWED_DOWNLOAD_SIZE_BYTES)
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
chunks.extend(chunk)
|
chunks.extend(chunk)
|
||||||
|
@ -47,7 +47,10 @@ async def _async_set_actuator_position(
|
|||||||
|
|
||||||
def _get_actuator_name(bed: SleepIQBed, actuator: SleepIQActuator) -> str:
|
def _get_actuator_name(bed: SleepIQBed, actuator: SleepIQActuator) -> str:
|
||||||
if actuator.side:
|
if actuator.side:
|
||||||
return f"SleepNumber {bed.name} {actuator.side_full} {actuator.actuator_full} {ENTITY_TYPES[ACTUATOR]}"
|
return (
|
||||||
|
"SleepNumber"
|
||||||
|
f" {bed.name} {actuator.side_full} {actuator.actuator_full} {ENTITY_TYPES[ACTUATOR]}"
|
||||||
|
)
|
||||||
|
|
||||||
return f"SleepNumber {bed.name} {actuator.actuator_full} {ENTITY_TYPES[ACTUATOR]}"
|
return f"SleepNumber {bed.name} {actuator.actuator_full} {ENTITY_TYPES[ACTUATOR]}"
|
||||||
|
|
||||||
|
@ -92,7 +92,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
|
|
||||||
if not validate_webhook_requirements(hass):
|
if not validate_webhook_requirements(hass):
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"The 'base_url' of the 'http' integration must be configured and start with 'https://'"
|
"The 'base_url' of the 'http' integration must be configured and start with"
|
||||||
|
" 'https://'"
|
||||||
)
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -135,7 +136,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
await device.status.refresh()
|
await device.status.refresh()
|
||||||
except ClientResponseError:
|
except ClientResponseError:
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Unable to update status for device: %s (%s), the device will be excluded",
|
(
|
||||||
|
"Unable to update status for device: %s (%s), the device will"
|
||||||
|
" be excluded"
|
||||||
|
),
|
||||||
device.label,
|
device.label,
|
||||||
device.device_id,
|
device.device_id,
|
||||||
exc_info=True,
|
exc_info=True,
|
||||||
@ -161,7 +165,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
except ClientResponseError as ex:
|
except ClientResponseError as ex:
|
||||||
if ex.status in (HTTPStatus.UNAUTHORIZED, HTTPStatus.FORBIDDEN):
|
if ex.status in (HTTPStatus.UNAUTHORIZED, HTTPStatus.FORBIDDEN):
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
"Unable to setup configuration entry '%s' - please reconfigure the integration",
|
(
|
||||||
|
"Unable to setup configuration entry '%s' - please reconfigure the"
|
||||||
|
" integration"
|
||||||
|
),
|
||||||
entry.title,
|
entry.title,
|
||||||
)
|
)
|
||||||
remove_entry = True
|
remove_entry = True
|
||||||
@ -194,7 +201,10 @@ async def async_get_entry_scenes(entry: ConfigEntry, api):
|
|||||||
except ClientResponseError as ex:
|
except ClientResponseError as ex:
|
||||||
if ex.status == HTTPStatus.FORBIDDEN:
|
if ex.status == HTTPStatus.FORBIDDEN:
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
"Unable to load scenes for configuration entry '%s' because the access token does not have the required access",
|
(
|
||||||
|
"Unable to load scenes for configuration entry '%s' because the"
|
||||||
|
" access token does not have the required access"
|
||||||
|
),
|
||||||
entry.title,
|
entry.title,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@ -237,7 +247,10 @@ async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
|
|||||||
app_count = sum(1 for entry in all_entries if entry.data[CONF_APP_ID] == app_id)
|
app_count = sum(1 for entry in all_entries if entry.data[CONF_APP_ID] == app_id)
|
||||||
if app_count > 1:
|
if app_count > 1:
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"App %s was not removed because it is in use by other configuration entries",
|
(
|
||||||
|
"App %s was not removed because it is in use by other configuration"
|
||||||
|
" entries"
|
||||||
|
),
|
||||||
app_id,
|
app_id,
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
@ -236,7 +236,10 @@ class SmartThingsThermostat(SmartThingsEntity, ClimateEntity):
|
|||||||
modes.add(state)
|
modes.add(state)
|
||||||
else:
|
else:
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Device %s (%s) returned an invalid supported thermostat mode: %s",
|
(
|
||||||
|
"Device %s (%s) returned an invalid supported thermostat"
|
||||||
|
" mode: %s"
|
||||||
|
),
|
||||||
self._device.label,
|
self._device.label,
|
||||||
self._device.device_id,
|
self._device.device_id,
|
||||||
mode,
|
mode,
|
||||||
|
@ -66,7 +66,9 @@ class SmartThingsFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
reason="invalid_webhook_url",
|
reason="invalid_webhook_url",
|
||||||
description_placeholders={
|
description_placeholders={
|
||||||
"webhook_url": webhook_url,
|
"webhook_url": webhook_url,
|
||||||
"component_url": "https://www.home-assistant.io/integrations/smartthings/",
|
"component_url": (
|
||||||
|
"https://www.home-assistant.io/integrations/smartthings/"
|
||||||
|
),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -216,7 +218,9 @@ class SmartThingsFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
errors=errors,
|
errors=errors,
|
||||||
description_placeholders={
|
description_placeholders={
|
||||||
"token_url": "https://account.smartthings.com/tokens",
|
"token_url": "https://account.smartthings.com/tokens",
|
||||||
"component_url": "https://www.home-assistant.io/integrations/smartthings/",
|
"component_url": (
|
||||||
|
"https://www.home-assistant.io/integrations/smartthings/"
|
||||||
|
),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -338,7 +338,10 @@ async def smartapp_sync_subscriptions(
|
|||||||
try:
|
try:
|
||||||
await api.delete_subscription(installed_app_id, sub.subscription_id)
|
await api.delete_subscription(installed_app_id, sub.subscription_id)
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Removed subscription for '%s' under app '%s' because it was no longer needed",
|
(
|
||||||
|
"Removed subscription for '%s' under app '%s' because it was no"
|
||||||
|
" longer needed"
|
||||||
|
),
|
||||||
sub.capability,
|
sub.capability,
|
||||||
installed_app_id,
|
installed_app_id,
|
||||||
)
|
)
|
||||||
@ -361,9 +364,11 @@ async def smartapp_sync_subscriptions(
|
|||||||
capability_count = len(capabilities)
|
capability_count = len(capabilities)
|
||||||
if capability_count > SUBSCRIPTION_WARNING_LIMIT:
|
if capability_count > SUBSCRIPTION_WARNING_LIMIT:
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Some device attributes may not receive push updates and there may be subscription "
|
(
|
||||||
"creation failures under app '%s' because %s subscriptions are required but "
|
"Some device attributes may not receive push updates and there may be"
|
||||||
"there is a limit of %s per app",
|
" subscription creation failures under app '%s' because %s"
|
||||||
|
" subscriptions are required but there is a limit of %s per app"
|
||||||
|
),
|
||||||
installed_app_id,
|
installed_app_id,
|
||||||
capability_count,
|
capability_count,
|
||||||
SUBSCRIPTION_WARNING_LIMIT,
|
SUBSCRIPTION_WARNING_LIMIT,
|
||||||
|
@ -154,16 +154,17 @@ class MailNotificationService(BaseNotificationService):
|
|||||||
server = self.connect()
|
server = self.connect()
|
||||||
except (smtplib.socket.gaierror, ConnectionRefusedError):
|
except (smtplib.socket.gaierror, ConnectionRefusedError):
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
"SMTP server not found or refused connection (%s:%s). "
|
(
|
||||||
"Please check the IP address, hostname, and availability of your SMTP server",
|
"SMTP server not found or refused connection (%s:%s). Please check"
|
||||||
|
" the IP address, hostname, and availability of your SMTP server"
|
||||||
|
),
|
||||||
self._server,
|
self._server,
|
||||||
self._port,
|
self._port,
|
||||||
)
|
)
|
||||||
|
|
||||||
except smtplib.SMTPAuthenticationError:
|
except smtplib.SMTPAuthenticationError:
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
"Login not possible. "
|
"Login not possible. Please check your setting and/or your credentials"
|
||||||
"Please check your setting and/or your credentials"
|
|
||||||
)
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -115,5 +115,6 @@ class SnoozFan(FanEntity, RestoreEntity):
|
|||||||
self._async_write_state_changed()
|
self._async_write_state_changed()
|
||||||
elif result.status != SnoozCommandResultStatus.CANCELLED:
|
elif result.status != SnoozCommandResultStatus.CANCELLED:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Command {command} failed with status {result.status.name} after {result.duration}"
|
f"Command {command} failed with status {result.status.name} after"
|
||||||
|
f" {result.duration}"
|
||||||
)
|
)
|
||||||
|
@ -262,7 +262,8 @@ class SolarEdgePowerFlowDataService(SolarEdgeDataService):
|
|||||||
|
|
||||||
if "connections" not in power_flow:
|
if "connections" not in power_flow:
|
||||||
LOGGER.debug(
|
LOGGER.debug(
|
||||||
"Missing connections in power flow data. Assuming site does not have any"
|
"Missing connections in power flow data. Assuming site does not"
|
||||||
|
" have any"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -64,7 +64,10 @@ class SolarlogData(update_coordinator.DataUpdateCoordinator):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.logger.debug(
|
self.logger.debug(
|
||||||
"Connection to Solarlog successful. Retrieving latest Solarlog update of %s",
|
(
|
||||||
|
"Connection to Solarlog successful. Retrieving latest Solarlog update"
|
||||||
|
" of %s"
|
||||||
|
),
|
||||||
data.time,
|
data.time,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -88,7 +88,10 @@ def soma_api_call(api_call):
|
|||||||
if self.is_available:
|
if self.is_available:
|
||||||
self.is_available = False
|
self.is_available = False
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Device is unreachable (%s). Error while fetching the state: %s",
|
(
|
||||||
|
"Device is unreachable (%s). Error while fetching the"
|
||||||
|
" state: %s"
|
||||||
|
),
|
||||||
self.name,
|
self.name,
|
||||||
response_from_api["msg"],
|
response_from_api["msg"],
|
||||||
)
|
)
|
||||||
|
@ -98,7 +98,8 @@ class SomaTilt(SomaEntity, CoverEntity):
|
|||||||
response = self.api.set_shade_position(self.device["mac"], target_api_position)
|
response = self.api.set_shade_position(self.device["mac"], target_api_position)
|
||||||
if not is_api_response_success(response):
|
if not is_api_response_success(response):
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f'Error while setting the cover position ({self.name}): {response["msg"]}'
|
f"Error while setting the cover position ({self.name}):"
|
||||||
|
f' {response["msg"]}'
|
||||||
)
|
)
|
||||||
self.set_position(kwargs[ATTR_TILT_POSITION])
|
self.set_position(kwargs[ATTR_TILT_POSITION])
|
||||||
|
|
||||||
@ -169,7 +170,8 @@ class SomaShade(SomaEntity, CoverEntity):
|
|||||||
)
|
)
|
||||||
if not is_api_response_success(response):
|
if not is_api_response_success(response):
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f'Error while setting the cover position ({self.name}): {response["msg"]}'
|
f"Error while setting the cover position ({self.name}):"
|
||||||
|
f' {response["msg"]}'
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_update(self) -> None:
|
async def async_update(self) -> None:
|
||||||
|
@ -122,7 +122,9 @@ SENSOR_TYPES: dict[str, SonarrSensorEntityDescription[Any]] = {
|
|||||||
entity_registry_enabled_default=False,
|
entity_registry_enabled_default=False,
|
||||||
value_fn=len,
|
value_fn=len,
|
||||||
attributes_fn=lambda data: {
|
attributes_fn=lambda data: {
|
||||||
i.title: f"{getattr(i.statistics,'episodeFileCount', 0)}/{getattr(i.statistics, 'episodeCount', 0)} Episodes"
|
i.title: (
|
||||||
|
f"{getattr(i.statistics,'episodeFileCount', 0)}/{getattr(i.statistics, 'episodeCount', 0)} Episodes"
|
||||||
|
)
|
||||||
for i in data
|
for i in data
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -52,7 +52,8 @@ async def async_setup_platform(
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""Set up from legacy configuration file. Obsolete."""
|
"""Set up from legacy configuration file. Obsolete."""
|
||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
"Configuring Songpal through media_player platform is no longer supported. Convert to songpal platform or UI configuration"
|
"Configuring Songpal through media_player platform is no longer supported."
|
||||||
|
" Convert to songpal platform or UI configuration"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -136,7 +136,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
|
|
||||||
if deprecated_address := config.get(CONF_INTERFACE_ADDR):
|
if deprecated_address := config.get(CONF_INTERFACE_ADDR):
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"'%s' is deprecated, enable %s in the Network integration (https://www.home-assistant.io/integrations/network/)",
|
(
|
||||||
|
"'%s' is deprecated, enable %s in the Network integration"
|
||||||
|
" (https://www.home-assistant.io/integrations/network/)"
|
||||||
|
),
|
||||||
CONF_INTERFACE_ADDR,
|
CONF_INTERFACE_ADDR,
|
||||||
deprecated_address,
|
deprecated_address,
|
||||||
)
|
)
|
||||||
@ -365,7 +368,8 @@ class SonosDiscoveryManager:
|
|||||||
"""Handle discovery via ssdp or zeroconf."""
|
"""Handle discovery via ssdp or zeroconf."""
|
||||||
if self._manual_config_required:
|
if self._manual_config_required:
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Automatic discovery is working, Sonos hosts in configuration.yaml are not needed"
|
"Automatic discovery is working, Sonos hosts in configuration.yaml are"
|
||||||
|
" not needed"
|
||||||
)
|
)
|
||||||
self._manual_config_required = False
|
self._manual_config_required = False
|
||||||
if model in DISCOVERY_IGNORED_MODELS:
|
if model in DISCOVERY_IGNORED_MODELS:
|
||||||
|
@ -58,12 +58,21 @@ class SonosEntity(Entity):
|
|||||||
"""Poll the entity if subscriptions fail."""
|
"""Poll the entity if subscriptions fail."""
|
||||||
if not self.speaker.subscriptions_failed:
|
if not self.speaker.subscriptions_failed:
|
||||||
if soco_config.EVENT_ADVERTISE_IP:
|
if soco_config.EVENT_ADVERTISE_IP:
|
||||||
listener_msg = f"{self.speaker.subscription_address} (advertising as {soco_config.EVENT_ADVERTISE_IP})"
|
listener_msg = (
|
||||||
|
f"{self.speaker.subscription_address}"
|
||||||
|
f" (advertising as {soco_config.EVENT_ADVERTISE_IP})"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
listener_msg = self.speaker.subscription_address
|
listener_msg = self.speaker.subscription_address
|
||||||
message = f"{self.speaker.zone_name} cannot reach {listener_msg}, falling back to polling, functionality may be limited"
|
message = (
|
||||||
|
f"{self.speaker.zone_name} cannot reach {listener_msg},"
|
||||||
|
" falling back to polling, functionality may be limited"
|
||||||
|
)
|
||||||
log_link_msg = f", see {SUB_FAIL_URL} for more details"
|
log_link_msg = f", see {SUB_FAIL_URL} for more details"
|
||||||
notification_link_msg = f'.\n\nSee <a href="{SUB_FAIL_URL}">Sonos documentation</a> for more details.'
|
notification_link_msg = (
|
||||||
|
f'.\n\nSee <a href="{SUB_FAIL_URL}">Sonos documentation</a>'
|
||||||
|
" for more details."
|
||||||
|
)
|
||||||
_LOGGER.warning(message + log_link_msg)
|
_LOGGER.warning(message + log_link_msg)
|
||||||
persistent_notification.async_create(
|
persistent_notification.async_create(
|
||||||
self.hass,
|
self.hass,
|
||||||
|
@ -657,7 +657,10 @@ class SonosSpeaker:
|
|||||||
return
|
return
|
||||||
if "BattChg" not in battery_dict:
|
if "BattChg" not in battery_dict:
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Unknown device properties update for %s (%s), please report an issue: '%s'",
|
(
|
||||||
|
"Unknown device properties update for %s (%s),"
|
||||||
|
" please report an issue: '%s'"
|
||||||
|
),
|
||||||
self.zone_name,
|
self.zone_name,
|
||||||
self.model_name,
|
self.model_name,
|
||||||
more_info,
|
more_info,
|
||||||
@ -1047,7 +1050,8 @@ class SonosSpeaker:
|
|||||||
speakers_set = {s for s in speakers if s.soco_snapshot}
|
speakers_set = {s for s in speakers if s.soco_snapshot}
|
||||||
if missing_snapshots := set(speakers) - speakers_set:
|
if missing_snapshots := set(speakers) - speakers_set:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Restore failed, speakers are missing snapshots: {[s.zone_name for s in missing_snapshots]}"
|
"Restore failed, speakers are missing snapshots:"
|
||||||
|
f" {[s.zone_name for s in missing_snapshots]}"
|
||||||
)
|
)
|
||||||
|
|
||||||
if with_group:
|
if with_group:
|
||||||
|
@ -255,7 +255,10 @@ class SonosAlarmEntity(SonosEntity, SwitchEntity):
|
|||||||
@property
|
@property
|
||||||
def name(self) -> str:
|
def name(self) -> str:
|
||||||
"""Return the name of the sensor."""
|
"""Return the name of the sensor."""
|
||||||
return f"{self.alarm.recurrence.capitalize()} alarm {str(self.alarm.start_time)[:5]}"
|
return (
|
||||||
|
f"{self.alarm.recurrence.capitalize()} alarm"
|
||||||
|
f" {str(self.alarm.start_time)[:5]}"
|
||||||
|
)
|
||||||
|
|
||||||
async def _async_fallback_poll(self) -> None:
|
async def _async_fallback_poll(self) -> None:
|
||||||
"""Call the central alarm polling method."""
|
"""Call the central alarm polling method."""
|
||||||
@ -424,7 +427,10 @@ def async_migrate_speech_enhancement_entity_unique_id(
|
|||||||
|
|
||||||
if len(speech_enhancement_entries) > 1:
|
if len(speech_enhancement_entries) > 1:
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Migration of Speech Enhancement switches on %s failed, manual cleanup required: %s",
|
(
|
||||||
|
"Migration of Speech Enhancement switches on %s failed,"
|
||||||
|
" manual cleanup required: %s"
|
||||||
|
),
|
||||||
speaker.zone_name,
|
speaker.zone_name,
|
||||||
[e.entity_id for e in speech_enhancement_entries],
|
[e.entity_id for e in speech_enhancement_entries],
|
||||||
)
|
)
|
||||||
|
@ -378,7 +378,8 @@ class SpotifyMediaPlayer(MediaPlayerEntity):
|
|||||||
|
|
||||||
if not self._scope_ok:
|
if not self._scope_ok:
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Spotify scopes are not set correctly, this can impact features such as media browsing"
|
"Spotify scopes are not set correctly, this can impact features such as"
|
||||||
|
" media browsing"
|
||||||
)
|
)
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@ -590,7 +590,8 @@ class SqueezeBoxEntity(MediaPlayerEntity):
|
|||||||
async def async_sync(self, other_player):
|
async def async_sync(self, other_player):
|
||||||
"""Sync this Squeezebox player to another. Deprecated."""
|
"""Sync this Squeezebox player to another. Deprecated."""
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Service squeezebox.sync is deprecated; use media_player.join_players instead"
|
"Service squeezebox.sync is deprecated; use media_player.join_players"
|
||||||
|
" instead"
|
||||||
)
|
)
|
||||||
await self.async_join_players([other_player])
|
await self.async_join_players([other_player])
|
||||||
|
|
||||||
@ -601,7 +602,8 @@ class SqueezeBoxEntity(MediaPlayerEntity):
|
|||||||
async def async_unsync(self):
|
async def async_unsync(self):
|
||||||
"""Unsync this Squeezebox player. Deprecated."""
|
"""Unsync this Squeezebox player. Deprecated."""
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Service squeezebox.unsync is deprecated; use media_player.unjoin_player instead"
|
"Service squeezebox.unsync is deprecated; use media_player.unjoin_player"
|
||||||
|
" instead"
|
||||||
)
|
)
|
||||||
await self.async_unjoin_player()
|
await self.async_unjoin_player()
|
||||||
|
|
||||||
|
@ -191,9 +191,8 @@ def valid_state_characteristic_configuration(config: dict[str, Any]) -> dict[str
|
|||||||
not is_binary and characteristic not in STATS_NUMERIC_SUPPORT
|
not is_binary and characteristic not in STATS_NUMERIC_SUPPORT
|
||||||
):
|
):
|
||||||
raise vol.ValueInvalid(
|
raise vol.ValueInvalid(
|
||||||
"The configured characteristic '{}' is not supported for the configured source sensor".format(
|
"The configured characteristic '{}' is not supported for the configured"
|
||||||
characteristic
|
" source sensor".format(characteristic)
|
||||||
)
|
|
||||||
)
|
)
|
||||||
return config
|
return config
|
||||||
|
|
||||||
|
@ -180,7 +180,10 @@ class RecorderOutput(StreamOutput):
|
|||||||
write_transform_matrix_and_rename(video_path)
|
write_transform_matrix_and_rename(video_path)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
"Error writing to '%s'. There are likely multiple recordings writing to the same file",
|
(
|
||||||
|
"Error writing to '%s'. There are likely multiple recordings"
|
||||||
|
" writing to the same file"
|
||||||
|
),
|
||||||
video_path,
|
video_path,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -442,7 +442,8 @@ class TimestampValidator:
|
|||||||
gap = packet.time_base * (prev_dts - packet.dts)
|
gap = packet.time_base * (prev_dts - packet.dts)
|
||||||
if gap > MAX_TIMESTAMP_GAP:
|
if gap > MAX_TIMESTAMP_GAP:
|
||||||
raise StreamWorkerError(
|
raise StreamWorkerError(
|
||||||
f"Timestamp overflow detected: last dts = {prev_dts}, dts = {packet.dts}"
|
f"Timestamp overflow detected: last dts = {prev_dts}, dts ="
|
||||||
|
f" {packet.dts}"
|
||||||
)
|
)
|
||||||
return False
|
return False
|
||||||
self._last_dts[packet.stream] = packet.dts
|
self._last_dts[packet.stream] = packet.dts
|
||||||
@ -496,7 +497,8 @@ def stream_worker(
|
|||||||
container = av.open(source, options=pyav_options, timeout=SOURCE_TIMEOUT)
|
container = av.open(source, options=pyav_options, timeout=SOURCE_TIMEOUT)
|
||||||
except av.AVError as err:
|
except av.AVError as err:
|
||||||
raise StreamWorkerError(
|
raise StreamWorkerError(
|
||||||
f"Error opening stream ({err.type}, {err.strerror}) {redact_credentials(str(source))}"
|
f"Error opening stream ({err.type}, {err.strerror})"
|
||||||
|
f" {redact_credentials(str(source))}"
|
||||||
) from err
|
) from err
|
||||||
try:
|
try:
|
||||||
video_stream = container.streams.video[0]
|
video_stream = container.streams.video[0]
|
||||||
|
@ -144,7 +144,8 @@ class SwitchBeeCoverEntity(SwitchBeeDeviceEntity[SwitchBeeShutter], CoverEntity)
|
|||||||
await self.coordinator.api.set_state(self._device.id, kwargs[ATTR_POSITION])
|
await self.coordinator.api.set_state(self._device.id, kwargs[ATTR_POSITION])
|
||||||
except (SwitchBeeError, SwitchBeeTokenError) as exp:
|
except (SwitchBeeError, SwitchBeeTokenError) as exp:
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Failed to set {self.name} position to {kwargs[ATTR_POSITION]}, error: {str(exp)}"
|
f"Failed to set {self.name} position to {kwargs[ATTR_POSITION]}, error:"
|
||||||
|
f" {str(exp)}"
|
||||||
) from exp
|
) from exp
|
||||||
|
|
||||||
self._get_coordinator_device().position = kwargs[ATTR_POSITION]
|
self._get_coordinator_device().position = kwargs[ATTR_POSITION]
|
||||||
|
@ -98,7 +98,10 @@ class SwitchBeeDeviceEntity(SwitchBeeEntity[_DeviceTypeT]):
|
|||||||
|
|
||||||
if self._is_online:
|
if self._is_online:
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"%s device is not responding, check the status in the SwitchBee mobile app",
|
(
|
||||||
|
"%s device is not responding, check the status in the SwitchBee"
|
||||||
|
" mobile app"
|
||||||
|
),
|
||||||
self.name,
|
self.name,
|
||||||
)
|
)
|
||||||
self._is_online = False
|
self._is_online = False
|
||||||
|
@ -141,7 +141,8 @@ class SwitcherDataUpdateCoordinator(update_coordinator.DataUpdateCoordinator):
|
|||||||
async def _async_update_data(self) -> None:
|
async def _async_update_data(self) -> None:
|
||||||
"""Mark device offline if no data."""
|
"""Mark device offline if no data."""
|
||||||
raise update_coordinator.UpdateFailed(
|
raise update_coordinator.UpdateFailed(
|
||||||
f"Device {self.name} did not send update for {MAX_UPDATE_INTERVAL_SEC} seconds"
|
f"Device {self.name} did not send update for"
|
||||||
|
f" {MAX_UPDATE_INTERVAL_SEC} seconds"
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -153,6 +153,5 @@ class SwitcherThermostatButtonEntity(
|
|||||||
self.coordinator.last_update_success = False
|
self.coordinator.last_update_success = False
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Call api for {self.name} failed, "
|
f"Call api for {self.name} failed, response/error: {response or error}"
|
||||||
f"response/error: {response or error}"
|
|
||||||
)
|
)
|
||||||
|
@ -153,7 +153,10 @@ class SyncthingClient:
|
|||||||
)
|
)
|
||||||
except aiosyncthing.exceptions.SyncthingError:
|
except aiosyncthing.exceptions.SyncthingError:
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"The syncthing server '%s' is not available. Sleeping %i seconds and retrying",
|
(
|
||||||
|
"The syncthing server '%s' is not available. Sleeping %i"
|
||||||
|
" seconds and retrying"
|
||||||
|
),
|
||||||
self._client.url,
|
self._client.url,
|
||||||
RECONNECT_INTERVAL.total_seconds(),
|
RECONNECT_INTERVAL.total_seconds(),
|
||||||
)
|
)
|
||||||
|
@ -98,7 +98,8 @@ class SynoApi:
|
|||||||
self._with_surveillance_station = False
|
self._with_surveillance_station = False
|
||||||
self.dsm.reset(SynoSurveillanceStation.API_KEY)
|
self.dsm.reset(SynoSurveillanceStation.API_KEY)
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
"Surveillance Station found, but disabled due to missing user permissions"
|
"Surveillance Station found, but disabled due to missing user"
|
||||||
|
" permissions"
|
||||||
)
|
)
|
||||||
|
|
||||||
LOGGER.debug(
|
LOGGER.debug(
|
||||||
|
@ -43,7 +43,10 @@ async def async_setup_services(hass: HomeAssistant) -> None:
|
|||||||
return
|
return
|
||||||
LOGGER.debug("%s DSM with serial %s", call.service, serial)
|
LOGGER.debug("%s DSM with serial %s", call.service, serial)
|
||||||
LOGGER.warning(
|
LOGGER.warning(
|
||||||
"The %s service is deprecated and will be removed in future release. Please use the corresponding button entity",
|
(
|
||||||
|
"The %s service is deprecated and will be removed in future"
|
||||||
|
" release. Please use the corresponding button entity"
|
||||||
|
),
|
||||||
call.service,
|
call.service,
|
||||||
)
|
)
|
||||||
dsm_device = hass.data[DOMAIN][serial]
|
dsm_device = hass.data[DOMAIN][serial]
|
||||||
|
@ -66,7 +66,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
try:
|
try:
|
||||||
if not await version.check_supported():
|
if not await version.check_supported():
|
||||||
raise ConfigEntryNotReady(
|
raise ConfigEntryNotReady(
|
||||||
f"You are not running a supported version of System Bridge. Please update to {SUPPORTED_VERSION} or higher."
|
"You are not running a supported version of System Bridge. Please"
|
||||||
|
f" update to {SUPPORTED_VERSION} or higher."
|
||||||
)
|
)
|
||||||
except AuthenticationException as exception:
|
except AuthenticationException as exception:
|
||||||
_LOGGER.error("Authentication failed for %s: %s", entry.title, exception)
|
_LOGGER.error("Authentication failed for %s: %s", entry.title, exception)
|
||||||
|
@ -37,7 +37,8 @@ def async_register_info(
|
|||||||
Deprecated.
|
Deprecated.
|
||||||
"""
|
"""
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Calling system_health.async_register_info is deprecated; Add a system_health platform instead"
|
"Calling system_health.async_register_info is deprecated; Add a system_health"
|
||||||
|
" platform instead"
|
||||||
)
|
)
|
||||||
hass.data.setdefault(DOMAIN, {})
|
hass.data.setdefault(DOMAIN, {})
|
||||||
SystemHealthRegistration(hass, domain).async_register_info(info_callback)
|
SystemHealthRegistration(hass, domain).async_register_info(info_callback)
|
||||||
|
@ -407,7 +407,10 @@ async def async_setup_sensor_registry_updates(
|
|||||||
"""Update all sensors in one executor jump."""
|
"""Update all sensors in one executor jump."""
|
||||||
if _update_lock.locked():
|
if _update_lock.locked():
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Updating systemmonitor took longer than the scheduled update interval %s",
|
(
|
||||||
|
"Updating systemmonitor took longer than the scheduled update"
|
||||||
|
" interval %s"
|
||||||
|
),
|
||||||
scan_interval,
|
scan_interval,
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
@ -282,7 +282,10 @@ class TadoConnector:
|
|||||||
):
|
):
|
||||||
"""Set a zone overlay."""
|
"""Set a zone overlay."""
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Set overlay for zone %s: overlay_mode=%s, temp=%s, duration=%s, type=%s, mode=%s fan_speed=%s swing=%s",
|
(
|
||||||
|
"Set overlay for zone %s: overlay_mode=%s, temp=%s, duration=%s,"
|
||||||
|
" type=%s, mode=%s fan_speed=%s swing=%s"
|
||||||
|
),
|
||||||
zone_id,
|
zone_id,
|
||||||
overlay_mode,
|
overlay_mode,
|
||||||
temperature,
|
temperature,
|
||||||
|
@ -598,7 +598,10 @@ class TadoClimate(TadoZoneEntity, ClimateEntity):
|
|||||||
)
|
)
|
||||||
|
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Switching to %s for zone %s (%d) with temperature %s °C and duration %s using overlay %s",
|
(
|
||||||
|
"Switching to %s for zone %s (%d) with temperature %s °C and duration"
|
||||||
|
" %s using overlay %s"
|
||||||
|
),
|
||||||
self._current_tado_hvac_mode,
|
self._current_tado_hvac_mode,
|
||||||
self.zone_name,
|
self.zone_name,
|
||||||
self.zone_id,
|
self.zone_id,
|
||||||
|
@ -67,7 +67,9 @@ class TadoZoneEntity(Entity):
|
|||||||
def device_info(self) -> DeviceInfo:
|
def device_info(self) -> DeviceInfo:
|
||||||
"""Return the device_info of the device."""
|
"""Return the device_info of the device."""
|
||||||
return DeviceInfo(
|
return DeviceInfo(
|
||||||
configuration_url=f"https://app.tado.com/en/main/home/zoneV2/{self.zone_id}",
|
configuration_url=(
|
||||||
|
f"https://app.tado.com/en/main/home/zoneV2/{self.zone_id}"
|
||||||
|
),
|
||||||
identifiers={(DOMAIN, self._device_zone_id)},
|
identifiers={(DOMAIN, self._device_zone_id)},
|
||||||
name=self.zone_name,
|
name=self.zone_name,
|
||||||
manufacturer=DEFAULT_NAME,
|
manufacturer=DEFAULT_NAME,
|
||||||
|
@ -118,9 +118,10 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
if len(stations := data.get("stations", [])) == 0:
|
if len(stations := data.get("stations", [])) == 0:
|
||||||
return self._show_form_user(user_input, errors={CONF_RADIUS: "no_stations"})
|
return self._show_form_user(user_input, errors={CONF_RADIUS: "no_stations"})
|
||||||
for station in stations:
|
for station in stations:
|
||||||
self._stations[
|
self._stations[station["id"]] = (
|
||||||
station["id"]
|
f"{station['brand']} {station['street']} {station['houseNumber']} -"
|
||||||
] = f"{station['brand']} {station['street']} {station['houseNumber']} - ({station['dist']}km)"
|
f" ({station['dist']}km)"
|
||||||
|
)
|
||||||
|
|
||||||
self._data = user_input
|
self._data = user_input
|
||||||
|
|
||||||
@ -268,9 +269,10 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
)
|
)
|
||||||
if stations := nearby_stations.get("stations"):
|
if stations := nearby_stations.get("stations"):
|
||||||
for station in stations:
|
for station in stations:
|
||||||
self._stations[
|
self._stations[station["id"]] = (
|
||||||
station["id"]
|
f"{station['brand']} {station['street']} {station['houseNumber']} -"
|
||||||
] = f"{station['brand']} {station['street']} {station['houseNumber']} - ({station['dist']}km)"
|
f" ({station['dist']}km)"
|
||||||
|
)
|
||||||
|
|
||||||
# add possible extra selected stations from import
|
# add possible extra selected stations from import
|
||||||
for selected_station in self.config_entry.data[CONF_STATIONS]:
|
for selected_station in self.config_entry.data[CONF_STATIONS]:
|
||||||
|
@ -85,7 +85,10 @@ def warn_if_topic_duplicated(
|
|||||||
for _, cfg in offenders
|
for _, cfg in offenders
|
||||||
]
|
]
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Multiple Tasmota devices are sharing the same topic '%s'. Offending devices: %s",
|
(
|
||||||
|
"Multiple Tasmota devices are sharing the same topic '%s'. Offending"
|
||||||
|
" devices: %s"
|
||||||
|
),
|
||||||
command_topic,
|
command_topic,
|
||||||
", ".join(offender_strings),
|
", ".join(offender_strings),
|
||||||
)
|
)
|
||||||
|
@ -131,8 +131,10 @@ class TcpEntity(Entity):
|
|||||||
readable, _, _ = select.select([sock], [], [], self._config[CONF_TIMEOUT])
|
readable, _, _ = select.select([sock], [], [], self._config[CONF_TIMEOUT])
|
||||||
if not readable:
|
if not readable:
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
|
(
|
||||||
"Timeout (%s second(s)) waiting for a response after "
|
"Timeout (%s second(s)) waiting for a response after "
|
||||||
"sending %r to %s on port %s",
|
"sending %r to %s on port %s"
|
||||||
|
),
|
||||||
self._config[CONF_TIMEOUT],
|
self._config[CONF_TIMEOUT],
|
||||||
self._config[CONF_PAYLOAD],
|
self._config[CONF_PAYLOAD],
|
||||||
self._config[CONF_HOST],
|
self._config[CONF_HOST],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user