Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions CODEOWNERS

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion homeassistant/components/collection_image/quality_scale.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ rules:
test-coverage: done

# Gold
devices: todo
devices:
status: exempt
comment: Adding a device adds no benefit for a single entity config entry.
diagnostics: todo
discovery-update-info:
status: exempt
Expand Down
51 changes: 35 additions & 16 deletions homeassistant/components/midea/quality_scale.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,37 +34,56 @@ rules:
config-entry-unloading: done
docs-configuration-parameters: done
docs-installation-parameters: done
entity-unavailable: todo
entity-unavailable: done
integration-owner: done
log-when-unavailable: done
parallel-updates: done
reauthentication-flow: todo
reauthentication-flow:
status: exempt
comment: >
Cloud login is only used transiently during the config flow to mint a
local device token/key, which is then stored and used for local polling
only; the cloud is never contacted again. midealocal.device.connect()
also swallows AuthException into a plain bool, so a rejected token/key
is indistinguishable from the device being offline and there is no
signal that could trigger a reauth flow.
test-coverage: done

# Gold
devices: todo
diagnostics: todo
discovery-update-info: todo
discovery: todo
devices: done
diagnostics: done
discovery-update-info: done
discovery:
status: exempt
comment: >
DHCP is used to synchronize the IP address of already configured devices
when their DHCP lease changes. It is not used for device discovery because
DHCP information alone is insufficient to identify and configure most supported
Midea appliances.
docs-data-update: done
docs-examples: done
docs-known-limitations: done
docs-supported-devices: done
docs-supported-functions: done
docs-troubleshooting: done
docs-use-cases: done
dynamic-devices: todo
dynamic-devices:
status: exempt
comment: One config entry per physical device, no hub.
entity-category: todo
entity-device-class: todo
entity-disabled-by-default: todo
entity-translations: todo
exception-translations: todo
icon-translations: todo
entity-device-class: done
entity-disabled-by-default: done
entity-translations: done
exception-translations: done
icon-translations: done
reconfiguration-flow: done
repair-issues: todo
stale-devices: todo
repair-issues:
status: exempt
comment: No known use cases for repair issues, yet.
stale-devices:
status: exempt
comment: One config entry per physical device, no hub.

# Platinum
async-dependency: todo
inject-websession: todo
inject-websession: done
strict-typing: done
2 changes: 1 addition & 1 deletion homeassistant/components/picotts/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"domain": "picotts",
"name": "Pico TTS",
"codeowners": ["@rooggiieerr"],
"codeowners": ["@rrooggiieerr"],
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/picotts",
"integration_type": "service",
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/sofar/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
"documentation": "https://www.home-assistant.io/integrations/sofar",
"integration_type": "device",
"iot_class": "local_polling",
"quality_scale": "silver",
"quality_scale": "platinum",
"requirements": ["sofar-modbus==0.14.0"]
}
12 changes: 8 additions & 4 deletions homeassistant/components/sofar/quality_scale.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ rules:
# Silver
action-exceptions: done
config-entry-unloading: done
docs-configuration-parameters: done
docs-configuration-parameters:
status: exempt
comment: This integration does not provide an options flow.
docs-installation-parameters: done
entity-unavailable: done
integration-owner: done
Expand All @@ -51,12 +53,12 @@ rules:
status: exempt
comment: Modbus TCP gateways are not announced over any discoverable protocol.
docs-data-update: done
docs-examples: todo
docs-examples: done
docs-known-limitations: done
docs-supported-devices: done
docs-supported-functions: done
docs-troubleshooting: done
docs-use-cases: todo
docs-use-cases: done
dynamic-devices: done
entity-category: done
entity-device-class: done
Expand All @@ -65,7 +67,9 @@ rules:
exception-translations: done
icon-translations: done
reconfiguration-flow: done
repair-issues: todo
repair-issues:
status: exempt
comment: This integration has no user-actionable issues to repair.
stale-devices: done

# Platinum
Expand Down
37 changes: 21 additions & 16 deletions homeassistant/components/tesla_fleet/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ def __init__(
async def _async_update_data(self) -> dict[str, Any]:
"""Update vehicle data using TeslaFleet API."""

self.update_interval = VEHICLE_INTERVAL

try:
# Check if the vehicle is awake using a free API call
response = await self.api.vehicle()
Expand All @@ -166,11 +168,16 @@ async def _async_update_data(self) -> dict[str, Any]:
except VehicleOffline:
self.data["state"] = TeslaFleetState.ASLEEP
return self.data
except RateLimited:
LOGGER.warning(
"%s rate limited, will skip refresh",
self.name,
)
except RateLimited as e:
if isinstance(e.data, dict) and (after := e.data.get("after")):
LOGGER.warning(
"%s rate limited, will retry in %s seconds",
self.name,
after,
)
self.update_interval = timedelta(seconds=int(after))
else:
LOGGER.warning("%s rate limited, will skip refresh", self.name)
return self.data
except (InvalidToken, OAuthExpired) as e:
_invalidate_access_token(self.hass, self.config_entry)
Expand All @@ -180,8 +187,6 @@ async def _async_update_data(self) -> dict[str, Any]:
except TeslaFleetError as e:
raise UpdateFailed(e.message) from e

self.update_interval = VEHICLE_INTERVAL

self.updated_once = True

if self.api.pre2021 and data["state"] == TeslaFleetState.ONLINE:
Expand Down Expand Up @@ -238,13 +243,13 @@ async def _async_update_data(self) -> dict[str, Any]:
try:
data = (await self.api.live_status())["response"]
except RateLimited as e:
if isinstance(e.data, dict) and "after" in e.data:
if isinstance(e.data, dict) and (after := e.data.get("after")):
LOGGER.warning(
"%s rate limited, will retry in %s seconds",
self.name,
e.data["after"],
after,
)
self.update_interval = timedelta(seconds=int(e.data["after"]))
self.update_interval = timedelta(seconds=int(after))
else:
LOGGER.warning("%s rate limited, will skip refresh", self.name)
return self.data
Expand Down Expand Up @@ -320,13 +325,13 @@ async def _async_update_data(self) -> dict[str, Any]:
try:
data = (await self.api.energy_history(TeslaEnergyPeriod.DAY))["response"]
except RateLimited as e:
if isinstance(e.data, dict) and "after" in e.data:
if isinstance(e.data, dict) and (after := e.data.get("after")):
LOGGER.warning(
"%s rate limited, will retry in %s seconds",
self.name,
e.data["after"],
after,
)
self.update_interval = timedelta(seconds=int(e.data["after"]))
self.update_interval = timedelta(seconds=int(after))
else:
LOGGER.warning("%s rate limited, will skip refresh", self.name)
return self.data
Expand Down Expand Up @@ -401,13 +406,13 @@ async def _async_update_data(self) -> dict[str, Any]:
try:
data = (await self.api.site_info())["response"]
except RateLimited as e:
if isinstance(e.data, dict) and "after" in e.data:
if isinstance(e.data, dict) and (after := e.data.get("after")):
LOGGER.warning(
"%s rate limited, will retry in %s seconds",
self.name,
e.data["after"],
after,
)
self.update_interval = timedelta(seconds=int(e.data["after"]))
self.update_interval = timedelta(seconds=int(after))
else:
LOGGER.warning("%s rate limited, will skip refresh", self.name)
return self.data
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/waqi/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,4 @@ async def _async_update_data(self) -> WAQIAirQuality:
self.subentry.data[CONF_STATION_NUMBER]
)
except WAQIError as exc:
raise UpdateFailed from exc
raise UpdateFailed(str(exc)) from exc
2 changes: 1 addition & 1 deletion homeassistant/package_constraints.txt
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ standard-telnetlib==3.13.0
typing-extensions>=4.16.0,<5.0
ulid-transform==2.2.9
urllib3>=2.0
uv==0.12.11
uv==0.12.12
webrtc-models==0.3.0
yarl==1.25.1
zeroconf==0.151.3
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ dependencies = [
"typing-extensions>=4.16.0,<5.0",
"ulid-transform==2.2.9",
"urllib3>=2.0",
"uv==0.12.11",
"uv==0.12.12",
"probatio==0.12.1",
"yarl==1.25.1",
"webrtc-models==0.3.0",
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading