293 lines
9.5 KiB
YAML
293 lines
9.5 KiB
YAML
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;
|
|
}
|
|
}
|