Give a lamp's modes a page: the effects, palettes, presets, speed and intensity of a WLED behind its colour card, with a drum picker and the effect's name on the tile (0.2.83)
A light that offers effects gets a sparkles key at the top right of its colour card. It opens a page with a row per thing the lamp offers, all from Home Assistant: the light's effect and the select entities of its device (a WLED's colour palette, preset and playlist) with what they are set to, and a slider per number entity of the device (speed, intensity). Names are Home Assistant's own English entity translations, icons its frontend's; nothing about a brand is hardcoded beyond a preferred order of translation keys. A row opens LVGL's roller with every name Home Assistant lists at that moment, asked for when the picker opens (esphome.screen_options, answered with op: options, one page of names per message), the effects alphabetically with Solid on top. The check key at the top right sends the choice as one action; the back key sends nothing. A slider sends number.set_value when let go. While an effect runs, the tile names it instead of the brightness. Firmware 0.2.70: effects_page.h (built when it opens, gone when it closes), Extra.effect/option_rows/number_rows, options_request, a hidden roller widget so ESPHome compiles LVGL's roller, five firmware-only glyphs. App 0.2.83: light_effects.py, the effect attribute, the device rows in the state message, card_options_loop. Checked on the host with a virtual finger (35/35 on both boards) and compiled for both ESP32 boards; CYD 1,675,424 B (91.3 %). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -92,7 +92,15 @@ struct Choice {
|
||||
// What only some tiles carry: climate modes, a select's options, weather, sun and timer times, a media
|
||||
// title, the vacuum rows. A light or a sensor has none of it, so a tile holds this block only while its
|
||||
// state needs one: twenty tiles with these fields inline took 24 KB of the CYD's RAM, mostly empty.
|
||||
// A light's effects page (firmware 0.2.70+): a select entity of the light's device with what it is set to and how many
|
||||
// options it has, and a number entity with its range; the names and icons are Home Assistant's, through the add-on.
|
||||
struct OptionRow { std::string entity, name, current; uint16_t count = 0; uint32_t icon = 0; };
|
||||
struct NumberRow { std::string entity, name; float value = NAN, low = 0, high = 100, step = 1; uint32_t icon = 0; };
|
||||
struct Extra {
|
||||
// The effect a light runs (its `effect` attribute), and the rows of its effects page.
|
||||
std::string effect;
|
||||
std::vector<OptionRow> option_rows;
|
||||
std::vector<NumberRow> number_rows;
|
||||
// Climate: the modes as JSON lists, the current fan and swing mode, and what it is doing now.
|
||||
std::string hvac_modes, fan_modes, swing_modes, fan_mode, swing_mode, hvac_action;
|
||||
// A select's options, at most eight.
|
||||
@@ -133,7 +141,7 @@ struct Extra {
|
||||
remaining.empty() && !timer_end && media_title.empty() && media_artist.empty() && media_album.empty() &&
|
||||
media_picture.empty() && !media_duration && !media_position && !media_position_at && fan_speeds.empty() && fan_speed.empty() &&
|
||||
choices.empty() && room.empty() && !charging && std::isnan(tilt) && action.empty() && action_data.empty() &&
|
||||
action_templates.empty() && state_word.empty();
|
||||
action_templates.empty() && state_word.empty() && effect.empty() && option_rows.empty() && number_rows.empty();
|
||||
}
|
||||
};
|
||||
// The Extra of a tile on the heap, copied along with the tile like an ordinary member.
|
||||
|
||||
Reference in New Issue
Block a user