mirror of
https://github.com/esphome/esphome.git
synced 2024-11-10 09:17:46 +01:00
commit
9b230a7d93
8 changed files with 85 additions and 64 deletions
|
@ -4,7 +4,6 @@ from esphome.components import i2c
|
||||||
from esphome.const import CONF_ID
|
from esphome.const import CONF_ID
|
||||||
|
|
||||||
DEPENDENCIES = ["i2c"]
|
DEPENDENCIES = ["i2c"]
|
||||||
AUTO_LOAD = ["sensor", "binary_sensor"]
|
|
||||||
MULTI_CONF = True
|
MULTI_CONF = True
|
||||||
|
|
||||||
CONF_APDS9960_ID = "apds9960_id"
|
CONF_APDS9960_ID = "apds9960_id"
|
||||||
|
|
|
@ -116,8 +116,12 @@ void APDS9960::setup() {
|
||||||
APDS9960_WRITE_BYTE(0x80, val);
|
APDS9960_WRITE_BYTE(0x80, val);
|
||||||
}
|
}
|
||||||
bool APDS9960::is_color_enabled_() const {
|
bool APDS9960::is_color_enabled_() const {
|
||||||
return this->red_channel_ != nullptr || this->green_channel_ != nullptr || this->blue_channel_ != nullptr ||
|
#ifdef USE_SENSOR
|
||||||
this->clear_channel_ != nullptr;
|
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() {
|
void APDS9960::dump_config() {
|
||||||
|
@ -125,6 +129,15 @@ void APDS9960::dump_config() {
|
||||||
LOG_I2C_DEVICE(this);
|
LOG_I2C_DEVICE(this);
|
||||||
|
|
||||||
LOG_UPDATE_INTERVAL(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()) {
|
if (this->is_failed()) {
|
||||||
switch (this->error_code_) {
|
switch (this->error_code_) {
|
||||||
case COMMUNICATION_FAILED:
|
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;
|
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);
|
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)
|
#ifdef USE_SENSOR
|
||||||
this->clear_channel_->publish_state(clear_perc);
|
if (this->clear_sensor_ != nullptr)
|
||||||
if (this->red_channel_ != nullptr)
|
this->clear_sensor_->publish_state(clear_perc);
|
||||||
this->red_channel_->publish_state(red_perc);
|
if (this->red_sensor_ != nullptr)
|
||||||
if (this->green_channel_ != nullptr)
|
this->red_sensor_->publish_state(red_perc);
|
||||||
this->green_channel_->publish_state(green_perc);
|
if (this->green_sensor_ != nullptr)
|
||||||
if (this->blue_channel_ != nullptr)
|
this->green_sensor_->publish_state(green_perc);
|
||||||
this->blue_channel_->publish_state(blue_perc);
|
if (this->blue_sensor_ != nullptr)
|
||||||
|
this->blue_sensor_->publish_state(blue_perc);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
void APDS9960::read_proximity_data_(uint8_t status) {
|
void APDS9960::read_proximity_data_(uint8_t status) {
|
||||||
if (this->proximity_ == nullptr)
|
#ifndef USE_SENSOR
|
||||||
|
return;
|
||||||
|
#else
|
||||||
|
if (this->proximity_sensor_ == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((status & 0b10) == 0x00) {
|
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;
|
float prox_perc = (prox / float(UINT8_MAX)) * 100.0f;
|
||||||
ESP_LOGD(TAG, "Got proximity=%.1f%%", prox_perc);
|
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_() {
|
void APDS9960::read_gesture_data_() {
|
||||||
if (!this->is_gesture_enabled_())
|
if (!this->is_gesture_enabled_())
|
||||||
|
@ -256,28 +275,29 @@ void APDS9960::read_gesture_data_() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void APDS9960::report_gesture_(int gesture) {
|
void APDS9960::report_gesture_(int gesture) {
|
||||||
|
#ifdef USE_BINARY_SENSOR
|
||||||
binary_sensor::BinarySensor *bin;
|
binary_sensor::BinarySensor *bin;
|
||||||
switch (gesture) {
|
switch (gesture) {
|
||||||
case 1:
|
case 1:
|
||||||
bin = this->up_direction_;
|
bin = this->up_direction_binary_sensor_;
|
||||||
this->gesture_up_started_ = false;
|
this->gesture_up_started_ = false;
|
||||||
this->gesture_down_started_ = false;
|
this->gesture_down_started_ = false;
|
||||||
ESP_LOGD(TAG, "Got gesture UP");
|
ESP_LOGD(TAG, "Got gesture UP");
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
bin = this->down_direction_;
|
bin = this->down_direction_binary_sensor_;
|
||||||
this->gesture_up_started_ = false;
|
this->gesture_up_started_ = false;
|
||||||
this->gesture_down_started_ = false;
|
this->gesture_down_started_ = false;
|
||||||
ESP_LOGD(TAG, "Got gesture DOWN");
|
ESP_LOGD(TAG, "Got gesture DOWN");
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
bin = this->left_direction_;
|
bin = this->left_direction_binary_sensor_;
|
||||||
this->gesture_left_started_ = false;
|
this->gesture_left_started_ = false;
|
||||||
this->gesture_right_started_ = false;
|
this->gesture_right_started_ = false;
|
||||||
ESP_LOGD(TAG, "Got gesture LEFT");
|
ESP_LOGD(TAG, "Got gesture LEFT");
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
bin = this->right_direction_;
|
bin = this->right_direction_binary_sensor_;
|
||||||
this->gesture_left_started_ = false;
|
this->gesture_left_started_ = false;
|
||||||
this->gesture_right_started_ = false;
|
this->gesture_right_started_ = false;
|
||||||
ESP_LOGD(TAG, "Got gesture RIGHT");
|
ESP_LOGD(TAG, "Got gesture RIGHT");
|
||||||
|
@ -290,6 +310,7 @@ void APDS9960::report_gesture_(int gesture) {
|
||||||
bin->publish_state(true);
|
bin->publish_state(true);
|
||||||
bin->publish_state(false);
|
bin->publish_state(false);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
void APDS9960::process_dataset_(int up, int down, int left, int right) {
|
void APDS9960::process_dataset_(int up, int down, int left, int right) {
|
||||||
/* Algorithm: (see Figure 11 in datasheet)
|
/* 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; }
|
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 {
|
bool APDS9960::is_gesture_enabled_() const {
|
||||||
return this->up_direction_ != nullptr || this->left_direction_ != nullptr || this->down_direction_ != nullptr ||
|
#ifdef USE_BINARY_SENSOR
|
||||||
this->right_direction_ != nullptr;
|
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
|
} // namespace apds9960
|
||||||
|
|
|
@ -1,14 +1,34 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "esphome/core/component.h"
|
|
||||||
#include "esphome/components/i2c/i2c.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"
|
#include "esphome/components/sensor/sensor.h"
|
||||||
|
#endif
|
||||||
|
#ifdef USE_BINARY_SENSOR
|
||||||
#include "esphome/components/binary_sensor/binary_sensor.h"
|
#include "esphome/components/binary_sensor/binary_sensor.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace apds9960 {
|
namespace apds9960 {
|
||||||
|
|
||||||
class APDS9960 : public PollingComponent, public i2c::I2CDevice {
|
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:
|
public:
|
||||||
void setup() override;
|
void setup() override;
|
||||||
void dump_config() 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_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_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:
|
protected:
|
||||||
bool is_color_enabled_() const;
|
bool is_color_enabled_() const;
|
||||||
bool is_proximity_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_gain_;
|
||||||
uint8_t gesture_wait_time_;
|
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 {
|
enum ErrorCode {
|
||||||
NONE = 0,
|
NONE = 0,
|
||||||
COMMUNICATION_FAILED,
|
COMMUNICATION_FAILED,
|
||||||
|
|
|
@ -6,19 +6,14 @@ from . import APDS9960, CONF_APDS9960_ID
|
||||||
|
|
||||||
DEPENDENCIES = ["apds9960"]
|
DEPENDENCIES = ["apds9960"]
|
||||||
|
|
||||||
DIRECTIONS = {
|
DIRECTIONS = ["up", "down", "left", "right"]
|
||||||
"UP": "set_up_direction",
|
|
||||||
"DOWN": "set_down_direction",
|
|
||||||
"LEFT": "set_left_direction",
|
|
||||||
"RIGHT": "set_right_direction",
|
|
||||||
}
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = binary_sensor.binary_sensor_schema(
|
CONFIG_SCHEMA = binary_sensor.binary_sensor_schema(
|
||||||
device_class=DEVICE_CLASS_MOVING
|
device_class=DEVICE_CLASS_MOVING
|
||||||
).extend(
|
).extend(
|
||||||
{
|
{
|
||||||
cv.GenerateID(CONF_APDS9960_ID): cv.use_id(APDS9960),
|
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):
|
async def to_code(config):
|
||||||
hub = await cg.get_variable(config[CONF_APDS9960_ID])
|
hub = await cg.get_variable(config[CONF_APDS9960_ID])
|
||||||
var = await binary_sensor.new_binary_sensor(config)
|
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))
|
cg.add(func(var))
|
||||||
|
|
|
@ -11,13 +11,7 @@ from . import APDS9960, CONF_APDS9960_ID
|
||||||
|
|
||||||
DEPENDENCIES = ["apds9960"]
|
DEPENDENCIES = ["apds9960"]
|
||||||
|
|
||||||
TYPES = {
|
TYPES = ["clear", "red", "green", "blue", "proximity"]
|
||||||
"CLEAR": "set_clear_channel",
|
|
||||||
"RED": "set_red_channel",
|
|
||||||
"GREEN": "set_green_channel",
|
|
||||||
"BLUE": "set_blue_channel",
|
|
||||||
"PROXIMITY": "set_proximity",
|
|
||||||
}
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = sensor.sensor_schema(
|
CONFIG_SCHEMA = sensor.sensor_schema(
|
||||||
unit_of_measurement=UNIT_PERCENT,
|
unit_of_measurement=UNIT_PERCENT,
|
||||||
|
@ -26,7 +20,7 @@ CONFIG_SCHEMA = sensor.sensor_schema(
|
||||||
state_class=STATE_CLASS_MEASUREMENT,
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
).extend(
|
).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),
|
cv.GenerateID(CONF_APDS9960_ID): cv.use_id(APDS9960),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -35,5 +29,5 @@ CONFIG_SCHEMA = sensor.sensor_schema(
|
||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
hub = await cg.get_variable(config[CONF_APDS9960_ID])
|
hub = await cg.get_variable(config[CONF_APDS9960_ID])
|
||||||
var = await sensor.new_sensor(config)
|
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))
|
cg.add(func(var))
|
||||||
|
|
|
@ -275,7 +275,7 @@ SPRINKLER_ACTION_SET_RUN_DURATION_SCHEMA = cv.Schema(
|
||||||
SPRINKLER_ACTION_QUEUE_VALVE_SCHEMA = cv.Schema(
|
SPRINKLER_ACTION_QUEUE_VALVE_SCHEMA = cv.Schema(
|
||||||
{
|
{
|
||||||
cv.Required(CONF_ID): cv.use_id(Sprinkler),
|
cv.Required(CONF_ID): cv.use_id(Sprinkler),
|
||||||
cv.Optional(CONF_RUN_DURATION, default=0): cv.templatable(
|
cv.Optional(CONF_RUN_DURATION, default="0s"): cv.templatable(
|
||||||
cv.positive_time_period_seconds
|
cv.positive_time_period_seconds
|
||||||
),
|
),
|
||||||
cv.Required(CONF_VALVE_NUMBER): cv.templatable(cv.positive_int),
|
cv.Required(CONF_VALVE_NUMBER): cv.templatable(cv.positive_int),
|
||||||
|
|
|
@ -767,11 +767,10 @@ bool WiFiComponent::wifi_ap_ip_config_(optional<ManualIP> manual_ip) {
|
||||||
info.gw.addr = static_cast<uint32_t>(network::IPAddress(192, 168, 4, 1));
|
info.gw.addr = static_cast<uint32_t>(network::IPAddress(192, 168, 4, 1));
|
||||||
info.netmask.addr = static_cast<uint32_t>(network::IPAddress(255, 255, 255, 0));
|
info.netmask.addr = static_cast<uint32_t>(network::IPAddress(255, 255, 255, 0));
|
||||||
}
|
}
|
||||||
esp_netif_dhcp_status_t dhcp_status;
|
|
||||||
esp_netif_dhcps_get_status(s_sta_netif, &dhcp_status);
|
err = esp_netif_dhcpc_stop(s_sta_netif);
|
||||||
err = esp_netif_dhcps_stop(s_sta_netif);
|
if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) {
|
||||||
if (err != ESP_OK) {
|
ESP_LOGV(TAG, "esp_netif_dhcpc_stop failed: %s", esp_err_to_name(err));
|
||||||
ESP_LOGV(TAG, "esp_netif_dhcps_stop failed! %d", err);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
"""Constants used by esphome."""
|
"""Constants used by esphome."""
|
||||||
|
|
||||||
__version__ = "2023.5.0b1"
|
__version__ = "2023.5.0b2"
|
||||||
|
|
||||||
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue