mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Add support for SM2235 and SM2335 LED drivers (#3924)
This commit is contained in:
		| @@ -208,7 +208,10 @@ esphome/components/shelly_dimmer/* @edge90 @rnauber | |||||||
| esphome/components/sht4x/* @sjtrny | esphome/components/sht4x/* @sjtrny | ||||||
| esphome/components/shutdown/* @esphome/core @jsuanet | esphome/components/shutdown/* @esphome/core @jsuanet | ||||||
| esphome/components/sim800l/* @glmnet | esphome/components/sim800l/* @glmnet | ||||||
|  | esphome/components/sm10bit_base/* @Cossid | ||||||
| esphome/components/sm2135/* @BoukeHaarsma23 | esphome/components/sm2135/* @BoukeHaarsma23 | ||||||
|  | esphome/components/sm2235/* @Cossid | ||||||
|  | esphome/components/sm2335/* @Cossid | ||||||
| esphome/components/sml/* @alengwenus | esphome/components/sml/* @alengwenus | ||||||
| esphome/components/smt100/* @piechade | esphome/components/smt100/* @piechade | ||||||
| esphome/components/sn74hc165/* @jesserockz | esphome/components/sn74hc165/* @jesserockz | ||||||
|   | |||||||
							
								
								
									
										44
									
								
								esphome/components/sm10bit_base/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								esphome/components/sm10bit_base/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | |||||||
|  | import esphome.codegen as cg | ||||||
|  | import esphome.config_validation as cv | ||||||
|  | from esphome import pins | ||||||
|  | from esphome.const import ( | ||||||
|  |     CONF_CLOCK_PIN, | ||||||
|  |     CONF_DATA_PIN, | ||||||
|  |     CONF_ID, | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | CODEOWNERS = ["@Cossid"] | ||||||
|  | MULTI_CONF = True | ||||||
|  |  | ||||||
|  | CONF_MAX_POWER_COLOR_CHANNELS = "max_power_color_channels" | ||||||
|  | CONF_MAX_POWER_WHITE_CHANNELS = "max_power_white_channels" | ||||||
|  |  | ||||||
|  | sm10bit_base_ns = cg.esphome_ns.namespace("sm10bit_base") | ||||||
|  | Sm10BitBase = sm10bit_base_ns.class_("Sm10BitBase", cg.Component) | ||||||
|  |  | ||||||
|  | SM10BIT_BASE_CONFIG_SCHEMA = cv.Schema( | ||||||
|  |     { | ||||||
|  |         cv.Required(CONF_DATA_PIN): pins.gpio_output_pin_schema, | ||||||
|  |         cv.Required(CONF_CLOCK_PIN): pins.gpio_output_pin_schema, | ||||||
|  |         cv.Optional(CONF_MAX_POWER_COLOR_CHANNELS, default=2): cv.int_range( | ||||||
|  |             min=0, max=15 | ||||||
|  |         ), | ||||||
|  |         cv.Optional(CONF_MAX_POWER_WHITE_CHANNELS, default=4): cv.int_range( | ||||||
|  |             min=0, max=15 | ||||||
|  |         ), | ||||||
|  |     } | ||||||
|  | ).extend(cv.COMPONENT_SCHEMA) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def register_sm10bit_base(config): | ||||||
|  |     var = cg.new_Pvariable(config[CONF_ID]) | ||||||
|  |     await cg.register_component(var, config) | ||||||
|  |  | ||||||
|  |     data = await cg.gpio_pin_expression(config[CONF_DATA_PIN]) | ||||||
|  |     cg.add(var.set_data_pin(data)) | ||||||
|  |     clock = await cg.gpio_pin_expression(config[CONF_CLOCK_PIN]) | ||||||
|  |     cg.add(var.set_clock_pin(clock)) | ||||||
|  |     cg.add(var.set_max_power_color_channels(config[CONF_MAX_POWER_COLOR_CHANNELS])) | ||||||
|  |     cg.add(var.set_max_power_white_channels(config[CONF_MAX_POWER_WHITE_CHANNELS])) | ||||||
|  |  | ||||||
|  |     return var | ||||||
							
								
								
									
										112
									
								
								esphome/components/sm10bit_base/sm10bit_base.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								esphome/components/sm10bit_base/sm10bit_base.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | |||||||
|  | #include "sm10bit_base.h" | ||||||
|  | #include "esphome/core/log.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace sm10bit_base { | ||||||
|  |  | ||||||
|  | static const char *const TAG = "sm10bit_base"; | ||||||
|  |  | ||||||
|  | static const uint8_t SM10BIT_ADDR_STANDBY = 0x0; | ||||||
|  | static const uint8_t SM10BIT_ADDR_START_3CH = 0x8; | ||||||
|  | static const uint8_t SM10BIT_ADDR_START_2CH = 0x10; | ||||||
|  | static const uint8_t SM10BIT_ADDR_START_5CH = 0x18; | ||||||
|  |  | ||||||
|  | // Power current values | ||||||
|  | // HEX | Binary | RGB level | White level | Config value | ||||||
|  | // 0x0 | 0000   | RGB 10mA  | CW 5mA      | 0 | ||||||
|  | // 0x1 | 0001   | RGB 20mA  | CW 10mA     | 1 | ||||||
|  | // 0x2 | 0010   | RGB 30mA  | CW 15mA     | 2 - Default spec color value | ||||||
|  | // 0x3 | 0011   | RGB 40mA  | CW 20mA     | 3 | ||||||
|  | // 0x4 | 0100   | RGB 50mA  | CW 25mA     | 4 - Default spec white value | ||||||
|  | // 0x5 | 0101   | RGB 60mA  | CW 30mA     | 5 | ||||||
|  | // 0x6 | 0110   | RGB 70mA  | CW 35mA     | 6 | ||||||
|  | // 0x7 | 0111   | RGB 80mA  | CW 40mA     | 7 | ||||||
|  | // 0x8 | 1000   | RGB 90mA  | CW 45mA     | 8 | ||||||
|  | // 0x9 | 1001   | RGB 100mA | CW 50mA     | 9 | ||||||
|  | // 0xA | 1010   | RGB 110mA | CW 55mA     | 10 | ||||||
|  | // 0xB | 1011   | RGB 120mA | CW 60mA     | 11 | ||||||
|  | // 0xC | 1100   | RGB 130mA | CW 65mA     | 12 | ||||||
|  | // 0xD | 1101   | RGB 140mA | CW 70mA     | 13 | ||||||
|  | // 0xE | 1110   | RGB 150mA | CW 75mA     | 14 | ||||||
|  | // 0xF | 1111   | RGB 160mA | CW 80mA     | 15 | ||||||
|  |  | ||||||
|  | void Sm10BitBase::loop() { | ||||||
|  |   if (!this->update_) | ||||||
|  |     return; | ||||||
|  |  | ||||||
|  |   uint8_t data[12]; | ||||||
|  |   if (this->pwm_amounts_[0] == 0 && this->pwm_amounts_[1] == 0 && this->pwm_amounts_[2] == 0 && | ||||||
|  |       this->pwm_amounts_[3] == 0 && this->pwm_amounts_[4] == 0) { | ||||||
|  |     // Off / Sleep | ||||||
|  |     data[0] = this->model_id_ + SM10BIT_ADDR_STANDBY; | ||||||
|  |     for (int i = 1; i < 12; i++) | ||||||
|  |       data[i] = 0; | ||||||
|  |     this->write_buffer_(data, 12); | ||||||
|  |   } else if (this->pwm_amounts_[0] == 0 && this->pwm_amounts_[1] == 0 && this->pwm_amounts_[2] == 0 && | ||||||
|  |              (this->pwm_amounts_[3] > 0 || this->pwm_amounts_[4] > 0)) { | ||||||
|  |     // Only data on white channels | ||||||
|  |     data[0] = this->model_id_ + SM10BIT_ADDR_START_2CH; | ||||||
|  |     data[1] = 0 << 4 | this->max_power_white_channels_; | ||||||
|  |     for (int i = 2, j = 0; i < 12; i += 2, j++) { | ||||||
|  |       data[i] = this->pwm_amounts_[j] >> 0x8; | ||||||
|  |       data[i + 1] = this->pwm_amounts_[j] & 0xFF; | ||||||
|  |     } | ||||||
|  |     this->write_buffer_(data, 12); | ||||||
|  |   } else if ((this->pwm_amounts_[0] > 0 || this->pwm_amounts_[1] > 0 || this->pwm_amounts_[2] > 0) && | ||||||
|  |              this->pwm_amounts_[3] == 0 && this->pwm_amounts_[4] == 0) { | ||||||
|  |     // Only data on RGB channels | ||||||
|  |     data[0] = this->model_id_ + SM10BIT_ADDR_START_3CH; | ||||||
|  |     data[1] = this->max_power_color_channels_ << 4 | 0; | ||||||
|  |     for (int i = 2, j = 0; i < 12; i += 2, j++) { | ||||||
|  |       data[i] = this->pwm_amounts_[j] >> 0x8; | ||||||
|  |       data[i + 1] = this->pwm_amounts_[j] & 0xFF; | ||||||
|  |     } | ||||||
|  |     this->write_buffer_(data, 12); | ||||||
|  |   } else { | ||||||
|  |     // All channels | ||||||
|  |     data[0] = this->model_id_ + SM10BIT_ADDR_START_5CH; | ||||||
|  |     data[1] = this->max_power_color_channels_ << 4 | this->max_power_white_channels_; | ||||||
|  |     for (int i = 2, j = 0; i < 12; i += 2, j++) { | ||||||
|  |       data[i] = this->pwm_amounts_[j] >> 0x8; | ||||||
|  |       data[i + 1] = this->pwm_amounts_[j] & 0xFF; | ||||||
|  |     } | ||||||
|  |     this->write_buffer_(data, 12); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   this->update_ = false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Sm10BitBase::set_channel_value_(uint8_t channel, uint16_t value) { | ||||||
|  |   if (this->pwm_amounts_[channel] != value) { | ||||||
|  |     this->update_ = true; | ||||||
|  |     this->update_channel_ = channel; | ||||||
|  |   } | ||||||
|  |   this->pwm_amounts_[channel] = value; | ||||||
|  | } | ||||||
|  | void Sm10BitBase::write_bit_(bool value) { | ||||||
|  |   this->clock_pin_->digital_write(false); | ||||||
|  |   this->data_pin_->digital_write(value); | ||||||
|  |   this->clock_pin_->digital_write(true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Sm10BitBase::write_byte_(uint8_t data) { | ||||||
|  |   for (uint8_t mask = 0x80; mask; mask >>= 1) { | ||||||
|  |     this->write_bit_(data & mask); | ||||||
|  |   } | ||||||
|  |   this->clock_pin_->digital_write(false); | ||||||
|  |   this->data_pin_->digital_write(true); | ||||||
|  |   this->clock_pin_->digital_write(true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Sm10BitBase::write_buffer_(uint8_t *buffer, uint8_t size) { | ||||||
|  |   this->data_pin_->digital_write(false); | ||||||
|  |   for (uint32_t i = 0; i < size; i++) { | ||||||
|  |     this->write_byte_(buffer[i]); | ||||||
|  |   } | ||||||
|  |   this->clock_pin_->digital_write(false); | ||||||
|  |   this->clock_pin_->digital_write(true); | ||||||
|  |   this->data_pin_->digital_write(true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | }  // namespace sm10bit_base | ||||||
|  | }  // namespace esphome | ||||||
							
								
								
									
										63
									
								
								esphome/components/sm10bit_base/sm10bit_base.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								esphome/components/sm10bit_base/sm10bit_base.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "esphome/core/component.h" | ||||||
|  | #include "esphome/core/hal.h" | ||||||
|  | #include "esphome/components/output/float_output.h" | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace sm10bit_base { | ||||||
|  |  | ||||||
|  | class Sm10BitBase : public Component { | ||||||
|  |  public: | ||||||
|  |   class Channel; | ||||||
|  |  | ||||||
|  |   void set_model(uint8_t model_id) { model_id_ = model_id; } | ||||||
|  |   void set_data_pin(GPIOPin *data_pin) { data_pin_ = data_pin; } | ||||||
|  |   void set_clock_pin(GPIOPin *clock_pin) { clock_pin_ = clock_pin; } | ||||||
|  |   void set_max_power_color_channels(uint8_t max_power_color_channels) { | ||||||
|  |     max_power_color_channels_ = max_power_color_channels; | ||||||
|  |   } | ||||||
|  |   void set_max_power_white_channels(uint8_t max_power_white_channels) { | ||||||
|  |     max_power_white_channels_ = max_power_white_channels; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   float get_setup_priority() const override { return setup_priority::HARDWARE; } | ||||||
|  |  | ||||||
|  |   void setup() override; | ||||||
|  |   void dump_config() override; | ||||||
|  |   void loop() override; | ||||||
|  |  | ||||||
|  |   class Channel : public output::FloatOutput { | ||||||
|  |    public: | ||||||
|  |     void set_parent(Sm10BitBase *parent) { parent_ = parent; } | ||||||
|  |     void set_channel(uint8_t channel) { channel_ = channel; } | ||||||
|  |  | ||||||
|  |    protected: | ||||||
|  |     void write_state(float state) override { | ||||||
|  |       auto amount = static_cast<uint16_t>(state * 0x3FF); | ||||||
|  |       this->parent_->set_channel_value_(this->channel_, amount); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     Sm10BitBase *parent_; | ||||||
|  |     uint8_t channel_; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  |   void set_channel_value_(uint8_t channel, uint16_t value); | ||||||
|  |   void write_bit_(bool value); | ||||||
|  |   void write_byte_(uint8_t data); | ||||||
|  |   void write_buffer_(uint8_t *buffer, uint8_t size); | ||||||
|  |  | ||||||
|  |   GPIOPin *data_pin_; | ||||||
|  |   GPIOPin *clock_pin_; | ||||||
|  |   uint8_t model_id_; | ||||||
|  |   uint8_t max_power_color_channels_{2}; | ||||||
|  |   uint8_t max_power_white_channels_{4}; | ||||||
|  |   uint8_t update_channel_; | ||||||
|  |   std::vector<uint16_t> pwm_amounts_; | ||||||
|  |   bool update_{true}; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }  // namespace sm10bit_base | ||||||
|  | }  // namespace esphome | ||||||
							
								
								
									
										22
									
								
								esphome/components/sm2235/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								esphome/components/sm2235/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | import esphome.codegen as cg | ||||||
|  | import esphome.config_validation as cv | ||||||
|  | from esphome.components import sm10bit_base | ||||||
|  |  | ||||||
|  | AUTO_LOAD = ["sm10bit_base", "output"] | ||||||
|  | CODEOWNERS = ["@Cossid"] | ||||||
|  | MULTI_CONF = True | ||||||
|  |  | ||||||
|  | sm2235_ns = cg.esphome_ns.namespace("sm2235") | ||||||
|  |  | ||||||
|  | SM2235 = sm2235_ns.class_("SM2235", sm10bit_base.Sm10BitBase) | ||||||
|  |  | ||||||
|  | CONFIG_SCHEMA = cv.Schema( | ||||||
|  |     { | ||||||
|  |         cv.GenerateID(): cv.declare_id(SM2235), | ||||||
|  |     } | ||||||
|  | ).extend(sm10bit_base.SM10BIT_BASE_CONFIG_SCHEMA) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def to_code(config): | ||||||
|  |     var = await sm10bit_base.register_sm10bit_base(config) | ||||||
|  |     cg.add(var.set_model(0xC0)) | ||||||
							
								
								
									
										28
									
								
								esphome/components/sm2235/output.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								esphome/components/sm2235/output.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | import esphome.codegen as cg | ||||||
|  | import esphome.config_validation as cv | ||||||
|  | from esphome.components import output | ||||||
|  | from esphome.const import CONF_CHANNEL, CONF_ID | ||||||
|  | from . import SM2235 | ||||||
|  |  | ||||||
|  | DEPENDENCIES = ["sm2235"] | ||||||
|  | CODEOWNERS = ["@Cossid"] | ||||||
|  |  | ||||||
|  | Channel = SM2235.class_("Channel", output.FloatOutput) | ||||||
|  |  | ||||||
|  | CONF_SM2235_ID = "sm2235_id" | ||||||
|  | CONFIG_SCHEMA = output.FLOAT_OUTPUT_SCHEMA.extend( | ||||||
|  |     { | ||||||
|  |         cv.GenerateID(CONF_SM2235_ID): cv.use_id(SM2235), | ||||||
|  |         cv.Required(CONF_ID): cv.declare_id(Channel), | ||||||
|  |         cv.Required(CONF_CHANNEL): cv.int_range(min=0, max=65535), | ||||||
|  |     } | ||||||
|  | ).extend(cv.COMPONENT_SCHEMA) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def to_code(config): | ||||||
|  |     var = cg.new_Pvariable(config[CONF_ID]) | ||||||
|  |     await output.register_output(var, config) | ||||||
|  |  | ||||||
|  |     parent = await cg.get_variable(config[CONF_SM2235_ID]) | ||||||
|  |     cg.add(var.set_parent(parent)) | ||||||
|  |     cg.add(var.set_channel(config[CONF_CHANNEL])) | ||||||
							
								
								
									
										27
									
								
								esphome/components/sm2235/sm2235.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								esphome/components/sm2235/sm2235.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | #include "sm2235.h" | ||||||
|  | #include "esphome/core/log.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace sm2235 { | ||||||
|  |  | ||||||
|  | static const char *const TAG = "sm2235"; | ||||||
|  |  | ||||||
|  | void SM2235::setup() { | ||||||
|  |   ESP_LOGCONFIG(TAG, "Setting up sm2235 Output Component..."); | ||||||
|  |   this->data_pin_->setup(); | ||||||
|  |   this->data_pin_->digital_write(true); | ||||||
|  |   this->clock_pin_->setup(); | ||||||
|  |   this->clock_pin_->digital_write(true); | ||||||
|  |   this->pwm_amounts_.resize(5, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void SM2235::dump_config() { | ||||||
|  |   ESP_LOGCONFIG(TAG, "sm2235:"); | ||||||
|  |   LOG_PIN("  Data Pin: ", this->data_pin_); | ||||||
|  |   LOG_PIN("  Clock Pin: ", this->clock_pin_); | ||||||
|  |   ESP_LOGCONFIG(TAG, "  Color Channels Max Power: %u", this->max_power_color_channels_); | ||||||
|  |   ESP_LOGCONFIG(TAG, "  White Channels Max Power: %u", this->max_power_white_channels_); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | }  // namespace sm2235 | ||||||
|  | }  // namespace esphome | ||||||
							
								
								
									
										19
									
								
								esphome/components/sm2235/sm2235.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								esphome/components/sm2235/sm2235.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "esphome/core/component.h" | ||||||
|  | #include "esphome/components/sm10bit_base/sm10bit_base.h" | ||||||
|  | #include "esphome/core/hal.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace sm2235 { | ||||||
|  |  | ||||||
|  | class SM2235 : public sm10bit_base::Sm10BitBase { | ||||||
|  |  public: | ||||||
|  |   SM2235() = default; | ||||||
|  |  | ||||||
|  |   void setup() override; | ||||||
|  |   void dump_config() override; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }  // namespace sm2235 | ||||||
|  | }  // namespace esphome | ||||||
							
								
								
									
										22
									
								
								esphome/components/sm2335/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								esphome/components/sm2335/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | import esphome.codegen as cg | ||||||
|  | import esphome.config_validation as cv | ||||||
|  | from esphome.components import sm10bit_base | ||||||
|  |  | ||||||
|  | AUTO_LOAD = ["sm10bit_base", "output"] | ||||||
|  | CODEOWNERS = ["@Cossid"] | ||||||
|  | MULTI_CONF = True | ||||||
|  |  | ||||||
|  | sm2335_ns = cg.esphome_ns.namespace("sm2335") | ||||||
|  |  | ||||||
|  | SM2335 = sm2335_ns.class_("SM2335", sm10bit_base.Sm10BitBase) | ||||||
|  |  | ||||||
|  | CONFIG_SCHEMA = cv.Schema( | ||||||
|  |     { | ||||||
|  |         cv.GenerateID(): cv.declare_id(SM2335), | ||||||
|  |     } | ||||||
|  | ).extend(sm10bit_base.SM10BIT_BASE_CONFIG_SCHEMA) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def to_code(config): | ||||||
|  |     var = await sm10bit_base.register_sm10bit_base(config) | ||||||
|  |     cg.add(var.set_model(0xC0)) | ||||||
							
								
								
									
										28
									
								
								esphome/components/sm2335/output.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								esphome/components/sm2335/output.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | import esphome.codegen as cg | ||||||
|  | import esphome.config_validation as cv | ||||||
|  | from esphome.components import output | ||||||
|  | from esphome.const import CONF_CHANNEL, CONF_ID | ||||||
|  | from . import SM2335 | ||||||
|  |  | ||||||
|  | DEPENDENCIES = ["sm2335"] | ||||||
|  | CODEOWNERS = ["@Cossid"] | ||||||
|  |  | ||||||
|  | Channel = SM2335.class_("Channel", output.FloatOutput) | ||||||
|  |  | ||||||
|  | CONF_SM2335_ID = "sm2335_id" | ||||||
|  | CONFIG_SCHEMA = output.FLOAT_OUTPUT_SCHEMA.extend( | ||||||
|  |     { | ||||||
|  |         cv.GenerateID(CONF_SM2335_ID): cv.use_id(SM2335), | ||||||
|  |         cv.Required(CONF_ID): cv.declare_id(Channel), | ||||||
|  |         cv.Required(CONF_CHANNEL): cv.int_range(min=0, max=65535), | ||||||
|  |     } | ||||||
|  | ).extend(cv.COMPONENT_SCHEMA) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def to_code(config): | ||||||
|  |     var = cg.new_Pvariable(config[CONF_ID]) | ||||||
|  |     await output.register_output(var, config) | ||||||
|  |  | ||||||
|  |     parent = await cg.get_variable(config[CONF_SM2335_ID]) | ||||||
|  |     cg.add(var.set_parent(parent)) | ||||||
|  |     cg.add(var.set_channel(config[CONF_CHANNEL])) | ||||||
							
								
								
									
										27
									
								
								esphome/components/sm2335/sm2335.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								esphome/components/sm2335/sm2335.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | #include "sm2335.h" | ||||||
|  | #include "esphome/core/log.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace sm2335 { | ||||||
|  |  | ||||||
|  | static const char *const TAG = "sm2335"; | ||||||
|  |  | ||||||
|  | void SM2335::setup() { | ||||||
|  |   ESP_LOGCONFIG(TAG, "Setting up sm2335 Output Component..."); | ||||||
|  |   this->data_pin_->setup(); | ||||||
|  |   this->data_pin_->digital_write(true); | ||||||
|  |   this->clock_pin_->setup(); | ||||||
|  |   this->clock_pin_->digital_write(true); | ||||||
|  |   this->pwm_amounts_.resize(5, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void SM2335::dump_config() { | ||||||
|  |   ESP_LOGCONFIG(TAG, "sm2335:"); | ||||||
|  |   LOG_PIN("  Data Pin: ", this->data_pin_); | ||||||
|  |   LOG_PIN("  Clock Pin: ", this->clock_pin_); | ||||||
|  |   ESP_LOGCONFIG(TAG, "  Color Channels Max Power: %u", this->max_power_color_channels_); | ||||||
|  |   ESP_LOGCONFIG(TAG, "  White Channels Max Power: %u", this->max_power_white_channels_); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | }  // namespace sm2335 | ||||||
|  | }  // namespace esphome | ||||||
							
								
								
									
										19
									
								
								esphome/components/sm2335/sm2335.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								esphome/components/sm2335/sm2335.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "esphome/core/component.h" | ||||||
|  | #include "esphome/components/sm10bit_base/sm10bit_base.h" | ||||||
|  | #include "esphome/core/hal.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace sm2335 { | ||||||
|  |  | ||||||
|  | class SM2335 : public sm10bit_base::Sm10BitBase { | ||||||
|  |  public: | ||||||
|  |   SM2335() = default; | ||||||
|  |  | ||||||
|  |   void setup() override; | ||||||
|  |   void dump_config() override; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }  // namespace sm2335 | ||||||
|  | }  // namespace esphome | ||||||
| @@ -1465,6 +1465,18 @@ my9231: | |||||||
|   num_chips: 2 |   num_chips: 2 | ||||||
|   bit_depth: 16 |   bit_depth: 16 | ||||||
|  |  | ||||||
|  | sm2235: | ||||||
|  |   data_pin: GPIO4 | ||||||
|  |   clock_pin: GPIO5 | ||||||
|  |   max_power_color_channels: 9 | ||||||
|  |   max_power_white_channels: 9 | ||||||
|  |  | ||||||
|  | sm2335: | ||||||
|  |   data_pin: GPIO4 | ||||||
|  |   clock_pin: GPIO5 | ||||||
|  |   max_power_color_channels: 9 | ||||||
|  |   max_power_white_channels: 9 | ||||||
|  |  | ||||||
| bp1658cj: | bp1658cj: | ||||||
|   data_pin: GPIO3 |   data_pin: GPIO3 | ||||||
|   clock_pin: GPIO5 |   clock_pin: GPIO5 | ||||||
| @@ -1600,6 +1612,36 @@ output: | |||||||
|   - platform: my9231 |   - platform: my9231 | ||||||
|     id: my_5 |     id: my_5 | ||||||
|     channel: 5 |     channel: 5 | ||||||
|  |   - platform: sm2235 | ||||||
|  |     id: sm2235_red | ||||||
|  |     channel: 1 | ||||||
|  |   - platform: sm2235 | ||||||
|  |     id: sm2235_green | ||||||
|  |     channel: 0 | ||||||
|  |   - platform: sm2235 | ||||||
|  |     id: sm2235_blue | ||||||
|  |     channel: 2 | ||||||
|  |   - platform: sm2235 | ||||||
|  |     id: sm2235_coldwhite | ||||||
|  |     channel: 4 | ||||||
|  |   - platform: sm2235 | ||||||
|  |     id: sm2235_warmwhite | ||||||
|  |     channel: 3 | ||||||
|  |   - platform: sm2335 | ||||||
|  |     id: sm2335_red | ||||||
|  |     channel: 1 | ||||||
|  |   - platform: sm2335 | ||||||
|  |     id: sm2335_green | ||||||
|  |     channel: 0 | ||||||
|  |   - platform: sm2335 | ||||||
|  |     id: sm2335_blue | ||||||
|  |     channel: 2 | ||||||
|  |   - platform: sm2335 | ||||||
|  |     id: sm2335_coldwhite | ||||||
|  |     channel: 4 | ||||||
|  |   - platform: sm2335 | ||||||
|  |     id: sm2335_warmwhite | ||||||
|  |     channel: 3 | ||||||
|   - platform: slow_pwm |   - platform: slow_pwm | ||||||
|     id: id24 |     id: id24 | ||||||
|     pin: GPIO26 |     pin: GPIO26 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user