#pragma once #include "esphome/components/tuya/tuya.h" #include "esphome/components/light/light_output.h" #include "esphome/components/api/custom_api_device.h" #include "esphome/core/component.h" namespace esphome { namespace tuya { enum DayNightSensorType { BINARY, TEXT, }; class TuyaLightPlus : public light::LightOutput, public PollingComponent, public api::CustomAPIDevice { public: void setup() override; void dump_config() override; void set_switch_id(uint8_t switch_id) { this->switch_id_ = switch_id; } void set_dimmer_id(uint8_t dimmer_id) { this->dimmer_id_ = dimmer_id; } void set_min_value_datapoint_id(uint8_t min_value_datapoint_id) { this->min_value_datapoint_id_ = min_value_datapoint_id; } void set_tuya_parent(Tuya *parent) { this->parent_ = parent; } void set_min_value(uint32_t min_value) { this->min_value_ = min_value; } void set_max_value(uint32_t max_value) { this->max_value_ = max_value; } void set_light_wattage(float light_wattage) { this->light_wattage_ = light_wattage; } void set_power_sensor(sensor::Sensor *power_sensor) { this->power_sensor_ = power_sensor; } light::LightTraits get_traits() override; void setup_state(light::LightState *state) override; void write_state(light::LightState *state) override; void loop() override; void update() override; void set_linked_lights(const std::string linked_lights) { this->linked_lights_ = linked_lights; } void set_day_night_sensor(const std::string day_night_sensor) { this->day_night_sensor_ = day_night_sensor; } void set_day_night_sensor_type(DayNightSensorType day_night_sensor_type) { this->day_night_sensor_type_ = day_night_sensor_type; } void set_day_night_day_value(const std::string day_night_day_value) { this->day_night_day_value_ = day_night_day_value; } void set_day_night_night_value(const std::string day_night_night_value) { this->day_night_night_value_ = day_night_night_value; } void set_day_default_brightness(uint8_t brightness) { this->day_default_brightness_ = brightness == 0 ? optional{} : this->ha_brightness_to_brightness_(brightness); } void set_night_default_brightness(uint8_t brightness) { this->night_default_brightness_ = brightness == 0 ? optional{} : this->ha_brightness_to_brightness_(brightness); } void set_day_auto_off_time(uint32_t auto_off_time) { this->day_auto_off_time_ = auto_off_time_ == 0 ? optional{} : auto_off_time; } void set_night_auto_off_time(uint32_t auto_off_time) { this->night_auto_off_time_ = auto_off_time_ == 0 ? optional{} : auto_off_time; } void add_new_double_click_while_off_callback(std::function &&callback); void set_double_click_while_off_stays_off(bool stays_off) { this->double_click_while_off_stays_off_ = stays_off; } void add_new_double_click_while_on_callback(std::function &&callback); void set_default_brightness(int brightness) { this->set_default_brightness_(this->ha_brightness_to_brightness_(brightness)); } void set_auto_off_time(int auto_off_time) { this->auto_off_time_ = auto_off_time == 0 ? optional{} : auto_off_time; } protected: float ha_brightness_to_brightness_(int brightness) { return clamp(static_cast(brightness) / static_cast(255), 0.01f, 1.0f); } float tuya_level_to_brightness_(uint32_t level) { return static_cast(level) / static_cast(this->max_value_); } uint32_t brightness_to_tuya_level_(float brightness) { return static_cast(brightness * this->max_value_); } void set_default_brightness_(float brightness); void handle_tuya_datapoint_(TuyaDatapoint datapoint); void on_day_night_changed_(std::string state); Tuya *parent_; optional switch_id_{}; optional dimmer_id_{}; optional min_value_datapoint_id_{}; uint32_t min_value_ = 0; uint32_t max_value_ = 255; light::LightState *state_{nullptr}; optional default_brightness_{}; optional auto_off_time_{}; optional linked_lights_{}; optional day_night_sensor_{}; optional day_night_sensor_type_{}; optional day_night_day_value_{}; optional day_night_night_value_{}; optional day_default_brightness_{}; optional night_default_brightness_{}; optional day_auto_off_time_{}; optional night_auto_off_time_{}; optional light_wattage_{}; sensor::Sensor *power_sensor_; CallbackManager double_click_while_off_callback_{}; CallbackManager double_click_while_on_callback_{}; bool has_double_click_while_off_{false}; bool double_click_while_off_stays_off_{true}; bool has_double_click_while_on_{false}; long double_click_while_off_timeout_ = 0; long double_click_while_on_timeout_ = 0; bool tuya_state_is_on_{false}; long last_state_change_ = 0; }; class DoubleClickWhileOffTrigger : public Trigger<> { public: DoubleClickWhileOffTrigger(TuyaLightPlus *light) { light->add_new_double_click_while_off_callback([this, light]() { this->trigger(); }); } }; class DoubleClickWhileOnTrigger : public Trigger<> { public: DoubleClickWhileOnTrigger(TuyaLightPlus *light) { light->add_new_double_click_while_on_callback([this, light]() { this->trigger(); }); } }; } // namespace tuya } // namespace esphome