#pragma once #include "../common.h" #include "interfaces.h" #include "esphome/components/light/light_state.h" namespace esphome { namespace xiaomi { namespace bslamp2 { // Can be replaced with light::LightStateRTCState once pull request // https://github.com/esphome/esphome/pull/1735 is merged. struct MyLightStateRTCState { bool state{false}; float brightness{1.0f}; float red{1.0f}; float green{1.0f}; float blue{1.0f}; float white{1.0f}; float color_temp{1.0f}; uint32_t effect{0}; }; /** * A custom LightState class for the Xiaomi Bedside Lamp 2. * * It is used by the DiscoAction to apply immediate light output * updates, without saving or publishing the new state. */ class XiaomiBslamp2LightState : public light::LightState, public LightStateDiscoSupport { public: XiaomiBslamp2LightState(const std::string &name, XiaomiBslamp2LightOutput *output) : light::LightState(name, output) { } void disco_stop() { MyLightStateRTCState recovered{}; if (this->rtc_.load(&recovered)) { auto call = make_disco_call(true); call.set_state(recovered.state); call.set_brightness_if_supported(recovered.brightness); call.set_red_if_supported(recovered.red); call.set_green_if_supported(recovered.green); call.set_blue_if_supported(recovered.blue); call.set_white_if_supported(recovered.white); call.set_color_temperature_if_supported(recovered.color_temp); if (recovered.effect != 0) { call.set_effect(recovered.effect); } else { call.set_transition_length_if_supported(0); } call.perform(); } } void disco_apply() { this->output_->write_state(this); this->next_write_ = false; } light::LightCall make_disco_call(bool save_and_publish) { auto call = this->make_call(); call.set_save(save_and_publish); call.set_publish(save_and_publish); return call; } }; } // namespace bslamp2 } // namespace xiaomi } // namespace esphome