Add button platform to Tuya (#60304)
This commit is contained in:
parent
a399037a46
commit
37219e8d04
3 changed files with 113 additions and 1 deletions
|
@ -1136,6 +1136,7 @@ omit =
|
||||||
homeassistant/components/tuya/__init__.py
|
homeassistant/components/tuya/__init__.py
|
||||||
homeassistant/components/tuya/base.py
|
homeassistant/components/tuya/base.py
|
||||||
homeassistant/components/tuya/binary_sensor.py
|
homeassistant/components/tuya/binary_sensor.py
|
||||||
|
homeassistant/components/tuya/button.py
|
||||||
homeassistant/components/tuya/camera.py
|
homeassistant/components/tuya/camera.py
|
||||||
homeassistant/components/tuya/climate.py
|
homeassistant/components/tuya/climate.py
|
||||||
homeassistant/components/tuya/const.py
|
homeassistant/components/tuya/const.py
|
||||||
|
|
105
homeassistant/components/tuya/button.py
Normal file
105
homeassistant/components/tuya/button.py
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
"""Support for Tuya buttons."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from tuya_iot import TuyaDevice, TuyaDeviceManager
|
||||||
|
|
||||||
|
from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
|
||||||
|
from homeassistant.config_entries import ConfigEntry
|
||||||
|
from homeassistant.const import ENTITY_CATEGORY_CONFIG
|
||||||
|
from homeassistant.core import HomeAssistant, callback
|
||||||
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||||
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
|
|
||||||
|
from . import HomeAssistantTuyaData
|
||||||
|
from .base import TuyaEntity
|
||||||
|
from .const import DOMAIN, TUYA_DISCOVERY_NEW, DPCode
|
||||||
|
|
||||||
|
# All descriptions can be found here.
|
||||||
|
# https://developer.tuya.com/en/docs/iot/standarddescription?id=K9i5ql6waswzq
|
||||||
|
BUTTONS: dict[str, tuple[ButtonEntityDescription, ...]] = {
|
||||||
|
# Robot Vacuum
|
||||||
|
# https://developer.tuya.com/en/docs/iot/fsd?id=K9gf487ck1tlo
|
||||||
|
"sd": (
|
||||||
|
ButtonEntityDescription(
|
||||||
|
key=DPCode.RESET_DUSTER_CLOTH,
|
||||||
|
name="Reset Duster Cloth",
|
||||||
|
icon="mdi:restart",
|
||||||
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
||||||
|
),
|
||||||
|
ButtonEntityDescription(
|
||||||
|
key=DPCode.RESET_EDGE_BRUSH,
|
||||||
|
name="Reset Edge Brush",
|
||||||
|
icon="mdi:restart",
|
||||||
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
||||||
|
),
|
||||||
|
ButtonEntityDescription(
|
||||||
|
key=DPCode.RESET_FILTER,
|
||||||
|
name="Reset Filter",
|
||||||
|
icon="mdi:air-filter",
|
||||||
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
||||||
|
),
|
||||||
|
ButtonEntityDescription(
|
||||||
|
key=DPCode.RESET_MAP,
|
||||||
|
name="Reset Map",
|
||||||
|
icon="mdi:map-marker-remove",
|
||||||
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
||||||
|
),
|
||||||
|
ButtonEntityDescription(
|
||||||
|
key=DPCode.RESET_ROLL_BRUSH,
|
||||||
|
name="Reset Roll Brush",
|
||||||
|
icon="mdi:restart",
|
||||||
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def async_setup_entry(
|
||||||
|
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
||||||
|
) -> None:
|
||||||
|
"""Set up Tuya buttons dynamically through Tuya discovery."""
|
||||||
|
hass_data: HomeAssistantTuyaData = hass.data[DOMAIN][entry.entry_id]
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def async_discover_device(device_ids: list[str]) -> None:
|
||||||
|
"""Discover and add a discovered Tuya buttons."""
|
||||||
|
entities: list[TuyaButtonEntity] = []
|
||||||
|
for device_id in device_ids:
|
||||||
|
device = hass_data.device_manager.device_map[device_id]
|
||||||
|
if descriptions := BUTTONS.get(device.category):
|
||||||
|
for description in descriptions:
|
||||||
|
if description.key in device.function:
|
||||||
|
entities.append(
|
||||||
|
TuyaButtonEntity(
|
||||||
|
device, hass_data.device_manager, description
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
async_add_entities(entities)
|
||||||
|
|
||||||
|
async_discover_device([*hass_data.device_manager.device_map])
|
||||||
|
|
||||||
|
entry.async_on_unload(
|
||||||
|
async_dispatcher_connect(hass, TUYA_DISCOVERY_NEW, async_discover_device)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TuyaButtonEntity(TuyaEntity, ButtonEntity):
|
||||||
|
"""Tuya Button Device."""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
device: TuyaDevice,
|
||||||
|
device_manager: TuyaDeviceManager,
|
||||||
|
description: ButtonEntityDescription,
|
||||||
|
) -> None:
|
||||||
|
"""Init Tuya button."""
|
||||||
|
super().__init__(device, device_manager)
|
||||||
|
self.entity_description = description
|
||||||
|
self._attr_unique_id = f"{super().unique_id}{description.key}"
|
||||||
|
|
||||||
|
def press(self, **kwargs: Any) -> None:
|
||||||
|
"""Press the button."""
|
||||||
|
self._send_command([{"code": self.entity_description.key, "value": True}])
|
|
@ -100,6 +100,7 @@ SMARTLIFE_APP = "smartlife"
|
||||||
|
|
||||||
PLATFORMS = [
|
PLATFORMS = [
|
||||||
"binary_sensor",
|
"binary_sensor",
|
||||||
|
"button",
|
||||||
"camera",
|
"camera",
|
||||||
"climate",
|
"climate",
|
||||||
"cover",
|
"cover",
|
||||||
|
@ -173,8 +174,8 @@ class DPCode(str, Enum):
|
||||||
CO2_STATE = "co2_state"
|
CO2_STATE = "co2_state"
|
||||||
CO2_VALUE = "co2_value" # CO2 concentration
|
CO2_VALUE = "co2_value" # CO2 concentration
|
||||||
COLOR_DATA_V2 = "color_data_v2"
|
COLOR_DATA_V2 = "color_data_v2"
|
||||||
COLOUR_DATA_HSV = "colour_data_hsv" # Colored light mode
|
|
||||||
COLOUR_DATA = "colour_data" # Colored light mode
|
COLOUR_DATA = "colour_data" # Colored light mode
|
||||||
|
COLOUR_DATA_HSV = "colour_data_hsv" # Colored light mode
|
||||||
COLOUR_DATA_V2 = "colour_data_v2" # Colored light mode
|
COLOUR_DATA_V2 = "colour_data_v2" # Colored light mode
|
||||||
CONCENTRATION_SET = "concentration_set" # Concentration setting
|
CONCENTRATION_SET = "concentration_set" # Concentration setting
|
||||||
CONTROL = "control"
|
CONTROL = "control"
|
||||||
|
@ -243,6 +244,11 @@ class DPCode(str, Enum):
|
||||||
RECORD_MODE = "record_mode"
|
RECORD_MODE = "record_mode"
|
||||||
RECORD_SWITCH = "record_switch" # Recording switch
|
RECORD_SWITCH = "record_switch" # Recording switch
|
||||||
RELAY_STATUS = "relay_status"
|
RELAY_STATUS = "relay_status"
|
||||||
|
RESET_DUSTER_CLOTH = "reset_duster_cloth"
|
||||||
|
RESET_EDGE_BRUSH = "reset_edge_brush"
|
||||||
|
RESET_FILTER = "reset_filter"
|
||||||
|
RESET_MAP = "reset_map"
|
||||||
|
RESET_ROLL_BRUSH = "reset_roll_brush"
|
||||||
SEEK = "seek"
|
SEEK = "seek"
|
||||||
SENSITIVITY = "sensitivity" # Sensitivity
|
SENSITIVITY = "sensitivity" # Sensitivity
|
||||||
SENSOR_HUMIDITY = "sensor_humidity"
|
SENSOR_HUMIDITY = "sensor_humidity"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue