Move YAML config to component

This commit is contained in:
Pierre Ståhl
2020-09-24 22:06:00 +02:00
committed by rospogrigio
parent 450060488b
commit 0048ce6d5e
8 changed files with 42 additions and 132 deletions

View File

@@ -1,48 +1,22 @@
"""The LocalTuya integration integration.""" """The LocalTuya integration integration."""
import asyncio import asyncio
import logging import logging
import voluptuous as vol
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.const import ( from homeassistant.const import (
CONF_DEVICE_ID,
CONF_ID,
CONF_ICON,
CONF_NAME,
CONF_FRIENDLY_NAME,
CONF_HOST,
CONF_PLATFORM, CONF_PLATFORM,
CONF_ENTITIES, CONF_ENTITIES,
) )
import homeassistant.helpers.config_validation as cv
from .const import CONF_LOCAL_KEY, CONF_PROTOCOL_VERSION, DOMAIN from .const import DOMAIN
from .config_flow import config_schema
import pprint
pp = pprint.PrettyPrinter(indent=4)
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
DEFAULT_ID = "1"
DEFAULT_PROTOCOL_VERSION = 3.3
UNSUB_LISTENER = "unsub_listener" UNSUB_LISTENER = "unsub_listener"
BASE_PLATFORM_SCHEMA = { CONFIG_SCHEMA = config_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,
}
def import_from_yaml(hass, config, platform): 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): async def async_setup(hass: HomeAssistant, config: dict):
"""Set up the LocalTuya integration component.""" """Set up the LocalTuya integration component."""
hass.data.setdefault(DOMAIN, {}) hass.data.setdefault(DOMAIN, {})
print("setup:", config.get(DOMAIN))
return True return True

View File

@@ -23,7 +23,6 @@ import voluptuous as vol
from homeassistant.components.binary_sensor import ( from homeassistant.components.binary_sensor import (
DOMAIN, DOMAIN,
PLATFORM_SCHEMA,
DEVICE_CLASSES_SCHEMA, DEVICE_CLASSES_SCHEMA,
BinarySensorEntity, BinarySensorEntity,
) )
@@ -33,20 +32,13 @@ from homeassistant.const import (
CONF_FRIENDLY_NAME, CONF_FRIENDLY_NAME,
) )
from . import ( from .common import LocalTuyaEntity, prepare_setup_entities
BASE_PLATFORM_SCHEMA,
LocalTuyaEntity,
prepare_setup_entities,
import_from_yaml,
)
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
CONF_STATE_ON = "state_on" CONF_STATE_ON = "state_on"
CONF_STATE_OFF = "state_off" CONF_STATE_OFF = "state_off"
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BASE_PLATFORM_SCHEMA)
def flow_schema(dps): def flow_schema(dps):
"""Return schema used in config flow.""" """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) 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: class TuyaCache:
"""Cache wrapper for pytuya.TuyaDevice.""" """Cache wrapper for pytuya.TuyaDevice."""

View File

@@ -15,6 +15,7 @@ from homeassistant.const import (
CONF_PLATFORM, CONF_PLATFORM,
CONF_SWITCHES, CONF_SWITCHES,
) )
import homeassistant.helpers.config_validation as cv
from . import pytuya from . import pytuya
from .const import ( # pylint: disable=unused-import 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( PICK_ENTITY_SCHEMA = vol.Schema(
{vol.Required(PLATFORM_TO_ADD, default=PLATFORMS[0]): vol.In(PLATFORMS)} {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)] 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.""" """Generate input validation schema for a platform."""
schema = {} 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: if allow_id:
schema[vol.Required(CONF_ID)] = vol.In(dps_strings) schema[vol.Required(CONF_ID)] = vol.In(dps_strings)
schema[vol.Required(CONF_FRIENDLY_NAME)] = str schema[vol.Required(CONF_FRIENDLY_NAME)] = str
@@ -126,6 +140,26 @@ def strip_dps_values(user_input, dps_strings):
return stripped 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): async def validate_input(hass: core.HomeAssistant, data):
"""Validate the user input allows us to connect.""" """Validate the user input allows us to connect."""
tuyainterface = pytuya.TuyaInterface( tuyainterface = pytuya.TuyaInterface(

View File

@@ -26,7 +26,6 @@ import voluptuous as vol
from homeassistant.components.cover import ( from homeassistant.components.cover import (
CoverEntity, CoverEntity,
DOMAIN, DOMAIN,
PLATFORM_SCHEMA,
SUPPORT_CLOSE, SUPPORT_CLOSE,
SUPPORT_OPEN, SUPPORT_OPEN,
SUPPORT_STOP, SUPPORT_STOP,
@@ -36,9 +35,7 @@ from homeassistant.const import (
CONF_ID, CONF_ID,
CONF_FRIENDLY_NAME, CONF_FRIENDLY_NAME,
) )
import homeassistant.helpers.config_validation as cv
from . import BASE_PLATFORM_SCHEMA, import_from_yaml
from .const import ( from .const import (
CONF_OPEN_CMD, CONF_OPEN_CMD,
CONF_CLOSE_CMD, CONF_CLOSE_CMD,
@@ -53,15 +50,6 @@ DEFAULT_CLOSE_CMD = "off"
DEFAULT_STOP_CMD = "stop" 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): def flow_schema(dps):
"""Return schema used in config flow.""" """Return schema used in config flow."""
return { return {
@@ -90,11 +78,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
async_add_entities(covers, True) 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): class LocaltuyaCover(LocalTuyaEntity, CoverEntity):
"""Tuya cover device.""" """Tuya cover device."""

View File

@@ -19,7 +19,6 @@ import logging
from homeassistant.components.fan import ( from homeassistant.components.fan import (
FanEntity, FanEntity,
DOMAIN, DOMAIN,
PLATFORM_SCHEMA,
SPEED_OFF, SPEED_OFF,
SPEED_LOW, SPEED_LOW,
SPEED_MEDIUM, SPEED_MEDIUM,
@@ -29,16 +28,10 @@ from homeassistant.components.fan import (
) )
from homeassistant.const import CONF_ID, CONF_FRIENDLY_NAME 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 from .common import LocalTuyaEntity, TuyaDevice, prepare_setup_entities
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BASE_PLATFORM_SCHEMA)
def flow_schema(dps): def flow_schema(dps):
"""Return schema used in config flow.""" """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) 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): class LocaltuyaFan(LocalTuyaEntity, FanEntity):
"""Representation of a Tuya fan.""" """Representation of a Tuya fan."""

View File

@@ -20,7 +20,6 @@ from homeassistant.const import (
from homeassistant.components.light import ( from homeassistant.components.light import (
LightEntity, LightEntity,
DOMAIN, DOMAIN,
PLATFORM_SCHEMA,
ATTR_BRIGHTNESS, ATTR_BRIGHTNESS,
ATTR_COLOR_TEMP, ATTR_COLOR_TEMP,
ATTR_HS_COLOR, ATTR_HS_COLOR,
@@ -28,13 +27,8 @@ from homeassistant.components.light import (
SUPPORT_COLOR, SUPPORT_COLOR,
) )
from . import (
BASE_PLATFORM_SCHEMA,
import_from_yaml,
)
from .common import LocalTuyaEntity, TuyaDevice, prepare_setup_entities from .common import LocalTuyaEntity, TuyaDevice, prepare_setup_entities
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
MIN_MIRED = 153 MIN_MIRED = 153
@@ -47,8 +41,6 @@ DPS_INDEX_BRIGHTNESS = "3"
DPS_INDEX_COLOURTEMP = "4" DPS_INDEX_COLOURTEMP = "4"
DPS_INDEX_COLOUR = "5" DPS_INDEX_COLOUR = "5"
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BASE_PLATFORM_SCHEMA)
def flow_schema(dps): def flow_schema(dps):
"""Return schema used in config flow.""" """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) 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): class LocaltuyaLight(LocalTuyaEntity, LightEntity):
"""Representation of a Tuya light.""" """Representation of a Tuya light."""

View File

@@ -18,7 +18,7 @@ import logging
import voluptuous as vol 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 ( from homeassistant.const import (
CONF_ID, CONF_ID,
CONF_DEVICE_CLASS, CONF_DEVICE_CLASS,
@@ -27,10 +27,6 @@ from homeassistant.const import (
STATE_UNKNOWN, STATE_UNKNOWN,
) )
from . import (
BASE_PLATFORM_SCHEMA,
import_from_yaml,
)
from .const import CONF_SCALING from .const import CONF_SCALING
from .common import LocalTuyaEntity, TuyaDevice, prepare_setup_entities from .common import LocalTuyaEntity, TuyaDevice, prepare_setup_entities
@@ -38,8 +34,6 @@ _LOGGER = logging.getLogger(__name__)
DEFAULT_SCALING = 1.0 DEFAULT_SCALING = 1.0
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BASE_PLATFORM_SCHEMA)
def flow_schema(dps): def flow_schema(dps):
"""Return schema used in config flow.""" """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) 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): class LocaltuyaSensor(LocalTuyaEntity):
"""Representation of a Tuya sensor.""" """Representation of a Tuya sensor."""

View File

@@ -31,20 +31,12 @@ import voluptuous as vol
from homeassistant.components.switch import ( from homeassistant.components.switch import (
SwitchEntity, SwitchEntity,
DOMAIN, DOMAIN,
PLATFORM_SCHEMA,
) )
from homeassistant.const import ( from homeassistant.const import (
CONF_ID, CONF_ID,
CONF_SWITCHES,
CONF_FRIENDLY_NAME, CONF_FRIENDLY_NAME,
CONF_NAME,
) )
import homeassistant.helpers.config_validation as cv
from . import (
BASE_PLATFORM_SCHEMA,
import_from_yaml,
)
from .const import ( from .const import (
ATTR_CURRENT, ATTR_CURRENT,
ATTR_CURRENT_CONSUMPTION, ATTR_CURRENT_CONSUMPTION,
@@ -59,27 +51,6 @@ _LOGGER = logging.getLogger(__name__)
DEFAULT_ID = "1" 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): def flow_schema(dps):
"""Return schema used in config flow.""" """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) 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): class LocaltuyaSwitch(LocalTuyaEntity, SwitchEntity):
"""Representation of a Tuya switch.""" """Representation of a Tuya switch."""