aa2137f3f8
App 0.2.46 / firmware 0.2.39: - The vacuum's state message carries extras from its own device: the cleaning mode and water selects (found by translation key, then entity id ending, so localized ids work), the suction speeds to offer, the battery sensor (HA 2026.8 dropped battery_level), charging and the current room. Speeds and water levels a mode covers move into the mode row; Custom only while in use. The manager watches these entities and resends only the vacuum's message when one changes. - Vacuum card redesign on both boards: robot with state, battery, charging bolt and room; Start (Pause, Resume) and Dock; then segmented rows for mode, suction and water, showing only the rows the chosen mode uses. Taps show at once and wait for Home Assistant; Locate is a round button in the Guition hero. - CYD climate card without the arc: big setpoint between large -/+ keys (debounced, hold to repeat) and one row of mode keys in HA's order and colours, with a more key for fan and swing. - Both profiles clear climate_edit_pending when the climate card is closed, instead of running ui_refresh every second while the flag stayed set. Tested with the owner's Roborock S8 on HA 2026.9.1 (live data, OTA-flashed bench boards) and with host renders of both boards; see docs/TEST_RESULTS_0246.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
202 lines
5.6 KiB
C++
202 lines
5.6 KiB
C++
#pragma once
|
|
// GENERATED by tools/generate_icons.py from screen_manager/app/tile_icons.py; do not edit.
|
|
#include <cstdint>
|
|
#include <string>
|
|
|
|
namespace tile_icon {
|
|
struct Named { const char *name; uint32_t codepoint; };
|
|
// Every glyph the three icon fonts of both boards carry, by Material Design Icons name.
|
|
inline constexpr Named NAMES[] = {
|
|
{"lightbulb", 0xF0335},
|
|
{"lightbulb-group", 0xF1253},
|
|
{"ceiling-light", 0xF0769},
|
|
{"chandelier", 0xF1793},
|
|
{"lamp", 0xF06B5},
|
|
{"floor-lamp", 0xF08DD},
|
|
{"desk-lamp", 0xF095F},
|
|
{"wall-sconce-flat", 0xF091D},
|
|
{"light-recessed", 0xF179B},
|
|
{"spotlight-beam", 0xF04C9},
|
|
{"led-strip-variant", 0xF1051},
|
|
{"outdoor-lamp", 0xF1054},
|
|
{"home", 0xF02DC},
|
|
{"sofa", 0xF04B9},
|
|
{"bed", 0xF02E3},
|
|
{"silverware-fork-knife", 0xF0A70},
|
|
{"chef-hat", 0xF0B7C},
|
|
{"shower", 0xF09A0},
|
|
{"bathtub", 0xF1818},
|
|
{"toilet", 0xF09AB},
|
|
{"desk", 0xF1239},
|
|
{"garage", 0xF06D9},
|
|
{"fireplace", 0xF0E2E},
|
|
{"thermometer", 0xF050F},
|
|
{"thermostat", 0xF0393},
|
|
{"air-conditioner", 0xF001B},
|
|
{"radiator", 0xF0438},
|
|
{"heat-pump", 0xF1A43},
|
|
{"fire", 0xF0238},
|
|
{"snowflake", 0xF0717},
|
|
{"water-percent", 0xF058E},
|
|
{"fan", 0xF0210},
|
|
{"ceiling-fan", 0xF1797},
|
|
{"air-purifier", 0xF0D44},
|
|
{"molecule-co2", 0xF07E4},
|
|
{"weather-sunny", 0xF0599},
|
|
{"weather-partly-cloudy", 0xF0595},
|
|
{"weather-cloudy", 0xF0590},
|
|
{"weather-rainy", 0xF0597},
|
|
{"weather-snowy", 0xF0598},
|
|
{"weather-windy", 0xF059D},
|
|
{"weather-night", 0xF0594},
|
|
{"weather-sunset-up", 0xF059C},
|
|
{"music-note", 0xF0387},
|
|
{"music", 0xF075A},
|
|
{"playlist-music", 0xF0CB8},
|
|
{"album", 0xF0025},
|
|
{"record-player", 0xF099A},
|
|
{"spotify", 0xF04C7},
|
|
{"radio", 0xF0439},
|
|
{"podcast", 0xF0994},
|
|
{"speaker", 0xF04C3},
|
|
{"speaker-multiple", 0xF0D38},
|
|
{"soundbar", 0xF17DB},
|
|
{"headphones", 0xF02CB},
|
|
{"piano", 0xF067D},
|
|
{"guitar-acoustic", 0xF0771},
|
|
{"television", 0xF0502},
|
|
{"projector", 0xF042E},
|
|
{"movie-open", 0xF0FCE},
|
|
{"cast", 0xF0118},
|
|
{"gamepad-variant", 0xF0297},
|
|
{"remote-tv", 0xF0EC5},
|
|
{"lock", 0xF033E},
|
|
{"lock-open-variant", 0xF0FC6},
|
|
{"shield-home", 0xF068A},
|
|
{"alarm-light", 0xF078F},
|
|
{"bell", 0xF009A},
|
|
{"doorbell", 0xF12E6},
|
|
{"cctv", 0xF07AE},
|
|
{"motion-sensor", 0xF0D91},
|
|
{"door-closed", 0xF081B},
|
|
{"door-open", 0xF081C},
|
|
{"window-closed-variant", 0xF11DB},
|
|
{"smoke-detector", 0xF0392},
|
|
{"water-alert", 0xF1502},
|
|
{"washing-machine", 0xF072A},
|
|
{"tumble-dryer", 0xF0917},
|
|
{"dishwasher", 0xF0AAC},
|
|
{"fridge", 0xF0290},
|
|
{"stove", 0xF04DE},
|
|
{"microwave", 0xF0C99},
|
|
{"toaster-oven", 0xF0CD3},
|
|
{"coffee-maker", 0xF109F},
|
|
{"kettle", 0xF05FA},
|
|
{"robot-vacuum", 0xF070D},
|
|
{"robot-mower", 0xF11F7},
|
|
{"printer-3d", 0xF042B},
|
|
{"power-plug", 0xF06A5},
|
|
{"power-socket-eu", 0xF07E7},
|
|
{"laptop", 0xF0322},
|
|
{"router-wireless", 0xF0469},
|
|
{"flash", 0xF0241},
|
|
{"solar-power", 0xF0A72},
|
|
{"solar-panel", 0xF0D9B},
|
|
{"home-battery", 0xF1901},
|
|
{"battery-high", 0xF12A3},
|
|
{"ev-station", 0xF05F1},
|
|
{"car-electric", 0xF0B6C},
|
|
{"meter-electric", 0xF1A57},
|
|
{"meter-gas", 0xF1A59},
|
|
{"water", 0xF058C},
|
|
{"water-boiler", 0xF0F92},
|
|
{"gauge", 0xF029A},
|
|
{"window-shutter", 0xF111C},
|
|
{"window-shutter-open", 0xF111E},
|
|
{"blinds", 0xF00AC},
|
|
{"blinds-open", 0xF1011},
|
|
{"roller-shade-closed", 0xF1A6C},
|
|
{"curtains", 0xF1846},
|
|
{"curtains-closed", 0xF1847},
|
|
{"awning-outline", 0xF1B88},
|
|
{"flower", 0xF024A},
|
|
{"tree", 0xF0531},
|
|
{"sprout", 0xF0E66},
|
|
{"grass", 0xF1510},
|
|
{"sprinkler", 0xF105F},
|
|
{"pool", 0xF0606},
|
|
{"grill", 0xF0E45},
|
|
{"mailbox", 0xF06EE},
|
|
{"trash-can", 0xF0A79},
|
|
{"recycle", 0xF044C},
|
|
{"dog", 0xF0A43},
|
|
{"cat", 0xF011B},
|
|
{"account", 0xF0004},
|
|
{"account-group", 0xF0849},
|
|
{"account-child", 0xF0A89},
|
|
{"home-account", 0xF0826},
|
|
{"sleep", 0xF04B2},
|
|
{"run", 0xF070E},
|
|
{"briefcase", 0xF00D6},
|
|
{"car", 0xF010B},
|
|
{"bike", 0xF00A3},
|
|
{"airplane", 0xF001D},
|
|
{"map-marker", 0xF034E},
|
|
{"power", 0xF0425},
|
|
{"toggle-switch", 0xF0521},
|
|
{"gesture-tap-button", 0xF12A8},
|
|
{"play", 0xF040A},
|
|
{"script-text", 0xF0BC2},
|
|
{"palette", 0xF03D8},
|
|
{"alarm", 0xF0020},
|
|
{"clock-outline", 0xF0150},
|
|
{"timer-outline", 0xF051B},
|
|
{"calendar", 0xF00ED},
|
|
{"bell-ring", 0xF009E},
|
|
{"heart", 0xF02D1},
|
|
{"alert-outline", 0xF002A},
|
|
{"cog", 0xF0493},
|
|
{"broom", 0xF00E2},
|
|
{"alert-circle-outline", 0xF05D6},
|
|
{"check", 0xF012C},
|
|
{"pause", 0xF03E4},
|
|
{"stop", 0xF04DB},
|
|
{"skip-next", 0xF04AD},
|
|
{"skip-previous", 0xF04AE},
|
|
{"volume-high", 0xF057E},
|
|
{"volume-off", 0xF0581},
|
|
{"arrow-up", 0xF005D},
|
|
{"arrow-down", 0xF0045},
|
|
{"arrow-expand-horizontal", 0xF084E},
|
|
{"arrow-collapse-horizontal", 0xF084C},
|
|
{"home-map-marker", 0xF05F8},
|
|
{"plus", 0xF0415},
|
|
{"minus", 0xF0374},
|
|
{"chevron-left", 0xF0141},
|
|
{"chevron-right", 0xF0142},
|
|
{"close", 0xF0156},
|
|
{"arrow-left", 0xF004D},
|
|
{"sun-snowflake-variant", 0xF1A79},
|
|
{"thermostat-auto", 0xF1B17},
|
|
{"weather-fog", 0xF0591},
|
|
{"weather-hail", 0xF0592},
|
|
{"weather-lightning", 0xF0593},
|
|
{"weather-lightning-rainy", 0xF067E},
|
|
{"weather-pouring", 0xF0596},
|
|
{"weather-snowy-rainy", 0xF067F},
|
|
{"weather-sunset-down", 0xF059B},
|
|
{"dots-horizontal", 0xF01D8},
|
|
};
|
|
inline constexpr size_t NAME_COUNT = sizeof(NAMES) / sizeof(NAMES[0]);
|
|
// Codepoint of a name the fonts carry; 0 for any other name.
|
|
inline uint32_t named(const std::string &name) {
|
|
for (const auto &entry : NAMES) if (name == entry.name) return entry.codepoint;
|
|
return 0;
|
|
}
|
|
// True when the fonts carry this codepoint, so a label can draw it.
|
|
inline bool carried(uint32_t codepoint) {
|
|
for (const auto &entry : NAMES) if (entry.codepoint == codepoint) return true;
|
|
return false;
|
|
}
|
|
} // namespace tile_icon
|