From eab1d5717f18767f3a12cb4ac1be7506db22dec7 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Fri, 9 May 2025 10:04:11 +0200 Subject: [PATCH] Use HassKey in hardware (#144337) --- homeassistant/components/hardware/__init__.py | 5 +++-- homeassistant/components/hardware/const.py | 11 +++++++++++ homeassistant/components/hardware/hardware.py | 10 ++++++---- homeassistant/components/hardware/models.py | 13 ++++++++++++- homeassistant/components/hardware/websocket_api.py | 13 +++++-------- 5 files changed, 37 insertions(+), 15 deletions(-) diff --git a/homeassistant/components/hardware/__init__.py b/homeassistant/components/hardware/__init__.py index 9de281b1e50..8576b29ef19 100644 --- a/homeassistant/components/hardware/__init__.py +++ b/homeassistant/components/hardware/__init__.py @@ -7,14 +7,15 @@ from homeassistant.helpers import config_validation as cv from homeassistant.helpers.typing import ConfigType from . import websocket_api -from .const import DOMAIN +from .const import DATA_HARDWARE, DOMAIN +from .models import HardwareData CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Hardware.""" - hass.data[DOMAIN] = {} + hass.data[DATA_HARDWARE] = HardwareData() await websocket_api.async_setup(hass) diff --git a/homeassistant/components/hardware/const.py b/homeassistant/components/hardware/const.py index 7fd64d5d968..2bde218c19d 100644 --- a/homeassistant/components/hardware/const.py +++ b/homeassistant/components/hardware/const.py @@ -1,3 +1,14 @@ """Constants for the Hardware integration.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +from homeassistant.util.hass_dict import HassKey + +if TYPE_CHECKING: + from .models import HardwareData + DOMAIN = "hardware" + +DATA_HARDWARE: HassKey[HardwareData] = HassKey(DOMAIN) diff --git a/homeassistant/components/hardware/hardware.py b/homeassistant/components/hardware/hardware.py index f2de9182b57..e07d970cd1f 100644 --- a/homeassistant/components/hardware/hardware.py +++ b/homeassistant/components/hardware/hardware.py @@ -8,13 +8,15 @@ from homeassistant.helpers.integration_platform import ( async_process_integration_platforms, ) -from .const import DOMAIN +from .const import DATA_HARDWARE, DOMAIN from .models import HardwareProtocol -async def async_process_hardware_platforms(hass: HomeAssistant) -> None: +async def async_process_hardware_platforms( + hass: HomeAssistant, +) -> None: """Start processing hardware platforms.""" - hass.data[DOMAIN]["hardware_platform"] = {} + hass.data[DATA_HARDWARE].hardware_platform = {} await async_process_integration_platforms( hass, DOMAIN, _register_hardware_platform, wait_for_platforms=True @@ -30,4 +32,4 @@ def _register_hardware_platform( return if not hasattr(platform, "async_info"): raise HomeAssistantError(f"Invalid hardware platform {platform}") - hass.data[DOMAIN]["hardware_platform"][integration_domain] = platform + hass.data[DATA_HARDWARE].hardware_platform[integration_domain] = platform diff --git a/homeassistant/components/hardware/models.py b/homeassistant/components/hardware/models.py index 6f25d6669cf..4b3c234f4c1 100644 --- a/homeassistant/components/hardware/models.py +++ b/homeassistant/components/hardware/models.py @@ -3,10 +3,21 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Protocol +from typing import TYPE_CHECKING, Protocol from homeassistant.core import HomeAssistant, callback +if TYPE_CHECKING: + from .websocket_api import SystemStatus + + +@dataclass +class HardwareData: + """Hardware data.""" + + hardware_platform: dict[str, HardwareProtocol] = None # type: ignore[assignment] + system_status: SystemStatus = None # type: ignore[assignment] + @dataclass(slots=True) class BoardInfo: diff --git a/homeassistant/components/hardware/websocket_api.py b/homeassistant/components/hardware/websocket_api.py index 7224c0f8f7e..fa441beeae5 100644 --- a/homeassistant/components/hardware/websocket_api.py +++ b/homeassistant/components/hardware/websocket_api.py @@ -16,9 +16,8 @@ from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.event import async_track_time_interval from homeassistant.util import dt as dt_util -from .const import DOMAIN +from .const import DATA_HARDWARE from .hardware import async_process_hardware_platforms -from .models import HardwareProtocol @dataclass(slots=True) @@ -34,7 +33,7 @@ async def async_setup(hass: HomeAssistant) -> None: """Set up the hardware websocket API.""" websocket_api.async_register_command(hass, ws_info) websocket_api.async_register_command(hass, ws_subscribe_system_status) - hass.data[DOMAIN]["system_status"] = SystemStatus( + hass.data[DATA_HARDWARE].system_status = SystemStatus( ha_psutil=await hass.async_add_executor_job(ha_psutil.PsutilWrapper), remove_periodic_timer=None, subscribers=set(), @@ -53,12 +52,10 @@ async def ws_info( """Return hardware info.""" hardware_info = [] - if "hardware_platform" not in hass.data[DOMAIN]: + if hass.data[DATA_HARDWARE].hardware_platform is None: await async_process_hardware_platforms(hass) - hardware_platform: dict[str, HardwareProtocol] = hass.data[DOMAIN][ - "hardware_platform" - ] + hardware_platform = hass.data[DATA_HARDWARE].hardware_platform for platform in hardware_platform.values(): if hasattr(platform, "async_info"): with contextlib.suppress(HomeAssistantError): @@ -78,7 +75,7 @@ def ws_subscribe_system_status( ) -> None: """Subscribe to system status updates.""" - system_status: SystemStatus = hass.data[DOMAIN]["system_status"] + system_status = hass.data[DATA_HARDWARE].system_status @callback def async_update_status(now: datetime) -> None: