From 60c270476f2b6ad1ed03f985fd47044258f4ac59 Mon Sep 17 00:00:00 2001 From: Oliver Kleinecke Date: Sat, 15 Feb 2025 15:14:30 +0100 Subject: [PATCH] refactor: rename DynamicLamp to DynamicLampComponent for improved clarity and consistency --- esphome/components/dynamic_lamp/__init__.py | 8 ++- .../components/dynamic_lamp/dynamic_lamp.cpp | 32 ++++++------ .../components/dynamic_lamp/dynamic_lamp.h | 26 +++++++++- .../dynamic_lamp/output/__init__.py | 50 +++++++++++++++++++ .../output/dynamic_lamp_output.cpp | 15 ++++++ .../dynamic_lamp/output/dynamic_lamp_output.h | 22 ++++++++ 6 files changed, 136 insertions(+), 17 deletions(-) create mode 100644 esphome/components/dynamic_lamp/output/__init__.py create mode 100644 esphome/components/dynamic_lamp/output/dynamic_lamp_output.cpp create mode 100644 esphome/components/dynamic_lamp/output/dynamic_lamp_output.h diff --git a/esphome/components/dynamic_lamp/__init__.py b/esphome/components/dynamic_lamp/__init__.py index 43df35edcc..d7423c752c 100644 --- a/esphome/components/dynamic_lamp/__init__.py +++ b/esphome/components/dynamic_lamp/__init__.py @@ -3,13 +3,17 @@ from esphome.components import output import esphome.config_validation as cv from esphome.const import CONF_ID +CODEOWNERS = ["@p1ngb4ck"] +MULTI_CONF = False + dynamic_lamp_ns = cg.esphome_ns.namespace('dynamic_lamp') -DynamicLamp = dynamic_lamp_ns.class_('DynamicLamp', cg.Component) +DynamicLampComponent = dynamic_lamp_ns.class_('DynamicLampComponent', cg.Component) +CONF_DYNAMIC_LAMP_ID = "dynamic_lamp_id" CONF_SAVE_MODE = 'save_mode' CONF_AVAILABLE_OUTPUTS = 'available_outputs' CONFIG_SCHEMA = cv.Schema({ - cv.GenerateID(): cv.declare_id(DynamicLamp), + cv.GenerateID(): cv.declare_id(DynamicLampComponent), cv.Required(CONF_AVAILABLE_OUTPUTS): [cv.use_id(output.FloatOutput)], cv.Optional(CONF_SAVE_MODE, default=0): cv.int_range(0, 1), }).extend(cv.COMPONENT_SCHEMA) diff --git a/esphome/components/dynamic_lamp/dynamic_lamp.cpp b/esphome/components/dynamic_lamp/dynamic_lamp.cpp index 79c21c5c61..7f09bd45dc 100644 --- a/esphome/components/dynamic_lamp/dynamic_lamp.cpp +++ b/esphome/components/dynamic_lamp/dynamic_lamp.cpp @@ -16,11 +16,11 @@ namespace dynamic_lamp { static const char *TAG = "dynamic_lamp"; -void DynamicLamp::setup() { +void DynamicLampComponent::setup() { this->begin(); } -void DynamicLamp::begin() { +void DynamicLampComponent::begin() { uint8_t i = 0; bool valid = true; if(this->save_mode_ == 0) { @@ -41,7 +41,7 @@ void DynamicLamp::begin() { */ } -void DynamicLamp::loop() { +void DynamicLampComponent::loop() { uint8_t i = 0; for (i = 0; i < this->lamp_count_; i++) { if (this->active_lamps_[i].active) { @@ -73,7 +73,7 @@ void DynamicLamp::loop() { } } -void DynamicLamp::dump_config() { +void DynamicLampComponent::dump_config() { ESP_LOGCONFIG(TAG, "Dynamic Lamp feature loaded"); switch(this->save_mode_) { case SAVE_MODE_NONE: @@ -93,11 +93,11 @@ void DynamicLamp::dump_config() { } } -void DynamicLamp::set_save_mode(uint8_t save_mode) { +void DynamicLampComponent::set_save_mode(uint8_t save_mode) { this->save_mode_ = save_mode; } -void DynamicLamp::add_available_output(output::FloatOutput * output, std::string output_id) { +void DynamicLampComponent::add_available_output(output::FloatOutput * output, std::string output_id) { uint8_t counter = 0; while (this->available_outputs_[counter].available) { counter++; @@ -113,7 +113,7 @@ void DynamicLamp::add_available_output(output::FloatOutput * output, std::string counter++; } -void DynamicLamp::add_lamp(std::string name) { +void DynamicLampComponent::add_lamp(std::string name) { if (this->lamp_count_ < 15) { this->lamp_count_++; this->active_lamps_[this->lamp_count_].active = true; @@ -128,7 +128,7 @@ void DynamicLamp::add_lamp(std::string name) { this->status_set_warning(); } -void DynamicLamp::remove_lamp(std::string lamp_name) { +void DynamicLampComponent::remove_lamp(std::string lamp_name) { uint8_t i = 0; while (i < this->lamp_count_) { if (this->active_lamps_[i].name == lamp_name) { @@ -144,7 +144,7 @@ void DynamicLamp::remove_lamp(std::string lamp_name) { ESP_LOGW(TAG, "No lamp with name %s defined !", lamp_name.c_str()); } -void DynamicLamp::add_output_to_lamp(std::string lamp_name, LinkedOutput *output) { +void DynamicLampComponent::add_output_to_lamp(std::string lamp_name, LinkedOutput *output) { uint8_t i = 0; while (i < 16) { if (this->active_lamps_[i].name == lamp_name) { @@ -159,7 +159,7 @@ void DynamicLamp::add_output_to_lamp(std::string lamp_name, LinkedOutput *output ESP_LOGW(TAG, "No lamp with name %s defined !", lamp_name.c_str()); } -void DynamicLamp::remove_output_from_lamp(std::string lamp_name, LinkedOutput *output) { +void DynamicLampComponent::remove_output_from_lamp(std::string lamp_name, LinkedOutput *output) { uint8_t i = 0; while (i < 16) { if (this->active_lamps_[i].name == lamp_name) { @@ -174,7 +174,7 @@ void DynamicLamp::remove_output_from_lamp(std::string lamp_name, LinkedOutput *o ESP_LOGW(TAG, "No lamp with name %s defined !", lamp_name.c_str()); } -std::array DynamicLamp::get_lamp_outputs(uint8_t lamp_number) { +std::array DynamicLampComponent::get_lamp_outputs(uint8_t lamp_number) { std::array bool_array; for (uint8_t i = 0; i < 16; i++) { bool_array[i] = this->active_lamps_[lamp_number].used_outputs[i]; @@ -182,7 +182,7 @@ std::array DynamicLamp::get_lamp_outputs(uint8_t lamp_number) { return bool_array; } -std::array DynamicLamp::get_lamp_outputs_by_name(std::string lamp_name) { +std::array DynamicLampComponent::get_lamp_outputs_by_name(std::string lamp_name) { uint8_t i = 0; std::array bool_array; for (i = 0; i < this->lamp_count_; i++) { @@ -195,11 +195,15 @@ std::array DynamicLamp::get_lamp_outputs_by_name(std::string lamp_name return bool_array; } -void DynamicLamp::set_lamp_values_(uint8_t lamp_number, bool active, uint16_t selected_outputs, uint8_t mode, uint8_t mode_value) { +void DynamicLampComponent::set_lamp_level(std::string lamp_name, float state) { + +} + +void DynamicLampComponent::set_lamp_values_(uint8_t lamp_number, bool active, uint16_t selected_outputs, uint8_t mode, uint8_t mode_value) { } -void DynamicLamp::restore_lamp_values_(uint8_t lamp_number) { +void DynamicLampComponent::restore_lamp_values_(uint8_t lamp_number) { this->active_lamps_[lamp_number].active = false; } diff --git a/esphome/components/dynamic_lamp/dynamic_lamp.h b/esphome/components/dynamic_lamp/dynamic_lamp.h index ae3607d64b..371605dbaa 100644 --- a/esphome/components/dynamic_lamp/dynamic_lamp.h +++ b/esphome/components/dynamic_lamp/dynamic_lamp.h @@ -31,14 +31,36 @@ struct LinkedOutput { bool update_level = false; }; +enum DynamicLampIdx : uint8_t { + LAMP_1 = 0, + LAMP_2 = 1, + LAMP_3 = 2, + LAMP_4 = 3, + LAMP_5 = 4, + LAMP_6 = 5, + LAMP_7 = 6, + LAMP_8 = 7, + LAMP_9 = 8, + LAMP_10 = 9, + LAMP_11 = 10, + LAMP_12 = 11, + LAMP_13 = 12, + LAMP_14 = 13, + LAMP_15 = 14, + LAMP_16 = 15, +}; + struct CombinedLamp { bool active = false; std::string name = ""; uint8_t lamp_index; + float state; bool used_outputs[16]; }; -class DynamicLamp : public Component { +class DynamicLamp; + +class DynamicLampComponent : public Component { public: void setup() override; void loop() override; @@ -54,6 +76,8 @@ class DynamicLamp : public Component { std::array get_lamp_outputs_by_name(std::string lamp_name); protected: + friend class DynamicLamp; + void set_lamp_level(std::string lamp_name, float state); void restore_lamp_values_(uint8_t lamp_number); void set_lamp_values_(uint8_t lamp_number, bool active, uint16_t selected_outputs, uint8_t mode, uint8_t mode_value); diff --git a/esphome/components/dynamic_lamp/output/__init__.py b/esphome/components/dynamic_lamp/output/__init__.py new file mode 100644 index 0000000000..7f938a07ce --- /dev/null +++ b/esphome/components/dynamic_lamp/output/__init__.py @@ -0,0 +1,50 @@ +import esphome.codegen as cg # noqa: I001 +from esphome.components import output +import esphome.config_validation as cv +from esphome.const import CONF_CHANNEL, CONF_ID +from .. import CONF_DYNAMIC_LAMP_ID, DynamicLampComponent, dynamic_lamp_ns + +DEPENDENCIES = ["dynamic_lamp"] + +DynamicLamp = dynamic_lamp_ns.class_( + "DynamicLamp", output.FloatOutput, cg.Parented.template(DynamicLampComponent) +) + +DynamicLampIdx = dynamic_lamp_ns.enum("DynamicLampIdx") +CHANNEL_OPTIONS = { + "A": DynamicLampIdx.LAMP_1, + "B": DynamicLampIdx.LAMP_2, + "C": DynamicLampIdx.LAMP_3, + "D": DynamicLampIdx.LAMP_4, + "E": DynamicLampIdx.LAMP_5, + "F": DynamicLampIdx.LAMP_6, + "G": DynamicLampIdx.LAMP_7, + "H": DynamicLampIdx.LAMP_8, + "I": DynamicLampIdx.LAMP_9, + "J": DynamicLampIdx.LAMP_10, + "K": DynamicLampIdx.LAMP_11, + "L": DynamicLampIdx.LAMP_12, + "M": DynamicLampIdx.LAMP_13, + "N": DynamicLampIdx.LAMP_14, + "O": DynamicLampIdx.LAMP_15, + "P": DynamicLampIdx.LAMP_16, +} + +CONFIG_SCHEMA = output.FLOAT_OUTPUT_SCHEMA.extend( + { + cv.Required(CONF_ID): cv.declare_id(DynamicLamp), + cv.GenerateID(CONF_DYNAMIC_LAMP_ID): cv.use_id(DynamicLampComponent), + cv.Required(CONF_CHANNEL): cv.enum(CHANNEL_OPTIONS, upper=True), + } +) + + +async def to_code(config): + parent = await cg.get_variable(config[CONF_DYNAMIC_LAMP_ID]) + var = cg.new_Pvariable( + config[CONF_ID], + parent, + config[CONF_CHANNEL], + ) + await output.register_output(var, config) + await cg.register_parented(var, config[CONF_DYNAMIC_LAMP_ID]) diff --git a/esphome/components/dynamic_lamp/output/dynamic_lamp_output.cpp b/esphome/components/dynamic_lamp/output/dynamic_lamp_output.cpp new file mode 100644 index 0000000000..0d6af6eb8b --- /dev/null +++ b/esphome/components/dynamic_lamp/output/dynamic_lamp_output.cpp @@ -0,0 +1,15 @@ +#include "dynamic_lamp_output.h" +#include "esphome/core/helpers.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace dynamic_lamp { + +static const char *const TAG = "dynamic_lamp.output"; + +void DynamicLamp::write_state(float state) { + this->state_ = state; +} + +} // namespace dynamic_lamp +} // namespace esphome diff --git a/esphome/components/dynamic_lamp/output/dynamic_lamp_output.h b/esphome/components/dynamic_lamp/output/dynamic_lamp_output.h new file mode 100644 index 0000000000..1edcb09853 --- /dev/null +++ b/esphome/components/dynamic_lamp/output/dynamic_lamp_output.h @@ -0,0 +1,22 @@ +#pragma once + +#include "../dynamic_lamp.h" +#include "esphome/core/component.h" +#include "esphome/components/output/float_output.h" + +namespace esphome { +namespace dnamic_lamp { + +class DynamicLamp : public output::FloatOutput, public Parented { + public: + DynamicLamp(DynamicLampComponent *parent, DynamicLampIdx lamp) : parent_(parent), lamp_(lamp) {} + + protected: + void write_state(float state) override; + DynamicLampComponent *parent_; + DynamicLampIdx lamp_; + float state_; +}; + +} // namespace dynamic_lamp +} // namespace esphome