20260326
This commit is contained in:
292
esphome/widgets/light/light_brightness_widget.yaml
Normal file
292
esphome/widgets/light/light_brightness_widget.yaml
Normal file
@@ -0,0 +1,292 @@
|
||||
substitutions:
|
||||
|
||||
exit_icon: "\U0000e902"
|
||||
|
||||
globals:
|
||||
- id: ${widget_name}_light_is_on
|
||||
type: bool
|
||||
initial_value: 'false'
|
||||
- id: ${widget_name}_current_brightness
|
||||
type: float
|
||||
initial_value: '1.0'
|
||||
- id: ${widget_name}_updating_from_ha
|
||||
type: bool
|
||||
initial_value: 'false'
|
||||
- id: ${widget_name}_ha_data_received
|
||||
type: bool
|
||||
initial_value: 'false'
|
||||
- id: ${widget_name}_sensors_ready_count
|
||||
type: int
|
||||
initial_value: '0'
|
||||
|
||||
sensor:
|
||||
# Brightness sensor
|
||||
- platform: homeassistant
|
||||
id: ${widget_name}_light_rgb_sensor_brightness
|
||||
entity_id: "${light_entity}"
|
||||
attribute: brightness
|
||||
on_value:
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return !std::isnan(x);'
|
||||
then:
|
||||
- lambda: |-
|
||||
static bool first_brightness_received = false;
|
||||
if (!first_brightness_received) {
|
||||
first_brightness_received = true;
|
||||
id(${widget_name}_sensors_ready_count) += 1;
|
||||
}
|
||||
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return !id(${widget_name}_updating_from_ha);'
|
||||
then:
|
||||
- globals.set:
|
||||
id: ${widget_name}_current_brightness
|
||||
value: !lambda return x;
|
||||
- lvgl.slider.update:
|
||||
id: ${widget_name}_light_rgb_brightness_slider
|
||||
value: !lambda return int(x);
|
||||
else:
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return !id(${widget_name}_updating_from_ha);'
|
||||
then:
|
||||
- globals.set:
|
||||
id: ${widget_name}_current_brightness
|
||||
value: '0.0'
|
||||
- lvgl.slider.update:
|
||||
id: ${widget_name}_light_rgb_brightness_slider
|
||||
value: 0
|
||||
- script.execute: ${widget_name}_check_all_data_ready
|
||||
|
||||
text_sensor:
|
||||
- platform: homeassistant
|
||||
id: ${widget_name}_light_rgb_state
|
||||
entity_id: "${light_entity}"
|
||||
on_value:
|
||||
- lambda: |-
|
||||
bool is_on = (x == "on");
|
||||
bool was_on = id(${widget_name}_light_is_on);
|
||||
id(${widget_name}_light_is_on) = is_on;
|
||||
|
||||
static bool first_state_received = false;
|
||||
if (!first_state_received) {
|
||||
first_state_received = true;
|
||||
id(${widget_name}_sensors_ready_count) += 1;
|
||||
}
|
||||
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return id(${widget_name}_light_is_on);'
|
||||
then:
|
||||
- lvgl.button.update:
|
||||
id: ${widget_name}_light_rgb_light_on
|
||||
bg_color: color_amber
|
||||
shadow_color: color_amber
|
||||
shadow_opa: 100%
|
||||
- lvgl.label.update:
|
||||
id: ${widget_name}_light_on
|
||||
text_color: color_amber
|
||||
|
||||
else:
|
||||
|
||||
- lvgl.button.update:
|
||||
id: ${widget_name}_light_rgb_light_on
|
||||
bg_color: color_white
|
||||
shadow_opa: TRANSP
|
||||
- lvgl.label.update:
|
||||
id: ${widget_name}_light_on
|
||||
text_color: color_steel_blue
|
||||
|
||||
- script.execute: ${widget_name}_check_all_data_ready
|
||||
|
||||
- platform: homeassistant
|
||||
id: ${widget_name}_light_rgb_name
|
||||
entity_id: "${light_entity}"
|
||||
attribute: friendly_name
|
||||
on_value:
|
||||
then:
|
||||
- lvgl.label.update:
|
||||
id: ${widget_name}_light_rgb_lable_name
|
||||
text: !lambda return x;
|
||||
|
||||
lvgl:
|
||||
pages:
|
||||
- id: ${widget_name}_light_rgb_page
|
||||
bg_color: color_slate_blue_gray
|
||||
widgets:
|
||||
- button:
|
||||
id: ${widget_name}_light_rgb_bg_name
|
||||
y: 20
|
||||
width: 440
|
||||
height: 40
|
||||
align: TOP_MID
|
||||
bg_color: color_steel_blue
|
||||
bg_opa: 20%
|
||||
shadow_opa: TRANSP
|
||||
radius: 10
|
||||
widgets:
|
||||
- label:
|
||||
id: ${widget_name}_light_rgb_lable_name
|
||||
align: CENTER
|
||||
text_font: nunito_16
|
||||
text_color: color_misty_blue
|
||||
text: "lightbulb"
|
||||
|
||||
- button:
|
||||
id: ${widget_name}_light_rgb_bg_lightbulb
|
||||
x: 20
|
||||
y: 80
|
||||
width: 200
|
||||
height: 280
|
||||
align: TOP_LEFT
|
||||
bg_color: color_steel_blue
|
||||
bg_opa: 20%
|
||||
shadow_opa: TRANSP
|
||||
radius: 10
|
||||
widgets:
|
||||
- button:
|
||||
id: ${widget_name}_light_rgb_light_on
|
||||
width: 70
|
||||
height: 70
|
||||
y: 74
|
||||
align: TOP_MID
|
||||
bg_color: color_white
|
||||
shadow_color: color_white
|
||||
shadow_ofs_y: -3
|
||||
shadow_spread: 3
|
||||
shadow_width: 15
|
||||
radius: 40
|
||||
- image:
|
||||
y: 30
|
||||
align: CENTER
|
||||
src: lightbulb_image
|
||||
id: ${widget_name}_lightbulb_image
|
||||
- button:
|
||||
id: ${widget_name}_light_rgb_light_on_btn
|
||||
width: 200
|
||||
height: 280
|
||||
align: CENTER
|
||||
bg_opa: TRANSP
|
||||
shadow_opa: TRANSP
|
||||
on_press:
|
||||
- homeassistant.service:
|
||||
service: light.toggle
|
||||
data:
|
||||
entity_id: "${light_entity}"
|
||||
|
||||
- obj:
|
||||
id: ${widget_name}_light_rgb_bg_slider
|
||||
x: -20
|
||||
y: 80
|
||||
width: 220
|
||||
height: 380
|
||||
align: TOP_RIGHT
|
||||
bg_color: color_steel_blue
|
||||
bg_opa: 20%
|
||||
border_opa: TRANSP
|
||||
shadow_opa: TRANSP
|
||||
radius: 20
|
||||
widgets:
|
||||
- button:
|
||||
id: ${widget_name}_light_rgb_brightness_gradient
|
||||
radius: 20
|
||||
width: 100
|
||||
height: 300
|
||||
align: CENTER
|
||||
bg_color: color_slate_blue_gray
|
||||
bg_opa: 100%
|
||||
shadow_opa: TRANSP
|
||||
|
||||
- slider:
|
||||
id: ${widget_name}_light_rgb_brightness_slider
|
||||
radius: 20
|
||||
width: 100
|
||||
height: 300
|
||||
align: CENTER
|
||||
bg_opa: TRANSP
|
||||
min_value: 3
|
||||
max_value: 255
|
||||
indicator:
|
||||
bg_color: color_amber
|
||||
radius: 10
|
||||
knob:
|
||||
bg_opa: TRANSP
|
||||
on_value:
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return !id(${widget_name}_updating_from_ha) && id(${widget_name}_ha_data_received);'
|
||||
then:
|
||||
- globals.set:
|
||||
id: ${widget_name}_current_brightness
|
||||
value: !lambda return x;
|
||||
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return !id(${widget_name}_light_is_on) && x > 3;'
|
||||
then:
|
||||
- homeassistant.service:
|
||||
service: light.turn_on
|
||||
data:
|
||||
entity_id: "${light_entity}"
|
||||
brightness: !lambda return int(x);
|
||||
on_release:
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return id(${widget_name}_ha_data_received);'
|
||||
then:
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return x <= 3;'
|
||||
then:
|
||||
- homeassistant.service:
|
||||
service: light.turn_off
|
||||
data:
|
||||
entity_id: "${light_entity}"
|
||||
else:
|
||||
- homeassistant.service:
|
||||
service: light.turn_on
|
||||
data:
|
||||
entity_id: "${light_entity}"
|
||||
brightness: !lambda return int(x);
|
||||
|
||||
- button:
|
||||
id: ${widget_name}_light_rgb_exit_on_btn
|
||||
x: 20
|
||||
y: -20
|
||||
width: 200
|
||||
height: 80
|
||||
align: BOTTOM_LEFT
|
||||
bg_color: color_steel_blue
|
||||
bg_opa: 20%
|
||||
border_opa: TRANSP
|
||||
shadow_opa: TRANSP
|
||||
radius: 10
|
||||
widgets:
|
||||
- label:
|
||||
id: ${widget_name}_light_rgb_exit_on_icon
|
||||
align: CENTER
|
||||
text_font: icons_28
|
||||
text_color: color_misty_blue
|
||||
text: "${exit_icon}"
|
||||
on_press:
|
||||
then:
|
||||
- lvgl.widget.show: menu_controls_main
|
||||
- lvgl.page.show:
|
||||
id: lights_group_page
|
||||
animation: OUT_RIGHT
|
||||
time: 300ms
|
||||
|
||||
script:
|
||||
- id: ${widget_name}_check_all_data_ready
|
||||
mode: restart
|
||||
then:
|
||||
- delay: 500ms
|
||||
- lambda: |-
|
||||
if (id(${widget_name}_sensors_ready_count) >= 2) {
|
||||
if (!id(${widget_name}_ha_data_received)) {
|
||||
id(${widget_name}_ha_data_received) = true;
|
||||
id(${widget_name}_updating_from_ha) = false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user