1
0
mirror of https://github.com/home-assistant/core.git synced 2026-04-17 23:53:49 +01:00

Migrate Tuya cover to TuyaCoverDefinition (#166328)

This commit is contained in:
epenet
2026-03-24 14:44:37 +01:00
committed by GitHub
parent 1e9c8ec32c
commit ca63f299ff

View File

@@ -5,11 +5,13 @@ from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any from typing import Any
from tuya_device_handlers.device_wrapper.base import DeviceWrapper from tuya_device_handlers.definition.cover import (
TuyaCoverDefinition,
get_default_definition,
)
from tuya_device_handlers.device_wrapper.cover import ( from tuya_device_handlers.device_wrapper.cover import (
ControlBackModePercentageMappingWrapper, ControlBackModePercentageMappingWrapper,
CoverClosedEnumWrapper, CoverClosedEnumWrapper,
CoverInstructionBooleanWrapper,
CoverInstructionEnumWrapper, CoverInstructionEnumWrapper,
CoverInstructionSpecialEnumWrapper, CoverInstructionSpecialEnumWrapper,
) )
@@ -153,21 +155,6 @@ COVERS: dict[DeviceCategory, tuple[TuyaCoverEntityDescription, ...]] = {
} }
def _get_instruction_wrapper(
device: CustomerDevice, description: TuyaCoverEntityDescription
) -> DeviceWrapper | None:
"""Get the instruction wrapper for the cover entity."""
if enum_wrapper := description.instruction_wrapper.find_dpcode(
device, description.key, prefer_function=True
):
return enum_wrapper
# Fallback to a boolean wrapper if available
return CoverInstructionBooleanWrapper.find_dpcode(
device, description.key, prefer_function=True
)
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: TuyaConfigEntry, entry: TuyaConfigEntry,
@@ -184,32 +171,19 @@ async def async_setup_entry(
device = manager.device_map[device_id] device = manager.device_map[device_id]
if descriptions := COVERS.get(device.category): if descriptions := COVERS.get(device.category):
entities.extend( entities.extend(
TuyaCoverEntity( TuyaCoverEntity(device, manager, description, definition)
device,
manager,
description,
current_position=description.position_wrapper.find_dpcode(
device, description.current_position
),
current_state_wrapper=description.current_state_wrapper.find_dpcode(
device, description.current_state
),
instruction_wrapper=_get_instruction_wrapper(
device, description
),
set_position=description.position_wrapper.find_dpcode(
device, description.set_position, prefer_function=True
),
tilt_position=description.position_wrapper.find_dpcode(
device,
(DPCode.ANGLE_HORIZONTAL, DPCode.ANGLE_VERTICAL),
prefer_function=True,
),
)
for description in descriptions for description in descriptions
if ( if (
description.key in device.function definition := get_default_definition(
or description.key in device.status_range device,
current_position_dpcode=description.current_position,
current_state_dpcode=description.current_state,
current_state_wrapper=description.current_state_wrapper,
instruction_dpcode=description.key,
instruction_wrapper=description.instruction_wrapper,
position_wrapper=description.position_wrapper,
set_position_dpcode=description.set_position,
)
) )
) )
@@ -232,34 +206,31 @@ class TuyaCoverEntity(TuyaEntity, CoverEntity):
device: CustomerDevice, device: CustomerDevice,
device_manager: Manager, device_manager: Manager,
description: TuyaCoverEntityDescription, description: TuyaCoverEntityDescription,
*, definition: TuyaCoverDefinition,
current_position: DeviceWrapper[int] | None,
current_state_wrapper: DeviceWrapper[bool] | None,
instruction_wrapper: DeviceWrapper[TuyaCoverAction] | None,
set_position: DeviceWrapper[int] | None,
tilt_position: DeviceWrapper[int] | None,
) -> None: ) -> None:
"""Init Tuya Cover.""" """Init Tuya Cover."""
super().__init__(device, device_manager, description) super().__init__(device, device_manager, description)
self._attr_supported_features = CoverEntityFeature(0) self._attr_supported_features = CoverEntityFeature(0)
self._current_position = current_position or set_position self._current_position = (
self._current_state_wrapper = current_state_wrapper definition.current_position_wrapper or definition.set_position_wrapper
self._instruction_wrapper = instruction_wrapper )
self._set_position = set_position self._current_state_wrapper = definition.current_state_wrapper
self._tilt_position = tilt_position self._instruction_wrapper = definition.instruction_wrapper
self._set_position = definition.set_position_wrapper
self._tilt_position = definition.tilt_position_wrapper
if instruction_wrapper: if definition.instruction_wrapper:
if TuyaCoverAction.OPEN in instruction_wrapper.options: if TuyaCoverAction.OPEN in definition.instruction_wrapper.options:
self._attr_supported_features |= CoverEntityFeature.OPEN self._attr_supported_features |= CoverEntityFeature.OPEN
if TuyaCoverAction.CLOSE in instruction_wrapper.options: if TuyaCoverAction.CLOSE in definition.instruction_wrapper.options:
self._attr_supported_features |= CoverEntityFeature.CLOSE self._attr_supported_features |= CoverEntityFeature.CLOSE
if TuyaCoverAction.STOP in instruction_wrapper.options: if TuyaCoverAction.STOP in definition.instruction_wrapper.options:
self._attr_supported_features |= CoverEntityFeature.STOP self._attr_supported_features |= CoverEntityFeature.STOP
if set_position: if definition.set_position_wrapper:
self._attr_supported_features |= CoverEntityFeature.SET_POSITION self._attr_supported_features |= CoverEntityFeature.SET_POSITION
if tilt_position: if definition.tilt_position_wrapper:
self._attr_supported_features |= CoverEntityFeature.SET_TILT_POSITION self._attr_supported_features |= CoverEntityFeature.SET_TILT_POSITION
@property @property