- #pragma once
-
- #include "common.h"
- #include "gpio_outputs.h"
-
- namespace esphome {
- namespace yeelight {
- namespace bs2 {
-
- /**
- * This class can handle the GPIO outputs for the night light mode.
- *
- * At the lowest brightness setting, the light will switch to night light
- * mode. In the Yeelight integration in Home Assistant, this feature is
- * exposed trough a separate switch. I have found that the switch is both
- * confusing and made me run into issues when automating the lights.
- * Using the lowest brightness for triggering the night light feels a lot
- * more natural.
- */
- class ColorNightLight : public GPIOOutputs {
- protected:
- bool set_light_color_values(light::LightColorValues v) {
- // Note: I do not check for a brightness at or below 0.01 (1%) here,
- // because the lowest brightness setting from Home Assistant turns
- // up as 0.011765 in here (which is 3/255 and not 1/100).
- if (v.get_brightness() >= 0.012f) {
- return false;
- }
-
- // This night light mode is activated when white light is selected.
- // Based on measurements using the original device firmware, so it
- // matches the night light of the original firmware.
- if (v.get_white() > 0) {
- red = 0.968f;
- green = 0.968f;
- blue = 0.972f;
- white = 0.0f;
- }
- // In RGB mode, the selected color is used to give the night light a
- // specific color, instead of the default. This is a nice extra for
- // this firmware, as the original firmware does not support it.
- else {
- red = esphome::lerp(v.get_red(), 0.9997f, 0.9680f);
- green = esphome::lerp(v.get_green(), 0.9997f, 0.9680f);
- auto blue_scale = (v.get_red() + v.get_green()) / 2.0f;
- auto blue_max = esphome::lerp(blue_scale, 0.9640f, 0.9720f);
- blue = esphome::lerp(v.get_blue(), 0.9997f, blue_max);
- white = 0.0f;
- }
-
- return true;
- }
- };
-
- } // namespace yeelight_bs2
- } // namespace yeelight
- } // namespace bs2
|