mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Provide the lights current color to the addressable_lambda_effect. (#646)
* Provide the lights current color to the addressable_lambda_effect. * Fix formatting * More formatting * Change the call signature of the lambda * lint Co-authored-by: olg <x>
This commit is contained in:
		| @@ -50,19 +50,19 @@ class AddressableLightEffect : public LightEffect { | |||||||
|  |  | ||||||
| class AddressableLambdaLightEffect : public AddressableLightEffect { | class AddressableLambdaLightEffect : public AddressableLightEffect { | ||||||
|  public: |  public: | ||||||
|   AddressableLambdaLightEffect(const std::string &name, const std::function<void(AddressableLight &)> &f, |   AddressableLambdaLightEffect(const std::string &name, const std::function<void(AddressableLight &, ESPColor)> &f, | ||||||
|                                uint32_t update_interval) |                                uint32_t update_interval) | ||||||
|       : AddressableLightEffect(name), f_(f), update_interval_(update_interval) {} |       : AddressableLightEffect(name), f_(f), update_interval_(update_interval) {} | ||||||
|   void apply(AddressableLight &it, const ESPColor ¤t_color) override { |   void apply(AddressableLight &it, const ESPColor ¤t_color) override { | ||||||
|     const uint32_t now = millis(); |     const uint32_t now = millis(); | ||||||
|     if (now - this->last_run_ >= this->update_interval_) { |     if (now - this->last_run_ >= this->update_interval_) { | ||||||
|       this->last_run_ = now; |       this->last_run_ = now; | ||||||
|       this->f_(it); |       this->f_(it, current_color); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   std::function<void(AddressableLight &)> f_; |   std::function<void(AddressableLight &, ESPColor)> f_; | ||||||
|   uint32_t update_interval_; |   uint32_t update_interval_; | ||||||
|   uint32_t last_run_{0}; |   uint32_t last_run_{0}; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ from .types import LambdaLightEffect, RandomLightEffect, StrobeLightEffect, \ | |||||||
|     FlickerLightEffect, AddressableRainbowLightEffect, AddressableColorWipeEffect, \ |     FlickerLightEffect, AddressableRainbowLightEffect, AddressableColorWipeEffect, \ | ||||||
|     AddressableColorWipeEffectColor, AddressableScanEffect, AddressableTwinkleEffect, \ |     AddressableColorWipeEffectColor, AddressableScanEffect, AddressableTwinkleEffect, \ | ||||||
|     AddressableRandomTwinkleEffect, AddressableFireworksEffect, AddressableFlickerEffect, \ |     AddressableRandomTwinkleEffect, AddressableFireworksEffect, AddressableFlickerEffect, \ | ||||||
|     AutomationLightEffect |     AutomationLightEffect, ESPColor | ||||||
|  |  | ||||||
| CONF_ADD_LED_INTERVAL = 'add_led_interval' | CONF_ADD_LED_INTERVAL = 'add_led_interval' | ||||||
| CONF_REVERSE = 'reverse' | CONF_REVERSE = 'reverse' | ||||||
| @@ -129,7 +129,7 @@ def flicker_effect_to_code(config, effect_id): | |||||||
|     cv.Optional(CONF_UPDATE_INTERVAL, default='0ms'): cv.positive_time_period_milliseconds, |     cv.Optional(CONF_UPDATE_INTERVAL, default='0ms'): cv.positive_time_period_milliseconds, | ||||||
| }) | }) | ||||||
| def addressable_lambda_effect_to_code(config, effect_id): | def addressable_lambda_effect_to_code(config, effect_id): | ||||||
|     args = [(AddressableLightRef, 'it')] |     args = [(AddressableLightRef, 'it'), (ESPColor, 'current_color')] | ||||||
|     lambda_ = yield cg.process_lambda(config[CONF_LAMBDA], args, return_type=cg.void) |     lambda_ = yield cg.process_lambda(config[CONF_LAMBDA], args, return_type=cg.void) | ||||||
|     var = cg.new_Pvariable(effect_id, config[CONF_NAME], lambda_, |     var = cg.new_Pvariable(effect_id, config[CONF_NAME], lambda_, | ||||||
|                            config[CONF_UPDATE_INTERVAL]) |                            config[CONF_UPDATE_INTERVAL]) | ||||||
|   | |||||||
| @@ -9,6 +9,8 @@ AddressableLightState = light_ns.class_('LightState', LightState) | |||||||
| LightOutput = light_ns.class_('LightOutput') | LightOutput = light_ns.class_('LightOutput') | ||||||
| AddressableLight = light_ns.class_('AddressableLight', cg.Component) | AddressableLight = light_ns.class_('AddressableLight', cg.Component) | ||||||
| AddressableLightRef = AddressableLight.operator('ref') | AddressableLightRef = AddressableLight.operator('ref') | ||||||
|  |  | ||||||
|  | ESPColor = light_ns.class_('ESPColor') | ||||||
| LightColorValues = light_ns.class_('LightColorValues') | LightColorValues = light_ns.class_('LightColorValues') | ||||||
|  |  | ||||||
| # Actions | # Actions | ||||||
|   | |||||||
| @@ -893,6 +893,11 @@ light: | |||||||
|         name: Flicker Effect With Custom Values |         name: Flicker Effect With Custom Values | ||||||
|         update_interval: 16ms |         update_interval: 16ms | ||||||
|         intensity: 5% |         intensity: 5% | ||||||
|  |     - addressable_lambda: | ||||||
|  |           name: "Test For Custom Lambda Effect" | ||||||
|  |           lambda: |- | ||||||
|  |             it[0] = current_color; | ||||||
|  |                  | ||||||
|     - automation: |     - automation: | ||||||
|         name: Custom Effect |         name: Custom Effect | ||||||
|         sequence: |         sequence: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user