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.
 
 

57 lines
2.0 KiB

#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