diff --git a/ucapi/api_definitions.py b/ucapi/api_definitions.py index b1b45b2..1e79aaa 100644 --- a/ucapi/api_definitions.py +++ b/ucapi/api_definitions.py @@ -6,11 +6,11 @@ """ from dataclasses import dataclass -from enum import Enum, IntEnum +from enum import IntEnum, StrEnum from typing import Any, Awaitable, Callable, TypeAlias -class DeviceStates(str, Enum): +class DeviceStates(StrEnum): """Device states.""" CONNECTED = "CONNECTED" @@ -33,7 +33,7 @@ class StatusCodes(IntEnum): SERVICE_UNAVAILABLE = 503 -class IntegrationSetupError(str, Enum): +class IntegrationSetupError(StrEnum): """More detailed error reason for ``state: ERROR`` condition.""" NONE = "NONE" @@ -45,7 +45,7 @@ class IntegrationSetupError(str, Enum): # Does WsMessages need to be public? -class WsMessages(str, Enum): +class WsMessages(StrEnum): """WebSocket request messages from Remote Two/3.""" AUTHENTICATION = "authentication" @@ -64,7 +64,7 @@ class WsMessages(str, Enum): # Does WsMsgEvents need to be public? -class WsMsgEvents(str, Enum): +class WsMsgEvents(StrEnum): """WebSocket event messages from Remote Two/3.""" CONNECT = "connect" @@ -84,7 +84,7 @@ class WsMsgEvents(str, Enum): MEDIA_SEARCH = "media_search" -class Events(str, Enum): +class Events(StrEnum): """Internal library events. All event parameters are named parameters and optional. @@ -159,7 +159,7 @@ class Events(str, Enum): # Does EventCategory need to be public? -class EventCategory(str, Enum): +class EventCategory(StrEnum): """Event categories.""" DEVICE = "DEVICE" @@ -284,7 +284,7 @@ class SetupComplete(SetupAction): # --------------------------------------------------------------------------- -class AssistantEventType(str, Enum): +class AssistantEventType(StrEnum): """Type discriminator for assistant event messages.""" READY = "ready" @@ -295,7 +295,7 @@ class AssistantEventType(str, Enum): ERROR = "error" -class AssistantErrorCode(str, Enum): +class AssistantErrorCode(StrEnum): """Error codes for assistant processing.""" SERVICE_UNAVAILABLE = "SERVICE_UNAVAILABLE" diff --git a/ucapi/button.py b/ucapi/button.py index 708c61c..7b85af9 100644 --- a/ucapi/button.py +++ b/ucapi/button.py @@ -5,26 +5,26 @@ :license: MPL-2.0, see LICENSE for more details. """ -from enum import Enum +from enum import StrEnum from .api_definitions import CommandHandler from .entity import Entity, EntityTypes -class States(str, Enum): +class States(StrEnum): """Button entity states.""" UNAVAILABLE = "UNAVAILABLE" AVAILABLE = "AVAILABLE" -class Attributes(str, Enum): +class Attributes(StrEnum): """Button entity attributes.""" STATE = "state" -class Commands(str, Enum): +class Commands(StrEnum): """Button entity commands.""" PUSH = "push" diff --git a/ucapi/climate.py b/ucapi/climate.py index 778e28c..68bd549 100644 --- a/ucapi/climate.py +++ b/ucapi/climate.py @@ -5,14 +5,14 @@ :license: MPL-2.0, see LICENSE for more details. """ -from enum import Enum +from enum import StrEnum from typing import Any from .api_definitions import CommandHandler from .entity import Entity, EntityTypes -class States(str, Enum): +class States(StrEnum): """Climate entity states.""" UNAVAILABLE = "UNAVAILABLE" @@ -25,7 +25,7 @@ class States(str, Enum): AUTO = "AUTO" -class Features(str, Enum): +class Features(StrEnum): """Climate entity features.""" ON_OFF = "on_off" @@ -37,7 +37,7 @@ class Features(str, Enum): FAN = "fan" -class Attributes(str, Enum): +class Attributes(StrEnum): """Climate entity attributes.""" STATE = "state" @@ -48,7 +48,7 @@ class Attributes(str, Enum): FAN_MODE = "fan_mode" -class Commands(str, Enum): +class Commands(StrEnum): """Climate entity commands.""" ON = "on" @@ -59,11 +59,11 @@ class Commands(str, Enum): FAN_MODE = "fan_mode" -class DeviceClasses(str, Enum): +class DeviceClasses(StrEnum): """Climate entity device classes.""" -class Options(str, Enum): +class Options(StrEnum): """Climate entity options.""" TEMPERATURE_UNIT = "temperature_unit" diff --git a/ucapi/cover.py b/ucapi/cover.py index 85381c7..4d6855b 100644 --- a/ucapi/cover.py +++ b/ucapi/cover.py @@ -5,14 +5,14 @@ :license: MPL-2.0, see LICENSE for more details. """ -from enum import Enum +from enum import StrEnum from typing import Any from .api_definitions import CommandHandler from .entity import Entity, EntityTypes -class States(str, Enum): +class States(StrEnum): """Cover entity states.""" UNAVAILABLE = "UNAVAILABLE" @@ -23,7 +23,7 @@ class States(str, Enum): CLOSED = "CLOSED" -class Features(str, Enum): +class Features(StrEnum): """Cover entity features.""" OPEN = "open" @@ -35,7 +35,7 @@ class Features(str, Enum): TILT_POSITION = "tilt_position" -class Attributes(str, Enum): +class Attributes(StrEnum): """Cover entity attributes.""" STATE = "state" @@ -43,7 +43,7 @@ class Attributes(str, Enum): TILT_POSITION = "tilt_position" -class Commands(str, Enum): +class Commands(StrEnum): """Cover entity commands.""" OPEN = "open" @@ -56,7 +56,7 @@ class Commands(str, Enum): TILT_STOP = "tilt_stop" -class DeviceClasses(str, Enum): +class DeviceClasses(StrEnum): """Cover entity device classes.""" BLIND = "blind" @@ -68,7 +68,7 @@ class DeviceClasses(str, Enum): WINDOW = "window" -class Options(str, Enum): +class Options(StrEnum): """Cover entity options.""" diff --git a/ucapi/entity.py b/ucapi/entity.py index c996a80..c4fcfa5 100644 --- a/ucapi/entity.py +++ b/ucapi/entity.py @@ -7,7 +7,7 @@ import inspect import logging -from enum import Enum +from enum import StrEnum from typing import Any from .api_definitions import CommandHandler, StatusCodes @@ -34,7 +34,7 @@ def validate_str(name: str, value: str, min_len: int = 1, max_len: int = 255) -> raise ValueError(f"{name} must be at most {max_len} characters") -class EntityTypes(str, Enum): +class EntityTypes(StrEnum): """Entity types.""" COVER = "cover" @@ -50,7 +50,7 @@ class EntityTypes(str, Enum): VOICE_ASSISTANT = "voice_assistant" -class CommonStates(str, Enum): +class CommonStates(StrEnum): """Common entity states available in all entities.""" UNAVAILABLE = "UNAVAILABLE" diff --git a/ucapi/ir_emitter.py b/ucapi/ir_emitter.py index dc9375b..e8ed166 100644 --- a/ucapi/ir_emitter.py +++ b/ucapi/ir_emitter.py @@ -5,14 +5,14 @@ :license: MPL-2.0, see LICENSE for more details. """ -from enum import Enum +from enum import StrEnum from typing import Any from .api_definitions import CommandHandler from .entity import Entity, EntityTypes -class States(str, Enum): +class States(StrEnum): """IR Emitter entity states.""" UNAVAILABLE = "UNAVAILABLE" @@ -20,30 +20,30 @@ class States(str, Enum): ON = "ON" -class Features(str, Enum): +class Features(StrEnum): """IR Emitter entity features.""" SEND_IR = "send_ir" -class Attributes(str, Enum): +class Attributes(StrEnum): """IR Emitter entity attributes.""" STATE = "state" -class Commands(str, Enum): +class Commands(StrEnum): """IR Emitter entity commands.""" SEND_IR = "send_ir" STOP_IR = "stop_ir" -class DeviceClasses(str, Enum): +class DeviceClasses(StrEnum): """IR Emitter entity device classes.""" -class Options(str, Enum): +class Options(StrEnum): """IR Emitter entity options.""" PORTS = "ports" diff --git a/ucapi/light.py b/ucapi/light.py index f846d12..dfc0d9d 100644 --- a/ucapi/light.py +++ b/ucapi/light.py @@ -5,14 +5,14 @@ :license: MPL-2.0, see LICENSE for more details. """ -from enum import Enum +from enum import StrEnum from typing import Any from .api_definitions import CommandHandler from .entity import Entity, EntityTypes -class States(str, Enum): +class States(StrEnum): """Light entity states.""" UNAVAILABLE = "UNAVAILABLE" @@ -21,7 +21,7 @@ class States(str, Enum): OFF = "OFF" -class Features(str, Enum): +class Features(StrEnum): """Light entity features.""" ON_OFF = "on_off" @@ -31,7 +31,7 @@ class Features(str, Enum): COLOR_TEMPERATURE = "color_temperature" -class Attributes(str, Enum): +class Attributes(StrEnum): """Light entity attributes.""" STATE = "state" @@ -41,7 +41,7 @@ class Attributes(str, Enum): COLOR_TEMPERATURE = "color_temperature" -class Commands(str, Enum): +class Commands(StrEnum): """Light entity commands.""" ON = "on" @@ -49,11 +49,11 @@ class Commands(str, Enum): TOGGLE = "toggle" -class DeviceClasses(str, Enum): +class DeviceClasses(StrEnum): """Light entity device classes.""" -class Options(str, Enum): +class Options(StrEnum): """Light entity options.""" COLOR_TEMPERATURE_STEPS = "color_temperature_steps" diff --git a/ucapi/remote.py b/ucapi/remote.py index 5defc94..2dd2f93 100644 --- a/ucapi/remote.py +++ b/ucapi/remote.py @@ -6,7 +6,7 @@ """ import dataclasses -from enum import Enum +from enum import StrEnum from typing import Any from .api_definitions import CommandHandler @@ -14,7 +14,7 @@ from .ui import DeviceButtonMapping, EntityCommand, UiPage -class States(str, Enum): +class States(StrEnum): """Remote entity states.""" UNAVAILABLE = "UNAVAILABLE" @@ -23,7 +23,7 @@ class States(str, Enum): OFF = "OFF" -class Features(str, Enum): +class Features(StrEnum): """Remote entity features.""" ON_OFF = "on_off" @@ -31,13 +31,13 @@ class Features(str, Enum): SEND_CMD = "send_cmd" -class Attributes(str, Enum): +class Attributes(StrEnum): """Remote entity attributes.""" STATE = "state" -class Commands(str, Enum): +class Commands(StrEnum): """Remote entity commands.""" ON = "on" @@ -47,7 +47,7 @@ class Commands(str, Enum): SEND_CMD_SEQUENCE = "send_cmd_sequence" -class Options(str, Enum): +class Options(StrEnum): """Remote entity options.""" SIMPLE_COMMANDS = "simple_commands" diff --git a/ucapi/select.py b/ucapi/select.py index 4671ab6..e80a201 100644 --- a/ucapi/select.py +++ b/ucapi/select.py @@ -5,14 +5,14 @@ :license: MPL-2.0, see LICENSE for more details. """ -from enum import Enum +from enum import StrEnum from typing import Any from .api_definitions import CommandHandler from .entity import Entity, EntityTypes -class States(str, Enum): +class States(StrEnum): """Select entity states.""" UNAVAILABLE = "UNAVAILABLE" @@ -20,11 +20,11 @@ class States(str, Enum): ON = "ON" -class Features(str, Enum): +class Features(StrEnum): """Select entity features.""" -class Attributes(str, Enum): +class Attributes(StrEnum): """Select entity attributes.""" STATE = "state" @@ -32,7 +32,7 @@ class Attributes(str, Enum): OPTIONS = "options" -class Commands(str, Enum): +class Commands(StrEnum): """Select entity commands.""" SELECT_OPTION = "select_option" @@ -42,11 +42,11 @@ class Commands(str, Enum): SELECT_PREVIOUS = "select_previous" -class DeviceClasses(str, Enum): +class DeviceClasses(StrEnum): """Select entity device classes.""" -class Options(str, Enum): +class Options(StrEnum): """Select entity options.""" diff --git a/ucapi/sensor.py b/ucapi/sensor.py index c86f362..28d3067 100644 --- a/ucapi/sensor.py +++ b/ucapi/sensor.py @@ -5,13 +5,13 @@ :license: MPL-2.0, see LICENSE for more details. """ -from enum import Enum +from enum import StrEnum from typing import Any from .entity import Entity, EntityTypes -class States(str, Enum): +class States(StrEnum): """Sensor entity states.""" UNAVAILABLE = "UNAVAILABLE" @@ -23,11 +23,11 @@ class States(str, Enum): """The sensor is available and providing measurements.""" -class Features(str, Enum): +class Features(StrEnum): """Sensor entity features.""" -class Attributes(str, Enum): +class Attributes(StrEnum): """Sensor entity attributes.""" STATE = "state" @@ -38,11 +38,11 @@ class Attributes(str, Enum): """Optional unit of the ``value`` if no default unit is set.""" -class Commands(str, Enum): +class Commands(StrEnum): """Sensor entity commands.""" -class DeviceClasses(str, Enum): +class DeviceClasses(StrEnum): """Sensor entity device classes. See https://unfoldedcircle.github.io/core-api/entities/entity_sensor.html @@ -69,7 +69,7 @@ class DeviceClasses(str, Enum): The binary specific device class is stored in the ``unit`` attribute.""" -class Options(str, Enum): +class Options(StrEnum): """Sensor entity options.""" CUSTOM_UNIT = "custom_unit" diff --git a/ucapi/switch.py b/ucapi/switch.py index cc927db..b90cc8f 100644 --- a/ucapi/switch.py +++ b/ucapi/switch.py @@ -5,14 +5,14 @@ :license: MPL-2.0, see LICENSE for more details. """ -from enum import Enum +from enum import StrEnum from typing import Any from .api_definitions import CommandHandler from .entity import Entity, EntityTypes -class States(str, Enum): +class States(StrEnum): """Switch entity states.""" UNAVAILABLE = "UNAVAILABLE" @@ -21,20 +21,20 @@ class States(str, Enum): OFF = "OFF" -class Features(str, Enum): +class Features(StrEnum): """Switch entity features.""" ON_OFF = "on_off" TOGGLE = "toggle" -class Attributes(str, Enum): +class Attributes(StrEnum): """Switch entity attributes.""" STATE = "state" -class Commands(str, Enum): +class Commands(StrEnum): """Switch entity commands.""" ON = "on" @@ -42,14 +42,14 @@ class Commands(str, Enum): TOGGLE = "toggle" -class DeviceClasses(str, Enum): +class DeviceClasses(StrEnum): """Switch entity device classes.""" OUTLET = "outlet" SWITCH = "switch" -class Options(str, Enum): +class Options(StrEnum): """Switch entity options.""" READABLE = "readable" diff --git a/ucapi/ui.py b/ucapi/ui.py index 74d0f62..b4d96dc 100644 --- a/ucapi/ui.py +++ b/ucapi/ui.py @@ -6,7 +6,7 @@ """ from dataclasses import KW_ONLY, dataclass -from enum import Enum +from enum import StrEnum @dataclass @@ -17,7 +17,7 @@ class EntityCommand: params: dict[str, str | int | list[str]] | None = None -class Buttons(str, Enum): +class Buttons(StrEnum): """Physical buttons.""" BACK = "BACK" diff --git a/ucapi/voice_assistant.py b/ucapi/voice_assistant.py index 316dcef..aeac6fd 100644 --- a/ucapi/voice_assistant.py +++ b/ucapi/voice_assistant.py @@ -13,7 +13,7 @@ from __future__ import annotations from dataclasses import asdict, dataclass, field -from enum import Enum +from enum import StrEnum from typing import Any, Optional from .api_definitions import CommandHandler @@ -32,7 +32,7 @@ DEFAULT_SAMPLE_RATE = 16000 -class States(str, Enum): +class States(StrEnum): """Voice Assistant entity states.""" UNAVAILABLE = "UNAVAILABLE" @@ -41,7 +41,7 @@ class States(str, Enum): OFF = "OFF" -class Features(str, Enum): +class Features(StrEnum): """Voice Assistant features.""" TRANSCRIPTION = "transcription" @@ -60,13 +60,13 @@ class Features(str, Enum): """ -class Attributes(str, Enum): +class Attributes(StrEnum): """Voice Assistant entity attributes.""" STATE = "state" -class Commands(str, Enum): +class Commands(StrEnum): """Integration-API Voice Assistant entity commands.""" VOICE_START = "voice_start" @@ -77,7 +77,7 @@ class Commands(str, Enum): """ -class Options(str, Enum): +class Options(StrEnum): """Voice Assistant entity option fields.""" AUDIO_CFG = "audio_cfg" @@ -88,7 +88,7 @@ class Options(str, Enum): # --------------------------------------------------------------------------- # Data models for options # --------------------------------------------------------------------------- -class SampleFormat(str, Enum): +class SampleFormat(StrEnum): """Audio format specification.""" I16 = "I16" @@ -318,7 +318,7 @@ def __init__( identifier, name, EntityTypes.VOICE_ASSISTANT, - [f.value if isinstance(f, Enum) else f for f in features], + [f.value if isinstance(f, StrEnum) else f for f in features], attributes, options=( options