Choose vacuum, vac & mop or mop on the vacuum card, and a climate card for the CYD (0.2.46)
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>
This commit is contained in:
@@ -100,5 +100,43 @@ int main() {
|
||||
Tile lamp = make("light.lamp", "on"); lamp.controls = "brightness";
|
||||
assert(is_slider(panel_kind(lamp)) && !is_key_row(panel_kind(lamp)));
|
||||
assert(is_key_row("playback") && is_key_row("mode") && !is_key_row("setpoint"));
|
||||
|
||||
// Climate mode colours follow Home Assistant; anything else is grey.
|
||||
assert(mode_color("heat") == 0xFF6F22 && mode_color("cool") == 0x2196F3 && mode_color("off") == 0x9E9E9E);
|
||||
|
||||
// Vacuum rows: the cleaning mode decides which of suction and water the card shows.
|
||||
Tile pippa = make("vacuum.s8", "docked", 30524);
|
||||
auto row = [](char kind, const char *entity, const char *current, std::vector<std::string> values, const char *roles = "") {
|
||||
runtime_tiles::Choice c; c.kind = kind; c.entity = entity; c.current = current; c.values = values; c.labels = values; c.roles = roles; return c;
|
||||
};
|
||||
pippa.choices = {row('m', "select.woonkamer_s8_schoonmaakmodus", "vac_and_mop", {"vacuum", "vac_and_mop", "mop", "custom"}, "vbma"),
|
||||
row('w', "select.s8_intensiteit_van_dweilen", "intense", {"mild", "standard", "intense"}),
|
||||
row('s', "", "", {"quiet", "balanced", "turbo", "max", "max_plus"})};
|
||||
pippa.fan_speed = "max";
|
||||
settle_suction(pippa);
|
||||
assert(pippa.choice('s')->current == "max" && pippa.choices.size() == 3);
|
||||
auto rows = vacuum_rows(pippa, 0);
|
||||
assert(rows.suction && rows.water && vacuum_role(pippa, 0) == 'b');
|
||||
pippa.choice('m')->current = "mop"; rows = vacuum_rows(pippa, 0);
|
||||
assert(!rows.suction && rows.water);
|
||||
pippa.choice('m')->current = "vacuum"; rows = vacuum_rows(pippa, 0);
|
||||
assert(rows.suction && !rows.water);
|
||||
pippa.choice('m')->current = "custom"; rows = vacuum_rows(pippa, 0);
|
||||
assert(!rows.suction && !rows.water && vacuum_role(pippa, 0) == 'a');
|
||||
pippa.choice('m')->current = "something_new"; assert(vacuum_role(pippa, 0) == 'b');
|
||||
// A tapped chip shows while Home Assistant is busy, and the old value once it gave up.
|
||||
pippa.choice('m')->current = "vac_and_mop"; pippa.choice('m')->sent = "mop";
|
||||
pippa.begin(1000);
|
||||
assert(shown_value(pippa, *pippa.choice('m'), 1500) == "mop" && vacuum_rows(pippa, 1500).water && !vacuum_rows(pippa, 1500).suction);
|
||||
assert(shown_value(pippa, *pippa.choice('m'), 9000) == "vac_and_mop");
|
||||
assert(choice_action(pippa, 'm', "mop").service == "select.select_option" && choice_action(pippa, 'm', "mop").key == "option");
|
||||
assert(choice_action(pippa, 's', "turbo").service == "vacuum.set_fan_speed" && choice_action(pippa, 's', "turbo").value == "turbo");
|
||||
// An older manager sends no suction row: the vacuum's own four speeds, with the card's names.
|
||||
Tile old_robot2 = make("vacuum.old", "docked", 30524);
|
||||
old_robot2.fan_speed_count = 2; old_robot2.fan_speeds[0] = "quiet"; old_robot2.fan_speeds[1] = "balanced"; old_robot2.fan_speed = "balanced";
|
||||
settle_suction(old_robot2);
|
||||
assert(old_robot2.choice('s') && old_robot2.choice('s')->labels[1] == "Normal" && old_robot2.choice('s')->current == "balanced");
|
||||
rows = vacuum_rows(old_robot2, 0);
|
||||
assert(rows.suction && !rows.water && !choice_action(old_robot2, 'm', "mop").valid());
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user