You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
2.0 KiB

  1. #pragma once
  2. #include <cmath>
  3. #include "../common.h"
  4. #include "../front_panel_hal.h"
  5. #include "esphome/components/sensor/sensor.h"
  6. namespace esphome {
  7. namespace yeelight {
  8. namespace bs2 {
  9. /**
  10. * A sensor for the slider on the Yeelight Bedside Lamp 2.
  11. *
  12. * This sensor publishes the level at which the slider was touched, so it
  13. * can be used to implement automations. Note that it does not represent
  14. * the brightness of the LED lights (this is implemented by the light output
  15. * component), nor the level as displayed by the slider using the front
  16. * panel light (this is implemented by the slider light component).
  17. */
  18. class YeelightBS2SliderSensor : public sensor::Sensor, public Component {
  19. public:
  20. void set_parent(FrontPanelHAL *front_panel) {
  21. front_panel_ = front_panel;
  22. }
  23. void setup() {
  24. ESP_LOGCONFIG(TAG, "Setting up slider sensor ...");
  25. front_panel_->add_on_event_callback(
  26. [this](EVENT ev) {
  27. if ((ev & FLAG_PART_MASK) == FLAG_PART_SLIDER) {
  28. auto level = (ev & FLAG_LEVEL_MASK) >> FLAG_LEVEL_SHIFT;
  29. // Slider level 1 is really hard to touch. It is between
  30. // the power button and the slider space, so it doesn't
  31. // look like this one was ever meant to be used, or that
  32. // the design was faulty on this. Therefore, level 1 is
  33. // ignored here.
  34. level = max(1.0f, level - 1.0f);
  35. // Convert the slider level to a float between 0.01 and
  36. // 1.00, which is useful as a representation for a
  37. // brightness value. The input level is now between
  38. // 1 and 20.
  39. auto publish_level = max(0.01f, (level-1.0f) * (1.00f / 19.0f));
  40. this->publish_state(publish_level);
  41. }
  42. }
  43. );
  44. }
  45. protected:
  46. FrontPanelHAL *front_panel_;
  47. };
  48. } // namespace bs2
  49. } // namespace yeelight
  50. } // namespace esphome