diff --git a/custom_components/localtuya/__init__.py b/custom_components/localtuya/__init__.py index 36dd9cc..adee5cb 100644 --- a/custom_components/localtuya/__init__.py +++ b/custom_components/localtuya/__init__.py @@ -1,48 +1,22 @@ """The LocalTuya integration integration.""" import asyncio import logging -import voluptuous as vol from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.const import ( - CONF_DEVICE_ID, - CONF_ID, - CONF_ICON, - CONF_NAME, - CONF_FRIENDLY_NAME, - CONF_HOST, CONF_PLATFORM, CONF_ENTITIES, ) -import homeassistant.helpers.config_validation as cv -from .const import CONF_LOCAL_KEY, CONF_PROTOCOL_VERSION, DOMAIN - - -import pprint - -pp = pprint.PrettyPrinter(indent=4) +from .const import DOMAIN +from .config_flow import config_schema _LOGGER = logging.getLogger(__name__) -DEFAULT_ID = "1" -DEFAULT_PROTOCOL_VERSION = 3.3 - UNSUB_LISTENER = "unsub_listener" -BASE_PLATFORM_SCHEMA = { - vol.Optional(CONF_ICON): cv.icon, # Deprecated: not used - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(CONF_LOCAL_KEY): cv.string, - vol.Optional(CONF_NAME): cv.string, # Deprecated: not used - vol.Required(CONF_FRIENDLY_NAME): cv.string, - vol.Required(CONF_PROTOCOL_VERSION, default=DEFAULT_PROTOCOL_VERSION): vol.Coerce( - float - ), - vol.Optional(CONF_ID, default=DEFAULT_ID): cv.string, -} +CONFIG_SCHEMA = config_schema() def import_from_yaml(hass, config, platform): @@ -60,6 +34,8 @@ def import_from_yaml(hass, config, platform): async def async_setup(hass: HomeAssistant, config: dict): """Set up the LocalTuya integration component.""" hass.data.setdefault(DOMAIN, {}) + + print("setup:", config.get(DOMAIN)) return True diff --git a/custom_components/localtuya/binary_sensor.py b/custom_components/localtuya/binary_sensor.py index 2891441..4687058 100644 --- a/custom_components/localtuya/binary_sensor.py +++ b/custom_components/localtuya/binary_sensor.py @@ -23,7 +23,6 @@ import voluptuous as vol from homeassistant.components.binary_sensor import ( DOMAIN, - PLATFORM_SCHEMA, DEVICE_CLASSES_SCHEMA, BinarySensorEntity, ) @@ -33,20 +32,13 @@ from homeassistant.const import ( CONF_FRIENDLY_NAME, ) -from . import ( - BASE_PLATFORM_SCHEMA, - LocalTuyaEntity, - prepare_setup_entities, - import_from_yaml, -) +from .common import LocalTuyaEntity, prepare_setup_entities _LOGGER = logging.getLogger(__name__) CONF_STATE_ON = "state_on" CONF_STATE_OFF = "state_off" -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BASE_PLATFORM_SCHEMA) - def flow_schema(dps): """Return schema used in config flow.""" @@ -76,11 +68,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities): async_add_entities(sensors, True) -def setup_platform(hass, config, add_devices, discovery_info=None): - """Set up of the Tuya sensor.""" - return import_from_yaml(hass, config, DOMAIN) - - class TuyaCache: """Cache wrapper for pytuya.TuyaDevice.""" diff --git a/custom_components/localtuya/config_flow.py b/custom_components/localtuya/config_flow.py index 070f1c7..ef98ede 100644 --- a/custom_components/localtuya/config_flow.py +++ b/custom_components/localtuya/config_flow.py @@ -15,6 +15,7 @@ from homeassistant.const import ( CONF_PLATFORM, CONF_SWITCHES, ) +import homeassistant.helpers.config_validation as cv from . import pytuya from .const import ( # pylint: disable=unused-import @@ -56,6 +57,16 @@ OPTIONS_SCHEMA = vol.Schema( } ) +DEVICE_SCHEMA = vol.Schema( + { + vol.Required(CONF_HOST): cv.string, + vol.Required(CONF_DEVICE_ID): cv.string, + vol.Required(CONF_LOCAL_KEY): cv.string, + vol.Required(CONF_FRIENDLY_NAME): cv.string, + vol.Required(CONF_PROTOCOL_VERSION, default="3.3"): vol.Coerce(float), + } +) + PICK_ENTITY_SCHEMA = vol.Schema( {vol.Required(PLATFORM_TO_ADD, default=PLATFORMS[0]): vol.In(PLATFORMS)} ) @@ -100,9 +111,12 @@ def gen_dps_strings(): return [f"{dp} (value: ?)" for dp in range(1, 256)] -def platform_schema(platform, dps_strings, allow_id=True): +def platform_schema(platform, dps_strings, allow_id=True, yaml=False): """Generate input validation schema for a platform.""" schema = {} + if yaml: + # In YAML mode we force the specified platform to match flow schema + schema[vol.Required(CONF_PLATFORM)] = vol.In([platform]) if allow_id: schema[vol.Required(CONF_ID)] = vol.In(dps_strings) schema[vol.Required(CONF_FRIENDLY_NAME)] = str @@ -126,6 +140,26 @@ def strip_dps_values(user_input, dps_strings): return stripped +def config_schema(): + """Build schema used for setting up component.""" + entity_schemas = [ + platform_schema(platform, range(1, 256), yaml=True) for platform in PLATFORMS + ] + return vol.Schema( + { + DOMAIN: vol.All( + cv.ensure_list, + [ + DEVICE_SCHEMA.extend( + {vol.Required(CONF_ENTITIES): [vol.Any(*entity_schemas)]} + ) + ], + ) + }, + extra=vol.ALLOW_EXTRA, + ) + + async def validate_input(hass: core.HomeAssistant, data): """Validate the user input allows us to connect.""" tuyainterface = pytuya.TuyaInterface( diff --git a/custom_components/localtuya/cover.py b/custom_components/localtuya/cover.py index 4103412..ad8a1ce 100644 --- a/custom_components/localtuya/cover.py +++ b/custom_components/localtuya/cover.py @@ -26,7 +26,6 @@ import voluptuous as vol from homeassistant.components.cover import ( CoverEntity, DOMAIN, - PLATFORM_SCHEMA, SUPPORT_CLOSE, SUPPORT_OPEN, SUPPORT_STOP, @@ -36,9 +35,7 @@ from homeassistant.const import ( CONF_ID, CONF_FRIENDLY_NAME, ) -import homeassistant.helpers.config_validation as cv -from . import BASE_PLATFORM_SCHEMA, import_from_yaml from .const import ( CONF_OPEN_CMD, CONF_CLOSE_CMD, @@ -53,15 +50,6 @@ DEFAULT_CLOSE_CMD = "off" DEFAULT_STOP_CMD = "stop" -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BASE_PLATFORM_SCHEMA).extend( - { - vol.Optional(CONF_OPEN_CMD, default=DEFAULT_OPEN_CMD): cv.string, - vol.Optional(CONF_CLOSE_CMD, default=DEFAULT_CLOSE_CMD): cv.string, - vol.Optional(CONF_STOP_CMD, default=DEFAULT_STOP_CMD): cv.string, - } -) - - def flow_schema(dps): """Return schema used in config flow.""" return { @@ -90,11 +78,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities): async_add_entities(covers, True) -def setup_platform(hass, config, add_devices, discovery_info=None): - """Set up of the Tuya cover.""" - return import_from_yaml(hass, config, DOMAIN) - - class LocaltuyaCover(LocalTuyaEntity, CoverEntity): """Tuya cover device.""" diff --git a/custom_components/localtuya/fan.py b/custom_components/localtuya/fan.py index 50dcf49..771032e 100644 --- a/custom_components/localtuya/fan.py +++ b/custom_components/localtuya/fan.py @@ -19,7 +19,6 @@ import logging from homeassistant.components.fan import ( FanEntity, DOMAIN, - PLATFORM_SCHEMA, SPEED_OFF, SPEED_LOW, SPEED_MEDIUM, @@ -29,16 +28,10 @@ from homeassistant.components.fan import ( ) from homeassistant.const import CONF_ID, CONF_FRIENDLY_NAME -from . import ( - BASE_PLATFORM_SCHEMA, - import_from_yaml, -) from .common import LocalTuyaEntity, TuyaDevice, prepare_setup_entities _LOGGER = logging.getLogger(__name__) -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BASE_PLATFORM_SCHEMA) - def flow_schema(dps): """Return schema used in config flow.""" @@ -65,11 +58,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities): async_add_entities(fans, True) -def setup_platform(hass, config, add_devices, discovery_info=None): - """Set up of the Tuya fan.""" - return import_from_yaml(hass, config, DOMAIN) - - class LocaltuyaFan(LocalTuyaEntity, FanEntity): """Representation of a Tuya fan.""" diff --git a/custom_components/localtuya/light.py b/custom_components/localtuya/light.py index a423ffe..b05639a 100644 --- a/custom_components/localtuya/light.py +++ b/custom_components/localtuya/light.py @@ -20,7 +20,6 @@ from homeassistant.const import ( from homeassistant.components.light import ( LightEntity, DOMAIN, - PLATFORM_SCHEMA, ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, ATTR_HS_COLOR, @@ -28,13 +27,8 @@ from homeassistant.components.light import ( SUPPORT_COLOR, ) -from . import ( - BASE_PLATFORM_SCHEMA, - import_from_yaml, -) from .common import LocalTuyaEntity, TuyaDevice, prepare_setup_entities - _LOGGER = logging.getLogger(__name__) MIN_MIRED = 153 @@ -47,8 +41,6 @@ DPS_INDEX_BRIGHTNESS = "3" DPS_INDEX_COLOURTEMP = "4" DPS_INDEX_COLOUR = "5" -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BASE_PLATFORM_SCHEMA) - def flow_schema(dps): """Return schema used in config flow.""" @@ -77,11 +69,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities): async_add_entities(lights, True) -def setup_platform(hass, config, add_devices, discovery_info=None): - """Set up of the Tuya light.""" - return import_from_yaml(hass, config, DOMAIN) - - class LocaltuyaLight(LocalTuyaEntity, LightEntity): """Representation of a Tuya light.""" diff --git a/custom_components/localtuya/sensor.py b/custom_components/localtuya/sensor.py index 294c5fa..77a36b4 100644 --- a/custom_components/localtuya/sensor.py +++ b/custom_components/localtuya/sensor.py @@ -18,7 +18,7 @@ import logging import voluptuous as vol -from homeassistant.components.sensor import DOMAIN, PLATFORM_SCHEMA, DEVICE_CLASSES +from homeassistant.components.sensor import DOMAIN, DEVICE_CLASSES from homeassistant.const import ( CONF_ID, CONF_DEVICE_CLASS, @@ -27,10 +27,6 @@ from homeassistant.const import ( STATE_UNKNOWN, ) -from . import ( - BASE_PLATFORM_SCHEMA, - import_from_yaml, -) from .const import CONF_SCALING from .common import LocalTuyaEntity, TuyaDevice, prepare_setup_entities @@ -38,8 +34,6 @@ _LOGGER = logging.getLogger(__name__) DEFAULT_SCALING = 1.0 -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BASE_PLATFORM_SCHEMA) - def flow_schema(dps): """Return schema used in config flow.""" @@ -71,11 +65,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities): async_add_entities(sensors, True) -def setup_platform(hass, config, add_devices, discovery_info=None): - """Set up of the Tuya sensor.""" - return import_from_yaml(hass, config, DOMAIN) - - class LocaltuyaSensor(LocalTuyaEntity): """Representation of a Tuya sensor.""" diff --git a/custom_components/localtuya/switch.py b/custom_components/localtuya/switch.py index 83d061d..ef2ec7f 100644 --- a/custom_components/localtuya/switch.py +++ b/custom_components/localtuya/switch.py @@ -31,20 +31,12 @@ import voluptuous as vol from homeassistant.components.switch import ( SwitchEntity, DOMAIN, - PLATFORM_SCHEMA, ) from homeassistant.const import ( CONF_ID, - CONF_SWITCHES, CONF_FRIENDLY_NAME, - CONF_NAME, ) -import homeassistant.helpers.config_validation as cv -from . import ( - BASE_PLATFORM_SCHEMA, - import_from_yaml, -) from .const import ( ATTR_CURRENT, ATTR_CURRENT_CONSUMPTION, @@ -59,27 +51,6 @@ _LOGGER = logging.getLogger(__name__) DEFAULT_ID = "1" -# TODO: This will eventully merge with flow_schema -SWITCH_SCHEMA = vol.Schema( - { - vol.Optional(CONF_ID, default=DEFAULT_ID): cv.string, - vol.Optional(CONF_NAME): cv.string, # Deprecated: not used - vol.Required(CONF_FRIENDLY_NAME): cv.string, - vol.Optional(CONF_CURRENT, default="-1"): cv.string, - vol.Optional(CONF_CURRENT_CONSUMPTION, default="-1"): cv.string, - vol.Optional(CONF_VOLTAGE, default="-1"): cv.string, - } -) - -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BASE_PLATFORM_SCHEMA).extend( - { - vol.Optional(CONF_CURRENT, default="-1"): cv.string, - vol.Optional(CONF_CURRENT_CONSUMPTION, default="-1"): cv.string, - vol.Optional(CONF_VOLTAGE, default="-1"): cv.string, - vol.Optional(CONF_SWITCHES, default={}): vol.Schema({cv.slug: SWITCH_SCHEMA}), - } -) - def flow_schema(dps): """Return schema used in config flow.""" @@ -118,11 +89,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities): async_add_entities(switches, True) -def setup_platform(hass, config, add_devices, discovery_info=None): - """Set up of the Tuya switch.""" - return import_from_yaml(hass, config, DOMAIN) - - class LocaltuyaSwitch(LocalTuyaEntity, SwitchEntity): """Representation of a Tuya switch."""