mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	refactor: update DynamicLampComponent to support new save modes and integrate with light output
This commit is contained in:
		| @@ -10,10 +10,11 @@ dynamic_lamp_ns = cg.esphome_ns.namespace('dynamic_lamp') | ||||
| 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(DynamicLampComponent), | ||||
|     cv.GenerateID(CONF_ID): 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) | ||||
|   | ||||
| @@ -97,11 +97,14 @@ void DynamicLampComponent::dump_config() { | ||||
|     case SAVE_MODE_NONE: | ||||
|       ESP_LOGCONFIG(TAG, "Save mode set to NONE"); | ||||
|       break; | ||||
|     case SAVE_MODE_LOCAL: | ||||
|       ESP_LOGCONFIG(TAG, "Save mode set to LOCAL"); | ||||
|       break; | ||||
|     case SAVE_MODE_FRAM: | ||||
|       ESP_LOGCONFIG(TAG, "Save mode set to FRAM"); | ||||
|       break; | ||||
|     default: | ||||
|       ESP_LOGCONFIG(TAG, "Currently only NONE(0) && FRAM(1) save modes supported, ignoring value %" PRIu8 " and defaulting to NONE!", this->save_mode_); | ||||
|       ESP_LOGCONFIG(TAG, "Currently only NONE(0), LOCAL(1) & FRAM(2) save modes supported, ignoring value %" PRIu8 " and defaulting to NONE!", this->save_mode_); | ||||
|       this->save_mode_ = 0; | ||||
|   } | ||||
|   for (uint8_t i = 0; i < 16; i++) { | ||||
|   | ||||
| @@ -8,7 +8,8 @@ namespace dynamic_lamp { | ||||
|  | ||||
| enum SupportedSaveModes : uint8_t { | ||||
|   SAVE_MODE_NONE = 0, | ||||
|   SAVE_MODE_FRAM = 1 | ||||
|   SAVE_MODE_LOCAL = 1, | ||||
|   SAVE_MODE_FRAM = 2 | ||||
| }; | ||||
|  | ||||
| enum LinkedOutputModeIdx : uint8_t { | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| import esphome.codegen as cg | ||||
| from esphome.components import output | ||||
| from esphome.components import light | ||||
| import esphome.config_validation as cv | ||||
| from esphome.const import CONF_CHANNEL, CONF_ID | ||||
|  | ||||
| @@ -8,7 +8,7 @@ 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) | ||||
|     "DynamicLamp", light.LightOutput, cg.Parented.template(DynamicLampComponent) | ||||
| ) | ||||
|  | ||||
| DynamicLampIdx = dynamic_lamp_ns.enum("DynamicLampIdx") | ||||
| @@ -31,7 +31,7 @@ CHANNEL_OPTIONS = { | ||||
|     "P": DynamicLampIdx.LAMP_16, | ||||
| } | ||||
|  | ||||
| CONFIG_SCHEMA = output.FLOAT_OUTPUT_SCHEMA.extend( | ||||
| CONFIG_SCHEMA = light.BRIGHTNESS_ONLY_LIGHT_SCHEMA.extend( | ||||
|     { | ||||
|         cv.Required(CONF_ID): cv.declare_id(DynamicLamp), | ||||
|         cv.GenerateID(CONF_DYNAMIC_LAMP_ID): cv.use_id(DynamicLampComponent), | ||||
| @@ -47,5 +47,5 @@ async def to_code(config): | ||||
|         parent, | ||||
|         config[CONF_CHANNEL], | ||||
|     ) | ||||
|     await output.register_output(var, config) | ||||
|     await light.register_light(var, config) | ||||
|     await cg.register_parented(var, config[CONF_DYNAMIC_LAMP_ID]) | ||||
|   | ||||
| @@ -7,11 +7,13 @@ namespace dynamic_lamp { | ||||
|  | ||||
| static const char *const TAG = "dynamic_lamp.output"; | ||||
|  | ||||
| void DynamicLamp::write_state(float state) { | ||||
|   if (this->parent_->write_state_(this->lamp_, state)) { | ||||
|     this->state_ = state; | ||||
| void DynamicLamp::write_state(light::LightState *state) override { | ||||
|     float bright; | ||||
|     state->current_values_as_brightness(&bright); | ||||
|     if (this->parent_->write_state_(this->lamp_, bright)) { | ||||
|       this->state_ = state; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| }  // namespace dynamic_lamp | ||||
| }  // namespace esphome | ||||
|   | ||||
| @@ -7,12 +7,17 @@ | ||||
| namespace esphome { | ||||
| namespace dynamic_lamp { | ||||
|  | ||||
| class DynamicLamp : public output::FloatOutput, public Parented<DynamicLampComponent> { | ||||
| class DynamicLamp : public light::LightOutput, public Parented<DynamicLampComponent> { | ||||
|  public: | ||||
|   DynamicLamp(DynamicLampComponent *parent, DynamicLampIdx lamp) : parent_(parent), lamp_(lamp) {} | ||||
|   light::LightTraits get_traits() override { | ||||
|     auto traits = light::LightTraits(); | ||||
|     traits.set_supported_color_modes({light::ColorMode::BRIGHTNESS}); | ||||
|     return traits; | ||||
|   } | ||||
|  | ||||
|  protected: | ||||
|   void write_state(float state) override; | ||||
|   void write_state(light::LightState *state) override; | ||||
|   DynamicLampComponent *parent_; | ||||
|   DynamicLampIdx lamp_; | ||||
|   float state_; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user