mirror of
https://github.com/home-assistant/core.git
synced 2025-08-05 13:45:12 +02:00
Rework imports
This commit is contained in:
@@ -8,15 +8,12 @@ from collections.abc import Iterable
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from enum import StrEnum
|
from enum import StrEnum
|
||||||
import logging
|
import logging
|
||||||
from typing import cast
|
|
||||||
|
|
||||||
from universal_silabs_flasher.const import ApplicationType as FlasherApplicationType
|
from universal_silabs_flasher.const import ApplicationType as FlasherApplicationType
|
||||||
from universal_silabs_flasher.flasher import Flasher
|
from universal_silabs_flasher.flasher import Flasher
|
||||||
import voluptuous as vol
|
|
||||||
from yarl import URL
|
|
||||||
|
|
||||||
from homeassistant.components.hassio import AddonError, AddonState, valid_addon
|
from homeassistant.components.hassio import AddonError, AddonState
|
||||||
from homeassistant.config_entries import ConfigEntry, ConfigEntryState
|
from homeassistant.config_entries import ConfigEntryState
|
||||||
from homeassistant.core import HomeAssistant, callback
|
from homeassistant.core import HomeAssistant, callback
|
||||||
from homeassistant.helpers.hassio import is_hassio
|
from homeassistant.helpers.hassio import is_hassio
|
||||||
from homeassistant.helpers.singleton import singleton
|
from homeassistant.helpers.singleton import singleton
|
||||||
@@ -147,88 +144,39 @@ class FirmwareInfo:
|
|||||||
return all(states)
|
return all(states)
|
||||||
|
|
||||||
|
|
||||||
async def get_zha_firmware_info(
|
|
||||||
hass: HomeAssistant, config_entry: ConfigEntry
|
|
||||||
) -> FirmwareInfo | None:
|
|
||||||
"""Return firmware information for the ZHA instance."""
|
|
||||||
|
|
||||||
# We only support EZSP firmware for now
|
|
||||||
if config_entry.data.get("radio_type", None) != "ezsp":
|
|
||||||
return None
|
|
||||||
|
|
||||||
device = config_entry.data.get("device", {}).get("path", None)
|
|
||||||
if device is None:
|
|
||||||
return None
|
|
||||||
|
|
||||||
try:
|
|
||||||
# pylint: disable-next=import-outside-toplevel
|
|
||||||
from homeassistant.components.zha.helpers import get_zha_gateway
|
|
||||||
except ImportError:
|
|
||||||
# A ZHA config entry exists but ZHA isn't installed, it was probably ignored
|
|
||||||
return None
|
|
||||||
|
|
||||||
try:
|
|
||||||
gateway = get_zha_gateway(hass)
|
|
||||||
except ValueError:
|
|
||||||
firmware_version = None
|
|
||||||
else:
|
|
||||||
firmware_version = gateway.state.node_info.version
|
|
||||||
|
|
||||||
return FirmwareInfo(
|
|
||||||
device=device,
|
|
||||||
firmware_type=ApplicationType.EZSP,
|
|
||||||
firmware_version=firmware_version,
|
|
||||||
source=ZHA_DOMAIN,
|
|
||||||
owners=[OwningIntegration(config_entry_id=config_entry.entry_id)],
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_otbr_firmware_info(
|
|
||||||
hass: HomeAssistant, config_entry: ConfigEntry
|
|
||||||
) -> FirmwareInfo | None:
|
|
||||||
"""Return firmware information for the OpenThread Border Router."""
|
|
||||||
device = config_entry.data["device"]
|
|
||||||
if device is None:
|
|
||||||
return None
|
|
||||||
|
|
||||||
owners: list[OwningIntegration | OwningAddon] = [
|
|
||||||
OwningIntegration(config_entry_id=config_entry.entry_id)
|
|
||||||
]
|
|
||||||
|
|
||||||
if is_hassio(hass) and (host := URL(config_entry.data["url"]).host) is not None:
|
|
||||||
try:
|
|
||||||
valid_addon(host)
|
|
||||||
except vol.Invalid:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
owners.append(OwningAddon(slug=host))
|
|
||||||
|
|
||||||
return FirmwareInfo(
|
|
||||||
device=device,
|
|
||||||
firmware_type=ApplicationType.SPINEL,
|
|
||||||
firmware_version=cast(str | None, config_entry.data["firmware_version"]),
|
|
||||||
source=OTBR_DOMAIN,
|
|
||||||
owners=owners,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def guess_hardware_owners(
|
async def guess_hardware_owners(
|
||||||
hass: HomeAssistant, device_path: str
|
hass: HomeAssistant, device_path: str
|
||||||
) -> list[FirmwareInfo]:
|
) -> list[FirmwareInfo]:
|
||||||
"""Guess the firmware info based on installed addons and other integrations."""
|
"""Guess the firmware info based on installed addons and other integrations."""
|
||||||
device_guesses: defaultdict[str, list[FirmwareInfo]] = defaultdict(list)
|
device_guesses: defaultdict[str, list[FirmwareInfo]] = defaultdict(list)
|
||||||
|
|
||||||
for zha_config_entry in hass.config_entries.async_entries(ZHA_DOMAIN):
|
try:
|
||||||
firmware_info = await get_zha_firmware_info(hass, zha_config_entry)
|
# pylint: disable-next=import-outside-toplevel, hass-component-root-import
|
||||||
|
from homeassistant.components.zha.homeassistant_hardware import (
|
||||||
|
get_firmware_info as get_zha_firmware_info,
|
||||||
|
)
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
for zha_config_entry in hass.config_entries.async_entries(ZHA_DOMAIN):
|
||||||
|
firmware_info = await get_zha_firmware_info(hass, zha_config_entry)
|
||||||
|
|
||||||
if firmware_info is not None:
|
if firmware_info is not None:
|
||||||
device_guesses[firmware_info.device].append(firmware_info)
|
device_guesses[firmware_info.device].append(firmware_info)
|
||||||
|
|
||||||
for otbr_config_entry in hass.config_entries.async_entries(OTBR_DOMAIN):
|
try:
|
||||||
firmware_info = await get_otbr_firmware_info(hass, otbr_config_entry)
|
# pylint: disable-next=import-outside-toplevel, hass-component-root-import
|
||||||
|
from homeassistant.components.otbr.homeassistant_hardware import (
|
||||||
|
get_firmware_info as get_otbr_firmware_info,
|
||||||
|
)
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
for otbr_config_entry in hass.config_entries.async_entries(OTBR_DOMAIN):
|
||||||
|
firmware_info = await get_otbr_firmware_info(hass, otbr_config_entry)
|
||||||
|
|
||||||
if firmware_info is not None:
|
if firmware_info is not None:
|
||||||
device_guesses[firmware_info.device].append(firmware_info)
|
device_guesses[firmware_info.device].append(firmware_info)
|
||||||
|
|
||||||
# It may be possible for the OTBR addon to be present without the integration
|
# It may be possible for the OTBR addon to be present without the integration
|
||||||
if is_hassio(hass):
|
if is_hassio(hass):
|
||||||
|
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import cast
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
from yarl import URL
|
from yarl import URL
|
||||||
|
|
||||||
@@ -12,6 +14,7 @@ from homeassistant.components.homeassistant_hardware.util import (
|
|||||||
OwningAddon,
|
OwningAddon,
|
||||||
OwningIntegration,
|
OwningIntegration,
|
||||||
)
|
)
|
||||||
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.exceptions import HomeAssistantError
|
from homeassistant.exceptions import HomeAssistantError
|
||||||
from homeassistant.helpers.hassio import is_hassio
|
from homeassistant.helpers.hassio import is_hassio
|
||||||
@@ -21,9 +24,10 @@ from .const import DOMAIN
|
|||||||
|
|
||||||
|
|
||||||
async def get_firmware_info(
|
async def get_firmware_info(
|
||||||
hass: HomeAssistant, config_entry: OTBRConfigEntry
|
hass: HomeAssistant, config_entry: ConfigEntry
|
||||||
) -> FirmwareInfo | None:
|
) -> FirmwareInfo | None:
|
||||||
"""Return firmware information for the OpenThread Border Router."""
|
"""Return firmware information for the OpenThread Border Router."""
|
||||||
|
config_entry = cast(OTBRConfigEntry, config_entry)
|
||||||
device = config_entry.data["device"]
|
device = config_entry.data["device"]
|
||||||
if device is None:
|
if device is None:
|
||||||
return None
|
return None
|
||||||
|
Reference in New Issue
Block a user