Files
hassos_config/esphome/widgets/settings.yaml
2026-03-26 12:10:21 +01:00

622 lines
23 KiB
YAML

globals:
- id: display_timeout
type: int
restore_value: true
initial_value: "2"
- id: current_language
type: int
restore_value: yes
initial_value: '6'
- id: vacuum_translations
type: std::map<std::string, std::string>
- id: cover_translations
type: std::map<std::string, std::string>
- id: climate_translations
type: std::map<std::string, std::string>
- id: weather_translations
type: std::map<std::string, std::string>
- id: alarm_panel_translations
type: std::map<std::string, std::string>
text_sensor:
- platform: homeassistant
id: translations_lang
entity_id: sensor.display_tools
on_value:
- lambda: |-
std::string lang_code = x;
int lang_index = id(flag_icon_mapping_index).get(lang_code);
if (lang_index != 0 || lang_code == "de") {
id(current_language) = lang_index;
}
- lvgl.dropdown.update:
id: language_dropdown
selected_index: !lambda |-
int index = id(flag_icon_mapping_index).get(x);
if (index != 0 || x == "de") {
return index;
}
return 6;
- lvgl.image.update:
id: flag_language_image
src: !lambda |-
int index = id(flag_icon_mapping_index).get(x);
if (index != 0 || x == "de") {
return id(flag_icon_mapping_image)[index];
}
return id(flag_icon_mapping_image)[6];
- platform: homeassistant
id: translations_vacuum
entity_id: sensor.display_tools
attribute: vacuum
on_value:
then:
- lambda: |-
if (x.length() > 0) {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, x);
if (!error) {
id(vacuum_translations).clear();
for (auto kv : doc.as<JsonObject>()) {
id(vacuum_translations)[kv.key().c_str()] = kv.value().as<std::string>();
}
}
}
- platform: homeassistant
id: translations_cover
entity_id: sensor.display_tools
attribute: cover
on_value:
then:
- lambda: |-
if (x.length() > 0) {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, x);
if (!error) {
id(cover_translations).clear();
for (auto kv : doc.as<JsonObject>()) {
id(cover_translations)[kv.key().c_str()] = kv.value().as<std::string>();
}
}
}
- platform: homeassistant
id: translations_climate
entity_id: sensor.display_tools
attribute: climate
on_value:
then:
- lambda: |-
if (x.length() > 0) {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, x);
if (!error) {
id(climate_translations).clear();
for (auto kv : doc.as<JsonObject>()) {
id(climate_translations)[kv.key().c_str()] = kv.value().as<std::string>();
}
}
}
- platform: homeassistant
id: translations_weather
entity_id: sensor.display_tools
attribute: weather
on_value:
then:
- lambda: |-
if (x.length() > 0) {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, x);
if (!error) {
id(weather_translations).clear();
for (auto kv : doc.as<JsonObject>()) {
id(weather_translations)[kv.key().c_str()] = kv.value().as<std::string>();
}
}
}
- platform: homeassistant
id: translations_alarm_panel
entity_id: sensor.display_tools
attribute: alarm_control_panel
on_value:
then:
- lambda: |-
if (x.length() > 0) {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, x);
if (!error) {
id(alarm_panel_translations).clear();
for (auto kv : doc.as<JsonObject>()) {
id(alarm_panel_translations)[kv.key().c_str()] = kv.value().as<std::string>();
}
}
}
script:
- id: get_translation
parameters:
component_param: string
key_param: string
then:
- lambda: |-
std::string component = component_param;
std::string key = key_param;
std::string result = key;
if (component == "vacuum") {
auto it = id(vacuum_translations).find(key);
if (it != id(vacuum_translations).end()) {
result = it->second;
}
} else if (component == "cover") {
auto it = id(cover_translations).find(key);
if (it != id(cover_translations).end()) {
result = it->second;
}
} else if (component == "climate") {
auto it = id(climate_translations).find(key);
if (it != id(climate_translations).end()) {
result = it->second;
}
} else if (component == "weather") {
auto it = id(weather_translations).find(key);
if (it != id(weather_translations).end()) {
result = it->second;
}
} else if (component == "alarm_panel") {
auto it = id(alarm_panel_translations).find(key);
if (it != id(alarm_panel_translations).end()) {
result = it->second;
}
}
lvgl:
on_idle:
timeout: !lambda "return (id(display_timeout_number).state * 60 * 1000);"
then:
- if:
condition:
lambda: 'return id(display_timeout_number).state >= 0;'
then:
- logger.log: "LVGL is idle"
- light.turn_off: display_backlight
- lvgl.pause:
else:
- logger.log: "LVGL idle, but backlight is on"
pages:
- id: settings_page
bg_color: color_slate_blue_gray
widgets:
# language:
- obj:
id: language_bg
x: 20
y: 20
width: 440
height: 100
align: TOP_LEFT
pad_all: 0
bg_color: color_steel_blue
bg_opa: 20%
border_opa: TRANSP
border_width: 0
shadow_opa: TRANSP
radius: 10
widgets:
- label:
id: language_label
x: 20
align: LEFT_MID
text_font: nunito_20
text_color: color_misty_blue
text: "Language"
- image:
id: flag_language_image
x: 160
align: LEFT_MID
src: !lambda return id(flag_icon_mapping_image)[id(current_language)];
- dropdown:
id: language_dropdown
x: 240
width: 200
align: LEFT_MID
options:
- Deutsch # de
- Español # es
- Français # fr
- English (GB) # en-GB
- Italiano # it
- Português # pt
- Русский # ru
- English (US) # en
- Polski # pl
- Türkçe # tr
- Svenska # sv
- Română # ro
- Nederlands # nl
- Magyar # hu
- Bahasa Indonesia # id
- Tiếng Việt # vi
- Čeština # cs
- Suomi # fi
bg_opa: TRANSP
shadow_opa: TRANSP
border_opa: TRANSP
border_width: 0
text_font: nunito_20
text_color: color_misty_blue
dropdown_list:
bg_color: color_slate_blue_gray
shadow_opa: TRANSP
border_color: color_misty_blue
border_width: 2
text_font: nunito_20
text_color: color_misty_blue
text_line_space: 7
pad_all: 8
max_height: 280
selected:
checked:
bg_color: color_steel_blue
bg_opa: 20%
text_color: color_misty_blue
pressed:
bg_opa: TRANSP
text_color: color_misty_blue
indicator:
text_opa: TRANSP
on_value:
- lvgl.image.update:
id: flag_language_image
src: !lambda return id(flag_icon_mapping_image)[x];
- homeassistant.action:
action: display_tools.get_translations_esphome
data:
language: !lambda return id(flag_icon_mapping_name).get(x).c_str();
category: entity_component
keys: '[
"component.vacuum.entity_component._.state.cleaning",
"component.vacuum.entity_component._.state.docked",
"component.vacuum.entity_component._.state.error",
"component.vacuum.entity_component._.state.idle",
"component.vacuum.entity_component._.state.off",
"component.vacuum.entity_component._.state.on",
"component.vacuum.entity_component._.state.paused",
"component.vacuum.entity_component._.state.returning",
"component.cover.entity_component._.state.closed",
"component.cover.entity_component._.state.closing",
"component.cover.entity_component._.state.open",
"component.cover.entity_component._.state.opening",
"component.cover.entity_component._.state.stopped",
"component.climate.entity_component._.state_attributes.hvac_action.state.cooling",
"component.climate.entity_component._.state_attributes.hvac_action.state.defrosting",
"component.climate.entity_component._.state_attributes.hvac_action.state.drying",
"component.climate.entity_component._.state_attributes.hvac_action.state.fan",
"component.climate.entity_component._.state_attributes.hvac_action.state.heating",
"component.climate.entity_component._.state_attributes.hvac_action.state.idle",
"component.climate.entity_component._.state_attributes.hvac_action.state.off",
"component.weather.entity_component._.state.clear-night",
"component.weather.entity_component._.state.cloudy",
"component.weather.entity_component._.state.exceptional",
"component.weather.entity_component._.state.fog",
"component.weather.entity_component._.state.hail",
"component.weather.entity_component._.state.lightning",
"component.weather.entity_component._.state.lightning-rainy",
"component.weather.entity_component._.state.partlycloudy",
"component.weather.entity_component._.state.pouring",
"component.weather.entity_component._.state.rainy",
"component.weather.entity_component._.state.snowy",
"component.weather.entity_component._.state.snowy-rainy",
"component.weather.entity_component._.state.sunny",
"component.weather.entity_component._.state.windy",
"component.weather.entity_component._.state.windy-variant",
"component.alarm_control_panel.entity_component._.state.armed",
"component.alarm_control_panel.entity_component._.state.armed_away",
"component.alarm_control_panel.entity_component._.state.armed_custom_bypass",
"component.alarm_control_panel.entity_component._.state.armed_home",
"component.alarm_control_panel.entity_component._.state.armed_night",
"component.alarm_control_panel.entity_component._.state.armed_vacation",
"component.alarm_control_panel.entity_component._.state.arming",
"component.alarm_control_panel.entity_component._.state.disarmed",
"component.alarm_control_panel.entity_component._.state.disarming",
"component.alarm_control_panel.entity_component._.state.pending",
"component.alarm_control_panel.entity_component._.state.triggered"
]'
# backlight:
- obj:
id: backlight_bg
x: 20
y: 140
width: 440
height: 100
align: TOP_LEFT
pad_all: 0
bg_color: color_steel_blue
bg_opa: 20%
border_opa: TRANSP
border_width: 0
shadow_opa: TRANSP
radius: 10
widgets:
- label:
id: display_backlight_label
x: 20
align: LEFT_MID
text_font: nunito_20
text_color: color_misty_blue
text: "Backlight"
- slider:
id: display_backlight_brightness_slider
x: -20
radius: 10
bg_color: color_slate_blue_gray
align: RIGHT_MID
width: 260
height: 60
min_value: 35
max_value: 100
value: 100
indicator:
bg_color: color_misty_blue
radius: 10
knob:
bg_opa: TRANSP
on_release:
then:
- light.turn_on:
id: display_backlight
brightness: !lambda return int(x)/ 100.0;
# sleep mode:
- obj:
id: sleep_mode_bg
x: 20
y: 260
width: 440
height: 100
align: TOP_LEFT
pad_all: 0
bg_color: color_steel_blue
bg_opa: 20%
border_opa: TRANSP
border_width: 0
shadow_opa: TRANSP
radius: 10
widgets:
- label:
id: display_timeout_label
x: 20
align: LEFT_MID
text_font: nunito_20
text_color: color_misty_blue
text: "Sleep mode"
- dropdown:
id: display_timeout_dropdown
x: 220
width: 200
align: LEFT_MID
selected_index: !lambda return id(display_timeout);
options:
- Never
- 1 minute
- 5 minutes
- 10 minutes
- 30 minutes
- 1 hour
- 6 hours
- 12 hours
bg_opa: TRANSP
shadow_opa: TRANSP
border_opa: TRANSP
border_width: 0
text_font: nunito_20
text_color: color_misty_blue
dropdown_list:
align: CENTER
bg_color: color_slate_blue_gray
shadow_opa: TRANSP
border_color: color_misty_blue
border_width: 2
text_font: nunito_20
text_color: color_misty_blue
text_line_space: 10
pad_all: 8
max_height: 360
selected:
checked:
bg_color: color_steel_blue
bg_opa: 20%
text_color: color_misty_blue
pressed:
bg_opa: TRANSP
text_color: color_misty_blue
indicator:
text_opa: TRANSP
on_value:
then:
- number.set:
id: display_timeout_number
value: !lambda |-
static const int backlight_time[] = {-1, 1, 5, 10, 30, 60, 360, 720};
return backlight_time[x];
- globals.set:
id: display_timeout
value: !lambda return x;
number:
- platform: template
id: display_timeout_number
name: LVGL screen timeout
optimistic: true
unit_of_measurement: "m"
initial_value: 10
restore_value: true
min_value: -1
max_value: 720
step: 1
mode: box
mapping:
- id: flag_icon_mapping_image
from: int
to: image
entries:
0: flags_de_img
1: flags_es_img
2: flags_fr_img
3: flags_gb_img
4: flags_it_img
5: flags_pt_img
6: flags_ru_img
7: flags_us_img
8: flags_pl_img
9: flags_tr_img
10: flags_sv_img
11: flags_ro_img
12: flags_nl_img
13: flags_hu_img
14: flags_id_img
15: flags_vi_img
16: flags_cs_img
17: flags_fi_img
- id: flag_icon_mapping_name
from: int
to: string
entries:
0: de
1: es
2: fr
3: en-GB
4: it
5: pt
6: ru
7: en
8: pl
9: tr
10: sv
11: ro
12: nl
13: hu
14: id
15: vi
16: cs
17: fi
- id: flag_icon_mapping_index
from: string
to: int
entries:
de: 0
es: 1
fr: 2
en-GB: 3
it: 4
pt: 5
ru: 6
en: 7
pl: 8
tr: 9
sv: 10
ro: 11
nl: 12
hu: 13
id: 14
vi: 15
cs: 16
fi: 17
esphome:
on_boot:
- priority: -100
then:
- homeassistant.action:
action: display_tools.get_translations_esphome
data:
language: !lambda return id(flag_icon_mapping_name).get(id(current_language)).c_str();
category: entity_component
keys: '[
"component.vacuum.entity_component._.state.cleaning",
"component.vacuum.entity_component._.state.docked",
"component.vacuum.entity_component._.state.error",
"component.vacuum.entity_component._.state.idle",
"component.vacuum.entity_component._.state.off",
"component.vacuum.entity_component._.state.on",
"component.vacuum.entity_component._.state.paused",
"component.vacuum.entity_component._.state.returning",
"component.cover.entity_component._.state.closed",
"component.cover.entity_component._.state.closing",
"component.cover.entity_component._.state.open",
"component.cover.entity_component._.state.opening",
"component.cover.entity_component._.state.stopped",
"component.climate.entity_component._.state_attributes.hvac_action.state.cooling",
"component.climate.entity_component._.state_attributes.hvac_action.state.defrosting",
"component.climate.entity_component._.state_attributes.hvac_action.state.drying",
"component.climate.entity_component._.state_attributes.hvac_action.state.fan",
"component.climate.entity_component._.state_attributes.hvac_action.state.heating",
"component.climate.entity_component._.state_attributes.hvac_action.state.idle",
"component.climate.entity_component._.state_attributes.hvac_action.state.off",
"component.weather.entity_component._.state.clear-night",
"component.weather.entity_component._.state.cloudy",
"component.weather.entity_component._.state.exceptional",
"component.weather.entity_component._.state.fog",
"component.weather.entity_component._.state.hail",
"component.weather.entity_component._.state.lightning",
"component.weather.entity_component._.state.lightning-rainy",
"component.weather.entity_component._.state.partlycloudy",
"component.weather.entity_component._.state.pouring",
"component.weather.entity_component._.state.rainy",
"component.weather.entity_component._.state.snowy",
"component.weather.entity_component._.state.snowy-rainy",
"component.weather.entity_component._.state.sunny",
"component.weather.entity_component._.state.windy",
"component.weather.entity_component._.state.windy-variant",
"component.alarm_control_panel.entity_component._.state.armed",
"component.alarm_control_panel.entity_component._.state.armed_away",
"component.alarm_control_panel.entity_component._.state.armed_custom_bypass",
"component.alarm_control_panel.entity_component._.state.armed_home",
"component.alarm_control_panel.entity_component._.state.armed_night",
"component.alarm_control_panel.entity_component._.state.armed_vacation",
"component.alarm_control_panel.entity_component._.state.arming",
"component.alarm_control_panel.entity_component._.state.disarmed",
"component.alarm_control_panel.entity_component._.state.disarming",
"component.alarm_control_panel.entity_component._.state.pending",
"component.alarm_control_panel.entity_component._.state.triggered"
]'
- lvgl.dropdown.update:
id: display_timeout_dropdown
selected_index: !lambda return id(display_timeout);
api:
on_client_connected:
- lvgl.dropdown.update:
id: display_timeout_dropdown
selected_index: !lambda return id(display_timeout);