Initial commit.

This commit is contained in:
2025-04-21 21:03:30 -04:00
commit d4f58c985f
2077 changed files with 75132 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
"""Platform to present any Tuya DP as an enumeration."""
import logging
from functools import partial
import voluptuous as vol
from homeassistant.components.select import DOMAIN, SelectEntity
from homeassistant.const import CONF_DEVICE_CLASS, STATE_UNKNOWN
from homeassistant.helpers import selector
from .entity import LocalTuyaEntity, async_setup_entry
from .const import (
CONF_DEFAULT_VALUE,
CONF_OPTIONS,
CONF_PASSIVE_ENTITY,
CONF_RESTORE_ON_RECONNECT,
DictSelector,
)
def flow_schema(dps):
"""Return schema used in config flow."""
return {
vol.Required(CONF_OPTIONS, default={}): selector.ObjectSelector(),
vol.Required(CONF_RESTORE_ON_RECONNECT): bool,
vol.Required(CONF_PASSIVE_ENTITY): bool,
vol.Optional(CONF_DEFAULT_VALUE): str,
}
_LOGGER = logging.getLogger(__name__)
class LocalTuyaSelect(LocalTuyaEntity, SelectEntity):
"""Representation of a Tuya Enumeration."""
def __init__(
self,
device,
config_entry,
sensorid,
**kwargs,
):
"""Initialize the Tuya sensor."""
super().__init__(device, config_entry, sensorid, _LOGGER, **kwargs)
self._state = STATE_UNKNOWN
self._state_friendly = ""
# Set Display options
options = {}
config_options: dict = self._config.get(CONF_OPTIONS, {})
if not isinstance(config_options, dict):
self.warning(
f"{self.name} DPiD: {self._dp_id}: Options configured incorrectly!"
+ "It must be in the format of key-value pairs,"
+ "where each line follows the structure [device_value: friendly name]"
)
config_options = {}
for k, v in config_options.items():
options[k] = v if v else k.replace("_", "").capitalize()
self._options = DictSelector(options)
@property
def current_option(self) -> str:
"""Return the current value."""
return self._state_friendly
@property
def options(self) -> list:
"""Return the list of values."""
return self._options.names
@property
def device_class(self):
"""Return the class of this device."""
return self._config.get(CONF_DEVICE_CLASS)
async def async_select_option(self, option: str) -> None:
"""Update the current value."""
option_value = self._options.to_tuya(option)
self.debug("Sending Option: " + option + " -> " + option_value)
await self._device.set_dp(option_value, self._dp_id)
def status_updated(self):
"""Device status was updated."""
super().status_updated()
if (state := self.dp_value(self._dp_id)) is not None:
self._state_friendly = self._options.to_ha(state, state)
# Default value is the first option
def entity_default_value(self):
"""Return the first option as the default value for this entity type."""
return self._options.names[0]
async_setup_entry = partial(async_setup_entry, DOMAIN, LocalTuyaSelect, flow_schema)