import esphome.codegen as cg import esphome.config_validation as cv from esphome import pins from esphome.components import output from esphome.components.ledc.output import LEDCOutput, validate_frequency from esphome.core import coroutine from esphome.core import CORE from esphome.config import get_platform from esphome.const import ( CONF_ID, CONF_RED, CONF_GREEN, CONF_BLUE, CONF_WHITE, CONF_TRIGGER_PIN, CONF_OUTPUT_ID, CONF_TRIGGER_ID, CONF_PIN, CONF_FREQUENCY, CONF_CHANNEL ) CONF_HUB_ID = "yeelight_bs2_hub_id" CONF_RED_ID = "red_id" CONF_GREEN_ID = "green_id" CONF_BLUE_ID = "blue_id" CONF_WHITE_ID = "white_id" CONF_MASTER1 = "master1" CONF_MASTER1_ID = "master1_id" CONF_MASTER2 = "master2" CONF_MASTER2_ID = "master2_id" CONF_ON_BRIGHTNESS = "on_brightness" CODEOWNERS = ["@mmakaay"] AUTO_LOAD = ["ledc"] yeelight_ns = cg.esphome_ns.namespace("yeelight") bs2_ns = yeelight_ns.namespace("bs2") YeelightBS2Hub = bs2_ns.class_("YeelightBS2Hub", cg.Component) LEDC_PINS = { # Config key ID PIN FREQ CH CONF_RED : ( CONF_RED_ID, "GPIO13", 3000, 0 ), CONF_GREEN : ( CONF_GREEN_ID, "GPIO14", 3000, 1 ), CONF_BLUE : ( CONF_BLUE_ID, "GPIO5", 3000, 2 ), CONF_WHITE : ( CONF_WHITE_ID, "GPIO12", 10000, 4 ), } def make_config_schema(): schema = cv.COMPONENT_SCHEMA.extend({ cv.GenerateID(): cv.declare_id(YeelightBS2Hub), cv.Optional(CONF_TRIGGER_PIN, default="GPIO16"): cv.All( pins.validate_gpio_pin, pins.validate_has_interrupt ), }) for key, pin_config in LEDC_PINS.items(): id_, pin, *_ = pin_config schema = schema.extend({ cv.GenerateID(id_): cv.declare_id(LEDCOutput), cv.Optional(key, default=pin): pins.validate_gpio_pin }) return schema; CONFIG_SCHEMA = make_config_schema() @coroutine def make_ledc_pin(key, config): id_, _, frequency, channel = LEDC_PINS[key] gpio_var = yield cg.gpio_pin_expression({ "number": config[key], "mode": "OUTPUT" }); ledc_var = cg.new_Pvariable(config[id_], gpio_var) cg.add(ledc_var.set_frequency(frequency)); cg.add(ledc_var.set_channel(channel)); yield from cg.register_component(ledc_var, {}) # TODO last arg? def to_code(config): hub_var = cg.new_Pvariable(config[CONF_ID]) yield cg.register_component(hub_var, config) for key in LEDC_PINS: ledc_pin = yield make_ledc_pin(key, config) setter = getattr(hub_var, "set_%s_pin" % key) cg.add(setter(ledc_pin)) trigger_pin = yield cg.gpio_pin_expression({ "number": config[CONF_TRIGGER_PIN], "mode": "INPUT", "inverted": False }) cg.add(hub_var.set_trigger_pin(trigger_pin)) # # led_white = yield cg.get_variable(config[CONF_WHITE]) # cg.add(var.set_white_output(led_white)) # # led_red = yield cg.get_variable(config[CONF_RED]) # cg.add(var.set_red_output(led_red)) # # led_green = yield cg.get_variable(config[CONF_GREEN]) # cg.add(var.set_green_output(led_green)) # # led_blue = yield cg.get_variable(config[CONF_BLUE]) # cg.add(var.set_blue_output(led_blue)) # # master1 = yield cg.get_variable(config[CONF_MASTER1]) # cg.add(var.set_master1_output(master1)) # # master2 = yield cg.get_variable(config[CONF_MASTER2]) # cg.add(var.set_master2_output(master2)) # # for conf in config.get(CONF_ON_BRIGHTNESS, []): # trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) # yield automation.build_automation(trigger, [(float, "x")], conf)