# scripts.yaml - PART 1: Original Scripts # Paste this as the beginning of your scripts.yaml file # Original existing scripts log_and_complete_chore: alias: Log and Complete Chore sequence: - choose: - conditions: - condition: state entity_id: input_select.person_selection state: Lou sequence: - target: entity_id: counter.chores_completed_lou action: counter.increment data: {} - conditions: - condition: state entity_id: input_select.person_selection state: Jess sequence: - target: entity_id: counter.chores_completed_jess action: counter.increment data: {} - conditions: - condition: state entity_id: input_select.person_selection state: William sequence: - target: entity_id: counter.chores_completed_william action: counter.increment data: {} - conditions: - condition: state entity_id: input_select.person_selection state: Xander sequence: - target: entity_id: counter.chores_completed_xander action: counter.increment data: {} - conditions: - condition: state entity_id: input_select.person_selection state: Bella sequence: - target: entity_id: counter.chores_completed_bella action: counter.increment data: {} - action: notify.send_message metadata: {} data: title: Chore message: ">- {{ states('input_select.person_selection') }} completed {{ states('input_select.chore_selection') }} on {{ now().strftime('%Y-%m-%d %H:%M:%S') }}" target: entity_id: notify.chore_log_bog - action: notify.persistent_notification data: title: Chores message: "{{ states('input_select.person_selection') }} completed {{ states('input_select.chore_selection') }} on {{ now().strftime('%Y-%m-%d %H:%M:%S') }}" enabled: false - data: entity_id: input_select.person_selection option: Select Person action: input_select.select_option - data: entity_id: input_select.chore_selection option: Select Chore action: input_select.select_option - action: python_script.parse_chore_log metadata: {} data: {} enabled: false testcast2: alias: TestCast2 sequence: - action: dash_cast.load_url metadata: {} data: reload_seconds: 300 entity_id: media_player.nesthub51f9 url: https://www.ebay.com.au/ force: false description: "" chorereset: alias: ChoreReset sequence: - data: entity_id: input_select.chore_selection option: Select Chore action: input_select.select_option description: "" weekly_chore_summary: alias: New Chore Summary sequence: - action: conversation.process metadata: {} data: prompt: |2- Summarize the chores done in the sensor.chore_log_bog between {{ now().strftime('%Y-%m-%d') }} and {{ (now() - timedelta(days=7)).strftime('%Y-%m-%d') }}. Group chores by person and provide a concise summary for each individual. chore_log_data: "{{ chore_log_entries }}" response_variable: generated_chore_content - service: input_text.set_value data: entity_id: input_text.chore_summary value: "{{ generated_chore_content }}" encouraging_prompt: alias: Encouraging Prompt sequence: - service: google_cloud_platform.generate_text data: model: text-davinci-003 project_id: your_gcp_project_id api_key: !secret google_cloud_platform_api_key temperature: 0.5 max_tokens: 50 prompt: "Generate a short encouraging message for someone who is doing chores. The message should be positive and uplifting." - service: notify.your_notification_method data: message: "{{ result.text }}" log_task_completion: alias: "Log Task Completion" fields: task: description: "The task that was completed" example: "Dishwasher Unload" person: description: "The person who completed the task" example: "Jess" sequence: - action: notify.chore_log_bog data: message: ">- {{ person }} completed {{ task }} on {{ now().strftime('%Y-%m-%d %H:%M:%S') }}" # scripts.yaml - PART 3 FIXED: Main Task System with correct notification service # Replace Part 3 with this corrected version ## NEW COMPLETE TASK SCRIPT - RELIABLE RECORDING SYSTEM # Replace your entire complete_task script with this version complete_task: alias: Complete Task description: Mark a task as complete and log who did it with reliable recording fields: task_type: description: The type of task being completed example: "Dishwasher Unload" family_member: description: Who completed the task example: "Jess" sequence: # Step 1: Record the chore completion in multiple ways for reliability - action: input_text.set_value target: entity_id: input_text.master_chore_log data: value: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }} - {{ family_member }} completed {{ task_type }}" # Step 2: Update individual person's last chore - action: input_text.set_value target: entity_id: > {% if family_member == 'Lou' %}input_text.last_chore_lou {% elif family_member == 'Jess' %}input_text.last_chore_jess {% elif family_member == 'William' %}input_text.last_chore_william {% elif family_member == 'Xander' %}input_text.last_chore_xander {% elif family_member == 'Bella' %}input_text.last_chore_bella {% endif %} data: value: "{{ task_type }}" # Step 3: Update timestamp for individual person - action: input_text.set_value target: entity_id: > {% if family_member == 'Lou' %}input_text.last_chore_lou_timestamp {% elif family_member == 'Jess' %}input_text.last_chore_jess_timestamp {% elif family_member == 'William' %}input_text.last_chore_william_timestamp {% elif family_member == 'Xander' %}input_text.last_chore_xander_timestamp {% elif family_member == 'Bella' %}input_text.last_chore_bella_timestamp {% endif %} data: value: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}" # Step 4: Increment weekly counter - action: counter.increment target: entity_id: > {% if family_member == 'Lou' %}counter.chores_completed_lou {% elif family_member == 'Jess' %}counter.chores_completed_jess {% elif family_member == 'William' %}counter.chores_completed_william {% elif family_member == 'Xander' %}counter.chores_completed_xander {% elif family_member == 'Bella' %}counter.chores_completed_bella {% endif %} # Step 5: Handle task-specific logic - choose: # Dishwasher Unload - conditions: - condition: template value_template: "{{ task_type == 'Dishwasher Unload' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_dishwasher_unload_pending # Washing Machine Unload - conditions: - condition: template value_template: "{{ task_type == 'Washing Machine Unload' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_washing_machine_unload_pending # Dryer Unload - conditions: - condition: template value_template: "{{ task_type == 'Dryer Unload' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_dryer_unload_pending # Bins Out - conditions: - condition: template value_template: "{{ task_type == 'Bins Out' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_bins_out_pending # Bins In - conditions: - condition: template value_template: "{{ task_type == 'Bins In' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_bins_in_pending # Kitty Litter Clean - conditions: - condition: template value_template: "{{ task_type == 'Kitty Litter Clean' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_kitty_litter_clean_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_kitty_litter_clean_done_today # Kitty Litter Change - conditions: - condition: template value_template: "{{ task_type == 'Kitty Litter Change' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_kitty_litter_change_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_kitty_litter_change_done_fortnight # Personal Clothes Tasks - conditions: - condition: template value_template: "{{ task_type == 'Bella - Clothes to Laundry' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_bella_clothes_to_laundry_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_bella_clothes_done_today - conditions: - condition: template value_template: "{{ task_type == 'Xander - Clothes to Laundry' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_xander_clothes_to_laundry_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_xander_clothes_done_today - conditions: - condition: template value_template: "{{ task_type == 'William - Clothes to Laundry' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_william_clothes_to_laundry_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_william_clothes_done_today # School Preparation Tasks - conditions: - condition: template value_template: "{{ task_type == 'William - School Ready' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_william_school_ready_pending - conditions: - condition: template value_template: "{{ task_type == 'Xander - School Ready' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_xander_school_ready_pending - conditions: - condition: template value_template: "{{ task_type == 'Bella - School Ready' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_bella_school_ready_pending # Pet Care Tasks - conditions: - condition: template value_template: "{{ task_type == 'Feed Chips' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_feed_chips_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_feed_chips_done_today - conditions: - condition: template value_template: "{{ task_type == 'Feed Harper' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_feed_harper_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_feed_harper_done_today - conditions: - condition: template value_template: "{{ task_type == 'Water Chips' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_water_chips_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_water_chips_done_today - conditions: - condition: template value_template: "{{ task_type == 'Water Harper' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_water_harper_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_water_harper_done_today # Daily Cleaning Tasks - conditions: - condition: template value_template: "{{ task_type == 'Handwash Dishes' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_handwash_dishes_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_handwash_dishes_done_today - conditions: - condition: template value_template: "{{ task_type == 'Tidy Kitchen' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_tidy_kitchen_pending - action: input_boolean.turn_on target: entity_id: input_boolean.task_tidy_kitchen_done_today # Karate Preparation Tasks - conditions: - condition: template value_template: "{{ task_type == 'Xander - Karate Ready' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_xander_karate_ready_pending - conditions: - condition: template value_template: "{{ task_type == 'Bella - Karate Ready' }}" sequence: - action: input_boolean.turn_off target: entity_id: input_boolean.task_bella_karate_ready_pending # Step 6: Send notifications - action: notify.homeassistantcomms data: message: "✅ {{ family_member }} completed: {{ task_type }}" target: '696581219445637171' - action: notify.mobile_app_jess_iphone data: message: "✅ {{ family_member }} completed {{ task_type }}" title: "Task Completed" mode: single # scripts.yaml - PART 4: Basic Completion Scripts # Paste this after Part 3 # SIMPLE TASK COMPLETION SCRIPTS # Replace all your individual completion scripts with these clean, simple versions # Appliance Tasks complete_bins_out: alias: Complete Bins Out sequence: - action: script.complete_task data: task_type: "Bins Out" family_member: "{{ states('input_select.family_member_selection') }}" complete_bins_in: alias: Complete Bins In sequence: - action: script.complete_task data: task_type: "Bins In" family_member: "{{ states('input_select.family_member_selection') }}" # Kitty Litter Tasks complete_kitty_litter_clean: alias: Complete Kitty Litter Clean sequence: - action: script.complete_task data: task_type: "Kitty Litter Clean" family_member: "{{ states('input_select.family_member_selection') }}" complete_kitty_litter_change: alias: Complete Kitty Litter Change sequence: - action: script.complete_task data: task_type: "Kitty Litter Change" family_member: "{{ states('input_select.family_member_selection') }}" # Personal Clothes Tasks complete_bella_clothes: alias: Complete Bella Clothes sequence: - action: script.complete_task data: task_type: "Bella - Clothes to Laundry" family_member: "Bella" complete_xander_clothes: alias: Complete Xander Clothes sequence: - action: script.complete_task data: task_type: "Xander - Clothes to Laundry" family_member: "Xander" complete_william_clothes: alias: Complete William Clothes sequence: - action: script.complete_task data: task_type: "William - Clothes to Laundry" family_member: "William" # School Tasks complete_william_school_ready: alias: Complete William School Ready sequence: - action: script.complete_task data: task_type: "William - School Ready" family_member: "William" complete_xander_school_ready: alias: Complete Xander School Ready sequence: - action: script.complete_task data: task_type: "Xander - School Ready" family_member: "Xander" complete_bella_school_ready: alias: Complete Bella School Ready sequence: - action: script.complete_task data: task_type: "Bella - School Ready" family_member: "Bella" # Pet Care Tasks complete_feed_chips: alias: Complete Feed Chips sequence: - action: script.complete_task data: task_type: "Feed Chips" family_member: "{{ states('input_select.family_member_selection') }}" complete_feed_harper: alias: Complete Feed Harper sequence: - action: script.complete_task data: task_type: "Feed Harper" family_member: "{{ states('input_select.family_member_selection') }}" complete_water_chips: alias: Complete Water Chips sequence: - action: script.complete_task data: task_type: "Water Chips" family_member: "{{ states('input_select.family_member_selection') }}" complete_water_harper: alias: Complete Water Harper sequence: - action: script.complete_task data: task_type: "Water Harper" family_member: "{{ states('input_select.family_member_selection') }}" # Daily Cleaning Tasks complete_handwash_dishes: alias: Complete Handwash Dishes sequence: - action: script.complete_task data: task_type: "Handwash Dishes" family_member: "{{ states('input_select.family_member_selection') }}" complete_tidy_kitchen: alias: Complete Tidy Kitchen sequence: - action: script.complete_task data: task_type: "Tidy Kitchen" family_member: "{{ states('input_select.family_member_selection') }}" # Karate Tasks complete_xander_karate_ready: alias: Complete Xander Karate Ready sequence: - action: script.complete_task data: task_type: "Xander - Karate Ready" family_member: "Xander" complete_bella_karate_ready: alias: Complete Bella Karate Ready sequence: - action: script.complete_task data: task_type: "Bella - Karate Ready" family_member: "Bella" # scripts.yaml - PART 5 CORRECTED: Individual Task Scripts # Add this to your scripts.yaml file after the complete_task script complete_clean_dining_table: alias: Complete Clean Dining Table sequence: - action: script.complete_task data: task_type: "Clean Dining Table" family_member: "{{ states('input_select.family_member_selection') }}" # Shared Task Scripts # Updated task completion scripts with "Select Person" prevention # Replace your existing scripts with these versions complete_dishwasher_unload: alias: Complete Dishwasher Unload sequence: # Check if a valid person is selected - condition: not conditions: - condition: state entity_id: input_select.family_member_selection state: 'Select Person' - action: input_boolean.turn_off entity_id: input_boolean.task_dishwasher_unload_pending - choose: - conditions: - condition: state entity_id: input_select.family_member_selection state: Lou sequence: - action: counter.increment entity_id: counter.chores_completed_lou - action: input_text.set_value entity_id: input_text.last_chore_lou data: value: "Dishwasher Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Jess sequence: - action: counter.increment entity_id: counter.chores_completed_jess - action: input_text.set_value entity_id: input_text.last_chore_jess data: value: "Dishwasher Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: William sequence: - action: counter.increment entity_id: counter.chores_completed_william - action: input_text.set_value entity_id: input_text.last_chore_william data: value: "Dishwasher Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Xander sequence: - action: counter.increment entity_id: counter.chores_completed_xander - action: input_text.set_value entity_id: input_text.last_chore_xander data: value: "Dishwasher Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Bella sequence: - action: counter.increment entity_id: counter.chores_completed_bella - action: input_text.set_value entity_id: input_text.last_chore_bella data: value: "Dishwasher Unload - {{ now().strftime('%H:%M') }}" - action: notify.homeassistantcomms data: message: "✅ {{ states('input_select.family_member_selection') }} unloaded the dishwasher!" target: '267249171017367552' - action: input_text.set_value entity_id: input_text.master_chore_log data: value: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }} - {{ states('input_select.family_member_selection') }} completed Dishwasher Unload" - action: notify.chorelog data: message: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }},{{ states('input_select.family_member_selection') }},Dishwasher Unload" mode: single complete_washing_machine_unload: alias: Complete Washing Machine Unload sequence: - condition: not conditions: - condition: state entity_id: input_select.family_member_selection state: 'Select Person' - action: input_boolean.turn_off entity_id: input_boolean.task_washing_machine_unload_pending - choose: - conditions: - condition: state entity_id: input_select.family_member_selection state: Lou sequence: - action: counter.increment entity_id: counter.chores_completed_lou - action: input_text.set_value entity_id: input_text.last_chore_lou data: value: "Washing Machine Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Jess sequence: - action: counter.increment entity_id: counter.chores_completed_jess - action: input_text.set_value entity_id: input_text.last_chore_jess data: value: "Washing Machine Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: William sequence: - action: counter.increment entity_id: counter.chores_completed_william - action: input_text.set_value entity_id: input_text.last_chore_william data: value: "Washing Machine Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Xander sequence: - action: counter.increment entity_id: counter.chores_completed_xander - action: input_text.set_value entity_id: input_text.last_chore_xander data: value: "Washing Machine Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Bella sequence: - action: counter.increment entity_id: counter.chores_completed_bella - action: input_text.set_value entity_id: input_text.last_chore_bella data: value: "Washing Machine Unload - {{ now().strftime('%H:%M') }}" - action: notify.homeassistantcomms data: message: "✅ {{ states('input_select.family_member_selection') }} unloaded the washing machine!" target: '267249171017367552' - action: input_text.set_value entity_id: input_text.master_chore_log data: value: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }} - {{ states('input_select.family_member_selection') }} completed Washing Machine Unload" - action: notify.chorelog data: message: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }},{{ states('input_select.family_member_selection') }},Washing Machine Unload" mode: single complete_dryer_unload: alias: Complete Dryer Unload sequence: - condition: not conditions: - condition: state entity_id: input_select.family_member_selection state: 'Select Person' - action: input_boolean.turn_off entity_id: input_boolean.task_dryer_unload_pending - choose: - conditions: - condition: state entity_id: input_select.family_member_selection state: Lou sequence: - action: counter.increment entity_id: counter.chores_completed_lou - action: input_text.set_value entity_id: input_text.last_chore_lou data: value: "Dryer Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Jess sequence: - action: counter.increment entity_id: counter.chores_completed_jess - action: input_text.set_value entity_id: input_text.last_chore_jess data: value: "Dryer Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: William sequence: - action: counter.increment entity_id: counter.chores_completed_william - action: input_text.set_value entity_id: input_text.last_chore_william data: value: "Dryer Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Xander sequence: - action: counter.increment entity_id: counter.chores_completed_xander - action: input_text.set_value entity_id: input_text.last_chore_xander data: value: "Dryer Unload - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Bella sequence: - action: counter.increment entity_id: counter.chores_completed_bella - action: input_text.set_value entity_id: input_text.last_chore_bella data: value: "Dryer Unload - {{ now().strftime('%H:%M') }}" - action: notify.homeassistantcomms data: message: "✅ {{ states('input_select.family_member_selection') }} unloaded the dryer!" target: '267249171017367552' - action: input_text.set_value entity_id: input_text.master_chore_log data: value: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }} - {{ states('input_select.family_member_selection') }} completed Dryer Unload" - action: notify.chorelog data: message: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }},{{ states('input_select.family_member_selection') }},Dryer Unload" mode: single # Add these scripts to your scripts.yaml file complete_dishwasher_load: alias: Complete Dishwasher Load sequence: - action: input_boolean.turn_off entity_id: input_boolean.task_dishwasher_load_pending - choose: - conditions: - condition: state entity_id: input_select.family_member_selection state: Lou sequence: - action: counter.increment entity_id: counter.chores_completed_lou - action: input_text.set_value entity_id: input_text.last_chore_lou data: value: "Load Dishwasher - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Jess sequence: - action: counter.increment entity_id: counter.chores_completed_jess - action: input_text.set_value entity_id: input_text.last_chore_jess data: value: "Load Dishwasher - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: William sequence: - action: counter.increment entity_id: counter.chores_completed_william - action: input_text.set_value entity_id: input_text.last_chore_william data: value: "Load Dishwasher - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Xander sequence: - action: counter.increment entity_id: counter.chores_completed_xander - action: input_text.set_value entity_id: input_text.last_chore_xander data: value: "Load Dishwasher - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Bella sequence: - action: counter.increment entity_id: counter.chores_completed_bella - action: input_text.set_value entity_id: input_text.last_chore_bella data: value: "Load Dishwasher - {{ now().strftime('%H:%M') }}" - action: notify.homeassistantcomms data: message: "✅ {{ states('input_select.family_member_selection') }} loaded the dishwasher!" target: '267249171017367552' - action: input_text.set_value entity_id: input_text.master_chore_log data: value: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }} - {{ states('input_select.family_member_selection') }} completed Load Dishwasher" mode: single complete_dryer_load: alias: Complete Dryer Load sequence: # Prevent "Select Person" from logging - condition: not conditions: - condition: state entity_id: input_select.family_member_selection state: 'Select Person' - action: input_boolean.turn_off entity_id: input_boolean.task_dryer_load_pending - choose: - conditions: - condition: state entity_id: input_select.family_member_selection state: Lou sequence: - action: counter.increment entity_id: counter.chores_completed_lou - action: input_text.set_value entity_id: input_text.last_chore_lou data: value: "Move to Dryer/Line - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Jess sequence: - action: counter.increment entity_id: counter.chores_completed_jess - action: input_text.set_value entity_id: input_text.last_chore_jess data: value: "Move to Dryer/Line - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: William sequence: - action: counter.increment entity_id: counter.chores_completed_william - action: input_text.set_value entity_id: input_text.last_chore_william data: value: "Move to Dryer/Line - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Xander sequence: - action: counter.increment entity_id: counter.chores_completed_xander - action: input_text.set_value entity_id: input_text.last_chore_xander data: value: "Move to Dryer/Line - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Bella sequence: - action: counter.increment entity_id: counter.chores_completed_bella - action: input_text.set_value entity_id: input_text.last_chore_bella data: value: "Move to Dryer/Line - {{ now().strftime('%H:%M') }}" - action: notify.homeassistantcomms data: message: "✅ {{ states('input_select.family_member_selection') }} moved clothes to dryer/clothesline!" target: '267249171017367552' - action: input_text.set_value entity_id: input_text.master_chore_log data: value: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }} - {{ states('input_select.family_member_selection') }} completed Move to Dryer/Line" mode: single complete_washing_load: alias: Complete Washing Load sequence: # Prevent "Select Person" from logging - condition: not conditions: - condition: state entity_id: input_select.family_member_selection state: 'Select Person' - action: input_boolean.turn_off entity_id: input_boolean.task_washing_load_pending - choose: - conditions: - condition: state entity_id: input_select.family_member_selection state: Lou sequence: - action: counter.increment entity_id: counter.chores_completed_lou - action: input_text.set_value entity_id: input_text.last_chore_lou data: value: "Load Washing Machine - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Jess sequence: - action: counter.increment entity_id: counter.chores_completed_jess - action: input_text.set_value entity_id: input_text.last_chore_jess data: value: "Load Washing Machine - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: William sequence: - action: counter.increment entity_id: counter.chores_completed_william - action: input_text.set_value entity_id: input_text.last_chore_william data: value: "Load Washing Machine - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Xander sequence: - action: counter.increment entity_id: counter.chores_completed_xander - action: input_text.set_value entity_id: input_text.last_chore_xander data: value: "Load Washing Machine - {{ now().strftime('%H:%M') }}" - conditions: - condition: state entity_id: input_select.family_member_selection state: Bella sequence: - action: counter.increment entity_id: counter.chores_completed_bella - action: input_text.set_value entity_id: input_text.last_chore_bella data: value: "Load Washing Machine - {{ now().strftime('%H:%M') }}" - action: notify.homeassistantcomms data: message: "✅ {{ states('input_select.family_member_selection') }} loaded the washing machine!" target: '267249171017367552' - action: input_text.set_value entity_id: input_text.master_chore_log data: value: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }} - {{ states('input_select.family_member_selection') }} completed Load Washing Machine" mode: single # scripts.yaml - All required scripts for device management and parental controls # Router authentication and token management for TP-Link Archer AX72 Pro unblock_all_devices: alias: "Unblock All Devices" description: "Emergency unblock for all family devices using TP-Link API" icon: mdi:check-circle mode: single sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.mobile_devices_blocked - input_boolean.desktop_devices_blocked - input_boolean.bella_homework_mode - input_boolean.william_study_mode - variables: all_devices: # All 22 device MAC addresses - "{{ states('input_text.jess_laptop_1_testing_mac') }}" - "{{ states('input_text.bella_desktop_wired_mac') }}" - "{{ states('input_text.bella_desktop_wireless_mac') }}" - "{{ states('input_text.bella_laptop_wired_mac') }}" - "{{ states('input_text.bella_laptop_wireless_mac') }}" - "{{ states('input_text.bella_iphone_mac') }}" - "{{ states('input_text.bella_ipad_mac') }}" - "{{ states('input_text.bella_switch_mac') }}" - "{{ states('input_text.xander_desktop_wired_mac') }}" - "{{ states('input_text.xander_desktop_wireless_mac') }}" - "{{ states('input_text.xander_laptop_wired_mac') }}" - "{{ states('input_text.xander_laptop_wireless_mac') }}" - "{{ states('input_text.xander_iphone_mac') }}" - "{{ states('input_text.xander_ipad_mac') }}" - "{{ states('input_text.xander_switch_mac') }}" - "{{ states('input_text.william_desktop_wired_mac') }}" - "{{ states('input_text.william_desktop_wireless_mac') }}" - "{{ states('input_text.william_laptop_wired_mac') }}" - "{{ states('input_text.william_laptop_wireless_mac') }}" - "{{ states('input_text.william_iphone_mac') }}" - "{{ states('input_text.william_ipad_mac') }}" - "{{ states('input_text.william_switch_mac') }}" - repeat: for_each: "{{ all_devices }}" sequence: - condition: template value_template: "{{ repeat.item != '' and repeat.item != 'unknown' }}" - service: rest_command.unblock_device_by_mac data: mac_address: "{{ repeat.item }}" continue_on_error: true - delay: milliseconds: 300 - service: notify.notify data: title: "✅ All Devices Unblocked" message: "Emergency unblock completed - all restrictions removed" # Network monitoring and maintenance for TP-Link Archer AX72 Pro network_health_check: alias: "Network Health Check" description: "Check router connectivity and refresh authentication if needed" icon: mdi:network-check mode: single sequence: - action: script.turn_on target: entity_id: script.router_login continue_on_error: true - delay: seconds: 5 - action: homeassistant.update_entity target: entity_id: binary_sensor.10_0_0_254 continue_on_error: true - condition: state entity_id: binary_sensor.10_0_0_254 state: 'off' - action: notify.mobile_app_jess_iphone data: title: "⚠️ Network Issue" message: "TP-Link router ping failed - check connectivity to 10.0.0.254" # Utility scripts for system management validate_configuration: alias: "Validate Home Assistant Configuration" description: "Check configuration validity before restart" mode: single sequence: - service: homeassistant.check_config - delay: seconds: 5 - service: system_log.write data: message: "Configuration validation completed" level: info backup_configuration: alias: "Create Configuration Backup" description: "Create backup before making changes" mode: single sequence: - service: hassio.backup_full data: name: "Auto backup {{ now().strftime('%Y-%m-%d_%H-%M') }}" compressed: true - service: persistent_notification.create data: title: "Backup Created" message: "Configuration backup completed successfully" # ========== MISSING SCRIPTS - ADD TO scripts.yaml ========== # These scripts were referenced but not defined, causing Spook warnings # ========== ROUTER TOKEN MANAGEMENT ========== refresh_router_token: alias: "Refresh Router Access Token" description: "Manually refresh router authentication token" mode: single sequence: - service: rest_command.router_login - delay: seconds: 3 - service: input_text.set_value target: entity_id: input_text.last_router_login data: value: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}" - service: input_text.set_value target: entity_id: input_text.system_status data: value: "Token refreshed at {{ now().strftime('%H:%M:%S') }}" # ========== MAC ADDRESS MANAGEMENT ========== update_device_mac: alias: "Update Device MAC Address" description: "Update MAC address for device tracking" fields: device_name: description: "Device name (e.g., bella_iphone)" example: "bella_iphone" selector: text: new_mac: description: "New MAC address" example: "AA:BB:CC:DD:EE:FF" selector: text: old_mac: description: "Old MAC address (optional)" example: "11:22:33:44:55:66" selector: text: mode: single sequence: - service: system_log.write data: message: > MAC Update: {{ device_name }} changed from {{ old_mac | default('unknown') }} to {{ new_mac }} at {{ now().strftime('%Y-%m-%d %H:%M:%S') }} level: info - service: input_text.set_value target: entity_id: "input_text.{{ device_name }}_mac" data: value: "{{ new_mac }}" - service: input_text.set_value target: entity_id: "input_text.{{ device_name }}_mac_backup" data: value: "{{ new_mac }}" - service: input_boolean.turn_off target: entity_id: "input_boolean.{{ device_name }}_mac_changed" continue_on_error: true bella_homework_mode: alias: "Bella's Homework Mode" icon: mdi:book-open-page-variant mode: restart sequence: - service: system_log.write data: message: "Bella's homework mode activated" level: info # Block gaming and distracting devices - service: input_boolean.turn_on target: entity_id: - input_boolean.bella_iphone_blocked - input_boolean.bella_ipad_blocked - input_boolean.bella_switch_blocked - input_boolean.bella_desktop_wireless_blocked continue_on_error: true # Keep laptop available for homework - service: input_boolean.turn_off target: entity_id: - input_boolean.bella_laptop_wireless_blocked - input_boolean.bella_laptop_wired_blocked continue_on_error: true - service: notify.family data: title: "📚 Bella's Homework Mode" message: "Homework mode enabled. Gaming devices blocked, laptop available." continue_on_error: true xander_gaming_mode: alias: "Xander's Gaming Mode" icon: mdi:gamepad-variant mode: restart sequence: - service: system_log.write data: message: "Xander's gaming mode activated" level: info - service: input_boolean.turn_off target: entity_id: - input_boolean.xander_desktop_wired_blocked - input_boolean.xander_desktop_wireless_blocked - input_boolean.xander_switch_blocked continue_on_error: true - service: notify.family data: title: "🎮 Xander's Gaming Mode" message: "Gaming session started - devices unblocked" continue_on_error: true william_study_mode: alias: "William's Study Mode" icon: mdi:school mode: restart sequence: - service: system_log.write data: message: "William's study mode activated" level: info # Block gaming devices - service: input_boolean.turn_on target: entity_id: - input_boolean.william_desktop_wireless_blocked - input_boolean.william_switch_blocked continue_on_error: true # Keep laptop available - service: input_boolean.turn_off target: entity_id: - input_boolean.william_laptop_wireless_blocked - input_boolean.william_laptop_wired_blocked - input_boolean.william_desktop_wired_blocked continue_on_error: true - service: notify.family data: title: "📖 William's Study Mode" message: "Study mode active - gaming blocked, work devices available" continue_on_error: true # ========== BULK DEVICE CONTROL SCRIPTS ========== block_all_mobile_devices: alias: "Block All Mobile Devices" icon: mdi:cellphone-off mode: single sequence: - service: input_boolean.turn_on target: entity_id: - input_boolean.bella_iphone_blocked - input_boolean.bella_ipad_blocked - input_boolean.xander_iphone_blocked - input_boolean.xander_ipad_blocked - input_boolean.william_iphone_blocked - input_boolean.william_ipad_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked all mobile devices at {{ now().strftime('%H:%M:%S') }}" - service: notify.family data: title: "🚫 Mobile Devices Blocked" message: "All iPhones and iPads blocked" block_all_desktop_devices: alias: "Block All Desktop Devices" icon: mdi:desktop-classic-off mode: single sequence: - service: input_boolean.turn_on target: entity_id: - input_boolean.bella_desktop_wired_blocked - input_boolean.bella_desktop_wireless_blocked - input_boolean.xander_desktop_wired_blocked - input_boolean.xander_desktop_wireless_blocked - input_boolean.william_desktop_wired_blocked - input_boolean.william_desktop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked all desktops at {{ now().strftime('%H:%M:%S') }}" - service: notify.family data: title: "🚫 Desktop Devices Blocked" message: "All desktop computers blocked" block_all_laptop_devices: alias: "Block All Laptop Devices" icon: mdi:laptop-off mode: single sequence: - service: input_boolean.turn_on target: entity_id: - input_boolean.jess_laptop_1_testing_blocked - input_boolean.bella_laptop_wired_blocked - input_boolean.bella_laptop_wireless_blocked - input_boolean.xander_laptop_wired_blocked - input_boolean.xander_laptop_wireless_blocked - input_boolean.william_laptop_wired_blocked - input_boolean.william_laptop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked all laptops at {{ now().strftime('%H:%M:%S') }}" - service: notify.family data: title: "🚫 Laptop Devices Blocked" message: "All laptop computers blocked" # ========== INDIVIDUAL CHILD CONTROL SCRIPTS ========== block_all_bella_devices: alias: "Block All Bella's Devices" icon: mdi:account-cancel mode: single sequence: - service: input_boolean.turn_on target: entity_id: - input_boolean.bella_desktop_wired_blocked - input_boolean.bella_desktop_wireless_blocked - input_boolean.bella_laptop_wired_blocked - input_boolean.bella_laptop_wireless_blocked - input_boolean.bella_iphone_blocked - input_boolean.bella_ipad_blocked - input_boolean.bella_switch_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked all Bella's devices at {{ now().strftime('%H:%M:%S') }}" - service: notify.family data: title: "🚫 Bella's Devices Blocked" message: "All 7 of Bella's devices have been blocked" unblock_all_bella_devices: alias: "Unblock All Bella's Devices" icon: mdi:account-check mode: single sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.bella_desktop_wired_blocked - input_boolean.bella_desktop_wireless_blocked - input_boolean.bella_laptop_wired_blocked - input_boolean.bella_laptop_wireless_blocked - input_boolean.bella_iphone_blocked - input_boolean.bella_ipad_blocked - input_boolean.bella_switch_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Unblocked all Bella's devices at {{ now().strftime('%H:%M:%S') }}" - service: notify.family data: title: "✅ Bella's Devices Unblocked" message: "All of Bella's devices have been restored" block_all_xander_devices: alias: "Block All Xander's Devices" icon: mdi:account-cancel mode: single sequence: - service: input_boolean.turn_on target: entity_id: - input_boolean.xander_desktop_wired_blocked - input_boolean.xander_desktop_wireless_blocked - input_boolean.xander_laptop_wired_blocked - input_boolean.xander_laptop_wireless_blocked - input_boolean.xander_iphone_blocked - input_boolean.xander_ipad_blocked - input_boolean.xander_switch_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked all Xander's devices at {{ now().strftime('%H:%M:%S') }}" - service: notify.family data: title: "🚫 Xander's Devices Blocked" message: "All 7 of Xander's devices have been blocked" unblock_all_xander_devices: alias: "Unblock All Xander's Devices" icon: mdi:account-check mode: single sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.xander_desktop_wired_blocked - input_boolean.xander_desktop_wireless_blocked - input_boolean.xander_laptop_wired_blocked - input_boolean.xander_laptop_wireless_blocked - input_boolean.xander_iphone_blocked - input_boolean.xander_ipad_blocked - input_boolean.xander_switch_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Unblocked all Xander's devices at {{ now().strftime('%H:%M:%S') }}" - service: notify.family data: title: "✅ Xander's Devices Unblocked" message: "All of Xander's devices have been restored" block_all_william_devices: alias: "Block All William's Devices" icon: mdi:account-cancel mode: single sequence: - service: input_boolean.turn_on target: entity_id: - input_boolean.william_desktop_wired_blocked - input_boolean.william_desktop_wireless_blocked - input_boolean.william_laptop_wired_blocked - input_boolean.william_laptop_wireless_blocked - input_boolean.william_iphone_blocked - input_boolean.william_ipad_blocked - input_boolean.william_switch_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked all William's devices at {{ now().strftime('%H:%M:%S') }}" - service: notify.family data: title: "🚫 William's Devices Blocked" message: "All 7 of William's devices have been blocked" unblock_all_william_devices: alias: "Unblock All William's Devices" icon: mdi:account-check mode: single sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.william_desktop_wired_blocked - input_boolean.william_desktop_wireless_blocked - input_boolean.william_laptop_wired_blocked - input_boolean.william_laptop_wireless_blocked - input_boolean.william_iphone_blocked - input_boolean.william_ipad_blocked - input_boolean.william_switch_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Unblocked all William's devices at {{ now().strftime('%H:%M:%S') }}" - service: notify.family data: title: "✅ William's Devices Unblocked" message: "All of William's devices have been restored" # ========== TESTING SCRIPT ========== test_jess_device_connection: alias: "Test Jess Device Connection" description: "Test connection to Jess's testing laptop" mode: single sequence: - service: rest_command.router_login continue_on_error: true - delay: seconds: 2 - service: rest_command.get_connected_devices continue_on_error: true - service: input_text.set_value target: entity_id: input_text.system_status data: value: "Jess device test completed at {{ now().strftime('%H:%M:%S') }}" - service: notify.family data: title: "Device Connection Test" message: "Test completed for Jess's laptop. Check system logs for details." continue_on_error: true block_all_children_devices: alias: "Block All Children's Devices" icon: mdi:account-cancel mode: single sequence: - service: script.block_all_bella_devices - service: script.block_all_xander_devices - service: script.block_all_william_devices - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked all children at {{ now().strftime('%H:%M:%S') }}" unblock_all_children_devices: alias: "Unblock All Children's Devices" icon: mdi:account-check mode: single sequence: - service: script.unblock_all_bella_devices - service: script.unblock_all_xander_devices - service: script.unblock_all_william_devices - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Unblocked all children at {{ now().strftime('%H:%M:%S') }}" system_health_check: alias: "System Health Check" description: "Run comprehensive system health check" mode: single sequence: - service: script.refresh_router_token continue_on_error: true - delay: seconds: 3 - service: homeassistant.update_entity target: entity_id: binary_sensor.10_0_0_254 continue_on_error: true - service: input_text.set_value target: entity_id: input_text.system_status data: value: "Health check completed at {{ now().strftime('%H:%M:%S') }}" backup_current_configuration: alias: "Backup Current Configuration" description: "Create backup of current settings" mode: single sequence: - service: input_text.set_value target: entity_id: input_text.system_status data: value: "Backup created at {{ now().strftime('%Y-%m-%d %H:%M:%S') }}" - service: persistent_notification.create data: title: "Backup Created" message: "Configuration backup completed successfully" # ========== ROUTER LOGIN SCRIPT (was missing!) ========== router_login: alias: "Router Login and Token Refresh" icon: mdi:router-wireless mode: single sequence: - action: rest_command.router_login - delay: seconds: 3 - action: system_log.write data: message: "Router login attempted at {{ now().strftime('%Y-%m-%d %H:%M:%S') }}" level: info - action: persistent_notification.create data: message: "Router authentication refreshed" title: "TP-Link Router" notification_id: "router_auth" # ========== CLEAR MAC CHANGE ALERTS (was missing!) ========== clear_mac_change_alerts: alias: "Clear MAC Change Alerts" description: "Clear alerts for MAC address changes" icon: mdi:bell-off fields: device_name: description: "Device name to clear alerts for" example: "bella_iphone" selector: text: mode: single sequence: - action: persistent_notification.dismiss data: notification_id: "mac_change_{{ device_name }}" - action: system_log.write data: message: "MAC change alerts cleared for {{ device_name }}" level: info # ========== TOGGLE SCRIPTS FOR DESKTOP/LAPTOP DEVICES ========== # Add these to your scripts.yaml file # These scripts toggle BOTH wired and wireless connections together # They check the current combined state and toggle accordingly # ========== BELLA'S DEVICE TOGGLES ========== toggle_bella_desktop: alias: "Toggle Bella's Desktop (Wired & Wireless)" icon: mdi:desktop-classic mode: single sequence: # Check if EITHER is currently blocked - choose: # If ANY are blocked, unblock BOTH - conditions: - condition: or conditions: - condition: state entity_id: input_boolean.bella_desktop_wired_blocked state: 'on' - condition: state entity_id: input_boolean.bella_desktop_wireless_blocked state: 'on' sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.bella_desktop_wired_blocked - input_boolean.bella_desktop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Unblocked Bella Desktop at {{ now().strftime('%H:%M:%S') }}" # If BOTH are unblocked, block BOTH default: - service: input_boolean.turn_on target: entity_id: - input_boolean.bella_desktop_wired_blocked - input_boolean.bella_desktop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked Bella Desktop at {{ now().strftime('%H:%M:%S') }}" toggle_bella_laptop: alias: "Toggle Bella's Laptop (Wired & Wireless)" icon: mdi:laptop mode: single sequence: - choose: - conditions: - condition: or conditions: - condition: state entity_id: input_boolean.bella_laptop_wired_blocked state: 'on' - condition: state entity_id: input_boolean.bella_laptop_wireless_blocked state: 'on' sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.bella_laptop_wired_blocked - input_boolean.bella_laptop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Unblocked Bella Laptop at {{ now().strftime('%H:%M:%S') }}" default: - service: input_boolean.turn_on target: entity_id: - input_boolean.bella_laptop_wired_blocked - input_boolean.bella_laptop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked Bella Laptop at {{ now().strftime('%H:%M:%S') }}" # ========== XANDER'S DEVICE TOGGLES ========== toggle_xander_desktop: alias: "Toggle Xander's Desktop (Wired & Wireless)" icon: mdi:desktop-classic mode: single sequence: - choose: - conditions: - condition: or conditions: - condition: state entity_id: input_boolean.xander_desktop_wired_blocked state: 'on' - condition: state entity_id: input_boolean.xander_desktop_wireless_blocked state: 'on' sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.xander_desktop_wired_blocked - input_boolean.xander_desktop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Unblocked Xander Desktop at {{ now().strftime('%H:%M:%S') }}" default: - service: input_boolean.turn_on target: entity_id: - input_boolean.xander_desktop_wired_blocked - input_boolean.xander_desktop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked Xander Desktop at {{ now().strftime('%H:%M:%S') }}" toggle_xander_laptop: alias: "Toggle Xander's Laptop (Wired & Wireless)" icon: mdi:laptop mode: single sequence: - choose: - conditions: - condition: or conditions: - condition: state entity_id: input_boolean.xander_laptop_wired_blocked state: 'on' - condition: state entity_id: input_boolean.xander_laptop_wireless_blocked state: 'on' sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.xander_laptop_wired_blocked - input_boolean.xander_laptop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Unblocked Xander Laptop at {{ now().strftime('%H:%M:%S') }}" default: - service: input_boolean.turn_on target: entity_id: - input_boolean.xander_laptop_wired_blocked - input_boolean.xander_laptop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked Xander Laptop at {{ now().strftime('%H:%M:%S') }}" # ========== WILLIAM'S DEVICE TOGGLES ========== toggle_william_desktop: alias: "Toggle William's Desktop (Wired & Wireless)" icon: mdi:desktop-classic mode: single sequence: - choose: - conditions: - condition: or conditions: - condition: state entity_id: input_boolean.william_desktop_wired_blocked state: 'on' - condition: state entity_id: input_boolean.william_desktop_wireless_blocked state: 'on' sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.william_desktop_wired_blocked - input_boolean.william_desktop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Unblocked William Desktop at {{ now().strftime('%H:%M:%S') }}" default: - service: input_boolean.turn_on target: entity_id: - input_boolean.william_desktop_wired_blocked - input_boolean.william_desktop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked William Desktop at {{ now().strftime('%H:%M:%S') }}" toggle_william_laptop: alias: "Toggle William's Laptop (Wired & Wireless)" icon: mdi:laptop mode: single sequence: - choose: - conditions: - condition: or conditions: - condition: state entity_id: input_boolean.william_laptop_wired_blocked state: 'on' - condition: state entity_id: input_boolean.william_laptop_wireless_blocked state: 'on' sequence: - service: input_boolean.turn_off target: entity_id: - input_boolean.william_laptop_wired_blocked - input_boolean.william_laptop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Unblocked William Laptop at {{ now().strftime('%H:%M:%S') }}" default: - service: input_boolean.turn_on target: entity_id: - input_boolean.william_laptop_wired_blocked - input_boolean.william_laptop_wireless_blocked - service: input_text.set_value target: entity_id: input_text.last_block_action data: value: "Blocked William Laptop at {{ now().strftime('%H:%M:%S') }}" # ========== ADD THESE SCRIPTS TO scripts.yaml ========== # Add these at the end of your scripts.yaml file # Enhanced router login using Python script router_login_python: alias: "Router Login (Python Enhanced)" description: "Login to router using Python script with better error handling" mode: single sequence: - service: python_script.tplink_router_control data: action: login - delay: seconds: 2 - service: persistent_notification.create data: title: "Router Login" message: "{{ states('input_text.system_status') }}" notification_id: router_login_status # Enhanced block device using Python script block_device_python: alias: "Block Device (Python Enhanced)" description: "Block device using Python script" fields: mac_address: description: "MAC address to block" example: "AA:BB:CC:DD:EE:FF" device_name: description: "Device name for logging" example: "Bella-iPhone" mode: single sequence: - service: python_script.tplink_router_control data: action: block mac_address: "{{ mac_address }}" device_name: "{{ device_name }}" - delay: seconds: 2 - service: persistent_notification.create data: title: "Device Block" message: "{{ states('input_text.system_status') }}" notification_id: device_block_status # Enhanced unblock device using Python script unblock_device_python: alias: "Unblock Device (Python Enhanced)" description: "Unblock device using Python script" fields: mac_address: description: "MAC address to unblock" example: "AA:BB:CC:DD:EE:FF" mode: single sequence: - service: python_script.tplink_router_control data: action: unblock mac_address: "{{ mac_address }}" - delay: seconds: 2 - service: persistent_notification.create data: title: "Device Unblock" message: "{{ states('input_text.system_status') }}" notification_id: device_unblock_status # Comprehensive router test - tests BOTH REST and Python methods test_router_comprehensive: alias: "Comprehensive Router Test" description: "Tests both REST and Python methods to find which works" mode: single sequence: - service: input_text.set_value target: entity_id: input_text.system_status data: value: "Starting comprehensive router test..." # TEST 1: REST Command Login - service: persistent_notification.create data: title: "Router Test" message: "Test 1: Trying REST command login..." notification_id: router_test - service: rest_command.router_login continue_on_error: true - delay: seconds: 3 - service: input_text.set_value target: entity_id: input_text.system_status data: value: "REST login completed. Token: {{ states('input_text.router_token')[:10] if states('input_text.router_token') not in ['unknown', '', 'unavailable'] else 'FAILED' }}" # TEST 2: Python Script Login - delay: seconds: 2 - service: persistent_notification.create data: title: "Router Test" message: "Test 2: Trying Python script login..." notification_id: router_test - service: python_script.tplink_router_control data: action: login continue_on_error: true - delay: seconds: 3 # TEST 3: Block test device (if we have a token) - condition: template value_template: "{{ states('input_text.router_token') not in ['unknown', '', 'unavailable'] }}" - service: persistent_notification.create data: title: "Router Test" message: "Test 3: Trying to block test device..." notification_id: router_test - service: rest_command.block_device_by_mac data: mac_address: "{{ states('input_text.jess_laptop_1_testing_mac') }}" device_name: "Test-Block" continue_on_error: true - delay: seconds: 5 # TEST 4: Unblock test device - service: persistent_notification.create data: title: "Router Test" message: "Test 4: Trying to unblock test device..." notification_id: router_test - service: rest_command.unblock_device_by_mac data: mac_address: "{{ states('input_text.jess_laptop_1_testing_mac') }}" continue_on_error: true - delay: seconds: 3 # Final Report - service: persistent_notification.create data: title: "✅ Router Test Complete" message: | **Test Results:** Router Token: {{ 'VALID ✅' if states('input_text.router_token') not in ['unknown', '', 'unavailable'] else 'INVALID ❌' }} Status: {{ states('input_text.system_status') }} Last Action: {{ states('input_text.last_block_action') }} **Next Steps:** - Check Settings → System → Logs for detailed errors - Look for ✅ or ❌ messages in system_status - If REST works, use existing scripts - If Python works, use _python versions of scripts notification_id: router_test_final # Quick test - just login test_router_login_quick: alias: "Quick Router Login Test" description: "Quick test of just the login function" mode: single sequence: - service: rest_command.router_login - delay: seconds: 3 - service: persistent_notification.create data: title: "Quick Login Test" message: | Token: {{ states('input_text.router_token')[:20] if states('input_text.router_token') not in ['unknown', '', 'unavailable'] else 'FAILED' }} Status: {{ states('input_text.system_status') }} Check Settings → System → Logs for details notification_id: quick_login_test # Router connection health check router_health_check: alias: "Router Health Check" description: "Check router connectivity and authentication status" mode: single sequence: - service: homeassistant.update_entity target: entity_id: binary_sensor.10_0_0_254 continue_on_error: true - delay: seconds: 2 - service: persistent_notification.create data: title: "Router Health Check" message: | **Router Status:** Ping: {{ '🟢 Online' if is_state('binary_sensor.10_0_0_254', 'on') else '🔴 Offline' }} Token: {{ '🟢 Valid' if states('input_text.router_token') not in ['unknown', '', 'unavailable'] else '🔴 Invalid' }} Last Login: {{ states('input_text.last_router_login') }} System Status: {{ states('input_text.system_status') }} **Recommendation:** {% if is_state('binary_sensor.10_0_0_254', 'off') %} ⚠️ Router is offline! Check network connection. {% elif states('input_text.router_token') in ['unknown', '', 'unavailable'] %} ⚠️ No valid token. Run "Test Router Login Quick" script. {% else %} ✅ Everything looks good! {% endif %} notification_id: router_health # ========== UPDATED TEST SCRIPTS - ADD TO scripts.yaml ========== # These scripts pass credentials directly for testing # Test with Python script using direct credentials test_router_login_python_direct: alias: "Test Router Login (Python with Direct Credentials)" description: "Test Python login with credentials passed directly" mode: single sequence: - service: python_script.tplink_router_control data: action: login username: "admin" password: "23Pinkpr!ncesses" - delay: seconds: 3 - service: persistent_notification.create data: title: "Python Login Test (Direct Creds)" message: | **Result:** Status: {{ states('input_text.system_status') }} Token: {{ states('input_text.router_token')[:30] if states('input_text.router_token') not in ['unknown', '', 'unavailable'] else 'NOT FOUND' }} Check Settings → System → Logs for detailed output notification_id: python_login_direct # Test REST command with updated config test_router_login_rest_updated: alias: "Test Router Login (REST Updated)" description: "Test REST command with updated credentials" mode: single sequence: - service: rest_command.router_login - delay: seconds: 3 - service: persistent_notification.create data: title: "REST Login Test (Updated)" message: | **Result:** Token: {{ states('input_text.router_token')[:30] if states('input_text.router_token') not in ['unknown', '', 'unavailable'] else 'NOT FOUND' }} Status: {{ states('input_text.system_status') }} {% if states('input_text.router_token') not in ['unknown', '', 'unavailable'] %} ✅ **SUCCESS!** REST commands are working. {% else %} ❌ **FAILED** - Try the Python method or check logs {% endif %} notification_id: rest_login_updated # Try alternative REST login test_router_login_rest_alt: alias: "Test Router Login (REST Alternative)" description: "Test alternative REST command format" mode: single sequence: - service: rest_command.router_login_alt - delay: seconds: 3 - service: persistent_notification.create data: title: "REST Login Test (Alternative)" message: | **Result:** Token: {{ states('input_text.router_token')[:30] if states('input_text.router_token') not in ['unknown', '', 'unavailable'] else 'NOT FOUND' }} {% if states('input_text.router_token') not in ['unknown', '', 'unavailable'] %} ✅ **SUCCESS!** Alternative REST format works. {% else %} ❌ **FAILED** - Alternative format didn't work either {% endif %} notification_id: rest_login_alt # Comprehensive test - tries everything test_router_all_methods: alias: "Test All Router Login Methods" description: "Try all login methods and report which works" mode: single sequence: # Clear token first - service: input_text.set_value target: entity_id: input_text.router_token data: value: "" - service: input_text.set_value target: entity_id: input_text.system_status data: value: "Testing all methods..." # METHOD 1: Standard REST - service: persistent_notification.create data: title: "Router Test Progress" message: "Method 1/3: Testing standard REST command..." notification_id: router_test_progress - service: rest_command.router_login continue_on_error: true - delay: seconds: 3 - service: input_text.set_value target: entity_id: input_text.router_token data: value: "" # Clear for next test # METHOD 2: Alternative REST - service: persistent_notification.create data: title: "Router Test Progress" message: "Method 2/3: Testing alternative REST format..." notification_id: router_test_progress - service: rest_command.router_login_alt continue_on_error: true - delay: seconds: 3 - service: input_text.set_value target: entity_id: input_text.router_token data: value: "" # Clear for next test # METHOD 3: Python Script - service: persistent_notification.create data: title: "Router Test Progress" message: "Method 3/3: Testing Python script..." notification_id: router_test_progress - service: python_script.tplink_router_control data: action: login username: "" password: "23Pinkpr!ncesses" continue_on_error: true - delay: seconds: 5 # Final Report - service: persistent_notification.create data: title: "🔍 Router Test Complete" message: | **FINAL RESULTS:** Token Status: {{ '✅ FOUND' if states('input_text.router_token') not in ['unknown', '', 'unavailable'] else '❌ NOT FOUND' }} Token Value: {{ states('input_text.router_token')[:40] if states('input_text.router_token') not in ['unknown', '', 'unavailable'] else 'NONE' }} System Status: {{ states('input_text.system_status') }} Last Login: {{ states('input_text.last_router_login') }} --- **RECOMMENDATION:** {% if states('input_text.router_token') not in ['unknown', '', 'unavailable'] %} ✅ **SUCCESS!** At least one method worked. Check which method was last in the logs. Use that method for your scripts. {% else %} ❌ **ALL METHODS FAILED** Possible issues: 1. Router not reachable at 10.0.0.254 2. Wrong password 3. Firmware changed authentication 4. Router security blocking automation Check Settings → System → Logs for details {% endif %} notification_id: router_test_final # Debug script - shows current status show_router_status: alias: "Show Current Router Status" description: "Display all router-related status info" mode: single sequence: - service: persistent_notification.create data: title: "📊 Router Status" message: | **Current Status:** **Connectivity:** Router Ping: {{ states('binary_sensor.10_0_0_254') }} **Authentication:** Token: {{ states('input_text.router_token')[:40] if states('input_text.router_token') not in ['unknown', '', 'unavailable'] else 'NONE' }} Username: {{ states('input_text.router_username') }} Password Set: {{ 'YES' if states('input_text.router_password') not in ['unknown', '', 'unavailable'] else 'NO' }} **Recent Activity:** Last Login: {{ states('input_text.last_router_login') }} Last Block Action: {{ states('input_text.last_block_action') }} System Status: {{ states('input_text.system_status') }} **Blocked Devices:** Currently Blocked: {{ states('sensor.devices_currently_blocked') }} devices notification_id: router_status #New Chorew system