1
0
mirror of https://github.com/home-assistant/core.git synced 2026-04-02 00:20:30 +01:00

Add ability to load custom Tuya quirks

This commit is contained in:
epenet
2026-03-31 09:48:49 +00:00
parent ef66446a0d
commit 3f74cca253
4 changed files with 56 additions and 2 deletions

View File

@@ -5,6 +5,7 @@ from __future__ import annotations
import logging
from typing import Any, NamedTuple
from tuya_device_handlers.devices import register_tuya_quirks
from tuya_sharing import (
CustomerDevice,
Manager,
@@ -107,6 +108,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: TuyaConfigEntry) -> bool
model_id=device.product_id,
)
await hass.async_add_executor_job(register_tuya_quirks, "/config/tuya_quirks/")
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
# If the device does not register any entities, the device does not need to subscribe
# So the subscription is here

View File

@@ -2,6 +2,7 @@
from __future__ import annotations
from tuya_device_handlers import TUYA_QUIRKS_REGISTRY
from tuya_device_handlers.definition.camera import (
TuyaCameraDefinition,
get_default_definition,
@@ -28,6 +29,20 @@ CAMERAS: dict[DeviceCategory, CameraEntityDescription] = {
}
def _get_quirk_entities(
manager: Manager, device: CustomerDevice
) -> list[TuyaCameraEntity] | None:
if (quirk := TUYA_QUIRKS_REGISTRY.get_quirk_for_device(device)) is None or (
entity_quirks := quirk.camera_quirks
) is None:
return None
return [
TuyaCameraEntity(device, manager, definition)
for entity_quirk in entity_quirks
if (definition := entity_quirk.definition_fn(device))
]
async def async_setup_entry(
hass: HomeAssistant,
entry: TuyaConfigEntry,
@@ -42,6 +57,9 @@ async def async_setup_entry(
entities: list[TuyaCameraEntity] = []
for device_id in device_ids:
device = manager.device_map[device_id]
if (quirk_entities := _get_quirk_entities(manager, device)) is not None:
entities.extend(quirk_entities)
continue
if description := CAMERAS.get(device.category):
entities.append(
TuyaCameraEntity(

View File

@@ -4,6 +4,7 @@ from __future__ import annotations
from typing import Any
from tuya_device_handlers import TUYA_QUIRKS_REGISTRY
from tuya_device_handlers.definition.fan import (
TuyaFanDefinition,
get_default_definition,
@@ -44,6 +45,20 @@ _HA_TO_TUYA_DIRECTION_MAPPINGS = {
}
def _get_quirk_entities(
manager: Manager, device: CustomerDevice
) -> list[TuyaFanEntity] | None:
if (quirk := TUYA_QUIRKS_REGISTRY.get_quirk_for_device(device)) is None or (
entity_quirks := quirk.fan_quirks
) is None:
return None
return [
TuyaFanEntity(device, manager, definition)
for entity_quirk in entity_quirks
if (definition := entity_quirk.definition_fn(device))
]
async def async_setup_entry(
hass: HomeAssistant,
entry: TuyaConfigEntry,
@@ -58,6 +73,9 @@ async def async_setup_entry(
entities: list[TuyaFanEntity] = []
for device_id in device_ids:
device = manager.device_map[device_id]
if (quirk_entities := _get_quirk_entities(manager, device)) is not None:
entities.extend(quirk_entities)
continue
if (description := FANS.get(device.category)) and (
definition := get_default_definition(device)
):

View File

@@ -4,6 +4,7 @@ from __future__ import annotations
from typing import Any
from tuya_device_handlers import TUYA_QUIRKS_REGISTRY
from tuya_device_handlers.definition.vacuum import (
TuyaVacuumDefinition,
get_default_definition,
@@ -42,6 +43,20 @@ VACUUMS: dict[DeviceCategory, StateVacuumEntityDescription] = {
}
def _get_quirk_entities(
manager: Manager, device: CustomerDevice
) -> list[TuyaVacuumEntity] | None:
if (quirk := TUYA_QUIRKS_REGISTRY.get_quirk_for_device(device)) is None or (
entity_quirks := quirk.vacuum_quirks
) is None:
return None
return [
TuyaVacuumEntity(device, manager, definition)
for entity_quirk in entity_quirks
if (definition := entity_quirk.definition_fn(device))
]
async def async_setup_entry(
hass: HomeAssistant,
entry: TuyaConfigEntry,
@@ -56,9 +71,10 @@ async def async_setup_entry(
entities: list[TuyaVacuumEntity] = []
for device_id in device_ids:
device = manager.device_map[device_id]
if (quirk_entities := _get_quirk_entities(manager, device)) is not None:
entities.extend(quirk_entities)
continue
if description := VACUUMS.get(device.category):
entities.append(
TuyaVacuumEntity(
device, manager, description, get_default_definition(device)
)
)