From 6b397a9ea56bed23b12528bc02773651467fcdf3 Mon Sep 17 00:00:00 2001 From: Kevin Lewis Date: Wed, 3 Apr 2019 00:52:45 -0400 Subject: [PATCH] Add SM16716 support. --- esphome/components/output/sm16716.py | 36 +++++++++++++++++++++++ esphome/components/sm16716.py | 43 ++++++++++++++++++++++++++++ esphome/const.py | 1 + tests/test1.yaml | 15 ++++++++++ 4 files changed, 95 insertions(+) create mode 100644 esphome/components/output/sm16716.py create mode 100644 esphome/components/sm16716.py diff --git a/esphome/components/output/sm16716.py b/esphome/components/output/sm16716.py new file mode 100644 index 0000000000..c6c1cf4884 --- /dev/null +++ b/esphome/components/output/sm16716.py @@ -0,0 +1,36 @@ +import voluptuous as vol + +from esphome.components import output +from esphome.components.sm16716 import SM16716OutputComponent +import esphome.config_validation as cv +from esphome.const import CONF_CHANNEL, CONF_ID, CONF_SM16716_ID, CONF_POWER_SUPPLY +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import setup_component + +DEPENDENCIES = ['sm16716'] + +Channel = SM16716OutputComponent.class_('Channel', output.FloatOutput) + +PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({ + vol.Required(CONF_ID): cv.declare_variable_id(Channel), + vol.Required(CONF_CHANNEL): vol.All(vol.Coerce(int), + vol.Range(min=0, max=65535)), + cv.GenerateID(CONF_SM16716_ID): cv.use_variable_id(SM16716OutputComponent), +}).extend(cv.COMPONENT_SCHEMA.schema) + + +def to_code(config): + power_supply = None + if CONF_POWER_SUPPLY in config: + for power_supply in get_variable(config[CONF_POWER_SUPPLY]): + yield + sm16716 = None + for sm16716 in get_variable(config[CONF_SM16716_ID]): + yield + rhs = sm16716.create_channel(config[CONF_CHANNEL], power_supply) + out = Pvariable(config[CONF_ID], rhs) + output.setup_output_platform(out, config, skip_power_supply=True) + setup_component(out, config) + + +BUILD_FLAGS = '-DUSE_SM16716_OUTPUT' diff --git a/esphome/components/sm16716.py b/esphome/components/sm16716.py new file mode 100644 index 0000000000..3ab1802820 --- /dev/null +++ b/esphome/components/sm16716.py @@ -0,0 +1,43 @@ +import voluptuous as vol + +from esphome import pins +from esphome.components import output +import esphome.config_validation as cv +from esphome.const import (CONF_CLOCK_PIN, CONF_DATA_PIN, CONF_ID, + CONF_NUM_CHANNELS, CONF_NUM_CHIPS, CONF_UPDATE_ON_BOOT) +from esphome.cpp_generator import Pvariable, add +from esphome.cpp_helpers import gpio_output_pin_expression, setup_component +from esphome.cpp_types import App, Component + +SM16716OutputComponent = output.output_ns.class_('SM16716OutputComponent', Component) +MULTI_CONF = True + +CONFIG_SCHEMA = cv.Schema({ + cv.GenerateID(): cv.declare_variable_id(SM16716OutputComponent), + vol.Required(CONF_DATA_PIN): pins.gpio_output_pin_schema, + vol.Required(CONF_CLOCK_PIN): pins.gpio_output_pin_schema, + vol.Optional(CONF_NUM_CHANNELS): vol.All(vol.Coerce(int), + vol.Range(3, 255)), + vol.Optional(CONF_NUM_CHIPS): vol.All(vol.Coerce(int), + vol.Range(1, 85)), + vol.Optional(CONF_UPDATE_ON_BOOT): vol.Coerce(bool), +}).extend(cv.COMPONENT_SCHEMA.schema) + + +def to_code(config): + for mosi in gpio_output_pin_expression(config[CONF_DATA_PIN]): + yield + for sclk in gpio_output_pin_expression(config[CONF_CLOCK_PIN]): + yield + rhs = App.make_sm16716_component(mosi, sclk) + sm16716 = Pvariable(config[CONF_ID], rhs) + if CONF_NUM_CHANNELS in config: + add(sm16716.set_num_channels(config[CONF_NUM_CHANNELS])) + if CONF_NUM_CHIPS in config: + add(sm16716.set_num_chips(config[CONF_NUM_CHIPS])) + if CONF_UPDATE_ON_BOOT in config: + add(sm16716.set_update(config[CONF_UPDATE_ON_BOOT])) + setup_component(sm16716, config) + + +BUILD_FLAGS = '-DUSE_SM16716_OUTPUT' diff --git a/esphome/const.py b/esphome/const.py index 901940f2dc..fb651200ff 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -384,6 +384,7 @@ CONF_RESTORE_STATE = 'restore_state' CONF_TIMING = 'timing' CONF_INVALID_COOLDOWN = 'invalid_cooldown' CONF_MY9231_ID = 'my9231_id' +CONF_SM16716_ID = 'sm16716_id' CONF_NUM_CHANNELS = 'num_channels' CONF_UPDATE_ON_BOOT = 'update_on_boot' CONF_INITIAL_VALUE = 'initial_value' diff --git a/tests/test1.yaml b/tests/test1.yaml index ff75ac29eb..cc93ad6943 100644 --- a/tests/test1.yaml +++ b/tests/test1.yaml @@ -640,6 +640,12 @@ my9231: num_chips: 2 bit_depth: 16 +sm16716: + data_pin: GPIO14 + clock_pin: GPIO4 + num_channels: 3 + num_chips: 1 + output: - platform: gpio pin: GPIO26 @@ -709,6 +715,15 @@ output: - platform: my9231 id: my_5 channel: 5 + - platform: sm16716 + id: sm_0 + channel: 0 + - platform: sm16716 + id: sm_1 + channel: 1 + - platform: sm16716 + id: sm_2 + channel: 2 - platform: copy id: my_copy1 outputs: