diff --git a/homeassistant/components/alarm_control_panel/__init__.py b/homeassistant/components/alarm_control_panel/__init__.py index c307e96e9f0..2747ea1d332 100644 --- a/homeassistant/components/alarm_control_panel/__init__.py +++ b/homeassistant/components/alarm_control_panel/__init__.py @@ -1,6 +1,7 @@ """Component to interface with an alarm control panel.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta import logging from typing import Any, Final, final @@ -120,7 +121,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class AlarmControlPanelEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class AlarmControlPanelEntityDescription(EntityDescription): """A class that describes alarm control panel entities.""" diff --git a/homeassistant/components/binary_sensor/__init__.py b/homeassistant/components/binary_sensor/__init__.py index a3303c525cb..2c6809d8b06 100644 --- a/homeassistant/components/binary_sensor/__init__.py +++ b/homeassistant/components/binary_sensor/__init__.py @@ -1,6 +1,7 @@ """Component to interface with binary sensors.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta from enum import StrEnum import logging @@ -175,7 +176,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class BinarySensorEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class BinarySensorEntityDescription(EntityDescription): """A class that describes binary sensor entities.""" device_class: BinarySensorDeviceClass | None = None diff --git a/homeassistant/components/bluetooth/passive_update_processor.py b/homeassistant/components/bluetooth/passive_update_processor.py index 601f78d4c8d..8da0d2c462b 100644 --- a/homeassistant/components/bluetooth/passive_update_processor.py +++ b/homeassistant/components/bluetooth/passive_update_processor.py @@ -93,11 +93,8 @@ def deserialize_entity_description( descriptions_class: type[EntityDescription], data: dict[str, Any] ) -> EntityDescription: """Deserialize an entity description.""" - # pylint: disable=protected-access result: dict[str, Any] = {} - if hasattr(descriptions_class, "_dataclass"): - descriptions_class = descriptions_class._dataclass - for field in cached_fields(descriptions_class): + for field in cached_fields(descriptions_class): # type: ignore[arg-type] field_name = field.name # It would be nice if field.type returned the actual # type instead of a str so we could avoid writing this @@ -117,7 +114,7 @@ def serialize_entity_description(description: EntityDescription) -> dict[str, An as_dict = dataclasses.asdict(description) return { field.name: as_dict[field.name] - for field in cached_fields(type(description)) + for field in cached_fields(type(description)) # type: ignore[arg-type] if field.default != as_dict.get(field.name) } diff --git a/homeassistant/components/button/__init__.py b/homeassistant/components/button/__init__.py index 4ebe1df68a2..1f6972a6467 100644 --- a/homeassistant/components/button/__init__.py +++ b/homeassistant/components/button/__init__.py @@ -1,6 +1,7 @@ """Component to pressing a button as platforms.""" from __future__ import annotations +from dataclasses import dataclass from datetime import datetime, timedelta from enum import StrEnum import logging @@ -72,7 +73,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class ButtonEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class ButtonEntityDescription(EntityDescription): """A class that describes button entities.""" device_class: ButtonDeviceClass | None = None diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index 528c2cef50a..21fde9690ce 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -5,7 +5,7 @@ import asyncio import collections from collections.abc import Awaitable, Callable, Iterable from contextlib import suppress -from dataclasses import asdict +from dataclasses import asdict, dataclass from datetime import datetime, timedelta from enum import IntFlag from functools import partial @@ -132,7 +132,8 @@ CAMERA_SERVICE_RECORD: Final = { } -class CameraEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class CameraEntityDescription(EntityDescription): """A class that describes camera entities.""" diff --git a/homeassistant/components/climate/__init__.py b/homeassistant/components/climate/__init__.py index 3e93bf27ffc..f73433e7341 100644 --- a/homeassistant/components/climate/__init__.py +++ b/homeassistant/components/climate/__init__.py @@ -1,6 +1,7 @@ """Provides functionality to interact with climate devices.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta import functools as ft import logging @@ -200,7 +201,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class ClimateEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class ClimateEntityDescription(EntityDescription): """A class that describes climate entities.""" diff --git a/homeassistant/components/cover/__init__.py b/homeassistant/components/cover/__init__.py index 633300af591..7b1afa876d0 100644 --- a/homeassistant/components/cover/__init__.py +++ b/homeassistant/components/cover/__init__.py @@ -2,6 +2,7 @@ from __future__ import annotations from collections.abc import Callable +from dataclasses import dataclass from datetime import timedelta from enum import IntFlag, StrEnum import functools as ft @@ -211,7 +212,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class CoverEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class CoverEntityDescription(EntityDescription): """A class that describes cover entities.""" device_class: CoverDeviceClass | None = None diff --git a/homeassistant/components/date/__init__.py b/homeassistant/components/date/__init__.py index 7426293cfb4..5841a39b231 100644 --- a/homeassistant/components/date/__init__.py +++ b/homeassistant/components/date/__init__.py @@ -1,6 +1,7 @@ """Component to allow setting date as platforms.""" from __future__ import annotations +from dataclasses import dataclass from datetime import date, timedelta import logging from typing import final @@ -61,7 +62,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class DateEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class DateEntityDescription(EntityDescription): """A class that describes date entities.""" diff --git a/homeassistant/components/datetime/__init__.py b/homeassistant/components/datetime/__init__.py index 823028ee6a7..0df29e9893f 100644 --- a/homeassistant/components/datetime/__init__.py +++ b/homeassistant/components/datetime/__init__.py @@ -1,6 +1,7 @@ """Component to allow setting date/time as platforms.""" from __future__ import annotations +from dataclasses import dataclass from datetime import UTC, datetime, timedelta import logging from typing import final @@ -70,7 +71,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class DateTimeEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class DateTimeEntityDescription(EntityDescription): """A class that describes date/time entities.""" diff --git a/homeassistant/components/event/__init__.py b/homeassistant/components/event/__init__.py index 40e55472d12..2ff224fec82 100644 --- a/homeassistant/components/event/__init__.py +++ b/homeassistant/components/event/__init__.py @@ -71,7 +71,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class EventEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class EventEntityDescription(EntityDescription): """A class that describes event entities.""" device_class: EventDeviceClass | None = None diff --git a/homeassistant/components/fan/__init__.py b/homeassistant/components/fan/__init__.py index 23261c4d944..21e32f84266 100644 --- a/homeassistant/components/fan/__init__.py +++ b/homeassistant/components/fan/__init__.py @@ -1,6 +1,7 @@ """Provides functionality to interact with fans.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta from enum import IntFlag import functools as ft @@ -186,7 +187,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class FanEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class FanEntityDescription(ToggleEntityDescription): """A class that describes fan entities.""" diff --git a/homeassistant/components/humidifier/__init__.py b/homeassistant/components/humidifier/__init__.py index 39150126b7a..6e0ab7c5832 100644 --- a/homeassistant/components/humidifier/__init__.py +++ b/homeassistant/components/humidifier/__init__.py @@ -1,6 +1,7 @@ """Provides functionality to interact with humidifier devices.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta from enum import StrEnum import logging @@ -123,7 +124,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class HumidifierEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class HumidifierEntityDescription(ToggleEntityDescription): """A class that describes humidifier entities.""" device_class: HumidifierDeviceClass | None = None diff --git a/homeassistant/components/image/__init__.py b/homeassistant/components/image/__init__.py index d90295f6279..0bd37198a9d 100644 --- a/homeassistant/components/image/__init__.py +++ b/homeassistant/components/image/__init__.py @@ -44,7 +44,8 @@ _RND: Final = SystemRandom() GET_IMAGE_TIMEOUT: Final = 10 -class ImageEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class ImageEntityDescription(EntityDescription): """A class that describes image entities.""" diff --git a/homeassistant/components/image_processing/__init__.py b/homeassistant/components/image_processing/__init__.py index 916812e41c9..07c6d44307d 100644 --- a/homeassistant/components/image_processing/__init__.py +++ b/homeassistant/components/image_processing/__init__.py @@ -2,6 +2,7 @@ from __future__ import annotations import asyncio +from dataclasses import dataclass from datetime import timedelta from enum import StrEnum import logging @@ -119,7 +120,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: return True -class ImageProcessingEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class ImageProcessingEntityDescription(EntityDescription): """A class that describes sensor entities.""" device_class: ImageProcessingDeviceClass | None = None diff --git a/homeassistant/components/lawn_mower/__init__.py b/homeassistant/components/lawn_mower/__init__.py index b25f9ab34af..bcff270e708 100644 --- a/homeassistant/components/lawn_mower/__init__.py +++ b/homeassistant/components/lawn_mower/__init__.py @@ -1,6 +1,7 @@ """The lawn mower integration.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta import logging from typing import final @@ -64,7 +65,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class LawnMowerEntityEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class LawnMowerEntityEntityDescription(EntityDescription): """A class that describes lawn mower entities.""" diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index 6643884566f..b3bda11c321 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -816,7 +816,8 @@ class Profiles: params.setdefault(ATTR_TRANSITION, profile.transition) -class LightEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): +@dataclasses.dataclass(frozen=True) +class LightEntityDescription(ToggleEntityDescription): """A class that describes binary sensor entities.""" diff --git a/homeassistant/components/lock/__init__.py b/homeassistant/components/lock/__init__.py index b28aa9d0a1b..6ae6225df45 100644 --- a/homeassistant/components/lock/__init__.py +++ b/homeassistant/components/lock/__init__.py @@ -1,6 +1,7 @@ """Component to interface with locks that can be controlled remotely.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta from enum import IntFlag import functools as ft @@ -100,7 +101,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class LockEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class LockEntityDescription(EntityDescription): """A class that describes lock entities.""" diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index a45127d7b86..9f60016a372 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -5,6 +5,7 @@ import asyncio import collections from collections.abc import Callable from contextlib import suppress +from dataclasses import dataclass import datetime as dt from enum import StrEnum import functools as ft @@ -448,7 +449,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class MediaPlayerEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class MediaPlayerEntityDescription(EntityDescription): """A class that describes media player entities.""" device_class: MediaPlayerDeviceClass | None = None diff --git a/homeassistant/components/number/__init__.py b/homeassistant/components/number/__init__.py index 631fc5fc96c..f47f217d058 100644 --- a/homeassistant/components/number/__init__.py +++ b/homeassistant/components/number/__init__.py @@ -120,7 +120,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class NumberEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclasses.dataclass(frozen=True) +class NumberEntityDescription(EntityDescription): """A class that describes number entities.""" device_class: NumberDeviceClass | None = None diff --git a/homeassistant/components/remote/__init__.py b/homeassistant/components/remote/__init__.py index 2901c14c455..fcd3260e24a 100644 --- a/homeassistant/components/remote/__init__.py +++ b/homeassistant/components/remote/__init__.py @@ -2,6 +2,7 @@ from __future__ import annotations from collections.abc import Iterable +from dataclasses import dataclass from datetime import timedelta from enum import IntFlag import functools as ft @@ -154,7 +155,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class RemoteEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class RemoteEntityDescription(ToggleEntityDescription): """A class that describes remote entities.""" diff --git a/homeassistant/components/select/__init__.py b/homeassistant/components/select/__init__.py index 9c978555dd5..225691b5af1 100644 --- a/homeassistant/components/select/__init__.py +++ b/homeassistant/components/select/__init__.py @@ -1,6 +1,7 @@ """Component to allow selecting an option from a list as platforms.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta import logging from typing import Any, final @@ -117,7 +118,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class SelectEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class SelectEntityDescription(EntityDescription): """A class that describes select entities.""" options: list[str] | None = None diff --git a/homeassistant/components/sensor/__init__.py b/homeassistant/components/sensor/__init__.py index 9cdcfade9ec..b3e6ed8afbb 100644 --- a/homeassistant/components/sensor/__init__.py +++ b/homeassistant/components/sensor/__init__.py @@ -136,7 +136,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class SensorEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class SensorEntityDescription(EntityDescription): """A class that describes sensor entities.""" device_class: SensorDeviceClass | None = None diff --git a/homeassistant/components/siren/__init__.py b/homeassistant/components/siren/__init__.py index d7e8843f54b..ee97474ce65 100644 --- a/homeassistant/components/siren/__init__.py +++ b/homeassistant/components/siren/__init__.py @@ -1,6 +1,7 @@ """Component to interface with various sirens/chimes.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta import logging from typing import Any, TypedDict, cast, final @@ -148,7 +149,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class SirenEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class SirenEntityDescription(ToggleEntityDescription): """A class that describes siren entities.""" available_tones: list[int | str] | dict[int, str] | None = None diff --git a/homeassistant/components/switch/__init__.py b/homeassistant/components/switch/__init__.py index bdbb2b7701b..24361afcdce 100644 --- a/homeassistant/components/switch/__init__.py +++ b/homeassistant/components/switch/__init__.py @@ -1,6 +1,7 @@ """Component to interface with switches that can be controlled remotely.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta from enum import StrEnum import logging @@ -88,7 +89,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class SwitchEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class SwitchEntityDescription(ToggleEntityDescription): """A class that describes switch entities.""" device_class: SwitchDeviceClass | None = None diff --git a/homeassistant/components/text/__init__.py b/homeassistant/components/text/__init__.py index 8e20fdd33af..7fab7a70304 100644 --- a/homeassistant/components/text/__init__.py +++ b/homeassistant/components/text/__init__.py @@ -98,7 +98,8 @@ class TextMode(StrEnum): TEXT = "text" -class TextEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class TextEntityDescription(EntityDescription): """A class that describes text entities.""" native_min: int = 0 diff --git a/homeassistant/components/time/__init__.py b/homeassistant/components/time/__init__.py index 2b5721aaf1b..5243adca328 100644 --- a/homeassistant/components/time/__init__.py +++ b/homeassistant/components/time/__init__.py @@ -1,6 +1,7 @@ """Component to allow setting time as platforms.""" from __future__ import annotations +from dataclasses import dataclass from datetime import time, timedelta import logging from typing import final @@ -61,7 +62,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class TimeEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class TimeEntityDescription(EntityDescription): """A class that describes time entities.""" diff --git a/homeassistant/components/unifiprotect/binary_sensor.py b/homeassistant/components/unifiprotect/binary_sensor.py index f32b53a5d7a..c1880a20934 100644 --- a/homeassistant/components/unifiprotect/binary_sensor.py +++ b/homeassistant/components/unifiprotect/binary_sensor.py @@ -564,7 +564,7 @@ class ProtectDeviceBinarySensor(ProtectDeviceEntity, BinarySensorEntity): updated_device.mount_type, BinarySensorDeviceClass.DOOR ) else: - self._attr_device_class = self.entity_description.device_class + self._attr_device_class = self.entity_description.device_class # type: ignore[assignment] class ProtectDiskBinarySensor(ProtectNVREntity, BinarySensorEntity): diff --git a/homeassistant/components/update/__init__.py b/homeassistant/components/update/__init__.py index 8597647fc18..f9ba6a63d55 100644 --- a/homeassistant/components/update/__init__.py +++ b/homeassistant/components/update/__init__.py @@ -1,6 +1,7 @@ """Component to allow for providing device or service updates.""" from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta from enum import StrEnum from functools import lru_cache @@ -174,7 +175,8 @@ async def async_clear_skipped(entity: UpdateEntity, service_call: ServiceCall) - await entity.async_clear_skipped() -class UpdateEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class UpdateEntityDescription(EntityDescription): """A class that describes update entities.""" device_class: UpdateDeviceClass | None = None diff --git a/homeassistant/components/vacuum/__init__.py b/homeassistant/components/vacuum/__init__.py index 5ffb3de2a12..f93a939c4ee 100644 --- a/homeassistant/components/vacuum/__init__.py +++ b/homeassistant/components/vacuum/__init__.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio from collections.abc import Mapping +from dataclasses import dataclass from datetime import timedelta from enum import IntFlag from functools import partial @@ -366,7 +367,8 @@ class _BaseVacuum(Entity): ) -class VacuumEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class VacuumEntityDescription(ToggleEntityDescription): """A class that describes vacuum entities.""" @@ -488,7 +490,8 @@ class VacuumEntity(_BaseVacuum, ToggleEntity): await self.hass.async_add_executor_job(partial(self.start_pause, **kwargs)) -class StateVacuumEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class StateVacuumEntityDescription(EntityDescription): """A class that describes vacuum entities.""" diff --git a/homeassistant/components/water_heater/__init__.py b/homeassistant/components/water_heater/__init__.py index 6506be10065..46731ef44a9 100644 --- a/homeassistant/components/water_heater/__init__.py +++ b/homeassistant/components/water_heater/__init__.py @@ -2,6 +2,7 @@ from __future__ import annotations from collections.abc import Mapping +from dataclasses import dataclass from datetime import timedelta from enum import IntFlag import functools as ft @@ -155,7 +156,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class WaterHeaterEntityEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class WaterHeaterEntityEntityDescription(EntityDescription): """A class that describes water heater entities.""" diff --git a/homeassistant/components/weather/__init__.py b/homeassistant/components/weather/__init__.py index 899181f2b5f..447aab0c413 100644 --- a/homeassistant/components/weather/__init__.py +++ b/homeassistant/components/weather/__init__.py @@ -5,6 +5,7 @@ import abc import asyncio from collections.abc import Callable, Iterable from contextlib import suppress +from dataclasses import dataclass from datetime import timedelta from functools import partial import logging @@ -250,7 +251,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return await component.async_unload_entry(entry) -class WeatherEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclass(frozen=True) +class WeatherEntityDescription(EntityDescription): """A class that describes weather entities.""" diff --git a/homeassistant/helpers/entity.py b/homeassistant/helpers/entity.py index 9f5ff3dad52..aaa3f779c53 100644 --- a/homeassistant/helpers/entity.py +++ b/homeassistant/helpers/entity.py @@ -52,7 +52,6 @@ from homeassistant.exceptions import ( ) from homeassistant.loader import async_suggest_report_issue, bind_hass from homeassistant.util import ensure_unique_string, slugify -from homeassistant.util.frozen_dataclass_compat import FrozenOrThawed from . import device_registry as dr, entity_registry as er from .device_registry import DeviceInfo, EventDeviceRegistryUpdatedData @@ -225,7 +224,8 @@ class EntityPlatformState(Enum): REMOVED = auto() -class EntityDescription(metaclass=FrozenOrThawed, frozen_or_thawed=True): +@dataclasses.dataclass(frozen=True) +class EntityDescription: """A class that describes Home Assistant entities.""" # This is the key identifier for this entity @@ -1313,7 +1313,8 @@ class Entity(ABC): ) -class ToggleEntityDescription(EntityDescription, frozen_or_thawed=True): +@dataclasses.dataclass(frozen=True, slots=True) +class ToggleEntityDescription(EntityDescription): """A class that describes toggle entities."""