Files
esphome-configs/mcu-desk-lamp.yaml

144 lines
3.4 KiB
YAML

substitutions:
device: desk-lamp
name: Mi Desk Lamp
comment: ""
esphome:
name: mcu-${device}
comment: ${comment}
esp32:
board: m5stack-atom
framework:
type: esp-idf
version: 5.1.2
platform_version: 6.6.0
packages:
common: !include common/common.yaml
# Mi Desk Lamp
# Pin Function (Name)
# GPIO18: Warm White (GPIO_PWM2)
# GPIO19: Cold White (GPIO_PWM1)
# GPIO21: Rotary switch A pin (GPIO_ROT_A)
# GPIO26: Rotary switch B pin (GPIO_ROT_B)
# GPIO36: Button (GPIO_KEY1)
binary_sensor:
- platform: gpio
pin:
number: 36
inverted: yes
id: rotary_button
# filters:
# invert:
on_click:
- light.toggle: mi_desk_light
# on_double_click:
# - switch.toggle: relay_2
light:
- platform: cwww
name: "${name} Light"
id: mi_desk_light
gamma_correct: 1
default_transition_length: 100ms
restore_mode: ALWAYS_OFF
cold_white: cold_white
warm_white: warm_white
cold_white_color_temperature: 153 mireds
warm_white_color_temperature: 370 mireds
output:
- platform: ledc
pin: 18
max_power: 0.85
id: warm_white
- platform: ledc
pin: 19
max_power: 0.85
id: cold_white
sensor:
- platform: rotary_encoder
id: rotary
pin_a: 21
pin_b: 26
resolution: "2"
# min_value: 128
# max_value: 255
# on_value:
# - while:
# condition:
# binary_sensor.is_off: button
# then:
# - light.dim_relative:
# id: mi_desk_light
# relative_brightness: 5%
# transition_length: 0.1s
# - delay: 0.1s
# filters:
# - or:
# - debounce: 0.1s
# - delta: 10
# - lambda: |-
# if (x < 0.0) return 0.0;
# if (x > 255.0) return 255.0;
# return x;
# on_value:
# then:
# # - output.set_level:
# # id: warm_white
# # level: !lambda "return x/256.0;"
# - output.set_level:
# id: warm_white
# level: !lambda |-
# return x / 255;
on_value:
then:
- lambda: |-
float brightness;
float temp = id(mi_desk_light).remote_values.get_color_temperature();
auto call = id(mi_desk_light).turn_on();
id(mi_desk_light).remote_values.as_brightness( &brightness );
// positive rotation
if (id(rotary).state > 0) {
//
if (id(rotary_button).state) {
temp -= 5.0f;
} else {
brightness -= 0.05f;
}
id(rotary).set_value(0);
// negative rotation
} else if (id(rotary).state < 0) {
if (id(rotary_button).state) {
temp += 5.0f;
} else {
brightness += 0.05f;
}
id(rotary).set_value(0);
}
// out of bounds check for brightness
if (brightness < 0.1f) {
brightness = 0.1f;
} else if (brightness > 1.0f) {
brightness = 1.0f;
}
// out of bounds check for color temp
if (temp < 153.0f) {
temp = 153.0f;
} else if (temp > 370.0f) {
temp = 370.0f;
}
// apply new settings
call.set_brightness(brightness);
call.set_color_temperature(temp);
call.perform();