mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Add TM1651 simple level, turn on, turn off actions (#920)
* Add TM1651 simple level action * fixed brightness validation * Updated lib, fixed import * Added turn_on, turn_off actions * Fixed after lint
This commit is contained in:
		| @@ -1,13 +1,19 @@ | ||||
| import esphome.codegen as cg | ||||
| import esphome.config_validation as cv | ||||
| from esphome import pins, automation | ||||
| from esphome.automation import maybe_simple_id | ||||
| from esphome.const import CONF_ID, CONF_CLK_PIN, CONF_DIO_PIN, CONF_LEVEL, CONF_BRIGHTNESS | ||||
|  | ||||
| tm1651_ns = cg.esphome_ns.namespace('tm1651') | ||||
| TM1651Display = tm1651_ns.class_('TM1651Display', cg.Component) | ||||
|  | ||||
| SetLevelPercentAction = tm1651_ns.class_('SetLevelPercentAction', automation.Action) | ||||
| SetLevelAction = tm1651_ns.class_('SetLevelAction', automation.Action) | ||||
| SetBrightnessAction = tm1651_ns.class_('SetBrightnessAction', automation.Action) | ||||
| validate_level = cv.All(cv.int_range(min=0, max=100)) | ||||
| TurnOnAction = tm1651_ns.class_('SetLevelPercentAction', automation.Action) | ||||
| TurnOffAction = tm1651_ns.class_('SetLevelPercentAction', automation.Action) | ||||
|  | ||||
| CONF_LEVEL_PERCENT = 'level_percent' | ||||
|  | ||||
| TM1651_BRIGHTNESS_OPTIONS = { | ||||
|     1: TM1651Display.TM1651_BRIGHTNESS_LOW, | ||||
| @@ -21,6 +27,10 @@ CONFIG_SCHEMA = cv.Schema({ | ||||
|     cv.Required(CONF_DIO_PIN): pins.internal_gpio_output_pin_schema, | ||||
| }) | ||||
|  | ||||
| validate_level_percent = cv.All(cv.int_range(min=0, max=100)) | ||||
| validate_level = cv.All(cv.int_range(min=0, max=7)) | ||||
| validate_brightness = cv.enum(TM1651_BRIGHTNESS_OPTIONS, int=True) | ||||
|  | ||||
|  | ||||
| def to_code(config): | ||||
|     var = cg.new_Pvariable(config[CONF_ID]) | ||||
| @@ -32,13 +42,50 @@ def to_code(config): | ||||
|     cg.add(var.set_dio_pin(dio_pin)) | ||||
|  | ||||
|     # https://platformio.org/lib/show/6865/TM1651 | ||||
|     cg.add_library('6865', '1.0.0') | ||||
|     cg.add_library('6865', '1.0.1') | ||||
|  | ||||
|  | ||||
| @automation.register_action('tm1651.set_level', SetLevelAction, cv.maybe_simple_value({ | ||||
| BINARY_OUTPUT_ACTION_SCHEMA = maybe_simple_id({ | ||||
|     cv.Required(CONF_ID): cv.use_id(TM1651Display), | ||||
| }) | ||||
|  | ||||
|  | ||||
| @automation.register_action('tm1651.turn_on', TurnOnAction, BINARY_OUTPUT_ACTION_SCHEMA) | ||||
| def output_turn_on_to_code(config, action_id, template_arg, args): | ||||
|     var = cg.new_Pvariable(action_id, template_arg) | ||||
|     yield cg.register_parented(var, config[CONF_ID]) | ||||
|     yield var | ||||
|  | ||||
|  | ||||
| @automation.register_action('tm1651.turn_off', TurnOffAction, BINARY_OUTPUT_ACTION_SCHEMA) | ||||
| def output_turn_off_to_code(config, action_id, template_arg, args): | ||||
|     var = cg.new_Pvariable(action_id, template_arg) | ||||
|     yield cg.register_parented(var, config[CONF_ID]) | ||||
|     yield var | ||||
|  | ||||
|  | ||||
| @automation.register_action( | ||||
|     'tm1651.set_level_percent', | ||||
|     SetLevelPercentAction, | ||||
|     cv.maybe_simple_value({ | ||||
|         cv.GenerateID(): cv.use_id(TM1651Display), | ||||
|         cv.Required(CONF_LEVEL_PERCENT): cv.templatable(validate_level_percent), | ||||
|     }, key=CONF_LEVEL_PERCENT)) | ||||
| def tm1651_set_level_percent_to_code(config, action_id, template_arg, args): | ||||
|     var = cg.new_Pvariable(action_id, template_arg) | ||||
|     yield cg.register_parented(var, config[CONF_ID]) | ||||
|     template_ = yield cg.templatable(config[CONF_LEVEL_PERCENT], args, cg.uint8) | ||||
|     cg.add(var.set_level_percent(template_)) | ||||
|     yield var | ||||
|  | ||||
|  | ||||
| @automation.register_action( | ||||
|     'tm1651.set_level', | ||||
|     SetLevelAction, | ||||
|     cv.maybe_simple_value({ | ||||
|         cv.GenerateID(): cv.use_id(TM1651Display), | ||||
|         cv.Required(CONF_LEVEL): cv.templatable(validate_level), | ||||
| }, key=CONF_LEVEL)) | ||||
|     }, key=CONF_LEVEL)) | ||||
| def tm1651_set_level_to_code(config, action_id, template_arg, args): | ||||
|     var = cg.new_Pvariable(action_id, template_arg) | ||||
|     yield cg.register_parented(var, config[CONF_ID]) | ||||
| @@ -47,10 +94,13 @@ def tm1651_set_level_to_code(config, action_id, template_arg, args): | ||||
|     yield var | ||||
|  | ||||
|  | ||||
| @automation.register_action('tm1651.set_brightness', SetBrightnessAction, cv.maybe_simple_value({ | ||||
| @automation.register_action( | ||||
|     'tm1651.set_brightness', | ||||
|     SetBrightnessAction, | ||||
|     cv.maybe_simple_value({ | ||||
|         cv.GenerateID(): cv.use_id(TM1651Display), | ||||
|     cv.Required(CONF_BRIGHTNESS): cv.templatable(validate_level), | ||||
| }, key=CONF_BRIGHTNESS)) | ||||
|         cv.Required(CONF_BRIGHTNESS): cv.templatable(validate_brightness), | ||||
|     }, key=CONF_BRIGHTNESS)) | ||||
| def tm1651_set_brightness_to_code(config, action_id, template_arg, args): | ||||
|     var = cg.new_Pvariable(action_id, template_arg) | ||||
|     yield cg.register_parented(var, config[CONF_ID]) | ||||
|   | ||||
| @@ -5,8 +5,9 @@ namespace esphome { | ||||
| namespace tm1651 { | ||||
|  | ||||
| static const char *TAG = "tm1651.display"; | ||||
|  | ||||
| static const uint8_t MAX_INPUT_LEVEL_PERCENT = 100; | ||||
| static const uint8_t TM1651_MAX_LEVEL = 7; | ||||
| static const uint8_t MAX_INPUT_LEVEL = 100; | ||||
|  | ||||
| static const uint8_t TM1651_BRIGHTNESS_LOW = 0; | ||||
| static const uint8_t TM1651_BRIGHTNESS_MEDIUM = 2; | ||||
| @@ -29,17 +30,36 @@ void TM1651Display::dump_config() { | ||||
|   LOG_PIN("  DIO: ", dio_pin_); | ||||
| } | ||||
|  | ||||
| void TM1651Display::set_level(uint8_t new_level) { | ||||
| void TM1651Display::set_level_percent(uint8_t new_level) { | ||||
|   this->level_ = calculate_level_(new_level); | ||||
|   this->repaint_(); | ||||
| } | ||||
|  | ||||
| void TM1651Display::set_level(uint8_t new_level) { | ||||
|   this->level_ = new_level; | ||||
|   this->repaint_(); | ||||
| } | ||||
|  | ||||
| void TM1651Display::set_brightness(uint8_t new_brightness) { | ||||
|   this->brightness_ = calculate_brightness_(new_brightness); | ||||
|   this->repaint_(); | ||||
| } | ||||
|  | ||||
| void TM1651Display::turn_on() { | ||||
|   this->is_on_ = true; | ||||
|   this->repaint_(); | ||||
| } | ||||
|  | ||||
| void TM1651Display::turn_off() { | ||||
|   this->is_on_ = false; | ||||
|   battery_display_->displayLevel(0); | ||||
| } | ||||
|  | ||||
| void TM1651Display::repaint_() { | ||||
|   if (!this->is_on_) { | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   battery_display_->set(this->brightness_); | ||||
|   battery_display_->displayLevel(this->level_); | ||||
| } | ||||
| @@ -49,7 +69,7 @@ uint8_t TM1651Display::calculate_level_(uint8_t new_level) { | ||||
|     return 0; | ||||
|   } | ||||
|  | ||||
|   float calculated_level = TM1651_MAX_LEVEL / (float) (MAX_INPUT_LEVEL / (float) new_level); | ||||
|   float calculated_level = TM1651_MAX_LEVEL / (float) (MAX_INPUT_LEVEL_PERCENT / (float) new_level); | ||||
|   return (uint8_t) roundf(calculated_level); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -17,13 +17,18 @@ class TM1651Display : public Component { | ||||
|   void setup() override; | ||||
|   void dump_config() override; | ||||
|  | ||||
|   void set_level_percent(uint8_t); | ||||
|   void set_level(uint8_t); | ||||
|   void set_brightness(uint8_t); | ||||
|  | ||||
|   void turn_on(); | ||||
|   void turn_off(); | ||||
|  | ||||
|  protected: | ||||
|   TM1651 *battery_display_; | ||||
|   GPIOPin *clk_pin_; | ||||
|   GPIOPin *dio_pin_; | ||||
|   bool is_on_ = true; | ||||
|  | ||||
|   uint8_t brightness_; | ||||
|   uint8_t level_; | ||||
| @@ -34,9 +39,20 @@ class TM1651Display : public Component { | ||||
|   uint8_t calculate_brightness_(uint8_t); | ||||
| }; | ||||
|  | ||||
| template<typename... Ts> class SetLevelPercentAction : public Action<Ts...>, public Parented<TM1651Display> { | ||||
|  public: | ||||
|   TEMPLATABLE_VALUE(uint8_t, level_percent) | ||||
|  | ||||
|   void play(Ts... x) override { | ||||
|     auto level_percent = this->level_percent_.value(x...); | ||||
|     this->parent_->set_level_percent(level_percent); | ||||
|   } | ||||
| }; | ||||
|  | ||||
| template<typename... Ts> class SetLevelAction : public Action<Ts...>, public Parented<TM1651Display> { | ||||
|  public: | ||||
|   TEMPLATABLE_VALUE(uint8_t, level) | ||||
|  | ||||
|   void play(Ts... x) override { | ||||
|     auto level = this->level_.value(x...); | ||||
|     this->parent_->set_level(level); | ||||
| @@ -46,11 +62,22 @@ template<typename... Ts> class SetLevelAction : public Action<Ts...>, public Par | ||||
| template<typename... Ts> class SetBrightnessAction : public Action<Ts...>, public Parented<TM1651Display> { | ||||
|  public: | ||||
|   TEMPLATABLE_VALUE(uint8_t, brightness) | ||||
|  | ||||
|   void play(Ts... x) override { | ||||
|     auto brightness = this->brightness_.value(x...); | ||||
|     this->parent_->set_brightness(brightness); | ||||
|   } | ||||
| }; | ||||
|  | ||||
| template<typename... Ts> class TurnOnAction : public Action<Ts...>, public Parented<TM1651Display> { | ||||
|  public: | ||||
|   void play(Ts... x) override { this->parent_->turn_on(); } | ||||
| }; | ||||
|  | ||||
| template<typename... Ts> class TurnOffAction : public Action<Ts...>, public Parented<TM1651Display> { | ||||
|  public: | ||||
|   void play(Ts... x) override { this->parent_->turn_off(); } | ||||
| }; | ||||
|  | ||||
| }  // namespace tm1651 | ||||
| }  // namespace esphome | ||||
|   | ||||
| @@ -138,6 +138,13 @@ api: | ||||
|       then: | ||||
|         - dfplayer.random | ||||
|  | ||||
|     - service: battery_level_percent | ||||
|       variables: | ||||
|         level_percent: int | ||||
|       then: | ||||
|         - tm1651.set_level_percent: | ||||
|             id: tm1651_battery | ||||
|             level_percent: !lambda 'return level_percent;' | ||||
|     - service: battery_level | ||||
|       variables: | ||||
|         level: int | ||||
| @@ -152,6 +159,14 @@ api: | ||||
|         - tm1651.set_brightness: | ||||
|             id: tm1651_battery | ||||
|             brightness: !lambda 'return brightness;' | ||||
|     - service: battery_turn_on | ||||
|       then: | ||||
|         - tm1651.turn_on: | ||||
|             id: tm1651_battery | ||||
|     - service: battery_turn_on | ||||
|       then: | ||||
|         - tm1651.turn_off: | ||||
|             id: tm1651_battery | ||||
|  | ||||
| wifi: | ||||
|   ssid: 'MySSID' | ||||
|   | ||||
		Reference in New Issue
	
	Block a user