From 0fc6a027a7e22167d1b4875da8ccdc2e3ff1efe6 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Tue, 5 Mar 2019 13:54:33 +0100 Subject: [PATCH] Add copy output platform (#472) --- esphome/components/output/copy.py | 58 +++++++++++++++++++++++++++++++ tests/test1.yaml | 12 +++++++ 2 files changed, 70 insertions(+) create mode 100644 esphome/components/output/copy.py diff --git a/esphome/components/output/copy.py b/esphome/components/output/copy.py new file mode 100644 index 0000000000..16abf638ac --- /dev/null +++ b/esphome/components/output/copy.py @@ -0,0 +1,58 @@ +import voluptuous as vol + +from esphome.components import output +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_OUTPUTS, CONF_TYPE +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import setup_component + +BinaryCopyOutput = output.output_ns.class_('BinaryCopyOutput', output.BinaryOutput) +FloatCopyOutput = output.output_ns.class_('FloatCopyOutput', output.FloatOutput) + +BINARY_SCHEMA = output.PLATFORM_SCHEMA.extend({ + vol.Required(CONF_ID): cv.declare_variable_id(BinaryCopyOutput), + vol.Required(CONF_TYPE): 'binary', + vol.Required(CONF_OUTPUTS): cv.ensure_list(cv.use_variable_id(output.BinaryOutput)), +}) + +FLOAT_SCHEMA = output.PLATFORM_SCHEMA.extend({ + vol.Required(CONF_ID): cv.declare_variable_id(FloatCopyOutput), + vol.Required(CONF_TYPE): 'float', + vol.Required(CONF_OUTPUTS): cv.ensure_list(cv.use_variable_id(output.FloatOutput)), +}) + + +def validate_copy_output(value): + if not isinstance(value, dict): + raise vol.Invalid("Value must be dict") + type = cv.string_strict(value.get(CONF_TYPE, 'float')).lower() + value[CONF_TYPE] = type + if type == 'binary': + return BINARY_SCHEMA(value) + if type == 'float': + return FLOAT_SCHEMA(value) + raise vol.Invalid("type must either be binary or float, not {}!".format(type)) + + +PLATFORM_SCHEMA = validate_copy_output + + +def to_code(config): + outputs = [] + for out in config[CONF_OUTPUTS]: + for var in get_variable(out): + yield + outputs.append(var) + + klass = { + 'binary': BinaryCopyOutput, + 'float': FloatCopyOutput, + }[config[CONF_TYPE]] + rhs = klass.new(outputs) + gpio = Pvariable(config[CONF_ID], rhs) + + output.setup_output_platform(gpio, config) + setup_component(gpio, config) + + +BUILD_FLAGS = '-DUSE_COPY_OUTPUT' diff --git a/tests/test1.yaml b/tests/test1.yaml index ad05722be2..8b66d15e1a 100644 --- a/tests/test1.yaml +++ b/tests/test1.yaml @@ -701,6 +701,18 @@ output: - platform: my9231 id: my_5 channel: 5 + - platform: copy + id: my_copy1 + outputs: + - my_1 + - my_2 + - my_3 + - platform: copy + id: my_copy2 + type: binary + outputs: + - id22 + - id2 light: - platform: binary