esphome/nesp.yml
Chris Cochrun 7742ff8909 grr
2025-07-08 09:34:25 -05:00

1501 lines
44 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# neo-nesp UI
packages:
colors: !include colors/HOMEASSISTANT
font:
- file: 'gfonts://Roboto@400'
glyphs: ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ°.:/+-%'
id: roboto_reg
size: 24
bpp: 4
extras:
# https://pictogrammers.github.io
- file: "fonts/materialdesignicons-webfont.ttf"
glyphs: [
"\U000F050F", # mdi:thermometer
"\U000F058E", # mdi:water-percent
"\U000F0425", # mdi:power
"\U000F0238", # mdi:fire
"\U000F1A45", # mdi:heat-wave
"\U000F0717", # mdi:snowflake
"\U000F1A79", # mdi:sun-snowflake-variant
"\U000F0210", # mdi:fan
"\U000F171D", # mdi:fan-auto
"\U000F1472", # mdi:fan-speed-1
"\U000F1473", # mdi:fan-speed-2
"\U000F1474", # mdi:fan-speed-3
"\U000F032A", # mdi:leaf
"\U000F04B9", # mdi:sofa
"\U000F14DE", # mdi:rocket-launch
"\U000F0D80", # mdi:home-floor-1
"\U000F0D81", # mdi:home-floor-2
"\U000F004D", # mdi:arrow-left
"\U000F09DF", # mdi:circle-small
"\U000F0E03", # mdi:thermometer-chevron-up
"\U000F0E02", # mdi:thermometer-chevron-down
"\U000F0594", # mdi:weather-night (clear)
"\U000F0590", # mdi:weather-cloudy (cloudy)
"\U000F0898", # mdi:weather-hurricane (cyclone, tropical_cyclone)
"\U000F0F30", # mdi:weather-hazy (dust, dusty, haze, hazy)
"\U000F0591", # mdi:weather-fog (fog)
"\U000F12CB", # mdi:snowflake-melt (frost)
"\U000F0596", # mdi:weather-pouring (heavy_shower, heavy_showers, rain)
"\U000F0F33", # mdi:weather-partly-rainy (light_rain)
# mdi:weather-light-showers (light_shower, light_showers)
"\U000F0599", # mdi:weather-sunny (mostly_sunny, sunny)
"\U000F0595", # mdi:weather-partly-cloudy (partly_cloudy)
"\U000F0597", # mdi:weather-rainy (shower, showers)
"\U000F0598", # mdi:weather-snowy (snow)
"\U000F0593", # mdi:weather-lightning
"\U000F067E", # mdi:weather-lightning-rainy (storm, storms)
"\U000F059D", # mdi:weather-windy (wind, windy)
"\U000F0592", # mdi:weather-hail
]
- file: 'gfonts://Roboto@400'
glyphs: ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ°.:/+-%'
id: roboto_med
size: 48
bpp: 4
extras:
# https://pictogrammers.github.io
- file: "fonts/materialdesignicons-webfont.ttf"
glyphs: [
"\U000F050F", # mdi:thermometer
"\U000F058E", # mdi:water-percent
"\U000F0425", # mdi:power
"\U000F0238", # mdi:fire
"\U000F1A45", # mdi:heat-wave
"\U000F0717", # mdi:snowflake
"\U000F1A79", # mdi:sun-snowflake-variant
"\U000F0210", # mdi:fan
"\U000F171D", # mdi:fan-auto
"\U000F1472", # mdi:fan-speed-1
"\U000F1473", # mdi:fan-speed-2
"\U000F1474", # mdi:fan-speed-3
"\U000F032A", # mdi:leaf
"\U000F04B9", # mdi:sofa
"\U000F14DE", # mdi:rocket-launch
"\U000F0D80", # mdi:home-floor-1
"\U000F0D81", # mdi:home-floor-2
"\U000F004D", # mdi:arrow-left
"\U000F09DF", # mdi:circle-small
"\U000F0E03", # mdi:thermometer-chevron-up
"\U000F0E02", # mdi:thermometer-chevron-down
"\U000F0594", # mdi:weather-night (clear)
"\U000F0590", # mdi:weather-cloudy (cloudy)
"\U000F0898", # mdi:weather-hurricane (cyclone, tropical_cyclone)
"\U000F0F30", # mdi:weather-hazy (dust, dusty, haze, hazy)
"\U000F0591", # mdi:weather-fog (fog)
"\U000F12CB", # mdi:snowflake-melt (frost)
"\U000F0596", # mdi:weather-pouring (heavy_shower, heavy_showers, rain)
"\U000F0F33", # mdi:weather-partly-rainy (light_rain)
# mdi:weather-light-showers (light_shower, light_showers)
"\U000F0599", # mdi:weather-sunny (mostly_sunny, sunny)
"\U000F0595", # mdi:weather-partly-cloudy (partly_cloudy)
"\U000F0597", # mdi:weather-rainy (shower, showers)
"\U000F0598", # mdi:weather-snowy (snow)
"\U000F0593", # mdi:weather-lightning
"\U000F067E", # mdi:weather-lightning-rainy (storm, storms)
"\U000F059D", # mdi:weather-windy (wind, windy)
"\U000F0592", # mdi:weather-hail
]
- file: 'gfonts://Roboto@400'
glyphs: ' -0123456789.°C'
id: roboto_huge
size: 90
bpp: 4
extras:
# https://pictogrammers.github.io
- file: "fonts/materialdesignicons-webfont.ttf"
glyphs: [
"\U000F171D", # mdi:fan-auto
"\U000F1472", # mdi:fan-speed-1
"\U000F1473", # mdi:fan-speed-2
"\U000F1474", # mdi:fan-speed-3
"\U000F0594", # mdi:weather-night (clear)
"\U000F0590", # mdi:weather-cloudy (cloudy)
"\U000F0898", # mdi:weather-hurricane (cyclone, tropical_cyclone)
"\U000F0F30", # mdi:weather-hazy (dust, dusty, haze, hazy)
"\U000F0591", # mdi:weather-fog (fog)
"\U000F12CB", # mdi:snowflake-melt (frost)
"\U000F0596", # mdi:weather-pouring (heavy_shower, heavy_showers, rain)
"\U000F0F33", # mdi:weather-partly-rainy (light_rain)
# mdi:weather-light-showers (light_shower, light_showers)
"\U000F0599", # mdi:weather-sunny (mostly_sunny, sunny)
"\U000F0595", # mdi:weather-partly-cloudy (partly_cloudy)
"\U000F0597", # mdi:weather-rainy (shower, showers)
"\U000F0598", # mdi:weather-snowy (snow)
"\U000F0593", # mdi:weather-lightning
"\U000F067E", # mdi:weather-lightning-rainy (storm, storms)
"\U000F059D", # mdi:weather-windy (wind, windy)
"\U000F0592", # mdi:weather-hail
]
globals:
- id: active_lvgl_page
type: std::string
lvgl:
encoders:
enter_button: push_button
sensor: rotary
bg_color: black
scrollbar_mode: "OFF"
default_font: roboto_reg
text_color: white
style_definitions:
- id: style_menu_button
align: CENTER
bg_opa: TRANSP
shadow_opa: TRANSP
height: 50
width: 50
radius: 50%
- id: style_menu_button_label
align: CENTER
y: 3
text_font: roboto_med
pages:
### GUI - THERMOSTAT
- id: main_page
on_load:
- globals.set:
id: active_lvgl_page
value: '"main_page"'
widgets:
- arc:
id: arc_bg
height: 468
width: 468
align: CENTER
arc_color: graylight
arc_opa: COVER
arc_width: 2
arc_rounded: false
- arc:
id: current_temp_arc
adjustable: true
state:
disabled: true
min_value: 120 # 12°C (* 10 because decimals not supported)
max_value: 340 # 34°C
height: 468
width: 468
align: CENTER
arc_color: graylight
arc_opa: COVER
arc_width: 2
arc_rounded: false
indicator:
arc_color: graylight
arc_opa: COVER
arc_width: 2
arc_rounded: false
knob:
bg_color: white
value: 230
- meter:
id: meter_ticks
height: 480
width: 480
align: CENTER
bg_opa: TRANSP
border_width: 0
scales:
range_from: 120 # 12°C (* 10 because decimals not supported)
range_to: 340 # 34°C
ticks:
count: 89
length: 37
width: 3
color: graylight
indicators:
- line:
id: set_temp_needle
color: white
width: 8
r_mod: 10
value: 230
- arc:
id: diff_temp_arc
start_value: 120
end_value: 230
color: white
width: 2
r_mod: 10
- obj:
id: mode_bg
height: 350
width: 350
radius: 175
align: CENTER
border_width: 0
bg_color: black
- roller:
id: set_temp_roller
state:
disabled: true
align: CENTER
anim_time: 500ms
text_font: roboto_med
text_opa: TRANSP
bg_opa: TRANSP
border_width: 0
text_line_space: 30
visible_row_count: 2
selected:
text_font: roboto_huge
text_opa: COVER
bg_opa: TRANSP
border_width: 0
options:
- 16.0
- 16.5
- 17.0
- 17.5
- 18.0
- 18.5
- 19.0
- 19.5
- 20.0
- 20.5
- 21.0
- 21.5
- 22.0
- 22.5
- 23.0
- 23.5
- 24.0
- 24.5
- 25.0
- 25.5
- 26.0
- 26.5
- 27.0
- 27.5
- 28.0
- 28.5
- 29.0
- 29.5
- 30.0
selected_index: 14
- label:
id: celsius_label
align: CENTER
x: 100
y: -43
text: "°C"
- label:
id: mode_label
align: CENTER
y: -100
text: "NESP"
- label:
id: weather_icon_label
hidden: true
align: CENTER
y: -100
text_font: roboto_huge
text: " "
- label:
id: weather_temp_label
hidden: true
align: CENTER
text_font: roboto_huge
text: " "
- label:
id: weather_forecast_label
hidden: true
align: CENTER
y: 70
text: " "
- label:
id: weather_feels_like_label
hidden: true
align: CENTER
y: 130
text: " "
- label:
id: big_fan_icon_label
hidden: true
align: CENTER
text_font: roboto_huge
text: " "
- label:
id: zone_1_label
align: CENTER
x: -15
y: 90
text_color: graydarker
text: "\U000F0D80"
- label:
id: zone_2_label
align: CENTER
x: 15
y: 90
text_color: graydarker
text: "\U000F0D81"
- label:
id: current_temp_label
align: CENTER
y: 120
text: " "
- label:
id: fan_icon_label
align: CENTER
y: 210
text_font: roboto_med
text: " "
### GUI - MENU
- id: menu_page
on_load:
- globals.set:
id: active_lvgl_page
value: '"menu_page"'
- script.execute: update_menu_date_label
- lvgl.widget.enable:
- menu_zone_2_button
- menu_zone_1_button
- menu_back_button
- menu_power_button
- menu_mode_button
- menu_preset_button
- menu_fan_button
- lvgl.widget.focus: menu_power_button
on_unload:
- lvgl.widget.disable:
- menu_zone_2_button
- menu_zone_1_button
- menu_back_button
- menu_power_button
- menu_mode_button
- menu_preset_button
- menu_fan_button
widgets:
- label:
id: menu_date_label
align: LEFT_MID
x: 30
y: -60
text_align: LEFT
text_color: graydark
text: "SUN 00:00"
- label:
id: menu_weather_icon_label
align: LEFT_MID
x: 30
y: -27
text_align: LEFT
text: "\U000F0599"
- label:
id: menu_weather_label
align: LEFT_MID
x: 60
y: -30
text_align: LEFT
text: "00°C"
- label:
id: menu_indoor_label
align: LEFT_MID
x: 30
y: 10
text_align: LEFT
text_color: graydark
text: "INDOOR"
- label:
id: menu_zone_icon_label
align: LEFT_MID
x: 30
y: 58
text_align: LEFT
text: "\U000F0D81\n\U000F0D80"
- label:
id: menu_zone_temp_label
align: LEFT_MID
x: 60
y: 55
text_align: LEFT
text: "00°C 00%H\n00°C 00%H"
- label:
id: selected_menu_label
align: CENTER
x: 55
text_font: roboto_med
text_align: RIGHT
- button:
id: menu_zone_2_button
state:
disabled: true
x: 0
y: -210
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F0D81"
on_focus:
- lvgl.label.update:
id: selected_menu_label
text: "Upstairs\nZone"
on_press:
- homeassistant.action:
action: cover.toggle
data:
entity_id: ${zone_2_entity}
- button:
id: menu_zone_1_button
state:
disabled: true
x: 105 # 210sin(30) clock coords
y: -182 # 210cos(30)
styles: style_menu_button
widgets:
- label:
align: CENTER
y: 3
text_font: roboto_med
text: "\U000F0D80"
on_focus:
- lvgl.label.update:
id: selected_menu_label
text: "Downstairs\nZone"
on_press:
- homeassistant.action:
action: cover.toggle
data:
entity_id: ${zone_1_entity}
- button:
id: menu_back_button
state:
disabled: true
x: 182
y: -105
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F004D"
on_focus:
- lvgl.label.update:
id: selected_menu_label
text: "Back"
on_press:
- script.execute: goto_main_page
- button:
id: menu_power_button
state:
disabled: true
x: 210
y: 0
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F0425"
on_focus:
- if:
condition:
lambda: 'return strcmp(id(hvac_mode).state.c_str(), "off") == 0;'
then:
lvgl.label.update:
id: selected_menu_label
text: "Turn On"
else:
lvgl.label.update:
id: selected_menu_label
text: "Turn Off"
on_press:
- homeassistant.action:
action: climate.toggle
data:
entity_id: ${climate_entity}
- script.execute: goto_main_page
- button:
id: menu_mode_button
state:
disabled: true
x: 182
y: 105
styles: style_menu_button
widgets:
- label:
id: menu_mode_button_label
styles: style_menu_button_label
text: "\U000F0238"
on_focus:
- lvgl.label.update:
id: selected_menu_label
text: "Mode"
on_press:
- script.execute: goto_mode_page
- button:
id: menu_preset_button
state:
disabled: true
x: 105
y: 182
styles: style_menu_button
widgets:
- label:
id: menu_preset_button_label
styles: style_menu_button_label
text: "\U000F032A"
on_focus:
- lvgl.label.update:
id: selected_menu_label
text: "Presets"
on_press:
- script.execute: goto_preset_page
- button:
id: menu_fan_button
state:
disabled: true
styles: style_menu_button
x: 0
y: 210
widgets:
- label:
id: menu_fan_button_label
styles: style_menu_button_label
text: "\U000F0210"
on_focus:
- lvgl.label.update:
id: selected_menu_label
text: "Fan\nSpeed"
on_press:
- script.execute: goto_fan_page
### GUI - MODE SELECT
- id: mode_page
on_load:
- globals.set:
id: active_lvgl_page
value: '"mode_page"'
- lvgl.widget.enable:
- mode_back_button
- mode_heat_cool_button
- mode_cool_button
- mode_heat_button
- mode_fan_button
- mode_dry_button
- lvgl.widget.focus: mode_cool_button
on_unload:
- lvgl.widget.disable:
- mode_back_button
- mode_heat_cool_button
- mode_cool_button
- mode_heat_button
- mode_fan_button
- mode_dry_button
widgets:
- label:
id: selected_mode_label
align: CENTER
x: 55
text_font: roboto_med
text_align: RIGHT
- button:
id: mode_back_button
state:
disabled: true
x: 105 # 210sin(30) clock coords
y: -182 # 210cos(30)
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F004D"
on_focus:
- lvgl.label.update:
id: selected_mode_label
text: "Back"
on_press:
- script.execute: goto_menu_page
- button:
id: mode_heat_cool_button
state:
disabled: true
x: 182
y: -105
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F1A79"
on_focus:
- lvgl.label.update:
id: selected_mode_label
text: "Auto"
on_press:
- homeassistant.action:
action: climate.set_hvac_mode
data:
entity_id: ${climate_entity}
hvac_mode: "heat_cool"
- script.execute: goto_main_page
- button:
id: mode_cool_button
state:
disabled: true
x: 210
y: 0
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F0717"
on_focus:
- lvgl.label.update:
id: selected_mode_label
text: "Cool"
on_press:
- homeassistant.action:
action: climate.set_hvac_mode
data:
entity_id: ${climate_entity}
hvac_mode: "cool"
- script.execute: goto_main_page
- button:
id: mode_heat_button
state:
disabled: true
x: 182
y: 105
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F0238"
on_focus:
- lvgl.label.update:
id: selected_mode_label
text: "Heat"
on_press:
- homeassistant.action:
action: climate.set_hvac_mode
data:
entity_id: ${climate_entity}
hvac_mode: "heat"
- script.execute: goto_main_page
- button:
id: mode_fan_button
state:
disabled: true
x: 105
y: 182
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F0210"
on_focus:
- lvgl.label.update:
id: selected_mode_label
text: "Fan"
on_press:
- homeassistant.action:
action: climate.set_hvac_mode
data:
entity_id: ${climate_entity}
hvac_mode: "fan_only"
- script.execute: goto_main_page
- button:
id: mode_dry_button
state:
disabled: true
x: 0
y: 210
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F058E"
on_focus:
- lvgl.label.update:
id: selected_mode_label
text: "Dehumidify"
on_press:
- homeassistant.action:
action: climate.set_hvac_mode
data:
entity_id: ${climate_entity}
hvac_mode: "dry"
- script.execute: goto_main_page
### GUI - PRESET SELECT
- id: preset_page
on_load:
- globals.set:
id: active_lvgl_page
value: '"preset_page"'
- lvgl.widget.enable:
- preset_back_button
- preset_eco_button
- preset_comfort_button
- preset_boost_button
- lvgl.widget.focus: preset_eco_button
on_unload:
- lvgl.widget.disable:
- preset_back_button
- preset_eco_button
- preset_comfort_button
- preset_boost_button
widgets:
- label:
id: selected_preset_label
align: CENTER
x: 55
text_font: roboto_med
text_align: RIGHT
- button:
id: preset_back_button
state:
disabled: true
x: 182
y: -105
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F004D"
on_focus:
- lvgl.label.update:
id: selected_preset_label
text: "Back"
on_press:
- script.execute: goto_menu_page
- button:
id: preset_eco_button
state:
disabled: true
x: 210
y: 0
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F032A"
on_focus:
- lvgl.label.update:
id: selected_preset_label
text: "Eco"
on_press:
- if:
condition:
lambda: 'return strcmp(id(preset_mode).state.c_str(), "eco") == 0;'
then:
- homeassistant.action:
action: climate.set_preset_mode
data:
entity_id: ${climate_entity}
preset_mode: "none"
else:
- homeassistant.action:
action: climate.set_preset_mode
data:
entity_id: ${climate_entity}
preset_mode: "eco"
- script.execute: goto_main_page
- button:
id: preset_comfort_button
state:
disabled: true
x: 182
y: 105
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F04B9"
on_focus:
- lvgl.label.update:
id: selected_preset_label
text: "Comfort"
on_press:
- if:
condition:
lambda: 'return strcmp(id(preset_mode).state.c_str(), "comfort") == 0;'
then:
- homeassistant.action:
action: climate.set_preset_mode
data:
entity_id: ${climate_entity}
preset_mode: "none"
else:
- homeassistant.action:
action: climate.set_preset_mode
data:
entity_id: ${climate_entity}
preset_mode: "comfort"
- script.execute: goto_main_page
- button:
id: preset_boost_button
state:
disabled: true
x: 105
y: 182
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F14DE"
on_focus:
- lvgl.label.update:
id: selected_preset_label
text: "Boost"
on_press:
- if:
condition:
lambda: 'return strcmp(id(preset_mode).state.c_str(), "boost") == 0;'
then:
- homeassistant.action:
action: climate.set_preset_mode
data:
entity_id: ${climate_entity}
preset_mode: "none"
else:
- homeassistant.action:
action: climate.set_preset_mode
data:
entity_id: ${climate_entity}
preset_mode: "boost"
- script.execute: goto_main_page
### GUI - FAN SPEED SELECT
- id: fan_page
on_load:
- globals.set:
id: active_lvgl_page
value: '"fan_page"'
- lvgl.widget.enable:
- fan_back_button
- fan_auto_button
- fan_high_button
- fan_medium_button
- fan_low_button
- lvgl.widget.focus: fan_auto_button
on_unload:
- lvgl.widget.disable:
- fan_back_button
- fan_auto_button
- fan_high_button
- fan_medium_button
- fan_low_button
widgets:
- label:
id: selected_fan_label
align: CENTER
x: 55
text_font: roboto_med
text_align: RIGHT
- button:
id: fan_back_button
state:
disabled: true
x: 182
y: -105
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F004D"
on_focus:
- lvgl.label.update:
id: selected_fan_label
text: "Back"
on_press:
- script.execute: goto_menu_page
- button:
id: fan_auto_button
state:
disabled: true
x: 210
y: 0
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F171D"
on_focus:
- lvgl.label.update:
id: selected_fan_label
text: "Auto"
on_press:
- homeassistant.action:
action: climate.set_fan_mode
data:
entity_id: ${climate_entity}
fan_mode: "auto"
- script.execute: goto_main_page
- button:
id: fan_high_button
state:
disabled: true
x: 182
y: 105
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F1474"
on_focus:
- lvgl.label.update:
id: selected_fan_label
text: "High"
on_press:
- homeassistant.action:
action: climate.set_fan_mode
data:
entity_id: ${climate_entity}
fan_mode: "high"
- script.execute: goto_main_page
- button:
id: fan_medium_button
state:
disabled: true
x: 105
y: 182
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F1473"
on_focus:
- lvgl.label.update:
id: selected_fan_label
text: "Medium"
on_press:
- homeassistant.action:
action: climate.set_fan_mode
data:
entity_id: ${climate_entity}
fan_mode: "medium"
- script.execute: goto_main_page
- button:
id: fan_low_button
state:
disabled: true
x: 0
y: 210
styles: style_menu_button
widgets:
- label:
styles: style_menu_button_label
text: "\U000F1472"
on_focus:
- lvgl.label.update:
id: selected_fan_label
text: "Low"
on_press:
- homeassistant.action:
action: climate.set_fan_mode
data:
entity_id: ${climate_entity}
fan_mode: "low"
- script.execute: goto_main_page
script:
- id: vibrate
parameters:
length_ms: int
then:
# XXX doesn't delay properly for short lengths (10-100ms)
- switch.turn_on: vibration
- delay: !lambda return length_ms;
- switch.turn_off: vibration
# navigate to pages with animation
- id: goto_main_page
then:
- lvgl.page.show:
id: main_page
animation: FADE_OUT
time: 500ms
- id: goto_menu_page
then:
- lvgl.page.show:
id: menu_page
animation: FADE_IN
time: 500ms
- id: goto_mode_page
then:
- lvgl.page.show:
id: mode_page
animation: FADE_IN
time: 500ms
- id: goto_preset_page
then:
- lvgl.page.show:
id: preset_page
animation: FADE_IN
time: 500ms
- id: goto_fan_page
then:
- lvgl.page.show:
id: fan_page
animation: FADE_IN
time: 500ms
# hvac mode UI scripts
- id: update_menu_date_label
then:
- lvgl.label.update:
id: menu_date_label
text: !lambda |-
auto now = id(hass_time).now();
static const char * const day_names[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
static char buf[10];
snprintf(buf, sizeof(buf), "%s %02d:%02d", day_names[now.day_of_week-1], now.hour, now.minute);
return buf;
- id: update_menu_zone_temp_label
then:
- lvgl.label.update:
id: menu_zone_temp_label
text:
format: "%.0f°C \U000F058E %.0f%%\n%.0f°C \U000F058E %.0f%%"
args: [ 'round(id(zone_2_temp).state)', 'round(id(zone_2_humidity).state)', 'round(id(zone_1_temp).state)', 'round(id(zone_1_humidity).state)' ]
- id: set_mode_off
then:
- script.execute: hide_widgets
- lvgl.label.update:
id: mode_label
text: "OFF"
- lvgl.widget.update:
id: mode_bg
bg_color: black
- light.turn_off: rgb_ring
- lvgl.label.update:
id: menu_mode_button_label
text_color: white
text: "\U000F0717"
- lvgl.widget.update:
id: menu_power_button
text_color: graydark
- lvgl.widget.update:
id: mode_heat_button
text_color: white
- lvgl.widget.update:
id: mode_cool_button
text_color: white
- lvgl.widget.update:
id: mode_fan_button
text_color: white
- lvgl.widget.update:
id: mode_dry_button
text_color: white
- lvgl.widget.update:
id: mode_heat_cool_button
text_color: white
- id: set_mode_heat
then:
- script.execute: show_widgets
- lvgl.label.update:
id: mode_label
text: "HEAT TO"
- lvgl.widget.update:
id: mode_bg
bg_color: mode_heat
- light.turn_on:
id: rgb_ring
brightness: 100%
red: 1.000
green: 0.533
blue: 0.118
- lvgl.label.update:
id: menu_mode_button_label
text_color: mode_heat
text: "\U000F0238"
- lvgl.widget.update:
id: menu_power_button
text_color: white
- lvgl.widget.update:
id: mode_heat_button
text_color: mode_heat
- lvgl.widget.update:
id: mode_cool_button
text_color: white
- lvgl.widget.update:
id: mode_fan_button
text_color: white
- lvgl.widget.update:
id: mode_dry_button
text_color: white
- lvgl.widget.update:
id: mode_heat_cool_button
text_color: white
- id: set_mode_cool
then:
- script.execute: show_widgets
- lvgl.label.update:
id: mode_label
text: "COOL TO"
- lvgl.widget.update:
id: mode_bg
bg_color: mode_cool
- light.turn_on:
id: rgb_ring
brightness: 100%
red: 0.498
green: 0.675
blue: 1.000
- lvgl.label.update:
id: menu_mode_button_label
text_color: mode_cool
text: "\U000F0717"
- lvgl.widget.update:
id: menu_power_button
text_color: white
- lvgl.widget.update:
id: mode_heat_button
text_color: white
- lvgl.widget.update:
id: mode_cool_button
text_color: mode_cool
- lvgl.widget.update:
id: mode_fan_button
text_color: white
- lvgl.widget.update:
id: mode_dry_button
text_color: white
- lvgl.widget.update:
id: mode_heat_cool_button
text_color: white
- id: set_mode_fan
then:
- script.execute: show_widgets
- lvgl.widget.hide:
- current_temp_arc
- set_temp_roller
- celsius_label
- current_temp_label
- fan_icon_label
- lvgl.indicator.update:
id: set_temp_needle
opa: TRANSP
- lvgl.indicator.update:
id: diff_temp_arc
opa: TRANSP
- lvgl.widget.show:
- big_fan_icon_label
- lvgl.label.update:
id: mode_label
text: "FAN ONLY"
- lvgl.widget.update:
id: mode_bg
bg_color: mode_fan
- light.turn_on:
id: rgb_ring
brightness: 100%
red: 0.749
green: 0.980
blue: 1.000
- lvgl.label.update:
id: menu_mode_button_label
text_color: mode_fan
text: "\U000F0210"
- lvgl.widget.update:
id: menu_power_button
text_color: white
- lvgl.widget.update:
id: mode_heat_button
text_color: white
- lvgl.widget.update:
id: mode_cool_button
text_color: white
- lvgl.widget.update:
id: mode_fan_button
text_color: mode_fan
- lvgl.widget.update:
id: mode_dry_button
text_color: white
- lvgl.widget.update:
id: mode_heat_cool_button
text_color: white
- id: set_mode_dry
then:
- script.execute: show_widgets
- lvgl.label.update:
id: mode_label
text: "DEHUMIDIFY"
- lvgl.widget.update:
id: mode_bg
bg_color: mode_dry
- light.turn_on:
id: rgb_ring
brightness: 100%
red: 1.000
green: 0.753
blue: 0.549
- lvgl.label.update:
id: menu_mode_button_label
text_color: mode_dry
text: "\U000F058E"
- lvgl.widget.update:
id: menu_power_button
text_color: white
- lvgl.widget.update:
id: mode_heat_button
text_color: white
- lvgl.widget.update:
id: mode_cool_button
text_color: white
- lvgl.widget.update:
id: mode_fan_button
text_color: white
- lvgl.widget.update:
id: mode_dry_button
text_color: mode_dry
- lvgl.widget.update:
id: mode_heat_cool_button
text_color: white
- id: set_mode_heat_cool
then:
- script.execute: show_widgets
- lvgl.label.update:
id: mode_label
text: "AUTO TO"
- lvgl.widget.update:
id: mode_bg
bg_color: graylight
- light.turn_on:
id: rgb_ring
brightness: 100%
red: 1.000
green: 0.894
blue: 0.804
- lvgl.label.update:
id: menu_mode_button_label
text_color: mode_heat_cool
text: "\U000F1A79"
- lvgl.widget.update:
id: menu_power_button
text_color: white
- lvgl.widget.update:
id: mode_heat_button
text_color: white
- lvgl.widget.update:
id: mode_cool_button
text_color: white
- lvgl.widget.update:
id: mode_fan_button
text_color: white
- lvgl.widget.update:
id: mode_dry_button
text_color: white
- lvgl.widget.update:
id: mode_heat_cool_button
text_color: mode_heat_cool
# preset mode UI scripts
- id: set_preset_none
then:
- lvgl.label.update:
id: menu_preset_button_label
text_color: white
text: "\U000F032A"
- lvgl.widget.update:
id: preset_eco_button
text_color: white
- lvgl.widget.update:
id: preset_comfort_button
text_color: white
- lvgl.widget.update:
id: preset_boost_button
text_color: white
- id: set_preset_eco
then:
- lvgl.label.update:
id: menu_preset_button_label
text_color: green
text: "\U000F032A"
- lvgl.widget.update:
id: preset_eco_button
text_color: green
- lvgl.widget.update:
id: preset_comfort_button
text_color: white
- lvgl.widget.update:
id: preset_boost_button
text_color: white
- id: set_preset_comfort
then:
- lvgl.label.update:
id: menu_preset_button_label
text_color: amber
text: "\U000F04B9"
- lvgl.widget.update:
id: preset_eco_button
text_color: white
- lvgl.widget.update:
id: preset_comfort_button
text_color: amber
- lvgl.widget.update:
id: preset_boost_button
text_color: white
- id: set_preset_boost
then:
- lvgl.label.update:
id: menu_preset_button_label
text_color: red
text: "\U000F14DE"
- lvgl.widget.update:
id: preset_eco_button
text_color: white
- lvgl.widget.update:
id: preset_comfort_button
text_color: white
- lvgl.widget.update:
id: preset_boost_button
text_color: red
# fan UI scripts
- id: set_fan_auto
then:
- lvgl.label.update:
id: big_fan_icon_label
text: "\U000F171D"
- lvgl.label.update:
id: fan_icon_label
text: "\U000F171D"
- lvgl.label.update:
id: menu_fan_button_label
text: "\U000F171D"
- id: set_fan_low
then:
- lvgl.label.update:
id: big_fan_icon_label
text: "\U000F1472"
- lvgl.label.update:
id: fan_icon_label
text: "\U000F1472"
- lvgl.label.update:
id: menu_fan_button_label
text: "\U000F1472"
- id: set_fan_medium
then:
- lvgl.label.update:
id: big_fan_icon_label
text: "\U000F1473"
- lvgl.label.update:
id: fan_icon_label
text: "\U000F1473"
- lvgl.label.update:
id: menu_fan_button_label
text: "\U000F1473"
- id: set_fan_high
then:
- lvgl.label.update:
id: big_fan_icon_label
text: "\U000F1474"
- lvgl.label.update:
id: fan_icon_label
text: "\U000F1474"
- lvgl.label.update:
id: menu_fan_button_label
text: "\U000F1474"
# zone UI scripts
- id: set_zone_1
then:
- lvgl.label.update:
id: zone_1_label
text_color: white
- lvgl.widget.update:
id: menu_zone_1_button
text_color: white
- id: unset_zone_1
then:
- lvgl.label.update:
id: zone_1_label
text_color: graydark
- lvgl.widget.update:
id: menu_zone_1_button
text_color: graydark
- id: set_zone_2
then:
- lvgl.label.update:
id: zone_2_label
text_color: white
- lvgl.widget.update:
id: menu_zone_2_button
text_color: white
- id: unset_zone_2
then:
- lvgl.label.update:
id: zone_2_label
text_color: graydark
- lvgl.widget.update:
id: menu_zone_2_button
text_color: graydark
# OFF mode weather UI scripts
- id: update_weather_forecast_label
then:
lvgl.label.update:
id: weather_forecast_label
text: !lambda |-
auto low = round(id(bom_low_temp).state);
auto high = round(id(bom_high_temp).state);
auto rain = round(id(bom_rain_chance).state);
static char buf[32];
if (!isnan(low)) {
snprintf(buf, sizeof(buf), "\U000F0E03 %.0f%.0f°C \U000F0597 %.0f%%", low, high, rain);
} else {
snprintf(buf, sizeof(buf), "\U000F0E03 %.0f°C \U000F0597 %.0f%%", high, rain);
}
return buf;
- id: show_widgets
then:
- lvgl.widget.show:
- current_temp_arc
- set_temp_roller
- celsius_label
- fan_icon_label
- current_temp_label
- zone_1_label
- zone_2_label
- meter_ticks
- mode_label
- lvgl.widget.hide:
- big_fan_icon_label
- weather_icon_label
- weather_temp_label
- weather_forecast_label
- weather_feels_like_label
- lvgl.indicator.update:
id: set_temp_needle
opa: COVER
- lvgl.indicator.update:
id: diff_temp_arc
opa: COVER
- id: hide_widgets
then:
- lvgl.widget.hide:
- big_fan_icon_label
- current_temp_arc
- set_temp_roller
- celsius_label
- fan_icon_label
- current_temp_label
- zone_1_label
- zone_2_label
- meter_ticks
- mode_label
- lvgl.widget.show:
- weather_icon_label
- weather_temp_label
- weather_forecast_label
- weather_feels_like_label
- lvgl.indicator.update:
id: set_temp_needle
opa: TRANSP
- lvgl.indicator.update:
id: diff_temp_arc
opa: TRANSP