From b635c771ec122194d8f36c3989eb38420b6a7b6e Mon Sep 17 00:00:00 2001 From: Joshua King Date: Sat, 28 Feb 2026 09:41:42 -0500 Subject: [PATCH] Refactor chore tracker for new kids: Emma, Liam, and Zoe - Updated dashboard YAML to reflect new kids and their chores. - Modified chores configuration to include new kids with appropriate icons and settings. - Adjusted generation script to handle new MDI glyphs for icons. - Revised Home Assistant integration to support new kids, including input buttons and automation for chores. - Ensured all references to old kids (Jordyn, Declan, Chloe) are replaced with new names and corresponding logic. --- esphome/chore-tracker-esphome.yaml | 891 +++++++++--------- .../chore-tracker-dashboard.yaml | 110 +-- esphome/chore-tracker/chores_config.yaml | 66 +- esphome/chore-tracker/generate.py | 24 +- packages/chore-tracker-ha.yaml | 182 ++-- 5 files changed, 660 insertions(+), 613 deletions(-) diff --git a/esphome/chore-tracker-esphome.yaml b/esphome/chore-tracker-esphome.yaml index cb1b5db..fe6d3f7 100644 --- a/esphome/chore-tracker-esphome.yaml +++ b/esphome/chore-tracker-esphome.yaml @@ -1,6 +1,6 @@ ################################################################################ # chore-tracker-esphome.yaml (AUTO-GENERATED — edit chores_config.yaml) -# Kids: Jordyn, Declan, Chloe +# Kids: Emma, Liam, Zoe # # HOME SCREEN BEHAVIOUR: # Red outline = chores incomplete @@ -29,7 +29,7 @@ psram: speed: 80MHz wifi: - ssid: !secret wifi_iot_ssid + ssid: !secret wifi_ssid password: !secret wifi_password ap: ssid: "Chore Tracker Hotspot" @@ -110,9 +110,9 @@ time: seconds: 0 then: - lambda: |- - id(reset_jordyn_chores).execute(); - id(reset_declan_chores).execute(); - id(reset_chloe_chores).execute(); + id(reset_emma_chores).execute(); + id(reset_liam_chores).execute(); + id(reset_zoe_chores).execute(); - lvgl.page.show: page_home # ── Fonts (place files in /config/esphome/fonts/) ──────────────────────────── @@ -132,6 +132,17 @@ font: - file: "fonts/Nunito-SemiBold.ttf" id: font_tiny size: 13 + # MDI icon font — used for chore icons and kid avatars + - file: "fonts/materialdesignicons-webfont.ttf" + id: font_mdi_large + size: 48 + bpp: 4 + glyphs: 󰂨󰇹󰈙󰉥󰋣󰏧󰖸󰦩󰲙󰾞󱞵󱬥 + - file: "fonts/materialdesignicons-webfont.ttf" + id: font_mdi_small + size: 32 + bpp: 4 + glyphs: 󰂨󰇹󰈙󰉥󰋣󰏧󰖸󰦩󰲙󰾞󱞵󱬥 # ── Switches — backlight raw + one per chore per kid ───────────────────────── switch: @@ -145,664 +156,664 @@ switch: mode: output: true - # ── Jordyn's chores ────────────────────────── + # ── Emma's chores ────────────────────────── - platform: template - name: "Jordyn - Make Bed" - id: jordyn_make_bed + name: "Emma - Make Bed" + id: emma_make_bed icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_jordyn_ui + - script.execute: update_emma_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_jordyn_make_bed + entity_id: switch.chore_tracker_emma_make_bed on_turn_off: then: - - script.execute: update_jordyn_ui + - script.execute: update_emma_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_jordyn_make_bed + entity_id: switch.chore_tracker_emma_make_bed - platform: template - name: "Jordyn - Brush Teeth" - id: jordyn_brush_teeth + name: "Emma - Brush Teeth" + id: emma_brush_teeth icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_jordyn_ui + - script.execute: update_emma_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_jordyn_brush_teeth + entity_id: switch.chore_tracker_emma_brush_teeth on_turn_off: then: - - script.execute: update_jordyn_ui + - script.execute: update_emma_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_jordyn_brush_teeth + entity_id: switch.chore_tracker_emma_brush_teeth - platform: template - name: "Jordyn - Tidy Room" - id: jordyn_tidy_room + name: "Emma - Tidy Room" + id: emma_tidy_room icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_jordyn_ui + - script.execute: update_emma_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_jordyn_tidy_room + entity_id: switch.chore_tracker_emma_tidy_room on_turn_off: then: - - script.execute: update_jordyn_ui + - script.execute: update_emma_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_jordyn_tidy_room + entity_id: switch.chore_tracker_emma_tidy_room - platform: template - name: "Jordyn - Homework" - id: jordyn_homework + name: "Emma - Homework" + id: emma_homework icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_jordyn_ui + - script.execute: update_emma_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_jordyn_homework + entity_id: switch.chore_tracker_emma_homework on_turn_off: then: - - script.execute: update_jordyn_ui + - script.execute: update_emma_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_jordyn_homework + entity_id: switch.chore_tracker_emma_homework - platform: template - name: "Jordyn - Feed Dog" - id: jordyn_feed_dog + name: "Emma - Feed Dog" + id: emma_feed_dog icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_jordyn_ui + - script.execute: update_emma_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_jordyn_feed_dog + entity_id: switch.chore_tracker_emma_feed_dog on_turn_off: then: - - script.execute: update_jordyn_ui + - script.execute: update_emma_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_jordyn_feed_dog + entity_id: switch.chore_tracker_emma_feed_dog - # ── Declan's chores ────────────────────────── + # ── Liam's chores ────────────────────────── - platform: template - name: "Declan - Make Bed" - id: declan_make_bed + name: "Liam - Make Bed" + id: liam_make_bed icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_declan_ui + - script.execute: update_liam_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_declan_make_bed + entity_id: switch.chore_tracker_liam_make_bed on_turn_off: then: - - script.execute: update_declan_ui + - script.execute: update_liam_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_declan_make_bed + entity_id: switch.chore_tracker_liam_make_bed - platform: template - name: "Declan - Brush Teeth" - id: declan_brush_teeth + name: "Liam - Brush Teeth" + id: liam_brush_teeth icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_declan_ui + - script.execute: update_liam_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_declan_brush_teeth + entity_id: switch.chore_tracker_liam_brush_teeth on_turn_off: then: - - script.execute: update_declan_ui + - script.execute: update_liam_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_declan_brush_teeth + entity_id: switch.chore_tracker_liam_brush_teeth - platform: template - name: "Declan - Set Table" - id: declan_set_table + name: "Liam - Set Table" + id: liam_set_table icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_declan_ui + - script.execute: update_liam_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_declan_set_table + entity_id: switch.chore_tracker_liam_set_table on_turn_off: then: - - script.execute: update_declan_ui + - script.execute: update_liam_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_declan_set_table + entity_id: switch.chore_tracker_liam_set_table - platform: template - name: "Declan - Take Out Trash" - id: declan_take_out_trash + name: "Liam - Take Out Trash" + id: liam_take_out_trash icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_declan_ui + - script.execute: update_liam_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_declan_take_out_trash + entity_id: switch.chore_tracker_liam_take_out_trash on_turn_off: then: - - script.execute: update_declan_ui + - script.execute: update_liam_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_declan_take_out_trash + entity_id: switch.chore_tracker_liam_take_out_trash - # ── Chloe's chores ────────────────────────── + # ── Zoe's chores ────────────────────────── - platform: template - name: "Chloe - Make Bed" - id: chloe_make_bed + name: "Zoe - Make Bed" + id: zoe_make_bed icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_chloe_make_bed + entity_id: switch.chore_tracker_zoe_make_bed on_turn_off: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_chloe_make_bed + entity_id: switch.chore_tracker_zoe_make_bed - platform: template - name: "Chloe - Brush Teeth" - id: chloe_brush_teeth + name: "Zoe - Brush Teeth" + id: zoe_brush_teeth icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_chloe_brush_teeth + entity_id: switch.chore_tracker_zoe_brush_teeth on_turn_off: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_chloe_brush_teeth + entity_id: switch.chore_tracker_zoe_brush_teeth - platform: template - name: "Chloe - Water Plants" - id: chloe_water_plants + name: "Zoe - Water Plants" + id: zoe_water_plants icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_chloe_water_plants + entity_id: switch.chore_tracker_zoe_water_plants on_turn_off: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_chloe_water_plants + entity_id: switch.chore_tracker_zoe_water_plants - platform: template - name: "Chloe - Homework" - id: chloe_homework + name: "Zoe - Homework" + id: zoe_homework icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_chloe_homework + entity_id: switch.chore_tracker_zoe_homework on_turn_off: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_chloe_homework + entity_id: switch.chore_tracker_zoe_homework - platform: template - name: "Chloe - Tidy Room" - id: chloe_tidy_room + name: "Zoe - Tidy Room" + id: zoe_tidy_room icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_chloe_tidy_room + entity_id: switch.chore_tracker_zoe_tidy_room on_turn_off: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_chloe_tidy_room + entity_id: switch.chore_tracker_zoe_tidy_room - platform: template - name: "Chloe - Practice Piano" - id: chloe_practice_piano + name: "Zoe - Practice Piano" + id: zoe_practice_piano icon: mdi:checkbox-marked-circle optimistic: true restore_mode: RESTORE_DEFAULT_OFF on_turn_on: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_on data: - entity_id: switch.chore_tracker_chloe_practice_piano + entity_id: switch.chore_tracker_zoe_practice_piano on_turn_off: then: - - script.execute: update_chloe_ui + - script.execute: update_zoe_ui - homeassistant.service: service: switch.turn_off data: - entity_id: switch.chore_tracker_chloe_practice_piano + entity_id: switch.chore_tracker_zoe_practice_piano # ── Sensors — reported to HA ───────────────────────────────────────────────── sensor: - platform: template - name: "Jordyn Chores Done" - id: jordyn_chores_done + name: "Emma Chores Done" + id: emma_chores_done accuracy_decimals: 0 update_interval: 2s lambda: |- int done = 0; - if (id(jordyn_make_bed).state) done++; - if (id(jordyn_brush_teeth).state) done++; - if (id(jordyn_tidy_room).state) done++; - if (id(jordyn_homework).state) done++; - if (id(jordyn_feed_dog).state) done++; + 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_feed_dog).state) done++; return done; - platform: template - name: "Declan Chores Done" - id: declan_chores_done + name: "Liam Chores Done" + id: liam_chores_done accuracy_decimals: 0 update_interval: 2s lambda: |- int done = 0; - if (id(declan_make_bed).state) done++; - if (id(declan_brush_teeth).state) done++; - if (id(declan_set_table).state) done++; - if (id(declan_take_out_trash).state) done++; + if (id(liam_make_bed).state) done++; + if (id(liam_brush_teeth).state) done++; + if (id(liam_set_table).state) done++; + if (id(liam_take_out_trash).state) done++; return done; - platform: template - name: "Chloe Chores Done" - id: chloe_chores_done + name: "Zoe Chores Done" + id: zoe_chores_done accuracy_decimals: 0 update_interval: 2s lambda: |- int done = 0; - if (id(chloe_make_bed).state) done++; - if (id(chloe_brush_teeth).state) done++; - if (id(chloe_water_plants).state) done++; - if (id(chloe_homework).state) done++; - if (id(chloe_tidy_room).state) done++; - if (id(chloe_practice_piano).state) done++; + if (id(zoe_make_bed).state) done++; + if (id(zoe_brush_teeth).state) done++; + if (id(zoe_water_plants).state) done++; + if (id(zoe_homework).state) done++; + if (id(zoe_tidy_room).state) done++; + if (id(zoe_practice_piano).state) done++; return done; # ── Scripts — reset + UI update ─────────────────────────────────────────────── script: - - id: reset_jordyn_chores + - id: reset_emma_chores mode: single then: - lambda: |- - id(jordyn_make_bed).turn_off(); - id(jordyn_brush_teeth).turn_off(); - id(jordyn_tidy_room).turn_off(); - id(jordyn_homework).turn_off(); - id(jordyn_feed_dog).turn_off(); - - script.execute: update_jordyn_ui + 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_feed_dog).turn_off(); + - script.execute: update_emma_ui - - id: update_jordyn_ui + - id: update_emma_ui mode: single then: - lambda: |- - int done = (id(jordyn_make_bed).state ? 1 : 0) + (id(jordyn_brush_teeth).state ? 1 : 0) + (id(jordyn_tidy_room).state ? 1 : 0) + (id(jordyn_homework).state ? 1 : 0) + (id(jordyn_feed_dog).state ? 1 : 0); + 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_feed_dog).state ? 1 : 0); int total = 5; char buf[24]; // Progress bar + label - lv_bar_set_value(id(progress_bar_jordyn), done, LV_ANIM_ON); + lv_bar_set_value(id(progress_bar_emma), done, LV_ANIM_ON); snprintf(buf, sizeof(buf), "%d / 5", done); - lv_label_set_text(id(progress_label_jordyn), buf); + lv_label_set_text(id(progress_label_emma), buf); // All-done message in sidebar - lv_label_set_text(id(all_done_label_jordyn), done == total ? "All done!" : ""); + lv_label_set_text(id(all_done_label_emma), done == total ? "All done!" : ""); // Home button: RED outline = incomplete, SOLID GREEN = all done if (done == total) { - lv_obj_set_style_bg_opa(id(home_btn_jordyn), LV_OPA_COVER, LV_PART_MAIN); - lv_obj_set_style_bg_color(id(home_btn_jordyn), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(home_btn_jordyn), 0, LV_PART_MAIN); - lv_label_set_text(id(home_status_jordyn), "\u2713 all done!"); - lv_obj_set_style_text_color(id(home_status_jordyn), lv_color_hex(0xFFFFFF), LV_PART_MAIN); + 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), "\u2713 all done!"); + lv_obj_set_style_text_color(id(home_status_emma), lv_color_hex(0xFFFFFF), LV_PART_MAIN); } else { - lv_obj_set_style_bg_opa(id(home_btn_jordyn), LV_OPA_TRANSP, LV_PART_MAIN); - lv_obj_set_style_border_color(id(home_btn_jordyn), lv_color_hex(0xFF4757), LV_PART_MAIN); - lv_obj_set_style_border_width(id(home_btn_jordyn), 5, LV_PART_MAIN); + 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_jordyn), buf); - lv_obj_set_style_text_color(id(home_status_jordyn), lv_color_hex(0xFF4757), LV_PART_MAIN); + 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); } // Card colours - if (id(jordyn_make_bed).state) { - lv_obj_set_style_bg_color(id(card_jordyn_make_bed), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_jordyn_make_bed), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_jordyn_make_bed), 3, LV_PART_MAIN); - lv_label_set_text(id(check_jordyn_make_bed), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_jordyn_make_bed), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_jordyn_make_bed), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_jordyn_make_bed), 2, LV_PART_MAIN); - lv_label_set_text(id(check_jordyn_make_bed), ""); + lv_obj_set_style_bg_color(id(card_emma_make_bed), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(jordyn_brush_teeth).state) { - lv_obj_set_style_bg_color(id(card_jordyn_brush_teeth), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_jordyn_brush_teeth), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_jordyn_brush_teeth), 3, LV_PART_MAIN); - lv_label_set_text(id(check_jordyn_brush_teeth), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_jordyn_brush_teeth), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_jordyn_brush_teeth), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_jordyn_brush_teeth), 2, LV_PART_MAIN); - lv_label_set_text(id(check_jordyn_brush_teeth), ""); + lv_obj_set_style_bg_color(id(card_emma_brush_teeth), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(jordyn_tidy_room).state) { - lv_obj_set_style_bg_color(id(card_jordyn_tidy_room), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_jordyn_tidy_room), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_jordyn_tidy_room), 3, LV_PART_MAIN); - lv_label_set_text(id(check_jordyn_tidy_room), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_jordyn_tidy_room), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_jordyn_tidy_room), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_jordyn_tidy_room), 2, LV_PART_MAIN); - lv_label_set_text(id(check_jordyn_tidy_room), ""); + lv_obj_set_style_bg_color(id(card_emma_tidy_room), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(jordyn_homework).state) { - lv_obj_set_style_bg_color(id(card_jordyn_homework), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_jordyn_homework), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_jordyn_homework), 3, LV_PART_MAIN); - lv_label_set_text(id(check_jordyn_homework), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_jordyn_homework), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_jordyn_homework), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_jordyn_homework), 2, LV_PART_MAIN); - lv_label_set_text(id(check_jordyn_homework), ""); + lv_obj_set_style_bg_color(id(card_emma_homework), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(jordyn_feed_dog).state) { - lv_obj_set_style_bg_color(id(card_jordyn_feed_dog), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_jordyn_feed_dog), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_jordyn_feed_dog), 3, LV_PART_MAIN); - lv_label_set_text(id(check_jordyn_feed_dog), "\u2705"); + if (id(emma_feed_dog).state) { + lv_obj_set_style_bg_color(id(card_emma_feed_dog), lv_color_hex(0xF0FFF4), LV_PART_MAIN); + lv_obj_set_style_border_color(id(card_emma_feed_dog), lv_color_hex(0x6BCB77), LV_PART_MAIN); + lv_obj_set_style_border_width(id(card_emma_feed_dog), 3, LV_PART_MAIN); + lv_label_set_text(id(check_emma_feed_dog), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_jordyn_feed_dog), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_jordyn_feed_dog), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_jordyn_feed_dog), 2, LV_PART_MAIN); - lv_label_set_text(id(check_jordyn_feed_dog), ""); + lv_obj_set_style_bg_color(id(card_emma_feed_dog), lv_color_hex(0xFFFFFF), LV_PART_MAIN); + lv_obj_set_style_border_color(id(card_emma_feed_dog), lv_color_hex(0xEEEEEE), LV_PART_MAIN); + lv_obj_set_style_border_width(id(card_emma_feed_dog), 2, LV_PART_MAIN); + lv_label_set_text(id(check_emma_feed_dog), ""); } - - id: reset_declan_chores + - id: reset_liam_chores mode: single then: - lambda: |- - id(declan_make_bed).turn_off(); - id(declan_brush_teeth).turn_off(); - id(declan_set_table).turn_off(); - id(declan_take_out_trash).turn_off(); - - script.execute: update_declan_ui + id(liam_make_bed).turn_off(); + id(liam_brush_teeth).turn_off(); + id(liam_set_table).turn_off(); + id(liam_take_out_trash).turn_off(); + - script.execute: update_liam_ui - - id: update_declan_ui + - id: update_liam_ui mode: single then: - lambda: |- - int done = (id(declan_make_bed).state ? 1 : 0) + (id(declan_brush_teeth).state ? 1 : 0) + (id(declan_set_table).state ? 1 : 0) + (id(declan_take_out_trash).state ? 1 : 0); + int done = (id(liam_make_bed).state ? 1 : 0) + (id(liam_brush_teeth).state ? 1 : 0) + (id(liam_set_table).state ? 1 : 0) + (id(liam_take_out_trash).state ? 1 : 0); int total = 4; char buf[24]; // Progress bar + label - lv_bar_set_value(id(progress_bar_declan), done, LV_ANIM_ON); + lv_bar_set_value(id(progress_bar_liam), done, LV_ANIM_ON); snprintf(buf, sizeof(buf), "%d / 4", done); - lv_label_set_text(id(progress_label_declan), buf); + lv_label_set_text(id(progress_label_liam), buf); // All-done message in sidebar - lv_label_set_text(id(all_done_label_declan), done == total ? "All done!" : ""); + lv_label_set_text(id(all_done_label_liam), done == total ? "All done!" : ""); // Home button: RED outline = incomplete, SOLID GREEN = all done if (done == total) { - lv_obj_set_style_bg_opa(id(home_btn_declan), LV_OPA_COVER, LV_PART_MAIN); - lv_obj_set_style_bg_color(id(home_btn_declan), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(home_btn_declan), 0, LV_PART_MAIN); - lv_label_set_text(id(home_status_declan), "\u2713 all done!"); - lv_obj_set_style_text_color(id(home_status_declan), lv_color_hex(0xFFFFFF), LV_PART_MAIN); + 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), "\u2713 all done!"); + lv_obj_set_style_text_color(id(home_status_liam), lv_color_hex(0xFFFFFF), LV_PART_MAIN); } else { - lv_obj_set_style_bg_opa(id(home_btn_declan), LV_OPA_TRANSP, LV_PART_MAIN); - lv_obj_set_style_border_color(id(home_btn_declan), lv_color_hex(0xFF4757), LV_PART_MAIN); - lv_obj_set_style_border_width(id(home_btn_declan), 5, LV_PART_MAIN); + 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_declan), buf); - lv_obj_set_style_text_color(id(home_status_declan), lv_color_hex(0xFF4757), LV_PART_MAIN); + 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); } // Card colours - if (id(declan_make_bed).state) { - lv_obj_set_style_bg_color(id(card_declan_make_bed), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_declan_make_bed), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_declan_make_bed), 3, LV_PART_MAIN); - lv_label_set_text(id(check_declan_make_bed), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_declan_make_bed), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_declan_make_bed), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_declan_make_bed), 2, LV_PART_MAIN); - lv_label_set_text(id(check_declan_make_bed), ""); + lv_obj_set_style_bg_color(id(card_liam_make_bed), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(declan_brush_teeth).state) { - lv_obj_set_style_bg_color(id(card_declan_brush_teeth), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_declan_brush_teeth), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_declan_brush_teeth), 3, LV_PART_MAIN); - lv_label_set_text(id(check_declan_brush_teeth), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_declan_brush_teeth), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_declan_brush_teeth), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_declan_brush_teeth), 2, LV_PART_MAIN); - lv_label_set_text(id(check_declan_brush_teeth), ""); + lv_obj_set_style_bg_color(id(card_liam_brush_teeth), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(declan_set_table).state) { - lv_obj_set_style_bg_color(id(card_declan_set_table), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_declan_set_table), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_declan_set_table), 3, LV_PART_MAIN); - lv_label_set_text(id(check_declan_set_table), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_declan_set_table), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_declan_set_table), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_declan_set_table), 2, LV_PART_MAIN); - lv_label_set_text(id(check_declan_set_table), ""); + lv_obj_set_style_bg_color(id(card_liam_set_table), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(declan_take_out_trash).state) { - lv_obj_set_style_bg_color(id(card_declan_take_out_trash), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_declan_take_out_trash), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_declan_take_out_trash), 3, LV_PART_MAIN); - lv_label_set_text(id(check_declan_take_out_trash), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_declan_take_out_trash), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_declan_take_out_trash), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_declan_take_out_trash), 2, LV_PART_MAIN); - lv_label_set_text(id(check_declan_take_out_trash), ""); + lv_obj_set_style_bg_color(id(card_liam_take_out_trash), lv_color_hex(0xFFFFFF), 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), ""); } - - id: reset_chloe_chores + - id: reset_zoe_chores mode: single then: - lambda: |- - id(chloe_make_bed).turn_off(); - id(chloe_brush_teeth).turn_off(); - id(chloe_water_plants).turn_off(); - id(chloe_homework).turn_off(); - id(chloe_tidy_room).turn_off(); - id(chloe_practice_piano).turn_off(); - - script.execute: update_chloe_ui + id(zoe_make_bed).turn_off(); + id(zoe_brush_teeth).turn_off(); + id(zoe_water_plants).turn_off(); + id(zoe_homework).turn_off(); + id(zoe_tidy_room).turn_off(); + id(zoe_practice_piano).turn_off(); + - script.execute: update_zoe_ui - - id: update_chloe_ui + - id: update_zoe_ui mode: single then: - lambda: |- - int done = (id(chloe_make_bed).state ? 1 : 0) + (id(chloe_brush_teeth).state ? 1 : 0) + (id(chloe_water_plants).state ? 1 : 0) + (id(chloe_homework).state ? 1 : 0) + (id(chloe_tidy_room).state ? 1 : 0) + (id(chloe_practice_piano).state ? 1 : 0); + int done = (id(zoe_make_bed).state ? 1 : 0) + (id(zoe_brush_teeth).state ? 1 : 0) + (id(zoe_water_plants).state ? 1 : 0) + (id(zoe_homework).state ? 1 : 0) + (id(zoe_tidy_room).state ? 1 : 0) + (id(zoe_practice_piano).state ? 1 : 0); int total = 6; char buf[24]; // Progress bar + label - lv_bar_set_value(id(progress_bar_chloe), done, LV_ANIM_ON); + lv_bar_set_value(id(progress_bar_zoe), done, LV_ANIM_ON); snprintf(buf, sizeof(buf), "%d / 6", done); - lv_label_set_text(id(progress_label_chloe), buf); + lv_label_set_text(id(progress_label_zoe), buf); // All-done message in sidebar - lv_label_set_text(id(all_done_label_chloe), done == total ? "All done!" : ""); + lv_label_set_text(id(all_done_label_zoe), done == total ? "All done!" : ""); // Home button: RED outline = incomplete, SOLID GREEN = all done if (done == total) { - lv_obj_set_style_bg_opa(id(home_btn_chloe), LV_OPA_COVER, LV_PART_MAIN); - lv_obj_set_style_bg_color(id(home_btn_chloe), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(home_btn_chloe), 0, LV_PART_MAIN); - lv_label_set_text(id(home_status_chloe), "\u2713 all done!"); - lv_obj_set_style_text_color(id(home_status_chloe), lv_color_hex(0xFFFFFF), LV_PART_MAIN); + 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), "\u2713 all done!"); + lv_obj_set_style_text_color(id(home_status_zoe), lv_color_hex(0xFFFFFF), LV_PART_MAIN); } else { - lv_obj_set_style_bg_opa(id(home_btn_chloe), LV_OPA_TRANSP, LV_PART_MAIN); - lv_obj_set_style_border_color(id(home_btn_chloe), lv_color_hex(0xFF4757), LV_PART_MAIN); - lv_obj_set_style_border_width(id(home_btn_chloe), 5, LV_PART_MAIN); + 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_chloe), buf); - lv_obj_set_style_text_color(id(home_status_chloe), lv_color_hex(0xFF4757), LV_PART_MAIN); + 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); } // Card colours - if (id(chloe_make_bed).state) { - lv_obj_set_style_bg_color(id(card_chloe_make_bed), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_make_bed), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_make_bed), 3, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_make_bed), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_chloe_make_bed), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_make_bed), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_make_bed), 2, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_make_bed), ""); + lv_obj_set_style_bg_color(id(card_zoe_make_bed), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(chloe_brush_teeth).state) { - lv_obj_set_style_bg_color(id(card_chloe_brush_teeth), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_brush_teeth), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_brush_teeth), 3, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_brush_teeth), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_chloe_brush_teeth), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_brush_teeth), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_brush_teeth), 2, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_brush_teeth), ""); + lv_obj_set_style_bg_color(id(card_zoe_brush_teeth), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(chloe_water_plants).state) { - lv_obj_set_style_bg_color(id(card_chloe_water_plants), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_water_plants), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_water_plants), 3, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_water_plants), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_chloe_water_plants), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_water_plants), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_water_plants), 2, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_water_plants), ""); + lv_obj_set_style_bg_color(id(card_zoe_water_plants), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(chloe_homework).state) { - lv_obj_set_style_bg_color(id(card_chloe_homework), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_homework), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_homework), 3, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_homework), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_chloe_homework), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_homework), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_homework), 2, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_homework), ""); + lv_obj_set_style_bg_color(id(card_zoe_homework), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(chloe_tidy_room).state) { - lv_obj_set_style_bg_color(id(card_chloe_tidy_room), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_tidy_room), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_tidy_room), 3, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_tidy_room), "\u2705"); + 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_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), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_chloe_tidy_room), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_tidy_room), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_tidy_room), 2, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_tidy_room), ""); + lv_obj_set_style_bg_color(id(card_zoe_tidy_room), lv_color_hex(0xFFFFFF), 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), ""); } - if (id(chloe_practice_piano).state) { - lv_obj_set_style_bg_color(id(card_chloe_practice_piano), lv_color_hex(0xF0FFF4), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_practice_piano), lv_color_hex(0x6BCB77), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_practice_piano), 3, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_practice_piano), "\u2705"); + if (id(zoe_practice_piano).state) { + lv_obj_set_style_bg_color(id(card_zoe_practice_piano), lv_color_hex(0xF0FFF4), LV_PART_MAIN); + lv_obj_set_style_border_color(id(card_zoe_practice_piano), lv_color_hex(0x6BCB77), LV_PART_MAIN); + lv_obj_set_style_border_width(id(card_zoe_practice_piano), 3, LV_PART_MAIN); + lv_label_set_text(id(check_zoe_practice_piano), "\u2705"); } else { - lv_obj_set_style_bg_color(id(card_chloe_practice_piano), lv_color_hex(0xFFFFFF), LV_PART_MAIN); - lv_obj_set_style_border_color(id(card_chloe_practice_piano), lv_color_hex(0xEEEEEE), LV_PART_MAIN); - lv_obj_set_style_border_width(id(card_chloe_practice_piano), 2, LV_PART_MAIN); - lv_label_set_text(id(check_chloe_practice_piano), ""); + lv_obj_set_style_bg_color(id(card_zoe_practice_piano), lv_color_hex(0xFFFFFF), LV_PART_MAIN); + lv_obj_set_style_border_color(id(card_zoe_practice_piano), lv_color_hex(0xEEEEEE), LV_PART_MAIN); + lv_obj_set_style_border_width(id(card_zoe_practice_piano), 2, LV_PART_MAIN); + lv_label_set_text(id(check_zoe_practice_piano), ""); } @@ -846,9 +857,9 @@ lvgl: radius: 12 on_click: then: - - script.execute: reset_jordyn_chores - - script.execute: reset_declan_chores - - script.execute: reset_chloe_chores + - script.execute: reset_emma_chores + - script.execute: reset_liam_chores + - script.execute: reset_zoe_chores widgets: - label: align: CENTER @@ -856,7 +867,7 @@ lvgl: text_color: 0xFFFFFF text_font: font_tiny - button: - id: home_btn_jordyn + id: home_btn_emma x: 80 y: 130 width: 200 @@ -868,21 +879,21 @@ lvgl: radius: 24 on_click: then: - - lvgl.page.show: page_jordyn + - lvgl.page.show: page_emma widgets: - label: align: CENTER y: -45 - text: "😺" - text_font: font_title + text: "󰇹" + text_font: font_mdi_large - label: align: CENTER y: 22 - text: "Jordyn" + text: "Emma" text_font: font_name text_color: 0x2D3436 - label: - id: home_status_jordyn + id: home_status_emma align: CENTER y: 66 text: "not done" @@ -890,7 +901,7 @@ lvgl: text_color: 0xFF4757 - button: - id: home_btn_declan + id: home_btn_liam x: 300 y: 130 width: 200 @@ -902,21 +913,21 @@ lvgl: radius: 24 on_click: then: - - lvgl.page.show: page_declan + - lvgl.page.show: page_liam widgets: - label: align: CENTER y: -45 - text: "🤓" - text_font: font_title + text: "󰲙" + text_font: font_mdi_large - label: align: CENTER y: 22 - text: "Declan" + text: "Liam" text_font: font_name text_color: 0x2D3436 - label: - id: home_status_declan + id: home_status_liam align: CENTER y: 66 text: "not done" @@ -924,7 +935,7 @@ lvgl: text_color: 0xFF4757 - button: - id: home_btn_chloe + id: home_btn_zoe x: 520 y: 130 width: 200 @@ -936,21 +947,21 @@ lvgl: radius: 24 on_click: then: - - lvgl.page.show: page_chloe + - lvgl.page.show: page_zoe widgets: - label: align: CENTER y: -45 - text: "🌝" - text_font: font_title + text: "󱞵" + text_font: font_mdi_large - label: align: CENTER y: 22 - text: "Chloe" + text: "Zoe" text_font: font_name text_color: 0x2D3436 - label: - id: home_status_chloe + id: home_status_zoe align: CENTER y: 66 text: "not done" @@ -958,7 +969,7 @@ lvgl: text_color: 0xFF4757 - - id: page_jordyn + - id: page_emma bg_color: 0xFFF9F0 widgets: @@ -978,18 +989,18 @@ lvgl: y: 22 width: 172 align: TOP_MID - text: "😺" - text_font: font_title + text: "󰇹" + text_font: font_mdi_large - label: x: 0 y: 76 width: 172 align: TOP_MID - text: "Jordyn" + text: "Emma" text_font: font_name text_color: 0xFFFFFF - bar: - id: progress_bar_jordyn + id: progress_bar_emma x: 14 y: 132 width: 144 @@ -1001,7 +1012,7 @@ lvgl: min_value: 0 max_value: 5 - label: - id: progress_label_jordyn + id: progress_label_emma x: 0 y: 156 width: 172 @@ -1010,7 +1021,7 @@ lvgl: text_font: font_small text_color: 0xDDEEFF - label: - id: all_done_label_jordyn + id: all_done_label_emma x: 0 y: 192 width: 172 @@ -1027,7 +1038,7 @@ lvgl: radius: 14 on_click: then: - - script.execute: reset_jordyn_chores + - script.execute: reset_emma_chores widgets: - label: align: CENTER @@ -1053,7 +1064,7 @@ lvgl: # ── Chore cards ─────────────────────────────────────────────────────── - button: - id: card_jordyn_make_bed + id: card_emma_make_bed x: 182 y: 10 width: 196 @@ -1067,10 +1078,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: jordyn_make_bed + - switch.toggle: emma_make_bed widgets: - label: - id: check_jordyn_make_bed + id: check_emma_make_bed align: TOP_RIGHT x: -10 y: 8 @@ -1079,8 +1090,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🛏️" - text_font: font_med + text: "󰋣" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1089,7 +1100,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_jordyn_brush_teeth + id: card_emma_brush_teeth x: 388 y: 10 width: 196 @@ -1103,10 +1114,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: jordyn_brush_teeth + - switch.toggle: emma_brush_teeth widgets: - label: - id: check_jordyn_brush_teeth + id: check_emma_brush_teeth align: TOP_RIGHT x: -10 y: 8 @@ -1115,8 +1126,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🦷" - text_font: font_med + text: "󰦩" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1125,7 +1136,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_jordyn_tidy_room + id: card_emma_tidy_room x: 594 y: 10 width: 196 @@ -1139,10 +1150,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: jordyn_tidy_room + - switch.toggle: emma_tidy_room widgets: - label: - id: check_jordyn_tidy_room + id: check_emma_tidy_room align: TOP_RIGHT x: -10 y: 8 @@ -1151,8 +1162,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🧹" - text_font: font_med + text: "󰂨" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1161,7 +1172,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_jordyn_homework + id: card_emma_homework x: 182 y: 158 width: 196 @@ -1175,10 +1186,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: jordyn_homework + - switch.toggle: emma_homework widgets: - label: - id: check_jordyn_homework + id: check_emma_homework align: TOP_RIGHT x: -10 y: 8 @@ -1187,8 +1198,8 @@ lvgl: - label: align: CENTER y: -34 - text: "📚" - text_font: font_med + text: "󰈙" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1197,7 +1208,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_jordyn_feed_dog + id: card_emma_feed_dog x: 388 y: 158 width: 196 @@ -1211,10 +1222,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: jordyn_feed_dog + - switch.toggle: emma_feed_dog widgets: - label: - id: check_jordyn_feed_dog + id: check_emma_feed_dog align: TOP_RIGHT x: -10 y: 8 @@ -1223,8 +1234,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🐾" - text_font: font_med + text: "󰉥" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1233,7 +1244,7 @@ lvgl: text_color: 0x2D3436 - - id: page_declan + - id: page_liam bg_color: 0xFFF9F0 widgets: @@ -1253,18 +1264,18 @@ lvgl: y: 22 width: 172 align: TOP_MID - text: "🤓" - text_font: font_title + text: "󰲙" + text_font: font_mdi_large - label: x: 0 y: 76 width: 172 align: TOP_MID - text: "Declan" + text: "Liam" text_font: font_name text_color: 0xFFFFFF - bar: - id: progress_bar_declan + id: progress_bar_liam x: 14 y: 132 width: 144 @@ -1276,7 +1287,7 @@ lvgl: min_value: 0 max_value: 4 - label: - id: progress_label_declan + id: progress_label_liam x: 0 y: 156 width: 172 @@ -1285,7 +1296,7 @@ lvgl: text_font: font_small text_color: 0xDDEEFF - label: - id: all_done_label_declan + id: all_done_label_liam x: 0 y: 192 width: 172 @@ -1302,7 +1313,7 @@ lvgl: radius: 14 on_click: then: - - script.execute: reset_declan_chores + - script.execute: reset_liam_chores widgets: - label: align: CENTER @@ -1328,7 +1339,7 @@ lvgl: # ── Chore cards ─────────────────────────────────────────────────────── - button: - id: card_declan_make_bed + id: card_liam_make_bed x: 182 y: 10 width: 196 @@ -1342,10 +1353,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: declan_make_bed + - switch.toggle: liam_make_bed widgets: - label: - id: check_declan_make_bed + id: check_liam_make_bed align: TOP_RIGHT x: -10 y: 8 @@ -1354,8 +1365,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🛏️" - text_font: font_med + text: "󰋣" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1364,7 +1375,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_declan_brush_teeth + id: card_liam_brush_teeth x: 388 y: 10 width: 196 @@ -1378,10 +1389,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: declan_brush_teeth + - switch.toggle: liam_brush_teeth widgets: - label: - id: check_declan_brush_teeth + id: check_liam_brush_teeth align: TOP_RIGHT x: -10 y: 8 @@ -1390,8 +1401,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🦷" - text_font: font_med + text: "󰦩" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1400,7 +1411,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_declan_set_table + id: card_liam_set_table x: 594 y: 10 width: 196 @@ -1414,10 +1425,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: declan_set_table + - switch.toggle: liam_set_table widgets: - label: - id: check_declan_set_table + id: check_liam_set_table align: TOP_RIGHT x: -10 y: 8 @@ -1426,8 +1437,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🍽️" - text_font: font_med + text: "󰏧" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1436,7 +1447,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_declan_take_out_trash + id: card_liam_take_out_trash x: 182 y: 158 width: 196 @@ -1450,10 +1461,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: declan_take_out_trash + - switch.toggle: liam_take_out_trash widgets: - label: - id: check_declan_take_out_trash + id: check_liam_take_out_trash align: TOP_RIGHT x: -10 y: 8 @@ -1462,8 +1473,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🗑️" - text_font: font_med + text: "󰖸" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1472,7 +1483,7 @@ lvgl: text_color: 0x2D3436 - - id: page_chloe + - id: page_zoe bg_color: 0xFFF9F0 widgets: @@ -1492,18 +1503,18 @@ lvgl: y: 22 width: 172 align: TOP_MID - text: "🌝" - text_font: font_title + text: "󱞵" + text_font: font_mdi_large - label: x: 0 y: 76 width: 172 align: TOP_MID - text: "Chloe" + text: "Zoe" text_font: font_name text_color: 0xFFFFFF - bar: - id: progress_bar_chloe + id: progress_bar_zoe x: 14 y: 132 width: 144 @@ -1515,7 +1526,7 @@ lvgl: min_value: 0 max_value: 6 - label: - id: progress_label_chloe + id: progress_label_zoe x: 0 y: 156 width: 172 @@ -1524,7 +1535,7 @@ lvgl: text_font: font_small text_color: 0xDDEEFF - label: - id: all_done_label_chloe + id: all_done_label_zoe x: 0 y: 192 width: 172 @@ -1541,7 +1552,7 @@ lvgl: radius: 14 on_click: then: - - script.execute: reset_chloe_chores + - script.execute: reset_zoe_chores widgets: - label: align: CENTER @@ -1567,7 +1578,7 @@ lvgl: # ── Chore cards ─────────────────────────────────────────────────────── - button: - id: card_chloe_make_bed + id: card_zoe_make_bed x: 182 y: 10 width: 196 @@ -1581,10 +1592,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: chloe_make_bed + - switch.toggle: zoe_make_bed widgets: - label: - id: check_chloe_make_bed + id: check_zoe_make_bed align: TOP_RIGHT x: -10 y: 8 @@ -1593,8 +1604,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🛏️" - text_font: font_med + text: "󰋣" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1603,7 +1614,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_chloe_brush_teeth + id: card_zoe_brush_teeth x: 388 y: 10 width: 196 @@ -1617,10 +1628,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: chloe_brush_teeth + - switch.toggle: zoe_brush_teeth widgets: - label: - id: check_chloe_brush_teeth + id: check_zoe_brush_teeth align: TOP_RIGHT x: -10 y: 8 @@ -1629,8 +1640,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🦷" - text_font: font_med + text: "󰦩" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1639,7 +1650,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_chloe_water_plants + id: card_zoe_water_plants x: 594 y: 10 width: 196 @@ -1653,10 +1664,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: chloe_water_plants + - switch.toggle: zoe_water_plants widgets: - label: - id: check_chloe_water_plants + id: check_zoe_water_plants align: TOP_RIGHT x: -10 y: 8 @@ -1665,8 +1676,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🌱" - text_font: font_med + text: "󱬥" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1675,7 +1686,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_chloe_homework + id: card_zoe_homework x: 182 y: 158 width: 196 @@ -1689,10 +1700,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: chloe_homework + - switch.toggle: zoe_homework widgets: - label: - id: check_chloe_homework + id: check_zoe_homework align: TOP_RIGHT x: -10 y: 8 @@ -1701,8 +1712,8 @@ lvgl: - label: align: CENTER y: -34 - text: "📚" - text_font: font_med + text: "󰈙" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1711,7 +1722,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_chloe_tidy_room + id: card_zoe_tidy_room x: 388 y: 158 width: 196 @@ -1725,10 +1736,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: chloe_tidy_room + - switch.toggle: zoe_tidy_room widgets: - label: - id: check_chloe_tidy_room + id: check_zoe_tidy_room align: TOP_RIGHT x: -10 y: 8 @@ -1737,8 +1748,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🧹" - text_font: font_med + text: "󰂨" + text_font: font_mdi_small - label: align: CENTER y: 17 @@ -1747,7 +1758,7 @@ lvgl: text_color: 0x2D3436 - button: - id: card_chloe_practice_piano + id: card_zoe_practice_piano x: 594 y: 158 width: 196 @@ -1761,10 +1772,10 @@ lvgl: shadow_ofs_y: 3 on_click: then: - - switch.toggle: chloe_practice_piano + - switch.toggle: zoe_practice_piano widgets: - label: - id: check_chloe_practice_piano + id: check_zoe_practice_piano align: TOP_RIGHT x: -10 y: 8 @@ -1773,8 +1784,8 @@ lvgl: - label: align: CENTER y: -34 - text: "🎹" - text_font: font_med + text: "󰾞" + text_font: font_mdi_small - label: align: CENTER y: 17 diff --git a/esphome/chore-tracker/chore-tracker-dashboard.yaml b/esphome/chore-tracker/chore-tracker-dashboard.yaml index 13f0b05..5334e7e 100644 --- a/esphome/chore-tracker/chore-tracker-dashboard.yaml +++ b/esphome/chore-tracker/chore-tracker-dashboard.yaml @@ -1,6 +1,6 @@ ################################################################################ # chore-tracker-dashboard.yaml (AUTO-GENERATED — edit chores_config.yaml) -# Kids: Jordyn, Declan, Chloe +# Kids: Emma, Liam, Zoe ################################################################################ title: "Chore Tracker" @@ -13,26 +13,26 @@ views: cards: - type: markdown content: > - ### 😺 Jordyn + ### 󰇹 Emma {{ - 'All done!' if states('sensor.jordyn_all_chores_done') == 'True' - else states('sensor.jordyn_chores_done_today') ~ '/5 chores done' + 'All done!' if states('sensor.emma_all_chores_done') == 'True' + else states('sensor.emma_chores_done_today') ~ '/5 chores done' }} - type: markdown content: > - ### 🤓 Declan + ### 󰲙 Liam {{ - 'All done!' if states('sensor.declan_all_chores_done') == 'True' - else states('sensor.declan_chores_done_today') ~ '/4 chores done' + 'All done!' if states('sensor.liam_all_chores_done') == 'True' + else states('sensor.liam_chores_done_today') ~ '/4 chores done' }} - type: markdown content: > - ### 🌝 Chloe + ### 󱞵 Zoe {{ - 'All done!' if states('sensor.chloe_all_chores_done') == 'True' - else states('sensor.chloe_chores_done_today') ~ '/6 chores done' + 'All done!' if states('sensor.zoe_all_chores_done') == 'True' + else states('sensor.zoe_chores_done_today') ~ '/6 chores done' }} - type: button @@ -44,90 +44,90 @@ views: target: entity_id: input_button.reset_all_chores - type: entities - title: "😺 Jordyn's Chores" + title: "󰇹 Emma's Chores" entities: - - entity: switch.chore_tracker_jordyn_make_bed - name: "🛏️ Make Bed" + - entity: switch.chore_tracker_emma_make_bed + name: "󰋣 Make Bed" - - entity: switch.chore_tracker_jordyn_brush_teeth - name: "🦷 Brush Teeth" + - entity: switch.chore_tracker_emma_brush_teeth + name: "󰦩 Brush Teeth" - - entity: switch.chore_tracker_jordyn_tidy_room - name: "🧹 Tidy Room" + - entity: switch.chore_tracker_emma_tidy_room + name: "󰂨 Tidy Room" - - entity: switch.chore_tracker_jordyn_homework - name: "📚 Homework" + - entity: switch.chore_tracker_emma_homework + name: "󰈙 Homework" - - entity: switch.chore_tracker_jordyn_feed_dog - name: "🐾 Feed Dog" + - entity: switch.chore_tracker_emma_feed_dog + name: "󰉥 Feed Dog" - type: divider - - entity: sensor.jordyn_chores_done_today + - entity: sensor.emma_chores_done_today name: "Chores done today" - - entity: sensor.jordyn_all_chores_done + - entity: sensor.emma_all_chores_done name: "All Done?" - type: button - name: "Reset Jordyn's Chores" + name: "Reset Emma's Chores" tap_action: action: call-service service: input_button.press target: - entity_id: input_button.jordyn_reset_chores + entity_id: input_button.emma_reset_chores - type: entities - title: "🤓 Declan's Chores" + title: "󰲙 Liam's Chores" entities: - - entity: switch.chore_tracker_declan_make_bed - name: "🛏️ Make Bed" + - entity: switch.chore_tracker_liam_make_bed + name: "󰋣 Make Bed" - - entity: switch.chore_tracker_declan_brush_teeth - name: "🦷 Brush Teeth" + - entity: switch.chore_tracker_liam_brush_teeth + name: "󰦩 Brush Teeth" - - entity: switch.chore_tracker_declan_set_table - name: "🍽️ Set Table" + - entity: switch.chore_tracker_liam_set_table + name: "󰏧 Set Table" - - entity: switch.chore_tracker_declan_take_out_trash - name: "🗑️ Take Out Trash" + - entity: switch.chore_tracker_liam_take_out_trash + name: "󰖸 Take Out Trash" - type: divider - - entity: sensor.declan_chores_done_today + - entity: sensor.liam_chores_done_today name: "Chores done today" - - entity: sensor.declan_all_chores_done + - entity: sensor.liam_all_chores_done name: "All Done?" - type: button - name: "Reset Declan's Chores" + name: "Reset Liam's Chores" tap_action: action: call-service service: input_button.press target: - entity_id: input_button.declan_reset_chores + entity_id: input_button.liam_reset_chores - type: entities - title: "🌝 Chloe's Chores" + title: "󱞵 Zoe's Chores" entities: - - entity: switch.chore_tracker_chloe_make_bed - name: "🛏️ Make Bed" + - entity: switch.chore_tracker_zoe_make_bed + name: "󰋣 Make Bed" - - entity: switch.chore_tracker_chloe_brush_teeth - name: "🦷 Brush Teeth" + - entity: switch.chore_tracker_zoe_brush_teeth + name: "󰦩 Brush Teeth" - - entity: switch.chore_tracker_chloe_water_plants - name: "🌱 Water Plants" + - entity: switch.chore_tracker_zoe_water_plants + name: "󱬥 Water Plants" - - entity: switch.chore_tracker_chloe_homework - name: "📚 Homework" + - entity: switch.chore_tracker_zoe_homework + name: "󰈙 Homework" - - entity: switch.chore_tracker_chloe_tidy_room - name: "🧹 Tidy Room" + - entity: switch.chore_tracker_zoe_tidy_room + name: "󰂨 Tidy Room" - - entity: switch.chore_tracker_chloe_practice_piano - name: "🎹 Practice Piano" + - entity: switch.chore_tracker_zoe_practice_piano + name: "󰾞 Practice Piano" - type: divider - - entity: sensor.chloe_chores_done_today + - entity: sensor.zoe_chores_done_today name: "Chores done today" - - entity: sensor.chloe_all_chores_done + - entity: sensor.zoe_all_chores_done name: "All Done?" - type: button - name: "Reset Chloe's Chores" + name: "Reset Zoe's Chores" tap_action: action: call-service service: input_button.press target: - entity_id: input_button.chloe_reset_chores + entity_id: input_button.zoe_reset_chores diff --git a/esphome/chore-tracker/chores_config.yaml b/esphome/chore-tracker/chores_config.yaml index 8f47785..6dedf0b 100644 --- a/esphome/chore-tracker/chores_config.yaml +++ b/esphome/chore-tracker/chores_config.yaml @@ -3,12 +3,30 @@ # # Edit this file to change kids, chores, and settings. # Then run: python3 generate.py +# +# ICONS: Use MDI codepoints from https://pictogrammers.com/library/mdi/ +# Format: "\U000FXXXX" e.g. mdi:bed = "\U000F02E3" +# The kid avatar field also uses MDI codepoints. +# +# Common chore icons: +# Bed: "\U000F02E3" mdi:bed +# Brush teeth: "\U000F09A9" mdi:toothbrush +# Broom: "\U000F00A8" mdi:broom +# Book: "\U000F0219" mdi:book-open-variant +# Dog: "\U000F01F9" mdi:dog +# Paw: "\U000F0265" mdi:paw +# Silverware: "\U000F03E7" mdi:silverware-fork-knife +# Trash: "\U000F05B8" mdi:trash-can +# Watering can: "\U000F1B25" mdi:watering-can +# Piano: "\U000F0F9E" mdi:piano +# Dumbbell: "\U000F0F1E" mdi:dumbbell +# Shower: "\U000F0467" mdi:shower ################################################################################ settings: device_name: chore-tracker friendly_name: "Chore Tracker" - wifi_ssid: !secret wifi_iot_ssid + wifi_ssid: !secret wifi_ssid wifi_password: !secret wifi_password api_key: !secret api_encryption_key ota_password: !secret ota_password @@ -17,54 +35,54 @@ settings: notify_service: notify.notify # ── KIDS ────────────────────────────────────────────────────────────────────── -# Each kid has their own chore list. -# name, avatar, color, color_dark, and chores are all required. +# avatar: MDI codepoint shown in the sidebar on the kid's chore page +# color / color_dark: hex colours for that kid's sidebar # kids: - - name: Jordyn - avatar: "😺" + - name: Emma + avatar: "\U000F01F9" # mdi:dog color: "4D96FF" color_dark: "2A6FCC" chores: - name: Make Bed - icon: "🛏️" + icon: "\U000F02E3" # mdi:bed - name: Brush Teeth - icon: "🦷" + icon: "\U000F09A9" # mdi:toothbrush - name: Tidy Room - icon: "🧹" + icon: "\U000F00A8" # mdi:broom - name: Homework - icon: "📚" + icon: "\U000F0219" # mdi:book-open-variant - name: Feed Dog - icon: "🐾" + icon: "\U000F0265" # mdi:paw - - name: Declan - avatar: "🤓" + - name: Liam + avatar: "\U000F0C99" # mdi:cat color: "C77DFF" color_dark: "8B42CC" chores: - name: Make Bed - icon: "🛏️" + icon: "\U000F02E3" # mdi:bed - name: Brush Teeth - icon: "🦷" + icon: "\U000F09A9" # mdi:toothbrush - name: Set Table - icon: "🍽️" + icon: "\U000F03E7" # mdi:silverware-fork-knife - name: Take Out Trash - icon: "🗑️" + icon: "\U000F05B8" # mdi:trash-can - - name: Chloe - avatar: "🌝" + - name: Zoe + avatar: "\U000F17B5" # mdi:teddy-bear color: "FF6B9D" color_dark: "CC3A6F" chores: - name: Make Bed - icon: "🛏️" + icon: "\U000F02E3" # mdi:bed - name: Brush Teeth - icon: "🦷" + icon: "\U000F09A9" # mdi:toothbrush - name: Water Plants - icon: "🌱" + icon: "\U000F1B25" # mdi:watering-can - name: Homework - icon: "📚" + icon: "\U000F0219" # mdi:book-open-variant - name: Tidy Room - icon: "🧹" + icon: "\U000F00A8" # mdi:broom - name: Practice Piano - icon: "🎹" \ No newline at end of file + icon: "\U000F0F9E" # mdi:piano \ No newline at end of file diff --git a/esphome/chore-tracker/generate.py b/esphome/chore-tracker/generate.py index ff4e790..f0ac321 100644 --- a/esphome/chore-tracker/generate.py +++ b/esphome/chore-tracker/generate.py @@ -122,6 +122,13 @@ def gen_esphome(cfg: dict) -> str: lvgl_pages = _gen_lvgl_pages(kids) scripts = _gen_scripts(kids) + # Collect all unique MDI glyphs used (avatars + chore icons) + all_glyphs = sorted(set( + [k["avatar"] for k in kids] + + [c["icon"] for k in kids for c in get_chores(k)] + )) + glyphs_str = "".join(all_glyphs) + return f"""\ ################################################################################ # chore-tracker-esphome.yaml (AUTO-GENERATED — edit chores_config.yaml) @@ -255,6 +262,17 @@ font: - file: "fonts/Nunito-SemiBold.ttf" id: font_tiny size: 13 + # MDI icon font — used for chore icons and kid avatars + - file: "fonts/materialdesignicons-webfont.ttf" + id: font_mdi_large + size: 48 + bpp: 4 + glyphs: {glyphs_str} + - file: "fonts/materialdesignicons-webfont.ttf" + id: font_mdi_small + size: 32 + bpp: 4 + glyphs: {glyphs_str} # ── Switches — backlight raw + one per chore per kid ───────────────────────── switch: @@ -336,7 +354,7 @@ def _gen_lvgl_pages(kids: list) -> str: align: CENTER y: -45 text: "{kid['avatar']}" - text_font: font_title + text_font: font_mdi_large - label: align: CENTER y: 22 @@ -443,7 +461,7 @@ def _gen_lvgl_pages(kids: list) -> str: align: CENTER y: {icon_y} text: "{chore['icon']}" - text_font: font_med + text_font: font_mdi_small - label: align: CENTER y: {label_y} @@ -475,7 +493,7 @@ def _gen_lvgl_pages(kids: list) -> str: width: {sidebar_w} align: TOP_MID text: "{kid['avatar']}" - text_font: font_title + text_font: font_mdi_large - label: x: 0 y: 76 diff --git a/packages/chore-tracker-ha.yaml b/packages/chore-tracker-ha.yaml index eefd123..2cde1f7 100644 --- a/packages/chore-tracker-ha.yaml +++ b/packages/chore-tracker-ha.yaml @@ -1,6 +1,6 @@ ################################################################################ # chore-tracker-ha.yaml (AUTO-GENERATED — edit chores_config.yaml) -# Kids: Jordyn, Declan, Chloe +# Kids: Emma, Liam, Zoe # # BIDIRECTIONAL SYNC: # Screen to HA: Each switch calls homeassistant.service on toggle @@ -8,14 +8,14 @@ ################################################################################ input_button: - jordyn_reset_chores: - name: "Reset Jordyn's Chores" + emma_reset_chores: + name: "Reset Emma's Chores" icon: mdi:restart - declan_reset_chores: - name: "Reset Declan's Chores" + liam_reset_chores: + name: "Reset Liam's Chores" icon: mdi:restart - chloe_reset_chores: - name: "Reset Chloe's Chores" + zoe_reset_chores: + name: "Reset Zoe's Chores" icon: mdi:restart reset_all_chores: name: "Reset All Chores" @@ -23,112 +23,112 @@ input_button: template: - sensor: - - name: "Jordyn Chores Done Today" - unique_id: jordyn_chores_done_today + - name: "Emma Chores Done Today" + unique_id: emma_chores_done_today icon: mdi:check-circle state: > - {% set chores = [states('switch.chore_tracker_jordyn_make_bed'), states('switch.chore_tracker_jordyn_brush_teeth'), states('switch.chore_tracker_jordyn_tidy_room'), states('switch.chore_tracker_jordyn_homework'), states('switch.chore_tracker_jordyn_feed_dog')] %} + {% set chores = [states('switch.chore_tracker_emma_make_bed'), states('switch.chore_tracker_emma_brush_teeth'), states('switch.chore_tracker_emma_tidy_room'), states('switch.chore_tracker_emma_homework'), states('switch.chore_tracker_emma_feed_dog')] %} {{ chores | select('equalto', 'on') | list | count }} - - name: "Jordyn All Chores Done" - unique_id: jordyn_all_chores_done + - name: "Emma All Chores Done" + unique_id: emma_all_chores_done icon: mdi:check-all state: > - {{ states('sensor.jordyn_chores_done_today') | int == 5 }} + {{ states('sensor.emma_chores_done_today') | int == 5 }} - - name: "Declan Chores Done Today" - unique_id: declan_chores_done_today + - name: "Liam Chores Done Today" + unique_id: liam_chores_done_today icon: mdi:check-circle state: > - {% set chores = [states('switch.chore_tracker_declan_make_bed'), states('switch.chore_tracker_declan_brush_teeth'), states('switch.chore_tracker_declan_set_table'), states('switch.chore_tracker_declan_take_out_trash')] %} + {% set chores = [states('switch.chore_tracker_liam_make_bed'), states('switch.chore_tracker_liam_brush_teeth'), states('switch.chore_tracker_liam_set_table'), states('switch.chore_tracker_liam_take_out_trash')] %} {{ chores | select('equalto', 'on') | list | count }} - - name: "Declan All Chores Done" - unique_id: declan_all_chores_done + - name: "Liam All Chores Done" + unique_id: liam_all_chores_done icon: mdi:check-all state: > - {{ states('sensor.declan_chores_done_today') | int == 4 }} + {{ states('sensor.liam_chores_done_today') | int == 4 }} - - name: "Chloe Chores Done Today" - unique_id: chloe_chores_done_today + - name: "Zoe Chores Done Today" + unique_id: zoe_chores_done_today icon: mdi:check-circle state: > - {% set chores = [states('switch.chore_tracker_chloe_make_bed'), states('switch.chore_tracker_chloe_brush_teeth'), states('switch.chore_tracker_chloe_water_plants'), states('switch.chore_tracker_chloe_homework'), states('switch.chore_tracker_chloe_tidy_room'), states('switch.chore_tracker_chloe_practice_piano')] %} + {% set chores = [states('switch.chore_tracker_zoe_make_bed'), states('switch.chore_tracker_zoe_brush_teeth'), states('switch.chore_tracker_zoe_water_plants'), states('switch.chore_tracker_zoe_homework'), states('switch.chore_tracker_zoe_tidy_room'), states('switch.chore_tracker_zoe_practice_piano')] %} {{ chores | select('equalto', 'on') | list | count }} - - name: "Chloe All Chores Done" - unique_id: chloe_all_chores_done + - name: "Zoe All Chores Done" + unique_id: zoe_all_chores_done icon: mdi:check-all state: > - {{ states('sensor.chloe_chores_done_today') | int == 6 }} + {{ states('sensor.zoe_chores_done_today') | int == 6 }} automation: - - id: jordyn_reset_from_ha - alias: "Chore Tracker - Reset Jordyn's chores from HA" + - id: emma_reset_from_ha + alias: "Chore Tracker - Reset Emma's chores from HA" trigger: - platform: state - entity_id: input_button.jordyn_reset_chores + entity_id: input_button.emma_reset_chores action: - service: switch.turn_off target: - entity_id: switch.chore_tracker_jordyn_make_bed + entity_id: switch.chore_tracker_emma_make_bed - service: switch.turn_off target: - entity_id: switch.chore_tracker_jordyn_brush_teeth + entity_id: switch.chore_tracker_emma_brush_teeth - service: switch.turn_off target: - entity_id: switch.chore_tracker_jordyn_tidy_room + entity_id: switch.chore_tracker_emma_tidy_room - service: switch.turn_off target: - entity_id: switch.chore_tracker_jordyn_homework + entity_id: switch.chore_tracker_emma_homework - service: switch.turn_off target: - entity_id: switch.chore_tracker_jordyn_feed_dog + entity_id: switch.chore_tracker_emma_feed_dog - - id: declan_reset_from_ha - alias: "Chore Tracker - Reset Declan's chores from HA" + - id: liam_reset_from_ha + alias: "Chore Tracker - Reset Liam's chores from HA" trigger: - platform: state - entity_id: input_button.declan_reset_chores + entity_id: input_button.liam_reset_chores action: - service: switch.turn_off target: - entity_id: switch.chore_tracker_declan_make_bed + entity_id: switch.chore_tracker_liam_make_bed - service: switch.turn_off target: - entity_id: switch.chore_tracker_declan_brush_teeth + entity_id: switch.chore_tracker_liam_brush_teeth - service: switch.turn_off target: - entity_id: switch.chore_tracker_declan_set_table + entity_id: switch.chore_tracker_liam_set_table - service: switch.turn_off target: - entity_id: switch.chore_tracker_declan_take_out_trash + entity_id: switch.chore_tracker_liam_take_out_trash - - id: chloe_reset_from_ha - alias: "Chore Tracker - Reset Chloe's chores from HA" + - id: zoe_reset_from_ha + alias: "Chore Tracker - Reset Zoe's chores from HA" trigger: - platform: state - entity_id: input_button.chloe_reset_chores + entity_id: input_button.zoe_reset_chores action: - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_make_bed + entity_id: switch.chore_tracker_zoe_make_bed - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_brush_teeth + entity_id: switch.chore_tracker_zoe_brush_teeth - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_water_plants + entity_id: switch.chore_tracker_zoe_water_plants - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_homework + entity_id: switch.chore_tracker_zoe_homework - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_tidy_room + entity_id: switch.chore_tracker_zoe_tidy_room - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_practice_piano + entity_id: switch.chore_tracker_zoe_practice_piano - id: reset_all_from_ha alias: "Chore Tracker - Reset ALL chores from HA" @@ -138,85 +138,85 @@ automation: action: - service: switch.turn_off target: - entity_id: switch.chore_tracker_jordyn_make_bed + entity_id: switch.chore_tracker_emma_make_bed - service: switch.turn_off target: - entity_id: switch.chore_tracker_jordyn_brush_teeth + entity_id: switch.chore_tracker_emma_brush_teeth - service: switch.turn_off target: - entity_id: switch.chore_tracker_jordyn_tidy_room + entity_id: switch.chore_tracker_emma_tidy_room - service: switch.turn_off target: - entity_id: switch.chore_tracker_jordyn_homework + entity_id: switch.chore_tracker_emma_homework - service: switch.turn_off target: - entity_id: switch.chore_tracker_jordyn_feed_dog + entity_id: switch.chore_tracker_emma_feed_dog - service: switch.turn_off target: - entity_id: switch.chore_tracker_declan_make_bed + entity_id: switch.chore_tracker_liam_make_bed - service: switch.turn_off target: - entity_id: switch.chore_tracker_declan_brush_teeth + entity_id: switch.chore_tracker_liam_brush_teeth - service: switch.turn_off target: - entity_id: switch.chore_tracker_declan_set_table + entity_id: switch.chore_tracker_liam_set_table - service: switch.turn_off target: - entity_id: switch.chore_tracker_declan_take_out_trash + entity_id: switch.chore_tracker_liam_take_out_trash - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_make_bed + entity_id: switch.chore_tracker_zoe_make_bed - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_brush_teeth + entity_id: switch.chore_tracker_zoe_brush_teeth - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_water_plants + entity_id: switch.chore_tracker_zoe_water_plants - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_homework + entity_id: switch.chore_tracker_zoe_homework - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_tidy_room + entity_id: switch.chore_tracker_zoe_tidy_room - service: switch.turn_off target: - entity_id: switch.chore_tracker_chloe_practice_piano + entity_id: switch.chore_tracker_zoe_practice_piano - - id: jordyn_all_done_notify - alias: "Chore Tracker - Jordyn all done!" + - id: emma_all_done_notify + alias: "Chore Tracker - Emma all done!" trigger: - platform: state - entity_id: sensor.jordyn_all_chores_done + entity_id: sensor.emma_all_chores_done to: "True" action: - service: notify.notify data: - title: "Jordyn finished all chores!" - message: "Jordyn completed all 5 chores today!" + title: "Emma finished all chores!" + message: "Emma completed all 5 chores today!" - - id: declan_all_done_notify - alias: "Chore Tracker - Declan all done!" + - id: liam_all_done_notify + alias: "Chore Tracker - Liam all done!" trigger: - platform: state - entity_id: sensor.declan_all_chores_done + entity_id: sensor.liam_all_chores_done to: "True" action: - service: notify.notify data: - title: "Declan finished all chores!" - message: "Declan completed all 4 chores today!" + title: "Liam finished all chores!" + message: "Liam completed all 4 chores today!" - - id: chloe_all_done_notify - alias: "Chore Tracker - Chloe all done!" + - id: zoe_all_done_notify + alias: "Chore Tracker - Zoe all done!" trigger: - platform: state - entity_id: sensor.chloe_all_chores_done + entity_id: sensor.zoe_all_chores_done to: "True" action: - service: notify.notify data: - title: "Chloe finished all chores!" - message: "Chloe completed all 6 chores today!" + title: "Zoe finished all chores!" + message: "Zoe completed all 6 chores today!" - id: chore_reminder_evening alias: "Chore Tracker - Evening reminder" @@ -226,33 +226,33 @@ automation: action: - if: condition: template - value_template: "{{ states('sensor.jordyn_all_chores_done') != 'True' }}" + value_template: "{{ states('sensor.emma_all_chores_done') != 'True' }}" then: - service: notify.notify data: - title: "Jordyn has unfinished chores" + title: "Emma has unfinished chores" message: > - Jordyn has done - {{ states('sensor.jordyn_chores_done_today') }}/5 chores today. + Emma has done + {{ states('sensor.emma_chores_done_today') }}/5 chores today. - if: condition: template - value_template: "{{ states('sensor.declan_all_chores_done') != 'True' }}" + value_template: "{{ states('sensor.liam_all_chores_done') != 'True' }}" then: - service: notify.notify data: - title: "Declan has unfinished chores" + title: "Liam has unfinished chores" message: > - Declan has done - {{ states('sensor.declan_chores_done_today') }}/4 chores today. + Liam has done + {{ states('sensor.liam_chores_done_today') }}/4 chores today. - if: condition: template - value_template: "{{ states('sensor.chloe_all_chores_done') != 'True' }}" + value_template: "{{ states('sensor.zoe_all_chores_done') != 'True' }}" then: - service: notify.notify data: - title: "Chloe has unfinished chores" + title: "Zoe has unfinished chores" message: > - Chloe has done - {{ states('sensor.chloe_chores_done_today') }}/6 chores today. + Zoe has done + {{ states('sensor.zoe_chores_done_today') }}/6 chores today.