################################################################################ # chore-tracker-esphome.yaml (AUTO-GENERATED — edit chores_config.yaml) # Kids: Emma, Liam, Zoe # # HOME SCREEN BEHAVIOUR: # Red outline = chores incomplete # Solid green = all chores done ✓ # Resets to red automatically at midnight ################################################################################ esphome: name: chore-tracker friendly_name: "Chore Tracker" esp32: board: esp32s3box framework: type: esp-idf wifi: ssid: !secret wifi_ssid password: !secret wifi_password ap: ssid: "Chore Tracker Hotspot" password: "choretracker" captive_portal: logger: level: INFO api: encryption: key: !secret api_encryption_key ota: - platform: esphome password: !secret ota_password # ── Display — Waveshare ESP32-S3 7" (adjust pins for your board revision) ───── display: - platform: rpi_dpi_rgb id: main_display auto_clear_enabled: false color_order: RGB dimensions: width: 800 height: 480 de_pin: number: GPIO40 ignore_strapping_warning: true hsync_pin: number: GPIO39 ignore_strapping_warning: true vsync_pin: number: GPIO41 pclk_pin: GPIO42 data_pins: red: [GPIO45, GPIO48, GPIO47, GPIO21, GPIO14] green: [GPIO5, GPIO6, GPIO7, GPIO15, GPIO16, GPIO4] blue: [GPIO8, GPIO3, GPIO46, GPIO9, GPIO1] touchscreen: - platform: gt911 id: touch display: main_display i2c_id: i2c_touch interrupt_pin: GPIO2 reset_pin: GPIO38 i2c: - id: i2c_touch sda: GPIO19 scl: GPIO20 frequency: 400kHz output: - platform: ledc pin: GPIO17 id: backlight_output light: - platform: monochromatic output: backlight_output name: "Display Backlight" id: backlight restore_mode: ALWAYS_ON # ── Time: drives the daily reset ───────────────────────────────────────────── time: - platform: homeassistant id: ha_time on_time: - hours: 0 minutes: 0 seconds: 0 then: - lambda: |- // Reset all kids via named scripts (resets switches + refreshes UI) id(reset_emma_chores).execute(); id(reset_liam_chores).execute(); id(reset_zoe_chores).execute(); - lvgl.page.show: page_home fonts: - file: "gfonts://Nunito:wght@900" id: font_title size: 40 - file: "gfonts://Nunito:wght@800" id: font_name size: 30 - file: "gfonts://Nunito:wght@700" id: font_med size: 22 - file: "gfonts://Nunito:wght@600" id: font_small size: 17 - file: "gfonts://Nunito:wght@600" id: font_tiny size: 13 # ── Switches — one per chore per kid, synced to HA ─────────────────────────── switch: # ── Emma's chores ────────────────────────── - platform: template name: "Emma - Make Bed" id: emma_make_bed icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_emma_make_bed on_turn_off: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_emma_make_bed - platform: template name: "Emma - Brush Teeth" id: emma_brush_teeth icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_emma_brush_teeth on_turn_off: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_emma_brush_teeth - platform: template name: "Emma - Tidy Room" id: emma_tidy_room icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_emma_tidy_room on_turn_off: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_emma_tidy_room - platform: template name: "Emma - Homework" id: emma_homework icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_emma_homework on_turn_off: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_emma_homework - platform: template name: "Emma - Set Table" id: emma_set_table icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_emma_set_table on_turn_off: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_emma_set_table - platform: template name: "Emma - Take Out Trash" id: emma_take_out_trash icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_emma_take_out_trash on_turn_off: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_emma_take_out_trash - platform: template name: "Emma - Feed Pet" id: emma_feed_pet icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_emma_feed_pet on_turn_off: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_emma_feed_pet - platform: template name: "Emma - Water Plants" id: emma_water_plants icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_emma_water_plants on_turn_off: then: - script.execute: update_emma_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_emma_water_plants # ── Liam's chores ────────────────────────── - platform: template name: "Liam - Make Bed" id: liam_make_bed icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_liam_make_bed on_turn_off: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_liam_make_bed - platform: template name: "Liam - Brush Teeth" id: liam_brush_teeth icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_liam_brush_teeth on_turn_off: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_liam_brush_teeth - platform: template name: "Liam - Tidy Room" id: liam_tidy_room icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_liam_tidy_room on_turn_off: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_liam_tidy_room - platform: template name: "Liam - Homework" id: liam_homework icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_liam_homework on_turn_off: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_liam_homework - platform: template name: "Liam - Set Table" id: liam_set_table icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_liam_set_table on_turn_off: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_liam_set_table - platform: template name: "Liam - Take Out Trash" id: liam_take_out_trash icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_liam_take_out_trash on_turn_off: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_liam_take_out_trash - platform: template name: "Liam - Feed Pet" id: liam_feed_pet icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_liam_feed_pet on_turn_off: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_liam_feed_pet - platform: template name: "Liam - Water Plants" id: liam_water_plants icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_liam_water_plants on_turn_off: then: - script.execute: update_liam_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_liam_water_plants # ── Zoe's chores ────────────────────────── - platform: template name: "Zoe - Make Bed" id: zoe_make_bed icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_zoe_make_bed on_turn_off: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_zoe_make_bed - platform: template name: "Zoe - Brush Teeth" id: zoe_brush_teeth icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_zoe_brush_teeth on_turn_off: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_zoe_brush_teeth - platform: template name: "Zoe - Tidy Room" id: zoe_tidy_room icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_zoe_tidy_room on_turn_off: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_zoe_tidy_room - platform: template name: "Zoe - Homework" id: zoe_homework icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_zoe_homework on_turn_off: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_zoe_homework - platform: template name: "Zoe - Set Table" id: zoe_set_table icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_zoe_set_table on_turn_off: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_zoe_set_table - platform: template name: "Zoe - Take Out Trash" id: zoe_take_out_trash icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_zoe_take_out_trash on_turn_off: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_zoe_take_out_trash - platform: template name: "Zoe - Feed Pet" id: zoe_feed_pet icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_zoe_feed_pet on_turn_off: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_zoe_feed_pet - platform: template name: "Zoe - Water Plants" id: zoe_water_plants icon: mdi:star optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_on data: entity_id: switch.chore_tracker_zoe_water_plants on_turn_off: then: - script.execute: update_zoe_ui # Push to HA so it stays in sync when toggled on the screen - homeassistant.service: service: switch.turn_off data: entity_id: switch.chore_tracker_zoe_water_plants # ── Sensors — reported to HA ───────────────────────────────────────────────── sensor: - platform: template name: "Emma Chores Done" id: emma_chores_done accuracy_decimals: 0 update_interval: 2s lambda: |- int done = 0; if (id(emma_make_bed).state) done++; if (id(emma_brush_teeth).state) done++; if (id(emma_tidy_room).state) done++; if (id(emma_homework).state) done++; if (id(emma_set_table).state) done++; if (id(emma_take_out_trash).state) done++; if (id(emma_feed_pet).state) done++; if (id(emma_water_plants).state) done++; return done; - platform: template name: "Emma Stars Today" id: emma_stars unit_of_measurement: "stars" accuracy_decimals: 0 update_interval: 2s lambda: |- int stars = 0; if (id(emma_make_bed).state) stars += 1; if (id(emma_brush_teeth).state) stars += 1; if (id(emma_tidy_room).state) stars += 2; if (id(emma_homework).state) stars += 3; if (id(emma_set_table).state) stars += 1; if (id(emma_take_out_trash).state) stars += 2; if (id(emma_feed_pet).state) stars += 1; if (id(emma_water_plants).state) stars += 1; return stars; - platform: template name: "Liam Chores Done" id: liam_chores_done accuracy_decimals: 0 update_interval: 2s lambda: |- int done = 0; if (id(liam_make_bed).state) done++; if (id(liam_brush_teeth).state) done++; if (id(liam_tidy_room).state) done++; if (id(liam_homework).state) done++; if (id(liam_set_table).state) done++; if (id(liam_take_out_trash).state) done++; if (id(liam_feed_pet).state) done++; if (id(liam_water_plants).state) done++; return done; - platform: template name: "Liam Stars Today" id: liam_stars unit_of_measurement: "stars" accuracy_decimals: 0 update_interval: 2s lambda: |- int stars = 0; if (id(liam_make_bed).state) stars += 1; if (id(liam_brush_teeth).state) stars += 1; if (id(liam_tidy_room).state) stars += 2; if (id(liam_homework).state) stars += 3; if (id(liam_set_table).state) stars += 1; if (id(liam_take_out_trash).state) stars += 2; if (id(liam_feed_pet).state) stars += 1; if (id(liam_water_plants).state) stars += 1; return stars; - platform: template name: "Zoe Chores Done" id: zoe_chores_done accuracy_decimals: 0 update_interval: 2s lambda: |- int done = 0; if (id(zoe_make_bed).state) done++; if (id(zoe_brush_teeth).state) done++; if (id(zoe_tidy_room).state) done++; if (id(zoe_homework).state) done++; if (id(zoe_set_table).state) done++; if (id(zoe_take_out_trash).state) done++; if (id(zoe_feed_pet).state) done++; if (id(zoe_water_plants).state) done++; return done; - platform: template name: "Zoe Stars Today" id: zoe_stars unit_of_measurement: "stars" accuracy_decimals: 0 update_interval: 2s lambda: |- int stars = 0; if (id(zoe_make_bed).state) stars += 1; if (id(zoe_brush_teeth).state) stars += 1; if (id(zoe_tidy_room).state) stars += 2; if (id(zoe_homework).state) stars += 3; if (id(zoe_set_table).state) stars += 1; if (id(zoe_take_out_trash).state) stars += 2; if (id(zoe_feed_pet).state) stars += 1; if (id(zoe_water_plants).state) stars += 1; return stars; # ── Scripts — update LVGL visuals when chore state changes ─────────────────── script: # Reset all of Emma's chores (used by manual reset button + midnight) - id: reset_emma_chores mode: single then: - lambda: |- id(emma_make_bed).turn_off(); id(emma_brush_teeth).turn_off(); id(emma_tidy_room).turn_off(); id(emma_homework).turn_off(); id(emma_set_table).turn_off(); id(emma_take_out_trash).turn_off(); id(emma_feed_pet).turn_off(); id(emma_water_plants).turn_off(); - script.execute: update_emma_ui - id: update_emma_ui mode: single then: - lambda: |- int done = (id(emma_make_bed).state ? 1 : 0) + (id(emma_brush_teeth).state ? 1 : 0) + (id(emma_tidy_room).state ? 1 : 0) + (id(emma_homework).state ? 1 : 0) + (id(emma_set_table).state ? 1 : 0) + (id(emma_take_out_trash).state ? 1 : 0) + (id(emma_feed_pet).state ? 1 : 0) + (id(emma_water_plants).state ? 1 : 0); int stars = (id(emma_make_bed).state ? 1 : 0) + (id(emma_brush_teeth).state ? 1 : 0) + (id(emma_tidy_room).state ? 2 : 0) + (id(emma_homework).state ? 3 : 0) + (id(emma_set_table).state ? 1 : 0) + (id(emma_take_out_trash).state ? 2 : 0) + (id(emma_feed_pet).state ? 1 : 0) + (id(emma_water_plants).state ? 1 : 0); int total = 8; // ── Sidebar progress & stars ────────────────────────────────────── lv_bar_set_value(id(progress_bar_emma), done, LV_ANIM_ON); char buf[32]; snprintf(buf, sizeof(buf), "%d / 8", done); lv_label_set_text(id(progress_label_emma), buf); snprintf(buf, sizeof(buf), "⭐ %d star%s", stars, stars == 1 ? "" : "s"); lv_label_set_text(id(sidebar_stars_emma), buf); // ── All-done celebration text ───────────────────────────────────── if (done == total) { lv_label_set_text(id(all_done_label_emma), "🎉 All done!"); } else { lv_label_set_text(id(all_done_label_emma), ""); } // ── Home screen button: RED outline = incomplete, GREEN = complete ─ if (done == total) { // Solid green — all chores done lv_obj_set_style_bg_opa(id(home_btn_emma), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_bg_color(id(home_btn_emma), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(home_btn_emma), 0, LV_PART_MAIN); lv_label_set_text(id(home_status_emma), "✓ all done!"); lv_obj_set_style_text_color(id(home_status_emma), lv_color_hex(0xFFFFFF), LV_PART_MAIN); } else { // Transparent fill with red border — incomplete lv_obj_set_style_bg_opa(id(home_btn_emma), LV_OPA_TRANSP, LV_PART_MAIN); lv_obj_set_style_border_color(id(home_btn_emma), lv_color_hex(0xFF4757), LV_PART_MAIN); lv_obj_set_style_border_width(id(home_btn_emma), 5, LV_PART_MAIN); snprintf(buf, sizeof(buf), "%d left", total - done); lv_label_set_text(id(home_status_emma), buf); lv_obj_set_style_text_color(id(home_status_emma), lv_color_hex(0xFF4757), LV_PART_MAIN); } // ── Individual chore card colours ───────────────────────────────── // Make Bed if (id(emma_make_bed).state) { lv_obj_set_style_bg_color(id(card_emma_make_bed), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_make_bed), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_make_bed), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_make_bed), 3, LV_PART_MAIN); lv_label_set_text(id(check_emma_make_bed), "✅"); } else { lv_obj_set_style_bg_color(id(card_emma_make_bed), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_make_bed), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_make_bed), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_make_bed), 2, LV_PART_MAIN); lv_label_set_text(id(check_emma_make_bed), ""); } // Brush Teeth if (id(emma_brush_teeth).state) { lv_obj_set_style_bg_color(id(card_emma_brush_teeth), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_brush_teeth), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_brush_teeth), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_brush_teeth), 3, LV_PART_MAIN); lv_label_set_text(id(check_emma_brush_teeth), "✅"); } else { lv_obj_set_style_bg_color(id(card_emma_brush_teeth), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_brush_teeth), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_brush_teeth), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_brush_teeth), 2, LV_PART_MAIN); lv_label_set_text(id(check_emma_brush_teeth), ""); } // Tidy Room if (id(emma_tidy_room).state) { lv_obj_set_style_bg_color(id(card_emma_tidy_room), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_tidy_room), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_tidy_room), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_tidy_room), 3, LV_PART_MAIN); lv_label_set_text(id(check_emma_tidy_room), "✅"); } else { lv_obj_set_style_bg_color(id(card_emma_tidy_room), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_tidy_room), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_tidy_room), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_tidy_room), 2, LV_PART_MAIN); lv_label_set_text(id(check_emma_tidy_room), ""); } // Homework if (id(emma_homework).state) { lv_obj_set_style_bg_color(id(card_emma_homework), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_homework), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_homework), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_homework), 3, LV_PART_MAIN); lv_label_set_text(id(check_emma_homework), "✅"); } else { lv_obj_set_style_bg_color(id(card_emma_homework), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_homework), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_homework), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_homework), 2, LV_PART_MAIN); lv_label_set_text(id(check_emma_homework), ""); } // Set Table if (id(emma_set_table).state) { lv_obj_set_style_bg_color(id(card_emma_set_table), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_set_table), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_set_table), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_set_table), 3, LV_PART_MAIN); lv_label_set_text(id(check_emma_set_table), "✅"); } else { lv_obj_set_style_bg_color(id(card_emma_set_table), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_set_table), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_set_table), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_set_table), 2, LV_PART_MAIN); lv_label_set_text(id(check_emma_set_table), ""); } // Take Out Trash if (id(emma_take_out_trash).state) { lv_obj_set_style_bg_color(id(card_emma_take_out_trash), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_take_out_trash), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_take_out_trash), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_take_out_trash), 3, LV_PART_MAIN); lv_label_set_text(id(check_emma_take_out_trash), "✅"); } else { lv_obj_set_style_bg_color(id(card_emma_take_out_trash), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_take_out_trash), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_take_out_trash), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_take_out_trash), 2, LV_PART_MAIN); lv_label_set_text(id(check_emma_take_out_trash), ""); } // Feed Pet if (id(emma_feed_pet).state) { lv_obj_set_style_bg_color(id(card_emma_feed_pet), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_feed_pet), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_feed_pet), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_feed_pet), 3, LV_PART_MAIN); lv_label_set_text(id(check_emma_feed_pet), "✅"); } else { lv_obj_set_style_bg_color(id(card_emma_feed_pet), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_feed_pet), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_feed_pet), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_feed_pet), 2, LV_PART_MAIN); lv_label_set_text(id(check_emma_feed_pet), ""); } // Water Plants if (id(emma_water_plants).state) { lv_obj_set_style_bg_color(id(card_emma_water_plants), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_water_plants), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_water_plants), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_water_plants), 3, LV_PART_MAIN); lv_label_set_text(id(check_emma_water_plants), "✅"); } else { lv_obj_set_style_bg_color(id(card_emma_water_plants), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_emma_water_plants), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_emma_water_plants), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_emma_water_plants), 2, LV_PART_MAIN); lv_label_set_text(id(check_emma_water_plants), ""); } # Reset all of Liam's chores (used by manual reset button + midnight) - id: reset_liam_chores mode: single then: - lambda: |- id(liam_make_bed).turn_off(); id(liam_brush_teeth).turn_off(); id(liam_tidy_room).turn_off(); id(liam_homework).turn_off(); id(liam_set_table).turn_off(); id(liam_take_out_trash).turn_off(); id(liam_feed_pet).turn_off(); id(liam_water_plants).turn_off(); - script.execute: update_liam_ui - id: update_liam_ui mode: single then: - lambda: |- int done = (id(liam_make_bed).state ? 1 : 0) + (id(liam_brush_teeth).state ? 1 : 0) + (id(liam_tidy_room).state ? 1 : 0) + (id(liam_homework).state ? 1 : 0) + (id(liam_set_table).state ? 1 : 0) + (id(liam_take_out_trash).state ? 1 : 0) + (id(liam_feed_pet).state ? 1 : 0) + (id(liam_water_plants).state ? 1 : 0); int stars = (id(liam_make_bed).state ? 1 : 0) + (id(liam_brush_teeth).state ? 1 : 0) + (id(liam_tidy_room).state ? 2 : 0) + (id(liam_homework).state ? 3 : 0) + (id(liam_set_table).state ? 1 : 0) + (id(liam_take_out_trash).state ? 2 : 0) + (id(liam_feed_pet).state ? 1 : 0) + (id(liam_water_plants).state ? 1 : 0); int total = 8; // ── Sidebar progress & stars ────────────────────────────────────── lv_bar_set_value(id(progress_bar_liam), done, LV_ANIM_ON); char buf[32]; snprintf(buf, sizeof(buf), "%d / 8", done); lv_label_set_text(id(progress_label_liam), buf); snprintf(buf, sizeof(buf), "⭐ %d star%s", stars, stars == 1 ? "" : "s"); lv_label_set_text(id(sidebar_stars_liam), buf); // ── All-done celebration text ───────────────────────────────────── if (done == total) { lv_label_set_text(id(all_done_label_liam), "🎉 All done!"); } else { lv_label_set_text(id(all_done_label_liam), ""); } // ── Home screen button: RED outline = incomplete, GREEN = complete ─ if (done == total) { // Solid green — all chores done lv_obj_set_style_bg_opa(id(home_btn_liam), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_bg_color(id(home_btn_liam), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(home_btn_liam), 0, LV_PART_MAIN); lv_label_set_text(id(home_status_liam), "✓ all done!"); lv_obj_set_style_text_color(id(home_status_liam), lv_color_hex(0xFFFFFF), LV_PART_MAIN); } else { // Transparent fill with red border — incomplete lv_obj_set_style_bg_opa(id(home_btn_liam), LV_OPA_TRANSP, LV_PART_MAIN); lv_obj_set_style_border_color(id(home_btn_liam), lv_color_hex(0xFF4757), LV_PART_MAIN); lv_obj_set_style_border_width(id(home_btn_liam), 5, LV_PART_MAIN); snprintf(buf, sizeof(buf), "%d left", total - done); lv_label_set_text(id(home_status_liam), buf); lv_obj_set_style_text_color(id(home_status_liam), lv_color_hex(0xFF4757), LV_PART_MAIN); } // ── Individual chore card colours ───────────────────────────────── // Make Bed if (id(liam_make_bed).state) { lv_obj_set_style_bg_color(id(card_liam_make_bed), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_make_bed), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_make_bed), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_make_bed), 3, LV_PART_MAIN); lv_label_set_text(id(check_liam_make_bed), "✅"); } else { lv_obj_set_style_bg_color(id(card_liam_make_bed), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_make_bed), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_make_bed), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_make_bed), 2, LV_PART_MAIN); lv_label_set_text(id(check_liam_make_bed), ""); } // Brush Teeth if (id(liam_brush_teeth).state) { lv_obj_set_style_bg_color(id(card_liam_brush_teeth), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_brush_teeth), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_brush_teeth), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_brush_teeth), 3, LV_PART_MAIN); lv_label_set_text(id(check_liam_brush_teeth), "✅"); } else { lv_obj_set_style_bg_color(id(card_liam_brush_teeth), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_brush_teeth), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_brush_teeth), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_brush_teeth), 2, LV_PART_MAIN); lv_label_set_text(id(check_liam_brush_teeth), ""); } // Tidy Room if (id(liam_tidy_room).state) { lv_obj_set_style_bg_color(id(card_liam_tidy_room), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_tidy_room), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_tidy_room), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_tidy_room), 3, LV_PART_MAIN); lv_label_set_text(id(check_liam_tidy_room), "✅"); } else { lv_obj_set_style_bg_color(id(card_liam_tidy_room), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_tidy_room), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_tidy_room), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_tidy_room), 2, LV_PART_MAIN); lv_label_set_text(id(check_liam_tidy_room), ""); } // Homework if (id(liam_homework).state) { lv_obj_set_style_bg_color(id(card_liam_homework), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_homework), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_homework), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_homework), 3, LV_PART_MAIN); lv_label_set_text(id(check_liam_homework), "✅"); } else { lv_obj_set_style_bg_color(id(card_liam_homework), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_homework), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_homework), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_homework), 2, LV_PART_MAIN); lv_label_set_text(id(check_liam_homework), ""); } // Set Table if (id(liam_set_table).state) { lv_obj_set_style_bg_color(id(card_liam_set_table), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_set_table), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_set_table), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_set_table), 3, LV_PART_MAIN); lv_label_set_text(id(check_liam_set_table), "✅"); } else { lv_obj_set_style_bg_color(id(card_liam_set_table), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_set_table), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_set_table), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_set_table), 2, LV_PART_MAIN); lv_label_set_text(id(check_liam_set_table), ""); } // Take Out Trash if (id(liam_take_out_trash).state) { lv_obj_set_style_bg_color(id(card_liam_take_out_trash), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_take_out_trash), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_take_out_trash), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_take_out_trash), 3, LV_PART_MAIN); lv_label_set_text(id(check_liam_take_out_trash), "✅"); } else { lv_obj_set_style_bg_color(id(card_liam_take_out_trash), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_take_out_trash), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_take_out_trash), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_take_out_trash), 2, LV_PART_MAIN); lv_label_set_text(id(check_liam_take_out_trash), ""); } // Feed Pet if (id(liam_feed_pet).state) { lv_obj_set_style_bg_color(id(card_liam_feed_pet), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_feed_pet), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_feed_pet), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_feed_pet), 3, LV_PART_MAIN); lv_label_set_text(id(check_liam_feed_pet), "✅"); } else { lv_obj_set_style_bg_color(id(card_liam_feed_pet), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_feed_pet), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_feed_pet), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_feed_pet), 2, LV_PART_MAIN); lv_label_set_text(id(check_liam_feed_pet), ""); } // Water Plants if (id(liam_water_plants).state) { lv_obj_set_style_bg_color(id(card_liam_water_plants), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_water_plants), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_water_plants), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_water_plants), 3, LV_PART_MAIN); lv_label_set_text(id(check_liam_water_plants), "✅"); } else { lv_obj_set_style_bg_color(id(card_liam_water_plants), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_liam_water_plants), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_liam_water_plants), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_liam_water_plants), 2, LV_PART_MAIN); lv_label_set_text(id(check_liam_water_plants), ""); } # Reset all of Zoe's chores (used by manual reset button + midnight) - id: reset_zoe_chores mode: single then: - lambda: |- id(zoe_make_bed).turn_off(); id(zoe_brush_teeth).turn_off(); id(zoe_tidy_room).turn_off(); id(zoe_homework).turn_off(); id(zoe_set_table).turn_off(); id(zoe_take_out_trash).turn_off(); id(zoe_feed_pet).turn_off(); id(zoe_water_plants).turn_off(); - script.execute: update_zoe_ui - id: update_zoe_ui mode: single then: - lambda: |- int done = (id(zoe_make_bed).state ? 1 : 0) + (id(zoe_brush_teeth).state ? 1 : 0) + (id(zoe_tidy_room).state ? 1 : 0) + (id(zoe_homework).state ? 1 : 0) + (id(zoe_set_table).state ? 1 : 0) + (id(zoe_take_out_trash).state ? 1 : 0) + (id(zoe_feed_pet).state ? 1 : 0) + (id(zoe_water_plants).state ? 1 : 0); int stars = (id(zoe_make_bed).state ? 1 : 0) + (id(zoe_brush_teeth).state ? 1 : 0) + (id(zoe_tidy_room).state ? 2 : 0) + (id(zoe_homework).state ? 3 : 0) + (id(zoe_set_table).state ? 1 : 0) + (id(zoe_take_out_trash).state ? 2 : 0) + (id(zoe_feed_pet).state ? 1 : 0) + (id(zoe_water_plants).state ? 1 : 0); int total = 8; // ── Sidebar progress & stars ────────────────────────────────────── lv_bar_set_value(id(progress_bar_zoe), done, LV_ANIM_ON); char buf[32]; snprintf(buf, sizeof(buf), "%d / 8", done); lv_label_set_text(id(progress_label_zoe), buf); snprintf(buf, sizeof(buf), "⭐ %d star%s", stars, stars == 1 ? "" : "s"); lv_label_set_text(id(sidebar_stars_zoe), buf); // ── All-done celebration text ───────────────────────────────────── if (done == total) { lv_label_set_text(id(all_done_label_zoe), "🎉 All done!"); } else { lv_label_set_text(id(all_done_label_zoe), ""); } // ── Home screen button: RED outline = incomplete, GREEN = complete ─ if (done == total) { // Solid green — all chores done lv_obj_set_style_bg_opa(id(home_btn_zoe), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_bg_color(id(home_btn_zoe), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(home_btn_zoe), 0, LV_PART_MAIN); lv_label_set_text(id(home_status_zoe), "✓ all done!"); lv_obj_set_style_text_color(id(home_status_zoe), lv_color_hex(0xFFFFFF), LV_PART_MAIN); } else { // Transparent fill with red border — incomplete lv_obj_set_style_bg_opa(id(home_btn_zoe), LV_OPA_TRANSP, LV_PART_MAIN); lv_obj_set_style_border_color(id(home_btn_zoe), lv_color_hex(0xFF4757), LV_PART_MAIN); lv_obj_set_style_border_width(id(home_btn_zoe), 5, LV_PART_MAIN); snprintf(buf, sizeof(buf), "%d left", total - done); lv_label_set_text(id(home_status_zoe), buf); lv_obj_set_style_text_color(id(home_status_zoe), lv_color_hex(0xFF4757), LV_PART_MAIN); } // ── Individual chore card colours ───────────────────────────────── // Make Bed if (id(zoe_make_bed).state) { lv_obj_set_style_bg_color(id(card_zoe_make_bed), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_make_bed), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_make_bed), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_make_bed), 3, LV_PART_MAIN); lv_label_set_text(id(check_zoe_make_bed), "✅"); } else { lv_obj_set_style_bg_color(id(card_zoe_make_bed), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_make_bed), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_make_bed), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_make_bed), 2, LV_PART_MAIN); lv_label_set_text(id(check_zoe_make_bed), ""); } // Brush Teeth if (id(zoe_brush_teeth).state) { lv_obj_set_style_bg_color(id(card_zoe_brush_teeth), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_brush_teeth), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_brush_teeth), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_brush_teeth), 3, LV_PART_MAIN); lv_label_set_text(id(check_zoe_brush_teeth), "✅"); } else { lv_obj_set_style_bg_color(id(card_zoe_brush_teeth), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_brush_teeth), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_brush_teeth), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_brush_teeth), 2, LV_PART_MAIN); lv_label_set_text(id(check_zoe_brush_teeth), ""); } // Tidy Room if (id(zoe_tidy_room).state) { lv_obj_set_style_bg_color(id(card_zoe_tidy_room), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_tidy_room), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_tidy_room), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_tidy_room), 3, LV_PART_MAIN); lv_label_set_text(id(check_zoe_tidy_room), "✅"); } else { lv_obj_set_style_bg_color(id(card_zoe_tidy_room), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_tidy_room), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_tidy_room), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_tidy_room), 2, LV_PART_MAIN); lv_label_set_text(id(check_zoe_tidy_room), ""); } // Homework if (id(zoe_homework).state) { lv_obj_set_style_bg_color(id(card_zoe_homework), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_homework), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_homework), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_homework), 3, LV_PART_MAIN); lv_label_set_text(id(check_zoe_homework), "✅"); } else { lv_obj_set_style_bg_color(id(card_zoe_homework), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_homework), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_homework), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_homework), 2, LV_PART_MAIN); lv_label_set_text(id(check_zoe_homework), ""); } // Set Table if (id(zoe_set_table).state) { lv_obj_set_style_bg_color(id(card_zoe_set_table), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_set_table), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_set_table), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_set_table), 3, LV_PART_MAIN); lv_label_set_text(id(check_zoe_set_table), "✅"); } else { lv_obj_set_style_bg_color(id(card_zoe_set_table), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_set_table), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_set_table), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_set_table), 2, LV_PART_MAIN); lv_label_set_text(id(check_zoe_set_table), ""); } // Take Out Trash if (id(zoe_take_out_trash).state) { lv_obj_set_style_bg_color(id(card_zoe_take_out_trash), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_take_out_trash), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_take_out_trash), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_take_out_trash), 3, LV_PART_MAIN); lv_label_set_text(id(check_zoe_take_out_trash), "✅"); } else { lv_obj_set_style_bg_color(id(card_zoe_take_out_trash), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_take_out_trash), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_take_out_trash), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_take_out_trash), 2, LV_PART_MAIN); lv_label_set_text(id(check_zoe_take_out_trash), ""); } // Feed Pet if (id(zoe_feed_pet).state) { lv_obj_set_style_bg_color(id(card_zoe_feed_pet), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_feed_pet), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_feed_pet), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_feed_pet), 3, LV_PART_MAIN); lv_label_set_text(id(check_zoe_feed_pet), "✅"); } else { lv_obj_set_style_bg_color(id(card_zoe_feed_pet), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_feed_pet), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_feed_pet), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_feed_pet), 2, LV_PART_MAIN); lv_label_set_text(id(check_zoe_feed_pet), ""); } // Water Plants if (id(zoe_water_plants).state) { lv_obj_set_style_bg_color(id(card_zoe_water_plants), lv_color_hex(0xF0FFF4), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_water_plants), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_water_plants), lv_color_hex(0x6BCB77), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_water_plants), 3, LV_PART_MAIN); lv_label_set_text(id(check_zoe_water_plants), "✅"); } else { lv_obj_set_style_bg_color(id(card_zoe_water_plants), lv_color_hex(0xFFFFFF), LV_PART_MAIN); lv_obj_set_style_bg_opa(id(card_zoe_water_plants), LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_border_color(id(card_zoe_water_plants), lv_color_hex(0xEEEEEE), LV_PART_MAIN); lv_obj_set_style_border_width(id(card_zoe_water_plants), 2, LV_PART_MAIN); lv_label_set_text(id(check_zoe_water_plants), ""); } # ── LVGL UI ─────────────────────────────────────────────────────────────────── lvgl: displays: - main_display touchscreens: - touch theme: btn: radius: 20 border_width: 0 pages: - id: page_home bg_color: 0xFFF9F0 widgets: - label: x: 0 y: 38 width: 800 align: TOP_MID text: "⭐ Chore Tracker" text_font: font_title text_color: 0x2D3436 - label: x: 0 y: 96 width: 800 align: TOP_MID text: "Tap a name to check off chores" text_font: font_small text_color: 0xB2BEC3 # Reset All button — bottom right, subtle red - btn: x: 660 y: 428 width: 130 height: 40 bg_color: 0xFF4757 radius: 12 on_click: then: - script.execute: reset_emma_chores - script.execute: reset_liam_chores - script.execute: reset_zoe_chores widgets: - label: align: CENTER text: "↺ Reset All" text_color: 0xFFFFFF text_font: font_tiny # Emma — starts red (incomplete), turns green when all done - btn: id: home_btn_emma x: 80 y: 140 width: 200 height: 200 bg_color: 0xFFFFFF bg_opa: TRANSP border_color: 0xFF4757 border_width: 5 radius: 24 on_click: then: - lvgl.page.show: page_emma widgets: - label: align: CENTER y: -38 text: "🐶" text_font: font_title - label: align: CENTER y: 28 text: "Emma" text_font: font_name text_color: 0x2D3436 - label: id: home_status_emma align: CENTER y: 68 text: "not done" text_font: font_tiny text_color: 0xFF4757 # Liam — starts red (incomplete), turns green when all done - btn: id: home_btn_liam x: 300 y: 140 width: 200 height: 200 bg_color: 0xFFFFFF bg_opa: TRANSP border_color: 0xFF4757 border_width: 5 radius: 24 on_click: then: - lvgl.page.show: page_liam widgets: - label: align: CENTER y: -38 text: "🐱" text_font: font_title - label: align: CENTER y: 28 text: "Liam" text_font: font_name text_color: 0x2D3436 - label: id: home_status_liam align: CENTER y: 68 text: "not done" text_font: font_tiny text_color: 0xFF4757 # Zoe — starts red (incomplete), turns green when all done - btn: id: home_btn_zoe x: 520 y: 140 width: 200 height: 200 bg_color: 0xFFFFFF bg_opa: TRANSP border_color: 0xFF4757 border_width: 5 radius: 24 on_click: then: - lvgl.page.show: page_zoe widgets: - label: align: CENTER y: -38 text: "🐻" text_font: font_title - label: align: CENTER y: 28 text: "Zoe" text_font: font_name text_color: 0x2D3436 - label: id: home_status_zoe align: CENTER y: 68 text: "not done" text_font: font_tiny text_color: 0xFF4757 - id: page_emma bg_color: 0xFFF9F0 widgets: # ── Sidebar ────────────────────────────────────────────────────────── - obj: x: 0 y: 0 width: 180 height: 480 bg_color: 0x4D96FF border_width: 0 radius: 0 pad_all: 0 widgets: - label: x: 0 y: 20 width: 180 align: TOP_MID text: "🐶" text_font: font_title - label: x: 0 y: 74 width: 180 align: TOP_MID text: "Emma" text_font: font_name text_color: 0xFFFFFF - label: id: sidebar_stars_emma x: 0 y: 120 width: 180 align: TOP_MID text: "⭐ 0 stars" text_font: font_med text_color: 0xFFD93D # Progress bar - bar: id: progress_bar_emma x: 16 y: 164 width: 148 height: 16 bg_color: 0x2A6FCC indicator: bg_color: 0xFFFFFF value: 0 min_value: 0 max_value: 8 - label: id: progress_label_emma x: 0 y: 188 width: 180 align: TOP_MID text: "0 / 8" text_font: font_tiny text_color: 0xDDEEFF # All-done celebration label (hidden until complete) - label: id: all_done_label_emma x: 0 y: 214 width: 180 align: TOP_MID text: "" text_font: font_small text_color: 0xFFFFFF # Manual reset button (parent use — above back button) - btn: x: 16 y: 362 width: 148 height: 44 bg_color: 0xFF4757 radius: 14 on_click: then: - script.execute: reset_emma_chores widgets: - label: align: CENTER text: "↺ Reset" text_color: 0xFFFFFF text_font: font_small # Back button - btn: x: 16 y: 418 width: 148 height: 46 bg_color: 0x2A6FCC radius: 14 on_click: then: - lvgl.page.show: page_home widgets: - label: align: CENTER text: "◀ Home" text_color: 0xFFFFFF text_font: font_small # ── Chore cards ─────────────────────────────────────────────────────── # Make Bed - btn: id: card_emma_make_bed x: 190 y: 10 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: emma_make_bed widgets: - label: id: check_emma_make_bed align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🛏️" text_font: font_med - label: align: CENTER y: 23 text: "Make Bed" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Brush Teeth - btn: id: card_emma_brush_teeth x: 393 y: 10 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: emma_brush_teeth widgets: - label: id: check_emma_brush_teeth align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🦷" text_font: font_med - label: align: CENTER y: 23 text: "Brush Teeth" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Tidy Room - btn: id: card_emma_tidy_room x: 596 y: 10 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: emma_tidy_room widgets: - label: id: check_emma_tidy_room align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🧹" text_font: font_med - label: align: CENTER y: 23 text: "Tidy Room" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 2" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Homework - btn: id: card_emma_homework x: 190 y: 158 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: emma_homework widgets: - label: id: check_emma_homework align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "📚" text_font: font_med - label: align: CENTER y: 23 text: "Homework" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 3" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Set Table - btn: id: card_emma_set_table x: 393 y: 158 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: emma_set_table widgets: - label: id: check_emma_set_table align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🍽️" text_font: font_med - label: align: CENTER y: 23 text: "Set Table" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Take Out Trash - btn: id: card_emma_take_out_trash x: 596 y: 158 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: emma_take_out_trash widgets: - label: id: check_emma_take_out_trash align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🗑️" text_font: font_med - label: align: CENTER y: 23 text: "Take Out Trash" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 2" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Feed Pet - btn: id: card_emma_feed_pet x: 190 y: 306 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: emma_feed_pet widgets: - label: id: check_emma_feed_pet align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🐾" text_font: font_med - label: align: CENTER y: 23 text: "Feed Pet" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Water Plants - btn: id: card_emma_water_plants x: 393 y: 306 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: emma_water_plants widgets: - label: id: check_emma_water_plants align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🌱" text_font: font_med - label: align: CENTER y: 23 text: "Water Plants" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 - id: page_liam bg_color: 0xFFF9F0 widgets: # ── Sidebar ────────────────────────────────────────────────────────── - obj: x: 0 y: 0 width: 180 height: 480 bg_color: 0xC77DFF border_width: 0 radius: 0 pad_all: 0 widgets: - label: x: 0 y: 20 width: 180 align: TOP_MID text: "🐱" text_font: font_title - label: x: 0 y: 74 width: 180 align: TOP_MID text: "Liam" text_font: font_name text_color: 0xFFFFFF - label: id: sidebar_stars_liam x: 0 y: 120 width: 180 align: TOP_MID text: "⭐ 0 stars" text_font: font_med text_color: 0xFFD93D # Progress bar - bar: id: progress_bar_liam x: 16 y: 164 width: 148 height: 16 bg_color: 0x8B42CC indicator: bg_color: 0xFFFFFF value: 0 min_value: 0 max_value: 8 - label: id: progress_label_liam x: 0 y: 188 width: 180 align: TOP_MID text: "0 / 8" text_font: font_tiny text_color: 0xDDEEFF # All-done celebration label (hidden until complete) - label: id: all_done_label_liam x: 0 y: 214 width: 180 align: TOP_MID text: "" text_font: font_small text_color: 0xFFFFFF # Manual reset button (parent use — above back button) - btn: x: 16 y: 362 width: 148 height: 44 bg_color: 0xFF4757 radius: 14 on_click: then: - script.execute: reset_liam_chores widgets: - label: align: CENTER text: "↺ Reset" text_color: 0xFFFFFF text_font: font_small # Back button - btn: x: 16 y: 418 width: 148 height: 46 bg_color: 0x8B42CC radius: 14 on_click: then: - lvgl.page.show: page_home widgets: - label: align: CENTER text: "◀ Home" text_color: 0xFFFFFF text_font: font_small # ── Chore cards ─────────────────────────────────────────────────────── # Make Bed - btn: id: card_liam_make_bed x: 190 y: 10 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: liam_make_bed widgets: - label: id: check_liam_make_bed align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🛏️" text_font: font_med - label: align: CENTER y: 23 text: "Make Bed" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Brush Teeth - btn: id: card_liam_brush_teeth x: 393 y: 10 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: liam_brush_teeth widgets: - label: id: check_liam_brush_teeth align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🦷" text_font: font_med - label: align: CENTER y: 23 text: "Brush Teeth" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Tidy Room - btn: id: card_liam_tidy_room x: 596 y: 10 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: liam_tidy_room widgets: - label: id: check_liam_tidy_room align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🧹" text_font: font_med - label: align: CENTER y: 23 text: "Tidy Room" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 2" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Homework - btn: id: card_liam_homework x: 190 y: 158 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: liam_homework widgets: - label: id: check_liam_homework align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "📚" text_font: font_med - label: align: CENTER y: 23 text: "Homework" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 3" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Set Table - btn: id: card_liam_set_table x: 393 y: 158 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: liam_set_table widgets: - label: id: check_liam_set_table align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🍽️" text_font: font_med - label: align: CENTER y: 23 text: "Set Table" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Take Out Trash - btn: id: card_liam_take_out_trash x: 596 y: 158 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: liam_take_out_trash widgets: - label: id: check_liam_take_out_trash align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🗑️" text_font: font_med - label: align: CENTER y: 23 text: "Take Out Trash" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 2" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Feed Pet - btn: id: card_liam_feed_pet x: 190 y: 306 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: liam_feed_pet widgets: - label: id: check_liam_feed_pet align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🐾" text_font: font_med - label: align: CENTER y: 23 text: "Feed Pet" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Water Plants - btn: id: card_liam_water_plants x: 393 y: 306 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: liam_water_plants widgets: - label: id: check_liam_water_plants align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🌱" text_font: font_med - label: align: CENTER y: 23 text: "Water Plants" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 - id: page_zoe bg_color: 0xFFF9F0 widgets: # ── Sidebar ────────────────────────────────────────────────────────── - obj: x: 0 y: 0 width: 180 height: 480 bg_color: 0xFF6B9D border_width: 0 radius: 0 pad_all: 0 widgets: - label: x: 0 y: 20 width: 180 align: TOP_MID text: "🐻" text_font: font_title - label: x: 0 y: 74 width: 180 align: TOP_MID text: "Zoe" text_font: font_name text_color: 0xFFFFFF - label: id: sidebar_stars_zoe x: 0 y: 120 width: 180 align: TOP_MID text: "⭐ 0 stars" text_font: font_med text_color: 0xFFD93D # Progress bar - bar: id: progress_bar_zoe x: 16 y: 164 width: 148 height: 16 bg_color: 0xCC3A6F indicator: bg_color: 0xFFFFFF value: 0 min_value: 0 max_value: 8 - label: id: progress_label_zoe x: 0 y: 188 width: 180 align: TOP_MID text: "0 / 8" text_font: font_tiny text_color: 0xDDEEFF # All-done celebration label (hidden until complete) - label: id: all_done_label_zoe x: 0 y: 214 width: 180 align: TOP_MID text: "" text_font: font_small text_color: 0xFFFFFF # Manual reset button (parent use — above back button) - btn: x: 16 y: 362 width: 148 height: 44 bg_color: 0xFF4757 radius: 14 on_click: then: - script.execute: reset_zoe_chores widgets: - label: align: CENTER text: "↺ Reset" text_color: 0xFFFFFF text_font: font_small # Back button - btn: x: 16 y: 418 width: 148 height: 46 bg_color: 0xCC3A6F radius: 14 on_click: then: - lvgl.page.show: page_home widgets: - label: align: CENTER text: "◀ Home" text_color: 0xFFFFFF text_font: font_small # ── Chore cards ─────────────────────────────────────────────────────── # Make Bed - btn: id: card_zoe_make_bed x: 190 y: 10 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: zoe_make_bed widgets: - label: id: check_zoe_make_bed align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🛏️" text_font: font_med - label: align: CENTER y: 23 text: "Make Bed" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Brush Teeth - btn: id: card_zoe_brush_teeth x: 393 y: 10 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: zoe_brush_teeth widgets: - label: id: check_zoe_brush_teeth align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🦷" text_font: font_med - label: align: CENTER y: 23 text: "Brush Teeth" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Tidy Room - btn: id: card_zoe_tidy_room x: 596 y: 10 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: zoe_tidy_room widgets: - label: id: check_zoe_tidy_room align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🧹" text_font: font_med - label: align: CENTER y: 23 text: "Tidy Room" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 2" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Homework - btn: id: card_zoe_homework x: 190 y: 158 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: zoe_homework widgets: - label: id: check_zoe_homework align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "📚" text_font: font_med - label: align: CENTER y: 23 text: "Homework" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 3" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Set Table - btn: id: card_zoe_set_table x: 393 y: 158 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: zoe_set_table widgets: - label: id: check_zoe_set_table align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🍽️" text_font: font_med - label: align: CENTER y: 23 text: "Set Table" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Take Out Trash - btn: id: card_zoe_take_out_trash x: 596 y: 158 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: zoe_take_out_trash widgets: - label: id: check_zoe_take_out_trash align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🗑️" text_font: font_med - label: align: CENTER y: 23 text: "Take Out Trash" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 2" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Feed Pet - btn: id: card_zoe_feed_pet x: 190 y: 306 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: zoe_feed_pet widgets: - label: id: check_zoe_feed_pet align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🐾" text_font: font_med - label: align: CENTER y: 23 text: "Feed Pet" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2 # Water Plants - btn: id: card_zoe_water_plants x: 393 y: 306 width: 193 height: 138 bg_color: 0xFFFFFF border_color: 0xEEEEEE border_width: 2 radius: 20 shadow_color: 0xCCCCCC shadow_width: 4 shadow_ofs_y: 3 on_click: then: - switch.toggle: zoe_water_plants widgets: - label: id: check_zoe_water_plants align: TOP_RIGHT x: -10 y: 8 text: "" text_font: font_med - label: align: CENTER y: -34 text: "🌱" text_font: font_med - label: align: CENTER y: 23 text: "Water Plants" text_font: font_small text_color: 0x2D3436 - label: align: CENTER y: 45 text: "⭐ 1" text_font: font_tiny text_color: 0x7A5900 bg_color: 0xFFD93D radius: 8 pad_left: 8 pad_right: 8 pad_top: 2 pad_bottom: 2