Files
rikku-home-assistant/custom_components/localtuya/const.py
T
2025-04-21 21:03:30 -04:00

292 lines
8.6 KiB
Python

"""Constants for localtuya integration."""
from dataclasses import dataclass
from typing import Any
from homeassistant.const import (
CONF_DEVICE_ID,
CONF_ENTITIES,
CONF_FRIENDLY_NAME,
CONF_HOST,
CONF_ID,
CONF_SCAN_INTERVAL,
EntityCategory,
Platform,
)
DOMAIN = "localtuya"
DATA_DISCOVERY = "discovery"
# Order on priority
SUPPORTED_PROTOCOL_VERSIONS = ["3.3", "3.1", "3.2", "3.4", "3.5"]
# Platforms in this list must support config flows
PLATFORMS = {
"Alarm Control Panel": Platform.ALARM_CONTROL_PANEL,
"Binary Sensor": Platform.BINARY_SENSOR,
"Button": Platform.BUTTON,
"Climate": Platform.CLIMATE,
"Cover": Platform.COVER,
"Fan": Platform.FAN,
"Humidifier": Platform.HUMIDIFIER,
"Light": Platform.LIGHT,
"Lock": Platform.LOCK,
"Number": Platform.NUMBER,
"Remote": Platform.REMOTE,
"Select": Platform.SELECT,
"Sensor": Platform.SENSOR,
"Siren": Platform.SIREN,
"Switch": Platform.SWITCH,
"Vacuum": Platform.VACUUM,
"Water Heater": Platform.WATER_HEATER,
}
ATTR_CURRENT = "current"
ATTR_CURRENT_CONSUMPTION = "current_consumption"
ATTR_VOLTAGE = "voltage"
ATTR_UPDATED_AT = "updated_at"
# Tuya Devices
CONF_TUYA_IP = "ip"
CONF_TUYA_GWID = "gwId"
CONF_TUYA_VERSION = "version"
# Status Payloads.
RESTORE_STATES = {"0": "restore"}
# config flow
CONF_LOCAL_KEY = "local_key"
CONF_ENABLE_DEBUG = "enable_debug"
CONF_PROTOCOL_VERSION = "protocol_version"
CONF_NODE_ID = "node_id"
CONF_GATEWAY_ID = "gateway_id"
CONF_DPS_STRINGS = "dps_strings"
CONF_MODEL = "model"
CONF_PRODUCT_KEY = "product_key"
CONF_PRODUCT_NAME = "product_name"
CONF_USER_ID = "user_id"
CONF_ENABLE_ADD_ENTITIES = "add_entities"
CONF_ADD_DEVICE = "add_device"
CONF_EDIT_DEVICE = "edit_device"
CONF_CONFIGURE_CLOUD = "configure_cloud"
CONF_NO_CLOUD = "no_cloud"
CONF_MANUAL_DPS = "manual_dps_strings"
CONF_DEFAULT_VALUE = "dps_default_value"
CONF_RESET_DPIDS = "reset_dpids"
CONF_PASSIVE_ENTITY = "is_passive_entity"
CONF_DEVICE_SLEEP_TIME = "device_sleep_time"
# ALARM
CONF_ALARM_SUPPORTED_STATES = "alarm_supported_states"
# Binary_sensor, Siren
CONF_STATE_ON = "state_on"
CONF_RESET_TIMER = "reset_timer"
# light
CONF_BRIGHTNESS_LOWER = "brightness_lower"
CONF_BRIGHTNESS_UPPER = "brightness_upper"
CONF_COLOR = "color"
CONF_COLOR_MODE = "color_mode"
CONF_COLOR_MODE_SET = "color_mode_set"
CONF_COLOR_TEMP_MIN_KELVIN = "color_temp_min_kelvin"
CONF_COLOR_TEMP_MAX_KELVIN = "color_temp_max_kelvin"
CONF_COLOR_TEMP_REVERSE = "color_temp_reverse"
CONF_MUSIC_MODE = "music_mode"
CONF_SCENE_VALUES = "scene_values"
CONF_SCENE_VALUES_FRIENDLY = "scene_values_friendly"
# switch
CONF_CURRENT = "current"
CONF_CURRENT_CONSUMPTION = "current_consumption"
CONF_VOLTAGE = "voltage"
# cover
CONF_COMMANDS_SET = "commands_set"
CONF_POSITIONING_MODE = "positioning_mode"
CONF_CURRENT_POSITION_DP = "current_position_dp"
CONF_SET_POSITION_DP = "set_position_dp"
CONF_STOP_SWITCH_DP = "stop_switch_dp"
CONF_POSITION_INVERTED = "position_inverted"
CONF_SPAN_TIME = "span_time"
# fan
CONF_FAN_SPEED_CONTROL = "fan_speed_control"
CONF_FAN_OSCILLATING_CONTROL = "fan_oscillating_control"
CONF_FAN_SPEED_MIN = "fan_speed_min"
CONF_FAN_SPEED_MAX = "fan_speed_max"
CONF_FAN_ORDERED_LIST = "fan_speed_ordered_list"
CONF_FAN_DIRECTION = "fan_direction"
CONF_FAN_DIRECTION_FWD = "fan_direction_forward"
CONF_FAN_DIRECTION_REV = "fan_direction_reverse"
CONF_FAN_DPS_TYPE = "fan_dps_type"
# sensor
CONF_SCALING = "scaling"
CONF_STATE_CLASS = "state_class"
# climate
CONF_TARGET_TEMPERATURE_DP = "target_temperature_dp"
CONF_CURRENT_TEMPERATURE_DP = "current_temperature_dp"
CONF_TEMPERATURE_STEP = "temperature_step"
CONF_MIN_TEMP = "min_temperature"
CONF_MAX_TEMP = "max_temperature"
CONF_PRECISION = "precision"
CONF_TARGET_PRECISION = "target_precision"
CONF_HVAC_MODE_DP = "hvac_mode_dp"
CONF_HVAC_MODE_SET = "hvac_mode_set"
CONF_PRESET_DP = "preset_dp"
CONF_PRESET_SET = "preset_set"
CONF_HEURISTIC_ACTION = "heuristic_action"
CONF_HVAC_ACTION_DP = "hvac_action_dp"
CONF_HVAC_ACTION_SET = "hvac_action_set"
CONF_HVAC_ADD_OFF = "hvac_add_off"
CONF_ECO_DP = "eco_dp"
CONF_ECO_VALUE = "eco_value"
CONF_FAN_SPEED_LIST = "fan_speed_list"
CONF_SWING_MODE_DP = "swing_mode_dp"
CONF_SWING_MODES = "swing_modes"
CONF_SWING_HORIZONTAL_DP = "swing_horizontal_dp"
CONF_SWING_HORIZONTAL_MODES = "swing_horizontal_modes"
# vacuum
CONF_POWERGO_DP = "powergo_dp"
CONF_IDLE_STATUS_VALUE = "idle_status_value"
CONF_RETURNING_STATUS_VALUE = "returning_status_value"
CONF_DOCKED_STATUS_VALUE = "docked_status_value"
CONF_BATTERY_DP = "battery_dp"
CONF_MODE_DP = "mode_dp"
CONF_MODES = "modes"
CONF_FAN_SPEED_DP = "fan_speed_dp"
CONF_FAN_SPEEDS = "fan_speeds"
CONF_CLEAN_TIME_DP = "clean_time_dp"
CONF_CLEAN_AREA_DP = "clean_area_dp"
CONF_CLEAN_RECORD_DP = "clean_record_dp"
CONF_LOCATE_DP = "locate_dp"
CONF_FAULT_DP = "fault_dp"
CONF_PAUSED_STATE = "paused_state"
CONF_RETURN_MODE = "return_mode"
CONF_STOP_STATUS = "stop_status"
CONF_PAUSE_DP = "pause_dp"
# number
CONF_MIN_VALUE = "min_value"
CONF_MAX_VALUE = "max_value"
CONF_STEPSIZE = "step_size"
# select
CONF_OPTIONS = "select_options"
CONF_OPTIONS_FRIENDLY = "select_options_friendly"
# Remote
CONF_RECEIVE_DP = "receive_dp"
CONF_KEY_STUDY_DP = "key_study_dp"
# Lock
CONF_JAMMED_DP = "jammed_dp"
CONF_LOCK_STATE_DP = "lock_state_dp"
# Humidifier
CONF_HUMIDIFIER_SET_HUMIDITY_DP = "humidifier_set_humidity_dp"
CONF_HUMIDIFIER_CURRENT_HUMIDITY_DP = "humidifier_current_humidity_dp"
CONF_HUMIDIFIER_MODE_DP = "humidifier_mode_dp"
CONF_HUMIDIFIER_AVAILABLE_MODES = "humidifier_available_modes"
# Water Heater
CONF_TARGET_TEMPERATURE_LOW_DP = "target_temperature_low_dp"
CONF_TARGET_TEMPERATURE_HIGH_DP = "target_temperature_high_dp"
# States
ATTR_STATE = "raw_state"
CONF_RESTORE_ON_RECONNECT = "restore_on_reconnect"
# Categories
ENTITY_CATEGORY = {
"None": None,
"Configuration": EntityCategory.CONFIG,
"Diagnostic": EntityCategory.DIAGNOSTIC,
}
# Default Categories
DEFAULT_CATEGORIES = {
"CONTROL": ["switch", "climate", "fan", "vacuum", "light"],
"CONFIG": ["select", "number", "button"],
"DIAGNOSTIC": ["sensor", "binary_sensor"],
}
@dataclass
class DictSelector:
"""
A class that manages the mapping between Tuya values and Home Assistant (HA) values.
Attributes:
tuya_ha (dict): A dictionary mapping Tuya values (keys) to HA values (values).
reverse (bool): Swaps `tuya_ha` keys and values.
"""
tuya_ha: dict[str, Any]
reverse: bool = False
def __post_init__(self):
if self.reverse:
self.tuya_ha = {v: k for k, v in self.tuya_ha.items()}
@property
def as_dict(self):
"""Return options as dict."""
return self.tuya_ha
@property
def values(self) -> list:
"""Return options Tuya keys."""
return getattr(self, "_cached_keys__tuya_ha", list(self.tuya_ha.keys()))
@property
def names(self) -> list:
"""Return options HA values."""
return getattr(self, "_cached_values_tuya_ha", list(self.tuya_ha.values()))
def to_ha(self, value: str, default=None):
"""Return the friendly name."""
return self.tuya_ha.get(value, default)
def to_tuya(self, name: str):
"""Return the tuya value."""
reversed_dict = getattr(
self, "_cached_reverse_tuya_ha", {v: k for k, v in self.tuya_ha.items()}
)
return reversed_dict.get(name)
def __repr__(self) -> str:
return "valid" if self.tuya_ha else ""
@dataclass
class DeviceConfig:
"""Represent the main configuration for LocalTuya device."""
device_config: dict[str, Any]
def __post_init__(self) -> None:
self.id: str = self.device_config[CONF_DEVICE_ID]
self.host: str = self.device_config[CONF_HOST]
self.local_key: str = self.device_config[CONF_LOCAL_KEY]
self.entities: list = self.device_config[CONF_ENTITIES]
self.protocol_version: str = self.device_config[CONF_PROTOCOL_VERSION]
self.sleep_time: int = self.device_config.get(CONF_DEVICE_SLEEP_TIME, 0)
self.scan_interval: int = self.device_config.get(CONF_SCAN_INTERVAL, 0)
self.enable_debug: bool = self.device_config.get(CONF_ENABLE_DEBUG, False)
self.name: str = self.device_config.get(CONF_FRIENDLY_NAME)
self.node_id: str | None = self.device_config.get(CONF_NODE_ID)
self.model: str = self.device_config.get(CONF_MODEL, "Tuya generic")
self.reset_dps: str = self.device_config.get(CONF_RESET_DPIDS, "")
self.manual_dps: str = self.device_config.get(CONF_MANUAL_DPS, "")
self.dps_strings: list = self.device_config.get(CONF_DPS_STRINGS, [])
def as_dict(self):
return self.device_config