Compare commits

...

2 Commits

Author SHA1 Message Date
epenet
03dc3eca07 Use hass.config.config_dir 2026-03-31 10:09:35 +00:00
epenet
849218d952 Add ability to load custom Tuya quirks 2026-03-31 09:48:49 +00:00
4 changed files with 59 additions and 0 deletions

View File

@@ -3,8 +3,10 @@
from __future__ import annotations
import logging
from pathlib import Path
from typing import Any, NamedTuple
from tuya_device_handlers.devices import register_tuya_quirks
from tuya_sharing import (
CustomerDevice,
Manager,
@@ -107,6 +109,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: TuyaConfigEntry) -> bool
model_id=device.product_id,
)
await hass.async_add_executor_job(
register_tuya_quirks, str(Path(hass.config.config_dir, "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,
@@ -24,6 +25,20 @@ CAMERAS: tuple[DeviceCategory, ...] = (
)
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,
@@ -38,6 +53,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 device.category in CAMERAS:
entities.append(
TuyaCameraEntity(device, manager, 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.fan import (
TuyaFanDefinition,
get_default_definition,
@@ -43,6 +44,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,
@@ -57,6 +72,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 device.category in TUYA_SUPPORT_TYPE 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,
@@ -37,6 +38,20 @@ _TUYA_TO_HA_ACTIVITY_MAPPINGS = {
}
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,
@@ -51,6 +66,9 @@ 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 device.category == DeviceCategory.SD:
entities.append(
TuyaVacuumEntity(device, manager, get_default_definition(device))