mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 06:33:51 +00:00 
			
		
		
		
	Remove AUTO_LOAD from apds9960 (#4746)
This commit is contained in:
		| @@ -4,7 +4,6 @@ from esphome.components import i2c | ||||
| from esphome.const import CONF_ID | ||||
|  | ||||
| DEPENDENCIES = ["i2c"] | ||||
| AUTO_LOAD = ["sensor", "binary_sensor"] | ||||
| MULTI_CONF = True | ||||
|  | ||||
| CONF_APDS9960_ID = "apds9960_id" | ||||
|   | ||||
| @@ -116,8 +116,12 @@ void APDS9960::setup() { | ||||
|   APDS9960_WRITE_BYTE(0x80, val); | ||||
| } | ||||
| bool APDS9960::is_color_enabled_() const { | ||||
|   return this->red_channel_ != nullptr || this->green_channel_ != nullptr || this->blue_channel_ != nullptr || | ||||
|          this->clear_channel_ != nullptr; | ||||
| #ifdef USE_SENSOR | ||||
|   return this->red_sensor_ != nullptr || this->green_sensor_ != nullptr || this->blue_sensor_ != nullptr || | ||||
|          this->clear_sensor_ != nullptr; | ||||
| #else | ||||
|   return false; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void APDS9960::dump_config() { | ||||
| @@ -125,6 +129,15 @@ void APDS9960::dump_config() { | ||||
|   LOG_I2C_DEVICE(this); | ||||
|  | ||||
|   LOG_UPDATE_INTERVAL(this); | ||||
|  | ||||
| #ifdef USE_SENSOR | ||||
|   LOG_SENSOR("  ", "Red channel", this->red_sensor_); | ||||
|   LOG_SENSOR("  ", "Green channel", this->green_sensor_); | ||||
|   LOG_SENSOR("  ", "Blue channel", this->blue_sensor_); | ||||
|   LOG_SENSOR("  ", "Clear channel", this->clear_sensor_); | ||||
|   LOG_SENSOR("  ", "Proximity", this->proximity_sensor_); | ||||
| #endif | ||||
|  | ||||
|   if (this->is_failed()) { | ||||
|     switch (this->error_code_) { | ||||
|       case COMMUNICATION_FAILED: | ||||
| @@ -181,17 +194,22 @@ void APDS9960::read_color_data_(uint8_t status) { | ||||
|   float blue_perc = (uint_blue / float(UINT16_MAX)) * 100.0f; | ||||
|  | ||||
|   ESP_LOGD(TAG, "Got clear=%.1f%% red=%.1f%% green=%.1f%% blue=%.1f%%", clear_perc, red_perc, green_perc, blue_perc); | ||||
|   if (this->clear_channel_ != nullptr) | ||||
|     this->clear_channel_->publish_state(clear_perc); | ||||
|   if (this->red_channel_ != nullptr) | ||||
|     this->red_channel_->publish_state(red_perc); | ||||
|   if (this->green_channel_ != nullptr) | ||||
|     this->green_channel_->publish_state(green_perc); | ||||
|   if (this->blue_channel_ != nullptr) | ||||
|     this->blue_channel_->publish_state(blue_perc); | ||||
| #ifdef USE_SENSOR | ||||
|   if (this->clear_sensor_ != nullptr) | ||||
|     this->clear_sensor_->publish_state(clear_perc); | ||||
|   if (this->red_sensor_ != nullptr) | ||||
|     this->red_sensor_->publish_state(red_perc); | ||||
|   if (this->green_sensor_ != nullptr) | ||||
|     this->green_sensor_->publish_state(green_perc); | ||||
|   if (this->blue_sensor_ != nullptr) | ||||
|     this->blue_sensor_->publish_state(blue_perc); | ||||
| #endif | ||||
| } | ||||
| void APDS9960::read_proximity_data_(uint8_t status) { | ||||
|   if (this->proximity_ == nullptr) | ||||
| #ifndef USE_SENSOR | ||||
|   return; | ||||
| #else | ||||
|   if (this->proximity_sensor_ == nullptr) | ||||
|     return; | ||||
|  | ||||
|   if ((status & 0b10) == 0x00) { | ||||
| @@ -204,7 +222,8 @@ void APDS9960::read_proximity_data_(uint8_t status) { | ||||
|  | ||||
|   float prox_perc = (prox / float(UINT8_MAX)) * 100.0f; | ||||
|   ESP_LOGD(TAG, "Got proximity=%.1f%%", prox_perc); | ||||
|   this->proximity_->publish_state(prox_perc); | ||||
|   this->proximity_sensor_->publish_state(prox_perc); | ||||
| #endif | ||||
| } | ||||
| void APDS9960::read_gesture_data_() { | ||||
|   if (!this->is_gesture_enabled_()) | ||||
| @@ -256,28 +275,29 @@ void APDS9960::read_gesture_data_() { | ||||
|   } | ||||
| } | ||||
| void APDS9960::report_gesture_(int gesture) { | ||||
| #ifdef USE_BINARY_SENSOR | ||||
|   binary_sensor::BinarySensor *bin; | ||||
|   switch (gesture) { | ||||
|     case 1: | ||||
|       bin = this->up_direction_; | ||||
|       bin = this->up_direction_binary_sensor_; | ||||
|       this->gesture_up_started_ = false; | ||||
|       this->gesture_down_started_ = false; | ||||
|       ESP_LOGD(TAG, "Got gesture UP"); | ||||
|       break; | ||||
|     case 2: | ||||
|       bin = this->down_direction_; | ||||
|       bin = this->down_direction_binary_sensor_; | ||||
|       this->gesture_up_started_ = false; | ||||
|       this->gesture_down_started_ = false; | ||||
|       ESP_LOGD(TAG, "Got gesture DOWN"); | ||||
|       break; | ||||
|     case 3: | ||||
|       bin = this->left_direction_; | ||||
|       bin = this->left_direction_binary_sensor_; | ||||
|       this->gesture_left_started_ = false; | ||||
|       this->gesture_right_started_ = false; | ||||
|       ESP_LOGD(TAG, "Got gesture LEFT"); | ||||
|       break; | ||||
|     case 4: | ||||
|       bin = this->right_direction_; | ||||
|       bin = this->right_direction_binary_sensor_; | ||||
|       this->gesture_left_started_ = false; | ||||
|       this->gesture_right_started_ = false; | ||||
|       ESP_LOGD(TAG, "Got gesture RIGHT"); | ||||
| @@ -290,6 +310,7 @@ void APDS9960::report_gesture_(int gesture) { | ||||
|     bin->publish_state(true); | ||||
|     bin->publish_state(false); | ||||
|   } | ||||
| #endif | ||||
| } | ||||
| void APDS9960::process_dataset_(int up, int down, int left, int right) { | ||||
|   /* Algorithm: (see Figure 11 in datasheet) | ||||
| @@ -365,10 +386,22 @@ void APDS9960::process_dataset_(int up, int down, int left, int right) { | ||||
|   } | ||||
| } | ||||
| float APDS9960::get_setup_priority() const { return setup_priority::DATA; } | ||||
| bool APDS9960::is_proximity_enabled_() const { return this->proximity_ != nullptr || this->is_gesture_enabled_(); } | ||||
| bool APDS9960::is_proximity_enabled_() const { | ||||
|   return | ||||
| #ifdef USE_SENSOR | ||||
|       this->proximity_sensor_ != nullptr | ||||
| #else | ||||
|       false | ||||
| #endif | ||||
|       || this->is_gesture_enabled_(); | ||||
| } | ||||
| bool APDS9960::is_gesture_enabled_() const { | ||||
|   return this->up_direction_ != nullptr || this->left_direction_ != nullptr || this->down_direction_ != nullptr || | ||||
|          this->right_direction_ != nullptr; | ||||
| #ifdef USE_BINARY_SENSOR | ||||
|   return this->up_direction_binary_sensor_ != nullptr || this->left_direction_binary_sensor_ != nullptr || | ||||
|          this->down_direction_binary_sensor_ != nullptr || this->right_direction_binary_sensor_ != nullptr; | ||||
| #else | ||||
|   return false; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| }  // namespace apds9960 | ||||
|   | ||||
| @@ -1,14 +1,34 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "esphome/core/component.h" | ||||
| #include "esphome/components/i2c/i2c.h" | ||||
| #include "esphome/core/component.h" | ||||
| #include "esphome/core/defines.h" | ||||
| #ifdef USE_SENSOR | ||||
| #include "esphome/components/sensor/sensor.h" | ||||
| #endif | ||||
| #ifdef USE_BINARY_SENSOR | ||||
| #include "esphome/components/binary_sensor/binary_sensor.h" | ||||
| #endif | ||||
|  | ||||
| namespace esphome { | ||||
| namespace apds9960 { | ||||
|  | ||||
| class APDS9960 : public PollingComponent, public i2c::I2CDevice { | ||||
| #ifdef USE_SENSOR | ||||
|   SUB_SENSOR(red) | ||||
|   SUB_SENSOR(green) | ||||
|   SUB_SENSOR(blue) | ||||
|   SUB_SENSOR(clear) | ||||
|   SUB_SENSOR(proximity) | ||||
| #endif | ||||
|  | ||||
| #ifdef USE_BINARY_SENSOR | ||||
|   SUB_BINARY_SENSOR(up_direction) | ||||
|   SUB_BINARY_SENSOR(right_direction) | ||||
|   SUB_BINARY_SENSOR(down_direction) | ||||
|   SUB_BINARY_SENSOR(left_direction) | ||||
| #endif | ||||
|  | ||||
|  public: | ||||
|   void setup() override; | ||||
|   void dump_config() override; | ||||
| @@ -23,16 +43,6 @@ class APDS9960 : public PollingComponent, public i2c::I2CDevice { | ||||
|   void set_gesture_gain(uint8_t gain) { this->gesture_gain_ = gain; } | ||||
|   void set_gesture_wait_time(uint8_t wait_time) { this->gesture_wait_time_ = wait_time; } | ||||
|  | ||||
|   void set_red_channel(sensor::Sensor *red_channel) { red_channel_ = red_channel; } | ||||
|   void set_green_channel(sensor::Sensor *green_channel) { green_channel_ = green_channel; } | ||||
|   void set_blue_channel(sensor::Sensor *blue_channel) { blue_channel_ = blue_channel; } | ||||
|   void set_clear_channel(sensor::Sensor *clear_channel) { clear_channel_ = clear_channel; } | ||||
|   void set_up_direction(binary_sensor::BinarySensor *up_direction) { up_direction_ = up_direction; } | ||||
|   void set_right_direction(binary_sensor::BinarySensor *right_direction) { right_direction_ = right_direction; } | ||||
|   void set_down_direction(binary_sensor::BinarySensor *down_direction) { down_direction_ = down_direction; } | ||||
|   void set_left_direction(binary_sensor::BinarySensor *left_direction) { left_direction_ = left_direction; } | ||||
|   void set_proximity(sensor::Sensor *proximity) { proximity_ = proximity; } | ||||
|  | ||||
|  protected: | ||||
|   bool is_color_enabled_() const; | ||||
|   bool is_proximity_enabled_() const; | ||||
| @@ -50,15 +60,6 @@ class APDS9960 : public PollingComponent, public i2c::I2CDevice { | ||||
|   uint8_t gesture_gain_; | ||||
|   uint8_t gesture_wait_time_; | ||||
|  | ||||
|   sensor::Sensor *red_channel_{nullptr}; | ||||
|   sensor::Sensor *green_channel_{nullptr}; | ||||
|   sensor::Sensor *blue_channel_{nullptr}; | ||||
|   sensor::Sensor *clear_channel_{nullptr}; | ||||
|   binary_sensor::BinarySensor *up_direction_{nullptr}; | ||||
|   binary_sensor::BinarySensor *right_direction_{nullptr}; | ||||
|   binary_sensor::BinarySensor *down_direction_{nullptr}; | ||||
|   binary_sensor::BinarySensor *left_direction_{nullptr}; | ||||
|   sensor::Sensor *proximity_{nullptr}; | ||||
|   enum ErrorCode { | ||||
|     NONE = 0, | ||||
|     COMMUNICATION_FAILED, | ||||
|   | ||||
| @@ -6,19 +6,14 @@ from . import APDS9960, CONF_APDS9960_ID | ||||
|  | ||||
| DEPENDENCIES = ["apds9960"] | ||||
|  | ||||
| DIRECTIONS = { | ||||
|     "UP": "set_up_direction", | ||||
|     "DOWN": "set_down_direction", | ||||
|     "LEFT": "set_left_direction", | ||||
|     "RIGHT": "set_right_direction", | ||||
| } | ||||
| DIRECTIONS = ["up", "down", "left", "right"] | ||||
|  | ||||
| CONFIG_SCHEMA = binary_sensor.binary_sensor_schema( | ||||
|     device_class=DEVICE_CLASS_MOVING | ||||
| ).extend( | ||||
|     { | ||||
|         cv.GenerateID(CONF_APDS9960_ID): cv.use_id(APDS9960), | ||||
|         cv.Required(CONF_DIRECTION): cv.one_of(*DIRECTIONS, upper=True), | ||||
|         cv.Required(CONF_DIRECTION): cv.one_of(*DIRECTIONS, lower=True), | ||||
|     } | ||||
| ) | ||||
|  | ||||
| @@ -26,5 +21,5 @@ CONFIG_SCHEMA = binary_sensor.binary_sensor_schema( | ||||
| async def to_code(config): | ||||
|     hub = await cg.get_variable(config[CONF_APDS9960_ID]) | ||||
|     var = await binary_sensor.new_binary_sensor(config) | ||||
|     func = getattr(hub, DIRECTIONS[config[CONF_DIRECTION]]) | ||||
|     func = getattr(hub, f"set_{config[CONF_DIRECTION]}_direction_binary_sensor") | ||||
|     cg.add(func(var)) | ||||
|   | ||||
| @@ -11,13 +11,7 @@ from . import APDS9960, CONF_APDS9960_ID | ||||
|  | ||||
| DEPENDENCIES = ["apds9960"] | ||||
|  | ||||
| TYPES = { | ||||
|     "CLEAR": "set_clear_channel", | ||||
|     "RED": "set_red_channel", | ||||
|     "GREEN": "set_green_channel", | ||||
|     "BLUE": "set_blue_channel", | ||||
|     "PROXIMITY": "set_proximity", | ||||
| } | ||||
| TYPES = ["clear", "red", "green", "blue", "proximity"] | ||||
|  | ||||
| CONFIG_SCHEMA = sensor.sensor_schema( | ||||
|     unit_of_measurement=UNIT_PERCENT, | ||||
| @@ -26,7 +20,7 @@ CONFIG_SCHEMA = sensor.sensor_schema( | ||||
|     state_class=STATE_CLASS_MEASUREMENT, | ||||
| ).extend( | ||||
|     { | ||||
|         cv.Required(CONF_TYPE): cv.one_of(*TYPES, upper=True), | ||||
|         cv.Required(CONF_TYPE): cv.one_of(*TYPES, lower=True), | ||||
|         cv.GenerateID(CONF_APDS9960_ID): cv.use_id(APDS9960), | ||||
|     } | ||||
| ) | ||||
| @@ -35,5 +29,5 @@ CONFIG_SCHEMA = sensor.sensor_schema( | ||||
| async def to_code(config): | ||||
|     hub = await cg.get_variable(config[CONF_APDS9960_ID]) | ||||
|     var = await sensor.new_sensor(config) | ||||
|     func = getattr(hub, TYPES[config[CONF_TYPE]]) | ||||
|     func = getattr(hub, f"set_{config[CONF_TYPE]}_sensor") | ||||
|     cg.add(func(var)) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user