mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Add gp8403 output component (#4495)
Co-authored-by: Samuel Sieb <samuel-github@sieb.net>
This commit is contained in:
		| @@ -95,6 +95,7 @@ esphome/components/feedback/* @ianchi | ||||
| esphome/components/fingerprint_grow/* @OnFreund @loongyh | ||||
| esphome/components/fs3000/* @kahrendt | ||||
| esphome/components/globals/* @esphome/core | ||||
| esphome/components/gp8403/* @jesserockz | ||||
| esphome/components/gpio/* @esphome/core | ||||
| esphome/components/gps/* @coogle | ||||
| esphome/components/graph/* @synco | ||||
|   | ||||
							
								
								
									
										40
									
								
								esphome/components/gp8403/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								esphome/components/gp8403/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| import esphome.config_validation as cv | ||||
| import esphome.codegen as cg | ||||
|  | ||||
| from esphome.components import i2c | ||||
| from esphome.const import CONF_ID, CONF_VOLTAGE | ||||
|  | ||||
| CODEOWNERS = ["@jesserockz"] | ||||
| DEPENDENCIES = ["i2c"] | ||||
| MULTI_CONF = True | ||||
|  | ||||
| gp8403_ns = cg.esphome_ns.namespace("gp8403") | ||||
| GP8403 = gp8403_ns.class_("GP8403", cg.Component, i2c.I2CDevice) | ||||
|  | ||||
| GP8403Voltage = gp8403_ns.enum("GP8403Voltage") | ||||
|  | ||||
| CONF_GP8403_ID = "gp8403_id" | ||||
|  | ||||
| VOLTAGES = { | ||||
|     "5V": GP8403Voltage.GP8403_VOLTAGE_5V, | ||||
|     "10V": GP8403Voltage.GP8403_VOLTAGE_10V, | ||||
| } | ||||
|  | ||||
| CONFIG_SCHEMA = ( | ||||
|     cv.Schema( | ||||
|         { | ||||
|             cv.GenerateID(): cv.declare_id(GP8403), | ||||
|             cv.Required(CONF_VOLTAGE): cv.enum(VOLTAGES, upper=True), | ||||
|         } | ||||
|     ) | ||||
|     .extend(cv.COMPONENT_SCHEMA) | ||||
|     .extend(i2c.i2c_device_schema(0x58)) | ||||
| ) | ||||
|  | ||||
|  | ||||
| async def to_code(config): | ||||
|     var = cg.new_Pvariable(config[CONF_ID]) | ||||
|     await cg.register_component(var, config) | ||||
|     await i2c.register_i2c_device(var, config) | ||||
|  | ||||
|     cg.add(var.set_voltage(config[CONF_VOLTAGE])) | ||||
							
								
								
									
										21
									
								
								esphome/components/gp8403/gp8403.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								esphome/components/gp8403/gp8403.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| #include "gp8403.h" | ||||
|  | ||||
| #include "esphome/core/log.h" | ||||
|  | ||||
| namespace esphome { | ||||
| namespace gp8403 { | ||||
|  | ||||
| static const char *const TAG = "gp8403"; | ||||
|  | ||||
| static const uint8_t RANGE_REGISTER = 0x01; | ||||
|  | ||||
| void GP8403::setup() { this->write_register(RANGE_REGISTER, (uint8_t *) (&this->voltage_), 1); } | ||||
|  | ||||
| void GP8403::dump_config() { | ||||
|   ESP_LOGCONFIG(TAG, "GP8403:"); | ||||
|   ESP_LOGCONFIG(TAG, "  Voltage: %dV", this->voltage_ == GP8403_VOLTAGE_5V ? 5 : 10); | ||||
|   LOG_I2C_DEVICE(this); | ||||
| } | ||||
|  | ||||
| }  // namespace gp8403 | ||||
| }  // namespace esphome | ||||
							
								
								
									
										27
									
								
								esphome/components/gp8403/gp8403.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								esphome/components/gp8403/gp8403.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "esphome/components/i2c/i2c.h" | ||||
| #include "esphome/core/component.h" | ||||
|  | ||||
| namespace esphome { | ||||
| namespace gp8403 { | ||||
|  | ||||
| enum GP8403Voltage { | ||||
|   GP8403_VOLTAGE_5V = 0x00, | ||||
|   GP8403_VOLTAGE_10V = 0x11, | ||||
| }; | ||||
|  | ||||
| class GP8403 : public Component, public i2c::I2CDevice { | ||||
|  public: | ||||
|   void setup() override; | ||||
|   void dump_config() override; | ||||
|   float get_setup_priority() const override { return setup_priority::DATA; } | ||||
|  | ||||
|   void set_voltage(gp8403::GP8403Voltage voltage) { this->voltage_ = voltage; } | ||||
|  | ||||
|  protected: | ||||
|   GP8403Voltage voltage_; | ||||
| }; | ||||
|  | ||||
| }  // namespace gp8403 | ||||
| }  // namespace esphome | ||||
							
								
								
									
										31
									
								
								esphome/components/gp8403/output/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								esphome/components/gp8403/output/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| import esphome.config_validation as cv | ||||
| import esphome.codegen as cg | ||||
|  | ||||
| from esphome.components import i2c, output | ||||
| from esphome.const import CONF_ID, CONF_CHANNEL | ||||
|  | ||||
| from .. import gp8403_ns, GP8403, CONF_GP8403_ID | ||||
|  | ||||
| DEPENDENCIES = ["gp8403"] | ||||
|  | ||||
| GP8403Output = gp8403_ns.class_( | ||||
|     "GP8403Output", cg.Component, i2c.I2CDevice, output.FloatOutput | ||||
| ) | ||||
|  | ||||
| CONFIG_SCHEMA = output.FLOAT_OUTPUT_SCHEMA.extend( | ||||
|     { | ||||
|         cv.GenerateID(): cv.declare_id(GP8403Output), | ||||
|         cv.GenerateID(CONF_GP8403_ID): cv.use_id(GP8403), | ||||
|         cv.Required(CONF_CHANNEL): cv.one_of(0, 1), | ||||
|     } | ||||
| ).extend(cv.COMPONENT_SCHEMA) | ||||
|  | ||||
|  | ||||
| async def to_code(config): | ||||
|     var = cg.new_Pvariable(config[CONF_ID]) | ||||
|     await cg.register_component(var, config) | ||||
|     await output.register_output(var, config) | ||||
|  | ||||
|     await cg.register_parented(var, config[CONF_GP8403_ID]) | ||||
|  | ||||
|     cg.add(var.set_channel(config[CONF_CHANNEL])) | ||||
							
								
								
									
										26
									
								
								esphome/components/gp8403/output/gp8403_output.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								esphome/components/gp8403/output/gp8403_output.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| #include "gp8403_output.h" | ||||
|  | ||||
| #include "esphome/core/log.h" | ||||
|  | ||||
| namespace esphome { | ||||
| namespace gp8403 { | ||||
|  | ||||
| static const char *const TAG = "gp8403.output"; | ||||
|  | ||||
| static const uint8_t OUTPUT_REGISTER = 0x02; | ||||
|  | ||||
| void GP8403Output::dump_config() { | ||||
|   ESP_LOGCONFIG(TAG, "GP8403 Output:"); | ||||
|   ESP_LOGCONFIG(TAG, "  Channel: %u", this->channel_); | ||||
| } | ||||
|  | ||||
| void GP8403Output::write_state(float state) { | ||||
|   uint16_t value = ((uint16_t) (state * 4095)) << 4; | ||||
|   i2c::ErrorCode err = this->parent_->write_register(OUTPUT_REGISTER + (2 * this->channel_), (uint8_t *) &value, 2); | ||||
|   if (err != i2c::ERROR_OK) { | ||||
|     ESP_LOGE(TAG, "Error writing to GP8403, code %d", err); | ||||
|   } | ||||
| } | ||||
|  | ||||
| }  // namespace gp8403 | ||||
| }  // namespace esphome | ||||
							
								
								
									
										25
									
								
								esphome/components/gp8403/output/gp8403_output.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								esphome/components/gp8403/output/gp8403_output.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "esphome/components/output/float_output.h" | ||||
| #include "esphome/core/component.h" | ||||
|  | ||||
| #include "esphome/components/gp8403/gp8403.h" | ||||
|  | ||||
| namespace esphome { | ||||
| namespace gp8403 { | ||||
|  | ||||
| class GP8403Output : public Component, public output::FloatOutput, public Parented<GP8403> { | ||||
|  public: | ||||
|   void dump_config() override; | ||||
|   float get_setup_priority() const override { return setup_priority::DATA - 1; } | ||||
|  | ||||
|   void set_channel(uint8_t channel) { this->channel_ = channel; } | ||||
|  | ||||
|   void write_state(float state) override; | ||||
|  | ||||
|  protected: | ||||
|   uint8_t channel_; | ||||
| }; | ||||
|  | ||||
| }  // namespace gp8403 | ||||
| }  // namespace esphome | ||||
| @@ -208,6 +208,12 @@ tlc5947: | ||||
|   clock_pin: GPIO14 | ||||
|   lat_pin: GPIO15 | ||||
|  | ||||
| gp8403: | ||||
|   - id: gp8403_5v | ||||
|     voltage: 5V | ||||
|   - id: gp8403_10v | ||||
|     voltage: 10V | ||||
|  | ||||
| output: | ||||
|   - platform: gpio | ||||
|     pin: GPIO2 | ||||
| @@ -245,6 +251,15 @@ output: | ||||
|     id: Led7 | ||||
|     led: 7 | ||||
|  | ||||
|   - platform: gp8403 | ||||
|     id: gp8403_output_0 | ||||
|     gp8403_id: gp8403_5v | ||||
|     channel: 0 | ||||
|   - platform: gp8403 | ||||
|     gp8403_id: gp8403_10v | ||||
|     id: gp8403_output_1 | ||||
|     channel: 1 | ||||
|  | ||||
| demo: | ||||
|  | ||||
| esp32_ble: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user