Skip to content

Commit

Permalink
2024.9.2 (#126062)
Browse files Browse the repository at this point in the history
  • Loading branch information
frenck authored Sep 16, 2024
2 parents 4445605 + 861fcbe commit b69b5aa
Show file tree
Hide file tree
Showing 68 changed files with 2,074 additions and 1,328 deletions.
2 changes: 1 addition & 1 deletion homeassistant/components/august/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,5 @@
"documentation": "https://www.home-assistant.io/integrations/august",
"iot_class": "cloud_push",
"loggers": ["pubnub", "yalexs"],
"requirements": ["yalexs==8.6.3", "yalexs-ble==2.4.3"]
"requirements": ["yalexs==8.6.4", "yalexs-ble==2.4.3"]
}
10 changes: 4 additions & 6 deletions homeassistant/components/blebox/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ async def async_setup_entry(
class BleBoxLightEntity(BleBoxEntity[blebox_uniapi.light.Light], LightEntity):
"""Representation of BleBox lights."""

_attr_max_mireds = 370 # 1,000,000 divided by 2700 Kelvin = 370 Mireds
_attr_min_mireds = 154 # 1,000,000 divided by 6500 Kelvin = 154 Mireds

def __init__(self, feature: blebox_uniapi.light.Light) -> None:
"""Initialize a BleBox light."""
super().__init__(feature)
Expand Down Expand Up @@ -87,12 +90,7 @@ def color_mode(self):
Set values to _attr_ibutes if needed.
"""
color_mode_tmp = COLOR_MODE_MAP.get(self._feature.color_mode, ColorMode.ONOFF)
if color_mode_tmp == ColorMode.COLOR_TEMP:
self._attr_min_mireds = 1
self._attr_max_mireds = 255

return color_mode_tmp
return COLOR_MODE_MAP.get(self._feature.color_mode, ColorMode.ONOFF)

@property
def supported_color_modes(self):
Expand Down
5 changes: 4 additions & 1 deletion homeassistant/components/bsblan/diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,8 @@ async def async_get_config_entry_diagnostics(
return {
"info": data.info.to_dict(),
"device": data.device.to_dict(),
"state": data.coordinator.data.state.to_dict(),
"coordinator_data": {
"state": data.coordinator.data.state.to_dict(),
},
"static": data.static.to_dict(),
}
6 changes: 3 additions & 3 deletions homeassistant/components/bsblan/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ class BSBLanEntity(CoordinatorEntity[BSBLanUpdateCoordinator]):
def __init__(self, coordinator: BSBLanUpdateCoordinator, data: BSBLanData) -> None:
"""Initialize BSBLan entity."""
super().__init__(coordinator, data)
host = self.coordinator.config_entry.data["host"]
mac = self.coordinator.config_entry.data["mac"]
host = coordinator.config_entry.data["host"]
mac = data.device.MAC
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, data.device.MAC)},
identifiers={(DOMAIN, mac)},
connections={(CONNECTION_NETWORK_MAC, format_mac(mac))},
name=data.device.name,
manufacturer="BSBLAN Inc.",
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/elevenlabs/tts.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ async def async_get_tts_audio(
"""Load tts audio file from the engine."""
_LOGGER.debug("Getting TTS audio for %s", message)
_LOGGER.debug("Options: %s", options)
voice_id = options[ATTR_VOICE]
voice_id = options.get(ATTR_VOICE, self._default_voice_id)
try:
audio = await self._client.generate(
text=message,
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/frontend/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
"documentation": "https://www.home-assistant.io/integrations/frontend",
"integration_type": "system",
"quality_scale": "internal",
"requirements": ["home-assistant-frontend==20240906.0"]
"requirements": ["home-assistant-frontend==20240909.1"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/govee_light_local/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"dependencies": ["network"],
"documentation": "https://www.home-assistant.io/integrations/govee_light_local",
"iot_class": "local_push",
"requirements": ["govee-local-api==1.5.1"]
"requirements": ["govee-local-api==1.5.2"]
}
3 changes: 2 additions & 1 deletion homeassistant/components/homeassistant_hardware/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@
"not_hassio_thread": "The OpenThread Border Router addon can only be installed with Home Assistant OS. If you would like to use the {model} as an Thread border router, please flash the firmware manually using the [web flasher]({docs_web_flasher_url}) and set up OpenThread Border Router to communicate with it.",
"otbr_addon_already_running": "The OpenThread Border Router add-on is already running, it cannot be installed again.",
"zha_still_using_stick": "This {model} is in use by the Zigbee Home Automation integration. Please migrate your Zigbee network to another adapter or delete the integration and try again.",
"otbr_still_using_stick": "This {model} is in use by the OpenThread Border Router add-on. If you use the Thread network, make sure you have alternative border routers. Uninstall the add-on and try again."
"otbr_still_using_stick": "This {model} is in use by the OpenThread Border Router add-on. If you use the Thread network, make sure you have alternative border routers. Uninstall the add-on and try again.",
"unsupported_firmware": "The radio firmware on your {model} could not be determined. Make sure that no other integration or addon is currently trying to communicate with the device. If you are running Home Assistant OS in a virtual machine or in Docker, please make sure that permissions are set correctly for the device."
},
"progress": {
"install_zigbee_flasher_addon": "The Silicon Labs Flasher addon is installed, this may take a few minutes.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,8 @@
"not_hassio_thread": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::not_hassio_thread%]",
"otbr_addon_already_running": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::otbr_addon_already_running%]",
"zha_still_using_stick": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::zha_still_using_stick%]",
"otbr_still_using_stick": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::otbr_still_using_stick%]"
"otbr_still_using_stick": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::otbr_still_using_stick%]",
"unsupported_firmware": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::unsupported_firmware%]"
},
"progress": {
"install_addon": "[%key:component::homeassistant_hardware::silabs_multiprotocol_hardware::options::progress::install_addon%]",
Expand Down Expand Up @@ -181,7 +182,10 @@
"zha_migration_failed": "[%key:component::homeassistant_hardware::silabs_multiprotocol_hardware::options::abort::zha_migration_failed%]",
"not_hassio": "[%key:component::homeassistant_hardware::silabs_multiprotocol_hardware::options::abort::not_hassio%]",
"not_hassio_thread": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::not_hassio_thread%]",
"otbr_addon_already_running": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::otbr_addon_already_running%]"
"otbr_addon_already_running": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::otbr_addon_already_running%]",
"zha_still_using_stick": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::zha_still_using_stick%]",
"otbr_still_using_stick": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::otbr_still_using_stick%]",
"unsupported_firmware": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::unsupported_firmware%]"
},
"progress": {
"install_addon": "[%key:component::homeassistant_hardware::silabs_multiprotocol_hardware::options::progress::install_addon%]",
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/homeassistant_yellow/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,8 @@
"not_hassio_thread": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::not_hassio_thread%]",
"otbr_addon_already_running": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::otbr_addon_already_running%]",
"zha_still_using_stick": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::zha_still_using_stick%]",
"otbr_still_using_stick": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::otbr_still_using_stick%]"
"otbr_still_using_stick": "[%key:component::homeassistant_hardware::firmware_picker::options::abort::otbr_still_using_stick%]",
"unsupported_firmware": "The radio firmware on your {model} could not be determined. Make sure that no other integration or addon is currently trying to communicate with the device."
},
"progress": {
"install_addon": "[%key:component::homeassistant_hardware::silabs_multiprotocol_hardware::options::progress::install_addon%]",
Expand Down
4 changes: 3 additions & 1 deletion homeassistant/components/incomfort/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,10 @@ def target_temperature(self) -> float | None:
As we set the override, we report back the override. The actual set point is
is returned at a later time.
Some older thermostats return 0.0 as override, in that case we fallback to
the actual setpoint.
"""
return self._room.override
return self._room.override or self._room.setpoint

async def async_set_temperature(self, **kwargs: Any) -> None:
"""Set a new target temperature for this zone."""
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/knx/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"requirements": [
"xknx==3.1.1",
"xknxproject==3.7.1",
"knx-frontend==2024.9.4.64538"
"knx-frontend==2024.9.10.221729"
],
"single_config_entry": true
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,10 @@ def parse_invalid(exc: vol.Invalid) -> _ErrorDescription:


def validate_entity_data(entity_data: dict) -> dict:
"""Validate entity data. Return validated data or raise EntityStoreValidationException."""
"""Validate entity data.
Return validated data or raise EntityStoreValidationException.
"""
try:
# return so defaults are applied
return ENTITY_STORE_DATA_SCHEMA(entity_data) # type: ignore[no-any-return]
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/lamarzocco/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@
"integration_type": "device",
"iot_class": "cloud_polling",
"loggers": ["lmcloud"],
"requirements": ["lmcloud==1.2.2"]
"requirements": ["lmcloud==1.2.3"]
}
4 changes: 2 additions & 2 deletions homeassistant/components/lifx/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@
"iot_class": "local_polling",
"loggers": ["aiolifx", "aiolifx_effects", "bitstring"],
"requirements": [
"aiolifx==1.0.9",
"aiolifx==1.1.1",
"aiolifx-effects==0.3.2",
"aiolifx-themes==0.5.0"
"aiolifx-themes==0.5.5"
]
}
5 changes: 1 addition & 4 deletions homeassistant/components/lyric/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,10 +208,7 @@ def __init__(
if LYRIC_HVAC_MODE_COOL in device.allowed_modes:
self._attr_hvac_modes.append(HVACMode.COOL)

if (
LYRIC_HVAC_MODE_HEAT in device.allowed_modes
and LYRIC_HVAC_MODE_COOL in device.allowed_modes
):
if LYRIC_HVAC_MODE_HEAT_COOL in device.allowed_modes:
self._attr_hvac_modes.append(HVACMode.HEAT_COOL)

# Setup supported features
Expand Down
8 changes: 7 additions & 1 deletion homeassistant/components/motion_blinds/button.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,13 @@ async def async_setup_entry(
coordinator = hass.data[DOMAIN][config_entry.entry_id][KEY_COORDINATOR]

for blind in motion_gateway.device_list.values():
if blind.limit_status == LimitStatus.Limit3Detected.name:
if blind.limit_status in (
LimitStatus.Limit3Detected.name,
{
"T": LimitStatus.Limit3Detected.name,
"B": LimitStatus.Limit3Detected.name,
},
):
entities.append(MotionGoFavoriteButton(coordinator, blind))
entities.append(MotionSetFavoriteButton(coordinator, blind))

Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/motion_blinds/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@
"documentation": "https://www.home-assistant.io/integrations/motion_blinds",
"iot_class": "local_push",
"loggers": ["motionblinds"],
"requirements": ["motionblinds==0.6.24"]
"requirements": ["motionblinds==0.6.25"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/nest/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
"iot_class": "cloud_push",
"loggers": ["google_nest_sdm"],
"quality_scale": "platinum",
"requirements": ["google-nest-sdm==5.0.0"]
"requirements": ["google-nest-sdm==5.0.1"]
}
16 changes: 11 additions & 5 deletions homeassistant/components/renault/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class RenaultBinarySensorEntityDescription(
"""Class describing Renault binary sensor entities."""

on_key: str
on_value: StateType
on_value: StateType | list[StateType]


async def async_setup_entry(
Expand Down Expand Up @@ -58,6 +58,9 @@ def is_on(self) -> bool | None:
"""Return true if the binary sensor is on."""
if (data := self._get_data_attr(self.entity_description.on_key)) is None:
return None

if isinstance(self.entity_description.on_value, list):
return data in self.entity_description.on_value
return data == self.entity_description.on_value


Expand All @@ -68,7 +71,10 @@ def is_on(self) -> bool | None:
coordinator="battery",
device_class=BinarySensorDeviceClass.PLUG,
on_key="plugStatus",
on_value=PlugState.PLUGGED.value,
on_value=[
PlugState.PLUGGED.value,
PlugState.PLUGGED_WAITING_FOR_CHARGE.value,
],
),
RenaultBinarySensorEntityDescription(
key="charging",
Expand Down Expand Up @@ -104,13 +110,13 @@ def is_on(self) -> bool | None:
]
+ [
RenaultBinarySensorEntityDescription(
key=f"{door.replace(' ','_').lower()}_door_status",
key=f"{door.replace(' ', '_').lower()}_door_status",
coordinator="lock_status",
# On means open, Off means closed
device_class=BinarySensorDeviceClass.DOOR,
on_key=f"doorStatus{door.replace(' ','')}",
on_key=f"doorStatus{door.replace(' ', '')}",
on_value="open",
translation_key=f"{door.lower().replace(' ','_')}_door_status",
translation_key=f"{door.lower().replace(' ', '_')}_door_status",
)
for door in ("Rear Left", "Rear Right", "Driver", "Passenger")
],
Expand Down
8 changes: 7 additions & 1 deletion homeassistant/components/renault/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,13 @@ def _get_utc_value(entity: RenaultSensor[T]) -> datetime:
translation_key="plug_state",
device_class=SensorDeviceClass.ENUM,
entity_class=RenaultSensor[KamereonVehicleBatteryStatusData],
options=["unplugged", "plugged", "plug_error", "plug_unknown"],
options=[
"unplugged",
"plugged",
"plugged_waiting_for_charge",
"plug_error",
"plug_unknown",
],
value_lambda=_get_plug_state_formatted,
),
RenaultSensorEntityDescription(
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/renault/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@
"state": {
"unplugged": "Unplugged",
"plugged": "Plugged in",
"plugged_waiting_for_charge": "Plugged in, waiting for charge",
"plug_error": "Plug error",
"plug_unknown": "Plug unknown"
}
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/russound_rio/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
"iot_class": "local_push",
"loggers": ["aiorussound"],
"quality_scale": "silver",
"requirements": ["aiorussound==3.0.4"]
"requirements": ["aiorussound==3.0.5"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/russound_rnet/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
"documentation": "https://www.home-assistant.io/integrations/russound_rnet",
"iot_class": "local_polling",
"loggers": ["russound"],
"requirements": ["russound==0.1.9"]
"requirements": ["russound==0.2.0"]
}
8 changes: 7 additions & 1 deletion homeassistant/components/russound_rnet/media_player.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,13 @@ def update(self) -> None:
# Updated this function to make a single call to get_zone_info, so that
# with a single call we can get On/Off, Volume and Source, reducing the
# amount of traffic and speeding up the update process.
ret = self._russ.get_zone_info(self._controller_id, self._zone_id, 4)
try:
ret = self._russ.get_zone_info(self._controller_id, self._zone_id, 4)
except BrokenPipeError:
_LOGGER.error("Broken Pipe Error, trying to reconnect to Russound RNET")
self._russ.connect()
ret = self._russ.get_zone_info(self._controller_id, self._zone_id, 4)

_LOGGER.debug("ret= %s", ret)
if ret is not None:
_LOGGER.debug(
Expand Down
3 changes: 1 addition & 2 deletions homeassistant/components/schlage/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,4 @@ def _lock(self) -> Lock:
@property
def available(self) -> bool:
"""Return if entity is available."""
# When is_locked is None the lock is unavailable.
return super().available and self._lock.is_locked is not None
return super().available and self.device_id in self.coordinator.data.locks
5 changes: 3 additions & 2 deletions homeassistant/components/schlage/lock.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ def __init__(
@callback
def _handle_coordinator_update(self) -> None:
"""Handle updated data from the coordinator."""
self._update_attrs()
return super()._handle_coordinator_update()
if self.device_id in self.coordinator.data.locks:
self._update_attrs()
super()._handle_coordinator_update()

def _update_attrs(self) -> None:
"""Update our internal state attributes."""
Expand Down
5 changes: 3 additions & 2 deletions homeassistant/components/schlage/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,5 +64,6 @@ def __init__(
@callback
def _handle_coordinator_update(self) -> None:
"""Handle updated data from the coordinator."""
self._attr_native_value = getattr(self._lock, self.entity_description.key)
return super()._handle_coordinator_update()
if self.device_id in self.coordinator.data.locks:
self._attr_native_value = getattr(self._lock, self.entity_description.key)
super()._handle_coordinator_update()
2 changes: 1 addition & 1 deletion homeassistant/components/sfr_box/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/sfr_box",
"integration_type": "device",
"iot_class": "local_polling",
"requirements": ["sfrbox-api==0.0.10"]
"requirements": ["sfrbox-api==0.0.11"]
}
7 changes: 6 additions & 1 deletion homeassistant/components/smlight/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,13 @@ async def async_step_zeroconf(
mac = discovery_info.properties.get("mac")
# fallback for legacy firmware
if mac is None:
info = await self.client.get_info()
try:
info = await self.client.get_info()
except SmlightConnectionError:
# User is likely running unsupported ESPHome firmware
return self.async_abort(reason="cannot_connect")
mac = info.MAC

await self.async_set_unique_id(format_mac(mac))
self._abort_if_unique_id_configured()

Expand Down
24 changes: 19 additions & 5 deletions homeassistant/components/sonos/media_player.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
SONOS_TO_REPEAT = {meaning: mode for mode, meaning in REPEAT_TO_SONOS.items()}

UPNP_ERRORS_TO_IGNORE = ["701", "711", "712"]
ANNOUNCE_NOT_SUPPORTED_ERRORS: list[str] = ["globalError"]

SERVICE_SNAPSHOT = "snapshot"
SERVICE_RESTORE = "restore"
Expand Down Expand Up @@ -556,11 +557,24 @@ async def async_play_media(
) from exc
if response.get("success"):
return
raise HomeAssistantError(
translation_domain=SONOS_DOMAIN,
translation_key="announce_media_error",
translation_placeholders={"media_id": media_id, "response": response},
)
if response.get("type") in ANNOUNCE_NOT_SUPPORTED_ERRORS:
# If the speaker does not support announce do not raise and
# fall through to_play_media to play the clip directly.
_LOGGER.debug(
"Speaker %s does not support announce, media_id %s response %s",
self.speaker.zone_name,
media_id,
response,
)
else:
raise HomeAssistantError(
translation_domain=SONOS_DOMAIN,
translation_key="announce_media_error",
translation_placeholders={
"media_id": media_id,
"response": response,
},
)

if spotify.is_spotify_media_type(media_type):
media_type = spotify.resolve_spotify_media_type(media_type)
Expand Down
Loading

0 comments on commit b69b5aa

Please sign in to comment.