Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2024.3.1 #113249

Merged
merged 64 commits into from
Mar 14, 2024
Merged

2024.3.1 #113249

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
649dd43
Fix optional Jellyfin RunTimeTicks (#108254)
j-stienstra Mar 11, 2024
6f6f37c
Add auto fan mode icon (#110185)
mattmccormack Mar 12, 2024
3c4bdeb
Ignore AussieBroadband services that don't support usage information …
FieldofClay Mar 13, 2024
e087ea5
Use friendly name for camera media source (#110882)
OnFreund Mar 12, 2024
57c8d47
Improve discovering upnp/igd device by always using the SSDP-discover…
StevenLooman Mar 12, 2024
c60f203
Update the numato-gpio dependency of the numato integration to v0.12.…
clssn Mar 10, 2024
095aab5
Disable updating ZHA coordinator path from discovery info (#112415)
puddly Mar 8, 2024
fba6e5f
Bump intents to 2024.3.6 (#112515)
synesthesiam Mar 6, 2024
4b387b5
Weatherflow_cloud backing lib bump (#112262)
jeeftor Mar 4, 2024
85b63c1
Bump weatherflow4py to 0.1.14 (#112554)
jeeftor Mar 7, 2024
2689f78
Restore the juicenet integration (#112578)
emontnemery Mar 7, 2024
4514f08
Fix incorrect filtering of unsupported locales in bring-api (#112589)
tr4nt0r Mar 8, 2024
b9a14d5
Include pytedee_async logger in tedee integration (#112590)
zweckj Mar 12, 2024
84d14ca
Issue warning modbus configuration when modbus configuration is empty…
janiversen Mar 9, 2024
aa37494
modbus scan_interval: 0 is correct configuration (#112619)
janiversen Mar 7, 2024
2985ab3
Update frontend to 20240307.0 (#112620)
bramkragten Mar 7, 2024
aebbee6
Make hass-nabucasa a core requirement (#112623)
emontnemery Mar 7, 2024
4db36d5
Bump aioautomower to 2024.3.0 (#112627)
Thomas55555 Mar 10, 2024
e348c7b
Bump pymodbus to v3.6.5 (#112629)
janiversen Mar 7, 2024
403013b
Bump axis to v52 (#112632)
Kane610 Mar 8, 2024
1f9e369
Update Loqed helper for more logging (#112646)
mikewoudenberg Mar 11, 2024
23fee43
Bump weatherflow4py to 0.1.17 (#112661)
jeeftor Mar 12, 2024
503fbfc
Bump `aionotion` to 2024.03.0 (#112675)
bachya Mar 8, 2024
e95ce2d
Make sure Notion saves new refresh token upon startup (#112676)
bachya Mar 9, 2024
9e977f2
Fix tado climate service (#112686)
alinbalutoiu Mar 8, 2024
c254328
Downgrade `pysnmp-lextudio` to version `5.0.34` (#112696)
bieniu Mar 8, 2024
f7b6424
Allow duplicate names in different modbus entities (#112701)
janiversen Mar 8, 2024
5a125bf
Guard against db corruption when renaming entities (#112718)
bdraco Mar 8, 2024
d99b9f7
Fix local calendar handling of empty recurrence ids (#112745)
allenporter Mar 9, 2024
3f22ad4
Bump pyenphase to 1.19.2 (#112747)
catsmanac Mar 8, 2024
7038952
Bump bthome-ble to 3.7.0 (#112783)
thecode Mar 9, 2024
93a0193
Upgrade `pysnmp-lextudio` to version `6.0.9` (#112795)
lextm Mar 9, 2024
8f2f9b8
Bump openwrt-luci-rpc version to 1.1.17 (#112796)
mrchi Mar 12, 2024
2d7de21
Fix google_asssistant sensor state reporting (#112838)
jbouwh Mar 12, 2024
fc2ca16
Fix MJPEG fallback when still image URL is missing with basic auth (#…
bdraco Mar 10, 2024
0d262ea
Bump boschshcpy to 0.2.82 (#112890)
FlyingFeng2021 Mar 11, 2024
def4f3c
Add missing translation placeholder in Hydrawise (#113007)
dknowles2 Mar 10, 2024
bbe88c2
Bump bthome-ble to 3.8.0 (#113008)
Ernst79 Mar 11, 2024
76cf252
Bump axis to v53 (#113019)
Kane610 Mar 11, 2024
7b5f879
Fix availability for GIOS index sensors (#113021)
bieniu Mar 12, 2024
a448c90
Bump ical to 7.0.1 and always use home assistant timezone for local t…
allenporter Mar 11, 2024
2dbc638
Fix some handle leaks in rainforest_raven (#113035)
cottsay Mar 12, 2024
911b396
Fix hvac_mode for viessmann devices with heatingCooling mode (#113054)
folke Mar 11, 2024
8ac5da9
components/gardena_bluetooth: Improve avaliability reliability (#113056)
alistair23 Mar 11, 2024
a2e9ecf
Fix for controlling Hue switch entities (#113064)
marcelveldt Mar 11, 2024
66cd6c0
Bump rova to 0.4.1 (#113066)
LukasdeBoer Mar 11, 2024
0b2322c
Fix colormode attribute on grouped Hue light (#113071)
marcelveldt Mar 11, 2024
cac2215
Bump axis to v54 (#113091)
Kane610 Mar 11, 2024
a63bf74
Bump aiodhcpwatcher to 0.8.1 (#113096)
bdraco Mar 11, 2024
d010df7
bump pytedee_async to 0.2.16 (#113135)
zweckj Mar 12, 2024
095d0d0
Add message from Bad Request errors to HassioAPIError (#113144)
agners Mar 13, 2024
962e5ec
Bump intents to 2023.3.12 (#113160)
synesthesiam Mar 12, 2024
6fdfc55
Bump airthings_ble to 0.7.1 (#113172)
LaStrada Mar 13, 2024
f7da6b5
Bump rokuecp to 0.19.2 (#113198)
ctalkington Mar 13, 2024
5769ba0
Bump `brother` library to version `4.0.2` (#113235)
bieniu Mar 13, 2024
525b20c
Bump version to 2024.3.1
frenck Mar 13, 2024
b88cdd7
Hotfix import error in ZHA for 2024.3.1 patch release (#113250)
frenck Mar 13, 2024
eb04365
Fix Twitch auth token refresh (#112833)
jonnybergdahl Mar 13, 2024
cda9bf7
Fix failing google diagnostics test (#113095)
bdraco Mar 11, 2024
297c7c1
Add diagnostics for IPP (#113205)
ctalkington Mar 14, 2024
45ef5a3
Apply suggestion failures fail supervisor repair (#113372)
mdegat01 Mar 14, 2024
6ca837b
Supervisor issues update retries on failure (#113373)
mdegat01 Mar 14, 2024
63e3da1
Add loggers to Husqvarna Automower (#113381)
Thomas55555 Mar 14, 2024
05c0416
Bump pyipp to 0.15.0 (#113204)
ctalkington Mar 13, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -639,6 +639,12 @@ omit =
homeassistant/components/izone/climate.py
homeassistant/components/izone/discovery.py
homeassistant/components/joaoapps_join/*
homeassistant/components/juicenet/__init__.py
homeassistant/components/juicenet/device.py
homeassistant/components/juicenet/entity.py
homeassistant/components/juicenet/number.py
homeassistant/components/juicenet/sensor.py
homeassistant/components/juicenet/switch.py
homeassistant/components/justnimbus/coordinator.py
homeassistant/components/justnimbus/entity.py
homeassistant/components/justnimbus/sensor.py
Expand Down
2 changes: 2 additions & 0 deletions CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,8 @@ build.json @home-assistant/supervisor
/tests/components/jellyfin/ @j-stienstra @ctalkington
/homeassistant/components/jewish_calendar/ @tsvi
/tests/components/jewish_calendar/ @tsvi
/homeassistant/components/juicenet/ @jesserockz
/tests/components/juicenet/ @jesserockz
/homeassistant/components/justnimbus/ @kvanzuijlen
/tests/components/justnimbus/ @kvanzuijlen
/homeassistant/components/jvc_projector/ @SteveEasley @msavazzi
Expand Down
3 changes: 1 addition & 2 deletions homeassistant/components/airthings_ble/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
hass.data.setdefault(DOMAIN, {})
address = entry.unique_id

elevation = hass.config.elevation
is_metric = hass.config.units is METRIC_SYSTEM
assert address is not None

Expand All @@ -40,7 +39,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
f"Could not find Airthings device with address {address}"
)

airthings = AirthingsBluetoothDeviceData(_LOGGER, elevation, is_metric)
airthings = AirthingsBluetoothDeviceData(_LOGGER, is_metric)

async def _async_update_method() -> AirthingsDevice:
"""Get data from Airthings BLE."""
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/airthings_ble/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,5 @@
"dependencies": ["bluetooth_adapters"],
"documentation": "https://www.home-assistant.io/integrations/airthings_ble",
"iot_class": "local_polling",
"requirements": ["airthings-ble==0.6.1"]
"requirements": ["airthings-ble==0.7.1"]
}
6 changes: 2 additions & 4 deletions homeassistant/components/airthings_ble/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
from homeassistant.const import (
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
LIGHT_LUX,
PERCENTAGE,
EntityCategory,
Platform,
Expand Down Expand Up @@ -106,8 +105,7 @@
),
"illuminance": SensorEntityDescription(
key="illuminance",
device_class=SensorDeviceClass.ILLUMINANCE,
native_unit_of_measurement=LIGHT_LUX,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
}
Expand Down Expand Up @@ -222,7 +220,7 @@ def __init__(
manufacturer=airthings_device.manufacturer,
hw_version=airthings_device.hw_version,
sw_version=airthings_device.sw_version,
model=airthings_device.model,
model=airthings_device.model.name,
)

@property
Expand Down
5 changes: 4 additions & 1 deletion homeassistant/components/aussie_broadband/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async_get_clientsession(hass),
)

# Ignore services that don't support usage data
ignore_types = FETCH_TYPES + ["Hardware"]

try:
await client.login()
services = await client.get_services(drop_types=FETCH_TYPES)
services = await client.get_services(drop_types=ignore_types)
except AuthenticationException as exc:
raise ConfigEntryAuthFailed() from exc
except ClientError as exc:
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/axis/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"iot_class": "local_push",
"loggers": ["axis"],
"quality_scale": "platinum",
"requirements": ["axis==50"],
"requirements": ["axis==54"],
"ssdp": [
{
"manufacturer": "AXIS"
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/bosch_shc/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"documentation": "https://www.home-assistant.io/integrations/bosch_shc",
"iot_class": "local_push",
"loggers": ["boschshcpy"],
"requirements": ["boschshcpy==0.2.75"],
"requirements": ["boschshcpy==0.2.82"],
"zeroconf": [
{
"type": "_http._tcp.local.",
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/bring/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/bring",
"integration_type": "service",
"iot_class": "cloud_polling",
"requirements": ["bring-api==0.5.5"]
"requirements": ["bring-api==0.5.6"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/brother/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
brother = await Brother.create(
host, printer_type=printer_type, snmp_engine=snmp_engine
)
except (ConnectionError, SnmpError) as error:
except (ConnectionError, SnmpError, TimeoutError) as error:
raise ConfigEntryNotReady from error

coordinator = BrotherDataUpdateCoordinator(hass, brother)
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/brother/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"iot_class": "local_polling",
"loggers": ["brother", "pyasn1", "pysmi", "pysnmp"],
"quality_scale": "platinum",
"requirements": ["brother==4.0.0"],
"requirements": ["brother==4.0.2"],
"zeroconf": [
{
"type": "_printer._tcp.local.",
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/bthome/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
"dependencies": ["bluetooth_adapters"],
"documentation": "https://www.home-assistant.io/integrations/bthome",
"iot_class": "local_push",
"requirements": ["bthome-ble==3.6.0"]
"requirements": ["bthome-ble==3.8.0"]
}
13 changes: 11 additions & 2 deletions homeassistant/components/calendar/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,11 @@ def _validate_rrule(value: Any) -> str:
return str(value)


def _empty_as_none(value: str | None) -> str | None:
"""Convert any empty string values to None."""
return value or None


CREATE_EVENT_SERVICE = "create_event"
CREATE_EVENT_SCHEMA = vol.All(
cv.has_at_least_one_key(EVENT_START_DATE, EVENT_START_DATETIME, EVENT_IN),
Expand Down Expand Up @@ -733,7 +738,9 @@ async def handle_calendar_event_create(
vol.Required("type"): "calendar/event/delete",
vol.Required("entity_id"): cv.entity_id,
vol.Required(EVENT_UID): cv.string,
vol.Optional(EVENT_RECURRENCE_ID): cv.string,
vol.Optional(EVENT_RECURRENCE_ID): vol.Any(
vol.All(cv.string, _empty_as_none), None
),
vol.Optional(EVENT_RECURRENCE_RANGE): cv.string,
}
)
Expand Down Expand Up @@ -777,7 +784,9 @@ async def handle_calendar_event_delete(
vol.Required("type"): "calendar/event/update",
vol.Required("entity_id"): cv.entity_id,
vol.Required(EVENT_UID): cv.string,
vol.Optional(EVENT_RECURRENCE_ID): cv.string,
vol.Optional(EVENT_RECURRENCE_ID): vol.Any(
vol.All(cv.string, _empty_as_none), None
),
vol.Optional(EVENT_RECURRENCE_RANGE): cv.string,
vol.Required(CONF_EVENT): WEBSOCKET_EVENT_SCHEMA,
}
Expand Down
16 changes: 12 additions & 4 deletions homeassistant/components/camera/media_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
PlayMedia,
)
from homeassistant.components.stream import FORMAT_CONTENT_TYPE, HLS_PROVIDER
from homeassistant.const import ATTR_FRIENDLY_NAME
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_component import EntityComponent
Expand All @@ -25,13 +26,20 @@ async def async_get_media_source(hass: HomeAssistant) -> CameraMediaSource:
return CameraMediaSource(hass)


def _media_source_for_camera(camera: Camera, content_type: str) -> BrowseMediaSource:
def _media_source_for_camera(
hass: HomeAssistant, camera: Camera, content_type: str
) -> BrowseMediaSource:
camera_state = hass.states.get(camera.entity_id)
title = camera.name
if camera_state:
title = camera_state.attributes.get(ATTR_FRIENDLY_NAME, camera.name)

return BrowseMediaSource(
domain=DOMAIN,
identifier=camera.entity_id,
media_class=MediaClass.VIDEO,
media_content_type=content_type,
title=camera.name,
title=title,
thumbnail=f"/api/camera_proxy/{camera.entity_id}",
can_play=True,
can_expand=False,
Expand Down Expand Up @@ -89,15 +97,15 @@ async def async_browse_media(
async def _filter_browsable_camera(camera: Camera) -> BrowseMediaSource | None:
stream_type = camera.frontend_stream_type
if stream_type is None:
return _media_source_for_camera(camera, camera.content_type)
return _media_source_for_camera(self.hass, camera, camera.content_type)
if not can_stream_hls:
return None

content_type = FORMAT_CONTENT_TYPE[HLS_PROVIDER]
if stream_type != StreamType.HLS and not (await camera.stream_source()):
return None

return _media_source_for_camera(camera, content_type)
return _media_source_for_camera(self.hass, camera, content_type)

component: EntityComponent[Camera] = self.hass.data[DOMAIN]
results = await asyncio.gather(
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/climate/icons.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"fan_mode": {
"default": "mdi:circle-medium",
"state": {
"auto": "mdi:fan-auto",
"diffuse": "mdi:weather-windy",
"focus": "mdi:target",
"high": "mdi:speedometer",
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/conversation/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
"integration_type": "system",
"iot_class": "local_push",
"quality_scale": "internal",
"requirements": ["hassil==1.6.1", "home-assistant-intents==2024.2.28"]
"requirements": ["hassil==1.6.1", "home-assistant-intents==2024.3.12"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/dhcp/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
],
"quality_scale": "internal",
"requirements": [
"aiodhcpwatcher==0.8.0",
"aiodhcpwatcher==0.8.1",
"aiodiscover==1.6.1",
"cached_ipaddress==0.3.0"
]
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/enphase_envoy/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"documentation": "https://www.home-assistant.io/integrations/enphase_envoy",
"iot_class": "local_polling",
"loggers": ["pyenphase"],
"requirements": ["pyenphase==1.19.1"],
"requirements": ["pyenphase==1.19.2"],
"zeroconf": [
{
"type": "_enphase-envoy._tcp.local."
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==20240306.0"]
"requirements": ["home-assistant-frontend==20240307.0"]
}
9 changes: 1 addition & 8 deletions homeassistant/components/gardena_bluetooth/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
)
from gardena_bluetooth.parse import Characteristic, CharacteristicType

from homeassistant.components import bluetooth
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.device_registry import DeviceInfo
Expand Down Expand Up @@ -117,13 +116,7 @@ def __init__(self, coordinator: Coordinator, context: Any = None) -> None:
@property
def available(self) -> bool:
"""Return if entity is available."""
return (
self.coordinator.last_update_success
and bluetooth.async_address_present(
self.hass, self.coordinator.address, True
)
and self._attr_available
)
return self.coordinator.last_update_success and self._attr_available


class GardenaBluetoothDescriptorEntity(GardenaBluetoothEntity):
Expand Down
6 changes: 3 additions & 3 deletions homeassistant/components/gios/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,11 +229,11 @@ def native_value(self) -> StateType:
@property
def available(self) -> bool:
"""Return if entity is available."""
available = super().available
sensor_data = getattr(self.coordinator.data, self.entity_description.key)
available = super().available and bool(sensor_data)

# Sometimes the API returns sensor data without indexes
if self.entity_description.subkey:
if self.entity_description.subkey and available:
return available and bool(sensor_data.index)

return available and bool(sensor_data)
return available
2 changes: 1 addition & 1 deletion homeassistant/components/google/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
"documentation": "https://www.home-assistant.io/integrations/calendar.google",
"iot_class": "cloud_polling",
"loggers": ["googleapiclient"],
"requirements": ["gcal-sync==6.0.3", "oauth2client==4.1.3", "ical==7.0.0"]
"requirements": ["gcal-sync==6.0.3", "oauth2client==4.1.3", "ical==7.0.1"]
}
15 changes: 10 additions & 5 deletions homeassistant/components/google_assistant/trait.py
Original file line number Diff line number Diff line change
Expand Up @@ -2706,10 +2706,9 @@ class SensorStateTrait(_Trait):
name = TRAIT_SENSOR_STATE
commands: list[str] = []

def _air_quality_description_for_aqi(self, aqi):
if aqi is None or aqi.isnumeric() is False:
def _air_quality_description_for_aqi(self, aqi: float | None) -> str:
if aqi is None or aqi < 0:
return "unknown"
aqi = int(aqi)
if aqi <= 50:
return "healthy"
if aqi <= 100:
Expand Down Expand Up @@ -2764,11 +2763,17 @@ def query_attributes(self):
if device_class is None or data is None:
return {}

sensor_data = {"name": data[0], "rawValue": self.state.state}
try:
value = float(self.state.state)
except ValueError:
value = None
if self.state.state == STATE_UNKNOWN:
value = None
sensor_data = {"name": data[0], "rawValue": value}

if device_class == sensor.SensorDeviceClass.AQI:
sensor_data["currentSensorState"] = self._air_quality_description_for_aqi(
self.state.state
value
)

return {"currentSensorStateData": [sensor_data]}
1 change: 1 addition & 0 deletions homeassistant/components/hassio/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
ATTR_HOMEASSISTANT_EXCLUDE_DATABASE = "homeassistant_exclude_database"
ATTR_INPUT = "input"
ATTR_ISSUES = "issues"
ATTR_MESSAGE = "message"
ATTR_METHOD = "method"
ATTR_PANELS = "panels"
ATTR_PASSWORD = "password"
Expand Down
Loading
Loading