- id: driveway_video_ai_analysis alias: Driveway Video AI Analysis description: Analyze driveway video to detect dog walking activity triggers: - entity_id: input_boolean.driveway_video_ready to: 'on' trigger: state conditions: - condition: state entity_id: input_boolean.ai_detection_enabled state: 'on' - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' actions: - data: task_name: driveway_video_dog_walk_detection instructions: "If one or more people and a dog are observed moving from the\ \ street towards the house (e.g., entering the driveway, walking towards the\ \ front door from the road, or otherwise returning home from a walk), classify\ \ this activity as 'ending_dog_walk'. If one or more people and a dog are\ \ observed moving from the house towards the street (e.g., leaving the front\ \ door, walking down the driveway onto the road, or otherwise departing for\ \ a walk), classify this activity as 'starting_dog_walk'. Respond with \"\ starting_dog_walk\" or \"ending_dog_walk\" based on the instructions above.\n\ \ or \n - \"dog_and_people\" - if a dog is seen with a person or\ \ people but not\n appearing to be starting or ending a walk\n -\ \ \"person_only\" - if only a person is seen\n - \"dog_person_separate\"\ \ - if a dog and person are seen in the video but\n not in the same frame.\n\ \ - \"dog_only\" if only a dog is seen \n - \"empty\" if no relevant\ \ activity is detected\n Focus on clear dog walking activity and direction\ \ of travel. In a\n separate paragraph, explain your reasoning.\n" attachments: - media_content_id: media-source://media_source/local/ai_image_notifications/driveway_dogwalk_capture.mp4 media_content_type: video/mp4 entity_id: ai_task.google_ai_task response_variable: driveway_video_response action: ai_task.generate_data - target: entity_id: input_text.driveway_analysis_result data: value: '{{ (driveway_video_response.data | lower).split('' '')[0].strip() }}' action: input_text.set_value - target: entity_id: input_boolean.driveway_video_ready action: input_boolean.turn_off data: {} mode: single - id: driveway_image_capture alias: Driveway Video Capture description: Capture video when both person and pet motion detected in driveway within 30 seconds, OR when person detected during active walk triggers: - entity_id: binary_sensor.driveway_person to: 'on' id: person_motion trigger: state - entity_id: binary_sensor.driveway_pet to: 'on' id: pet_motion trigger: state conditions: - condition: time after: 06:00:00 before: '22:00:00' - condition: template value_template: '{{ states(''input_text.driveway_camera_entity'') not in [''unknown'', ''''] }} ' actions: - choose: - conditions: - condition: trigger id: person_motion - condition: state state: 'off' entity_id: binary_sensor.driveway_pet sequence: - wait_for_trigger: - entity_id: binary_sensor.driveway_pet to: 'on' trigger: state timeout: hours: 0 minutes: 0 seconds: 15 milliseconds: 0 continue_on_timeout: false - conditions: - condition: trigger id: pet_motion - condition: state state: 'off' entity_id: binary_sensor.driveway_person sequence: - wait_for_trigger: - entity_id: binary_sensor.driveway_person to: 'on' trigger: state timeout: hours: 0 minutes: 0 seconds: 15 milliseconds: 0 continue_on_timeout: false - target: entity_id: input_datetime.last_walk_detection data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' action: input_datetime.set_datetime - target: entity_id: input_boolean.driveway_video_ready action: input_boolean.turn_off data: {} - action: shell_command.ensure_backup_directories continue_on_error: true - action: shell_command.backup_driveway_walk_video continue_on_error: true - delay: 00:00:02 - target: entity_id: '{{ states(''input_text.driveway_camera_entity'') }}' data: duration: 30 filename: /config/www/local/ai_image_notifications/driveway_dogwalk_capture.mp4 lookback: 15 action: camera.record - delay: 00:00:32 - target: entity_id: input_boolean.driveway_video_ready action: input_boolean.turn_on data: {} mode: single - id: evening_dog_walk_reminder alias: Evening Dog Walk Reminder description: Remind to walk dog in the evening (8:30pm-10pm) trigger: - platform: time at: '20:30:00' - platform: time at: '21:00:00' - platform: time at: '21:30:00' condition: - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.notifications_enabled state: 'on' - condition: state entity_id: input_boolean.walk_in_progress state: 'off' - condition: template value_template: '{% set evening_walk = states(''input_datetime.evening_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ evening_walk == ''unknown'' or evening_walk[:10] != today }} ' action: - event: UNotify event_data_template: message_speak: Time for your evening dog walk! Don't forget the leash! message_display: Evening Dog Walk Time πŸ• message: Time for your evening dog walk! It's {{ now().strftime('%H:%M') }} - grab the leash and have a great walk! πŸ• priority: normal channel: General aiprompt: 'no' message_target: liam tag: evening_dog_walk - id: evening_walk_auto_complete alias: Evening Walk Auto Complete description: Automatically mark evening walk as complete when detected (3pm-10pm) trigger: - platform: state entity_id: sensor.driveway_analysis to: ending_dog_walk condition: - condition: time after: '15:00:00' before: '22:00:00' - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' - condition: template value_template: '{% set evening_walk = states(''input_datetime.evening_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ evening_walk == ''unknown'' or evening_walk[:10] != today }} ' action: - service: input_boolean.turn_off target: entity_id: input_boolean.walk_in_progress - action: input_datetime.set_datetime target: entity_id: input_datetime.evening_walk_done data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message: clear_notification message_target: liam tag: evening_dog_walk - event: UNotify event_data_template: message: clear_notification message_target: liam tag: walk_started - event: UNotify event_data_template: message_speak: Excellent job taking the dog for an evening walk! You're amazing! message_display: Evening Walk Complete! πŸŽ‰ message: "Great job taking the dog for their evening walk! You''re amazing!\ \ {% set start_time = states('input_datetime.current_walk_started') %} {%\ \ if start_time != 'unknown' %}\n {% set duration = ((as_timestamp(now())\ \ - as_timestamp(start_time)) / 60) | round(0) %}\n Walk duration: {{ duration\ \ }} minutes.\n{% endif %} \U0001F415❀️\n" priority: normal channel: General aiprompt: 'no' message_target: liam tag: evening_walk_complete - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: "Evening walk completed at {{ now().strftime('%H:%M') }}. {% set start_time\ \ = states('input_datetime.current_walk_started') %} {% if start_time != 'unknown'\ \ %}\n {% set duration = ((as_timestamp(now()) - as_timestamp(start_time))\ \ / 60) | round(0) %}\n Duration: {{ duration }} minutes.\n{% endif %}\n" priority: low channel: General aiprompt: 'no' message_target: parents tag: evening_walk_status - id: trigger_family_room_analysis alias: Trigger Family Room AI Analysis description: Analyze family room tidiness when person motion detected trigger: - platform: state entity_id: binary_sensor.family_room_person_motion to: 'on' - platform: state entity_id: binary_sensor.family_room_person_motion to: 'off' for: minutes: 2 - platform: state entity_id: input_boolean.force_family_room_check to: 'on' condition: - condition: state entity_id: input_boolean.ai_detection_enabled state: 'on' - condition: state entity_id: input_boolean.family_room_monitoring_enabled state: 'on' - condition: template value_template: '{{ states(''input_text.family_room_camera_entity'') not in [''unknown'', ''''] }} ' - condition: template value_template: '{{ states(''input_text.ai_task_entity'') not in [''unknown'', ''unavailable'', ''''] }} ' - condition: or conditions: - condition: state entity_id: input_boolean.force_family_room_check state: 'on' - condition: template value_template: "{% set last_check = states('input_datetime.family_room_last_check')\ \ %} {% if last_check == 'unknown' %}\n true\n{% else %}\n {{ (as_timestamp(now())\ \ - as_timestamp(last_check)) > 300 }}\n{% endif %}\n" action: - service: input_datetime.set_datetime target: entity_id: input_datetime.family_room_last_check data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - service: camera.snapshot target: entity_id: '{{ states(''input_text.family_room_camera_entity'') }}' data: filename: /config/www/local/ai_image_notifications/family_room_snapshot.jpg - service: camera.snapshot target: entity_id: '{{ states(''input_text.kitchen_camera_entity'') }}' data: filename: /config/www/local/ai_image_notifications/family_room_kitchen_view_snapshot.jpg - service: ai_task.generate_data data: task_name: family_room_tidiness_analysis instructions: 'Analyze these family room/living room images. Focus ONLY on practical safety and cleanliness. Rate tidiness 0-100. If below {{ states(''input_number.family_room_cleanliness_threshold'') }}, respond "needs_tidying" and list issues. If above, respond "tidy". Analysis of the family_room_kitchen_view_snapshot.jpg should exclude anything that is the kitchen. The family room is to the top left of the image, near the couch. If you see dirty dishes on the desk area between the kitchen and the family room, call that out too, but ignore the general clutter. ONLY flag these issues: - Food/drinks left out (especially if sticky/messy) - Dishes with food residue - Items on the floor (tripping hazard) - Spills that need cleaning IGNORE: blankets on chairs, remotes on tables, books/papers, decorative items, stuffed animals on furniture, charging cables ' attachments: - media_content_id: media-source://media_source/local/ai_image_notifications/family_room_snapshot.jpg media_content_type: image/jpeg - media_content_id: media-source://media_source/local/ai_image_notifications/family_room_kitchen_view_snapshot.jpg media_content_type: image/jpeg entity_id: ai_task.google_ai_task response_variable: family_room_ai_response - service: variable.update_sensor data: value: "{% set response = family_room_ai_response.data | lower %} {% if 'needs_tidying'\ \ in response %}\n needs_tidying\n{% elif 'tidy' in response %}\n tidy \ \ \n{% else %}\n unknown\n{% endif %}\n" attributes: timestamp: '{{ now() }}' tasks: "{% set response = family_room_ai_response.data %} {% set ns = namespace(filtered=[])\ \ %} {% for line in response.split('\\n') %}\n {% if not ('needs_tidying'\ \ in line.lower() or 'tidy' in line.lower()) %}\n {% set ns.filtered\ \ = ns.filtered + [line] %}\n {% endif %}\n{% endfor %} {{ ns.filtered\ \ | join('\\n') | trim }}\n" replace_attributes: true target: entity_id: sensor.family_room_tidy_status - service: input_boolean.turn_off target: entity_id: input_boolean.force_family_room_check - id: family_room_tidying_notification alias: Family Room Tidying Notification description: Send notifications when family room needs tidying trigger: - platform: state entity_id: sensor.family_room_analysis to: needs_tidying condition: - condition: state entity_id: input_boolean.family_room_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.notifications_enabled state: 'on' - condition: template value_template: "{% set last_notification = states('input_datetime.last_family_room_notification')\ \ %} {% if last_notification == 'unknown' %}\n true\n{% else %}\n {{ (as_timestamp(now())\ \ - as_timestamp(last_notification)) / 60 > states('input_number.notification_cooldown')\ \ | int }}\n{% endif %}\n" action: - action: input_datetime.set_datetime target: entity_id: input_datetime.last_family_room_notification data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message_speak: Hey Liam, the family room could use some tidying when you have a chance message_display: Family Room Needs Tidying πŸ›‹οΈ message: When you get a chance, {{ state_attr('sensor.family_room_analysis', 'specific_tasks') | default('please tidy up the family room') | lower }}. priority: normal channel: General aiprompt: 'no' message_target: liam tag: family_room_tidy - id: family_room_tidied_acknowledgment alias: Family Room Tidied Acknowledgment description: Acknowledge when family room has been tidied trigger: - platform: state entity_id: sensor.family_room_analysis from: needs_tidying to: tidy condition: - condition: state entity_id: input_boolean.notifications_enabled state: 'on' action: - event: UNotify event_data_template: message: clear_notification message_target: liam tag: family_room_tidy - event: UNotify event_data_template: message_speak: Fantastic job tidying the family room! You're doing amazing! message_display: Family Room Tidy! ✨ message: Thanks for tidying up the family room! It looks great - you're amazing! 🌟 priority: normal channel: General aiprompt: 'no' message_target: liam tag: family_room_tidied - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: Family room tidied at {{ now().strftime('%H:%M') }} - excellent work! priority: low channel: General aiprompt: 'no' message_target: parents tag: family_room_status - id: family_room_tidy_notification alias: Family Room Tidy Notification description: Send notifications when family room is analyzed as tidy trigger: - platform: state entity_id: sensor.family_room_analysis to: tidy condition: - condition: state entity_id: input_boolean.family_room_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.notifications_enabled state: 'on' - condition: template value_template: '{% set from_state = trigger.from_state.state if trigger.from_state else ''unknown'' %} {{ from_state in [''unknown'', ''unavailable'', none] }} ' action: - service: notify.parents data: title: Family Room Looking Good! ✨ message: The family room is nice and tidy. Great job keeping it organized! data: tag: family_room_good - id: trigger_kitchen_analysis alias: Trigger Kitchen AI Analysis description: Analyze kitchen cleanliness when person motion detected trigger: - platform: state entity_id: binary_sensor.kitchen_person_motion to: 'on' - platform: state entity_id: binary_sensor.kitchen_person_motion to: 'off' for: minutes: 2 - platform: state entity_id: input_boolean.force_kitchen_check to: 'on' condition: - condition: state entity_id: input_boolean.ai_detection_enabled state: 'on' - condition: state entity_id: input_boolean.kitchen_monitoring_enabled state: 'on' - condition: template value_template: '{{ states(''input_text.kitchen_camera_entity'') not in [''unknown'', ''''] }} ' - condition: template value_template: '{{ states(''input_text.ai_task_entity'') not in [''unknown'', ''unavailable'', ''''] }} ' - condition: or conditions: - condition: state entity_id: input_boolean.force_kitchen_check state: 'on' - condition: template value_template: "{% set last_check = states('input_datetime.kitchen_last_check')\ \ %} {% if last_check == 'unknown' %}\n true\n{% else %}\n {{ (as_timestamp(now())\ \ - as_timestamp(last_check)) > 300 }}\n{% endif %}\n" action: - service: input_datetime.set_datetime target: entity_id: input_datetime.kitchen_last_check data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - service: camera.snapshot target: entity_id: '{{ states(''input_text.kitchen_camera_entity'') }}' data: filename: /config/www/local/ai_image_notifications/kitchen_snapshot.jpg - service: ai_task.generate_data data: task_name: kitchen_cleanliness_analysis instructions: 'Analyze this kitchen image for food safety and basic cleanliness. Focus on: 1. Food items left out on counters (especially perishable items) 2. Dirty dishes in sink or on counters 3. Spills or messes that could attract pests 4. General tidiness that affects food preparation safety Categorize as: - "clean" if kitchen is suitable for food preparation - "needs_attention" if there are minor issues (few dishes, small spills) - "needs_cleaning" if there are food safety concerns (food left out, many dirty dishes, significant mess) Be family-friendly and focus on health/safety rather than perfection. Respond with just the category, then provide 2-3 specific helpful suggestions. ' attachments: - media_content_id: media-source://media_source/local/ai_image_notifications/kitchen_snapshot.jpg media_content_type: image/jpeg entity_id: ai_task.google_ai_task response_variable: kitchen_ai_response - service: variable.update_sensor data: value: "{% if 'needs_cleaning' in kitchen_ai_response.data | lower %}\n needs_cleaning\n\ {% elif 'needs_attention' in kitchen_ai_response.data | lower %}\n needs_attention\n\ {% elif 'clean' in kitchen_ai_response.data | lower %}\n clean\n{% else %}\n\ \ unknown\n{% endif %}\n" attributes: timestamp: '{{ now() }}' tasks: "{% set response = kitchen_ai_response.data %} {% set ns = namespace(filtered=[])\ \ %} {% for line in response.split('\\n') %}\n {% if not ('needs_cleaning'\ \ in line.lower() or 'needs_attention' in line.lower() or 'clean' in line.lower())\ \ %}\n {% set ns.filtered = ns.filtered + [line] %}\n {% endif %}\n\ {% endfor %} {{ ns.filtered | join('\\n') | trim }}\n" replace_attributes: true target: entity_id: sensor.kitchen_clean_status - service: input_boolean.turn_off target: entity_id: input_boolean.force_kitchen_check - id: kitchen_cleaned_acknowledgment alias: Kitchen Cleaned Acknowledgment description: Acknowledge when kitchen has been cleaned trigger: - platform: state entity_id: sensor.kitchen_analysis from: needs_cleaning to: clean condition: - condition: state entity_id: input_boolean.notifications_enabled state: 'on' action: - event: UNotify event_data_template: message: clear_notification message_target: liam tag: kitchen_cleanup - event: UNotify event_data_template: message_speak: Awesome job cleaning the kitchen! You're doing great! message_display: Kitchen Clean! ✨ message: Great job cleaning up the kitchen! It looks fantastic - you're awesome! 🌟 priority: normal channel: General aiprompt: 'no' message_target: liam tag: kitchen_cleaned - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: Kitchen cleaned at {{ now().strftime('%H:%M') }} - great work! priority: low channel: General aiprompt: 'no' message_target: parents tag: kitchen_status - id: kitchen_cleanup_notification alias: Kitchen Cleanup Notification description: Send notifications when kitchen needs cleaning trigger: - platform: state entity_id: sensor.kitchen_analysis to: needs_cleaning condition: - condition: state entity_id: input_boolean.kitchen_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.notifications_enabled state: 'on' - condition: template value_template: "{% set last_notification = states('input_datetime.last_kitchen_notification')\ \ %} {% if last_notification == 'unknown' %}\n true\n{% else %}\n {{ (as_timestamp(now())\ \ - as_timestamp(last_notification)) / 60 > states('input_number.notification_cooldown')\ \ | int }}\n{% endif %}\n" action: - action: input_datetime.set_datetime target: entity_id: input_datetime.last_kitchen_notification data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message_speak: '{% if states(''input_text.notification_target'') == ''liam'' %} Hey Liam, the kitchen needs some attention when you have a moment {% else %} no {% endif %} ' message_display: '{% if states(''input_text.notification_target'') == ''liam'' %} Kitchen Needs Cleaning 🍽️ {% else %} no {% endif %} ' message: Hey, when you're done in the kitchen, {{ state_attr('sensor.kitchen_analysis', 'specific_tasks') | default('please tidy up a bit') | lower }}. priority: normal channel: General aiprompt: 'no' message_target: '{{ states(''input_text.notification_target'') }}' tag: kitchen_cleanup - id: morning_dog_walk_reminder alias: Morning Dog Walk Reminder description: Remind to walk dog in the morning/afternoon (12pm-3pm) trigger: - platform: time at: '12:00:00' - platform: time at: '12:30:00' - platform: time at: '13:00:00' condition: - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.notifications_enabled state: 'on' - condition: state entity_id: input_boolean.walk_in_progress state: 'off' - condition: template value_template: '{% set morning_walk = states(''input_datetime.morning_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ morning_walk == ''unknown'' or morning_walk[:10] != today }} ' action: - event: UNotify event_data_template: message_speak: Time for your morning dog walk! Don't forget the leash! message_display: Morning Dog Walk Time πŸ• message: Time for your morning dog walk! It's {{ now().strftime('%H:%M') }} - grab the leash and have a great walk! πŸ• priority: normal channel: General aiprompt: 'no' message_target: liam tag: morning_dog_walk - id: morning_walk_auto_complete alias: Morning Walk Auto Complete description: Automatically mark morning walk as complete when detected (6am-3pm) trigger: - platform: state entity_id: sensor.driveway_analysis to: ending_dog_walk condition: - condition: time after: 06:00:00 before: '15:00:00' - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' - condition: template value_template: '{% set morning_walk = states(''input_datetime.morning_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ morning_walk == ''unknown'' or morning_walk[:10] != today }} ' action: - service: input_boolean.turn_off target: entity_id: input_boolean.walk_in_progress - action: input_datetime.set_datetime target: entity_id: input_datetime.morning_walk_done data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message: clear_notification message_target: liam tag: morning_dog_walk - event: UNotify event_data_template: message: clear_notification message_target: liam tag: walk_started - event: UNotify event_data_template: message_speak: Awesome job taking the dog for a morning walk! You're the best! message_display: Morning Walk Complete! πŸŽ‰ message: "Great job taking the dog for their morning walk! You''re awesome!\ \ {% set start_time = states('input_datetime.current_walk_started') %} {%\ \ if start_time != 'unknown' %}\n {% set duration = ((as_timestamp(now())\ \ - as_timestamp(start_time)) / 60) | round(0) %}\n Walk duration: {{ duration\ \ }} minutes.\n{% endif %} \U0001F415❀️\n" priority: normal channel: General aiprompt: 'no' message_target: liam tag: morning_walk_complete - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: "Morning walk completed at {{ now().strftime('%H:%M') }}. {% set start_time\ \ = states('input_datetime.current_walk_started') %} {% if start_time != 'unknown'\ \ %}\n {% set duration = ((as_timestamp(now()) - as_timestamp(start_time))\ \ / 60) | round(0) %}\n Duration: {{ duration }} minutes.\n{% endif %}\n" priority: low channel: General aiprompt: 'no' message_target: parents tag: morning_walk_status - id: unclear_walk_return_notification alias: Unclear Walk Return Notification description: Notify user when walk return analysis is unclear during active walk trigger: - platform: state entity_id: sensor.driveway_analysis to: unclear condition: - condition: state entity_id: input_boolean.walk_in_progress state: 'on' - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' action: - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: Someone returned to the driveway during the walk, but I couldn't clearly see if the dog was with them due to lighting or positioning. Did the walk just finish? priority: normal channel: General aiprompt: 'no' message_target: parents tag: unclear_walk_return actions: - action: confirm_walk_complete title: Yes, Walk Complete βœ… - action: walk_still_ongoing title: No, Still Walking πŸšΆβ€β™‚οΈ - id: handle_unclear_walk_response alias: Handle Unclear Walk Response description: Process user's response to unclear walk return notification trigger: - platform: event event_type: mobile_app_notification_action event_data: action: confirm_walk_complete id: walk_complete - platform: event event_type: mobile_app_notification_action event_data: action: walk_still_ongoing id: still_walking condition: - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' action: - event: UNotify event_data_template: message: clear_notification message_target: parents tag: unclear_walk_return - choose: - conditions: - condition: trigger id: walk_complete sequence: - service: input_boolean.turn_off target: entity_id: input_boolean.walk_in_progress - choose: - conditions: - condition: time after: 06:00:00 before: '15:00:00' sequence: - condition: template value_template: '{% set morning_walk = states(''input_datetime.morning_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ morning_walk == ''unknown'' or morning_walk[:10] != today }} ' - action: input_datetime.set_datetime target: entity_id: input_datetime.morning_walk_done data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message: clear_notification message_target: liam tag: morning_dog_walk - event: UNotify event_data_template: message_speak: Awesome job with the morning walk! You're the best! message_display: Morning Walk Complete! πŸ•β€οΈ message: Thanks for walking the dog! Morning walk marked as complete - you're amazing! priority: normal channel: General aiprompt: 'no' message_target: liam tag: walk_acknowledgment - conditions: - condition: time after: '15:00:00' before: '22:00:00' sequence: - condition: template value_template: '{% set evening_walk = states(''input_datetime.evening_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ evening_walk == ''unknown'' or evening_walk[:10] != today }} ' - action: input_datetime.set_datetime target: entity_id: input_datetime.evening_walk_done data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message: clear_notification message_target: liam tag: evening_dog_walk - event: UNotify event_data_template: message_speak: Excellent job with the evening walk! You're amazing! message_display: Evening Walk Complete! πŸ•β€οΈ message: Thanks for walking the dog! Evening walk marked as complete - you're amazing! priority: normal channel: General aiprompt: 'no' message_target: liam tag: walk_acknowledgment - conditions: - condition: trigger id: still_walking sequence: - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: Got it! Walk marked as still in progress. I'll keep monitoring for the return. priority: low channel: General aiprompt: 'no' message_target: parents tag: walk_acknowledgment - id: walk_started_detection alias: Walk Started Detection description: Detect when someone starts a dog walk and clear reminders trigger: - platform: state entity_id: sensor.driveway_analysis to: starting_dog_walk condition: - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.walk_in_progress state: 'off' action: - service: input_boolean.turn_on target: entity_id: input_boolean.walk_in_progress - service: input_datetime.set_datetime target: entity_id: input_datetime.current_walk_started data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message: clear_notification message_target: liam tag: morning_dog_walk - event: UNotify event_data_template: message: clear_notification message_target: liam tag: evening_dog_walk - event: UNotify event_data_template: message_speak: Great! You're taking the dog for a walk - have a wonderful time! message_display: Walk Started! πŸšΆβ€β™‚οΈπŸ• message: Awesome! You're taking the dog for a walk - have a great time together! πŸ•β€οΈ priority: normal channel: General aiprompt: 'no' message_target: liam tag: walk_started - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: Dog walk started at {{ now().strftime('%H:%M') }}. priority: low channel: General aiprompt: 'no' message_target: parents tag: walk_started_status - id: driveway_video_ai_analysis alias: Driveway Video AI Analysis description: Analyze driveway video to detect dog walking activity triggers: - entity_id: input_boolean.driveway_video_ready to: 'on' trigger: state conditions: - condition: state entity_id: input_boolean.ai_detection_enabled state: 'on' - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' actions: - data: task_name: driveway_video_dog_walk_detection instructions: "If one or more people and a dog are observed moving from the\ \ street towards the house (e.g., entering the driveway, walking towards the\ \ front door from the road, or otherwise returning home from a walk), classify\ \ this activity as 'ending_dog_walk'.\nIf one or more people and a dog are\ \ observed moving from the house towards the street (e.g., leaving the front\ \ door, walking down the driveway onto the road, or otherwise departing for\ \ a walk), classify this activity as 'starting_dog_walk'.\nRespond with \"\ starting_dog_walk\" or \"ending_dog_walk\" based on the instructions above.\n\ \n or \n\n - \"dog_and_people\" - if a dog is seen with a person\ \ or people but not\n appearing to be starting or ending a walk\n\n \ \ - \"person_only\" - if only a person is seen\n\n - \"dog_person_separate\"\ \ - if a dog and person are seen in the video but\n not in the same frame.\n\ \n - \"dog_only\" if only a dog is seen \n\n - \"empty\" if no relevant\ \ activity is detected\n\n Focus on clear dog walking activity and direction\ \ of travel. In a\n separate paragraph, explain your reasoning.\n" attachments: - media_content_id: media-source://media_source/local/ai_image_notifications/driveway_dogwalk_capture.mp4 media_content_type: video/mp4 entity_id: ai_task.google_ai_task response_variable: driveway_video_response action: ai_task.generate_data - target: entity_id: input_text.driveway_analysis_result data: value: '{{ (driveway_video_response.data | lower).split('' '')[0].strip() }}' action: input_text.set_value - target: entity_id: input_boolean.driveway_video_ready action: input_boolean.turn_off data: {} mode: single - id: driveway_image_capture alias: Driveway Video Capture description: Capture video when both person and pet motion detected in driveway within 30 seconds, OR when person detected during active walk triggers: - entity_id: binary_sensor.driveway_person to: 'on' id: person_motion trigger: state - entity_id: binary_sensor.driveway_pet to: 'on' id: pet_motion trigger: state conditions: - condition: time after: 06:00:00 before: '22:00:00' - condition: template value_template: '{{ states(''input_text.driveway_camera_entity'') not in [''unknown'', ''''] }} ' actions: - choose: - conditions: - condition: trigger id: person_motion - condition: state state: 'off' entity_id: binary_sensor.driveway_pet sequence: - wait_for_trigger: - entity_id: binary_sensor.driveway_pet to: 'on' trigger: state timeout: hours: 0 minutes: 0 seconds: 15 milliseconds: 0 continue_on_timeout: false - conditions: - condition: trigger id: pet_motion - condition: state state: 'off' entity_id: binary_sensor.driveway_person sequence: - wait_for_trigger: - entity_id: binary_sensor.driveway_person to: 'on' trigger: state timeout: hours: 0 minutes: 0 seconds: 15 milliseconds: 0 continue_on_timeout: false - target: entity_id: input_datetime.last_walk_detection data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' action: input_datetime.set_datetime - target: entity_id: input_boolean.driveway_video_ready action: input_boolean.turn_off data: {} - action: shell_command.ensure_backup_directories continue_on_error: true - action: shell_command.backup_driveway_walk_video continue_on_error: true - delay: 00:00:02 - target: entity_id: '{{ states(''input_text.driveway_camera_entity'') }}' data: duration: 30 filename: /config/www/local/ai_image_notifications/driveway_dogwalk_capture.mp4 lookback: 15 action: camera.record - delay: 00:00:32 - target: entity_id: input_boolean.driveway_video_ready action: input_boolean.turn_on data: {} mode: single - id: evening_dog_walk_reminder alias: Evening Dog Walk Reminder description: Remind to walk dog in the evening (8:30pm-10pm) trigger: - platform: time at: '20:30:00' - platform: time at: '21:00:00' - platform: time at: '21:30:00' condition: - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.notifications_enabled state: 'on' - condition: state entity_id: input_boolean.walk_in_progress state: 'off' - condition: template value_template: '{% set evening_walk = states(''input_datetime.evening_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ evening_walk == ''unknown'' or evening_walk[:10] != today }} ' action: - event: UNotify event_data_template: message_speak: Time for your evening dog walk! Don't forget the leash! message_display: Evening Dog Walk Time πŸ• message: Time for your evening dog walk! It's {{ now().strftime('%H:%M') }} - grab the leash and have a great walk! πŸ• priority: normal channel: General aiprompt: 'no' message_target: liam tag: evening_dog_walk - id: evening_walk_auto_complete alias: Evening Walk Auto Complete description: Automatically mark evening walk as complete when detected (3pm-10pm) trigger: - platform: state entity_id: sensor.driveway_analysis to: ending_dog_walk condition: - condition: time after: '15:00:00' before: '22:00:00' - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' - condition: template value_template: '{% set evening_walk = states(''input_datetime.evening_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ evening_walk == ''unknown'' or evening_walk[:10] != today }} ' action: - service: input_boolean.turn_off target: entity_id: input_boolean.walk_in_progress - action: input_datetime.set_datetime target: entity_id: input_datetime.evening_walk_done data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message: clear_notification message_target: liam tag: evening_dog_walk - event: UNotify event_data_template: message: clear_notification message_target: liam tag: walk_started - event: UNotify event_data_template: message_speak: Excellent job taking the dog for an evening walk! You're amazing! message_display: Evening Walk Complete! πŸŽ‰ message: "Great job taking the dog for their evening walk! You''re amazing!\ \ {% set start_time = states('input_datetime.current_walk_started') %} {%\ \ if start_time != 'unknown' %}\n {% set duration = ((as_timestamp(now())\ \ - as_timestamp(start_time)) / 60) | round(0) %}\n Walk duration: {{ duration\ \ }} minutes.\n{% endif %} \U0001F415❀️\n" priority: normal channel: General aiprompt: 'no' message_target: liam tag: evening_walk_complete - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: "Evening walk completed at {{ now().strftime('%H:%M') }}. {% set start_time\ \ = states('input_datetime.current_walk_started') %} {% if start_time != 'unknown'\ \ %}\n {% set duration = ((as_timestamp(now()) - as_timestamp(start_time))\ \ / 60) | round(0) %}\n Duration: {{ duration }} minutes.\n{% endif %}\n" priority: low channel: General aiprompt: 'no' message_target: parents tag: evening_walk_status - id: trigger_family_room_analysis alias: Trigger Family Room AI Analysis description: Analyze family room tidiness when person motion detected trigger: - platform: state entity_id: binary_sensor.family_room_person_motion to: 'on' - platform: state entity_id: binary_sensor.family_room_person_motion to: 'off' for: minutes: 2 - platform: state entity_id: input_boolean.force_family_room_check to: 'on' condition: - condition: state entity_id: input_boolean.ai_detection_enabled state: 'on' - condition: state entity_id: input_boolean.family_room_monitoring_enabled state: 'on' - condition: template value_template: '{{ states(''input_text.family_room_camera_entity'') not in [''unknown'', ''''] }} ' - condition: template value_template: '{{ states(''input_text.ai_task_entity'') not in [''unknown'', ''unavailable'', ''''] }} ' - condition: or conditions: - condition: state entity_id: input_boolean.force_family_room_check state: 'on' - condition: template value_template: "{% set last_check = states('input_datetime.family_room_last_check')\ \ %} {% if last_check == 'unknown' %}\n true\n{% else %}\n {{ (as_timestamp(now())\ \ - as_timestamp(last_check)) > 300 }}\n{% endif %}\n" action: - service: input_datetime.set_datetime target: entity_id: input_datetime.family_room_last_check data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - service: camera.snapshot target: entity_id: '{{ states(''input_text.family_room_camera_entity'') }}' data: filename: /config/www/local/ai_image_notifications/family_room_snapshot.jpg - service: camera.snapshot target: entity_id: '{{ states(''input_text.kitchen_camera_entity'') }}' data: filename: /config/www/local/ai_image_notifications/family_room_kitchen_view_snapshot.jpg - service: ai_task.generate_data data: task_name: family_room_tidiness_analysis instructions: 'Analyze these family room/living room images. Focus ONLY on practical safety and cleanliness. Rate tidiness 0-100. If below {{ states(''input_number.family_room_cleanliness_threshold'') }}, respond "needs_tidying" and list issues. If above, respond "tidy". Analysis of the family_room_kitchen_view_snapshot.jpg should exclude anything that is the kitchen. The family room is to the top left of the image, near the couch. If you see dirty dishes on the desk area between the kitchen and the family room, call that out too, but ignore the general clutter. ONLY flag these issues: - Food/drinks left out (especially if sticky/messy) - Dishes with food residue - Items on the floor (tripping hazard) - Spills that need cleaning IGNORE: blankets on chairs, remotes on tables, books/papers, decorative items, stuffed animals on furniture, charging cables ' attachments: - media_content_id: media-source://media_source/local/ai_image_notifications/family_room_snapshot.jpg media_content_type: image/jpeg - media_content_id: media-source://media_source/local/ai_image_notifications/family_room_kitchen_view_snapshot.jpg media_content_type: image/jpeg entity_id: ai_task.google_ai_task response_variable: family_room_ai_response - service: variable.update_sensor data: value: "{% set response = family_room_ai_response.data | lower %} {% if 'needs_tidying'\ \ in response %}\n needs_tidying\n{% elif 'tidy' in response %}\n tidy \ \ \n{% else %}\n unknown\n{% endif %}\n" attributes: timestamp: '{{ now() }}' tasks: "{% set response = family_room_ai_response.data %} {% set ns = namespace(filtered=[])\ \ %} {% for line in response.split('\\n') %}\n {% if not ('needs_tidying'\ \ in line.lower() or 'tidy' in line.lower()) %}\n {% set ns.filtered\ \ = ns.filtered + [line] %}\n {% endif %}\n{% endfor %} {{ ns.filtered\ \ | join('\\n') | trim }}\n" replace_attributes: true target: entity_id: sensor.family_room_tidy_status - service: input_boolean.turn_off target: entity_id: input_boolean.force_family_room_check - id: family_room_tidying_notification alias: Family Room Tidying Notification description: Send notifications when family room needs tidying trigger: - platform: state entity_id: sensor.family_room_analysis to: needs_tidying condition: - condition: state entity_id: input_boolean.family_room_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.notifications_enabled state: 'on' - condition: template value_template: "{% set last_notification = states('input_datetime.last_family_room_notification')\ \ %} {% if last_notification == 'unknown' %}\n true\n{% else %}\n {{ (as_timestamp(now())\ \ - as_timestamp(last_notification)) / 60 > states('input_number.notification_cooldown')\ \ | int }}\n{% endif %}\n" action: - action: input_datetime.set_datetime target: entity_id: input_datetime.last_family_room_notification data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message_speak: Hey Liam, the family room could use some tidying when you have a chance message_display: Family Room Needs Tidying πŸ›‹οΈ message: When you get a chance, {{ state_attr('sensor.family_room_analysis', 'specific_tasks') | default('please tidy up the family room') | lower }}. priority: normal channel: General aiprompt: 'no' message_target: liam tag: family_room_tidy - id: family_room_tidied_acknowledgment alias: Family Room Tidied Acknowledgment description: Acknowledge when family room has been tidied trigger: - platform: state entity_id: sensor.family_room_analysis from: needs_tidying to: tidy condition: - condition: state entity_id: input_boolean.notifications_enabled state: 'on' action: - event: UNotify event_data_template: message: clear_notification message_target: liam tag: family_room_tidy - event: UNotify event_data_template: message_speak: Fantastic job tidying the family room! You're doing amazing! message_display: Family Room Tidy! ✨ message: Thanks for tidying up the family room! It looks great - you're amazing! 🌟 priority: normal channel: General aiprompt: 'no' message_target: liam tag: family_room_tidied - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: Family room tidied at {{ now().strftime('%H:%M') }} - excellent work! priority: low channel: General aiprompt: 'no' message_target: parents tag: family_room_status - id: family_room_tidy_notification alias: Family Room Tidy Notification description: Send notifications when family room is analyzed as tidy trigger: - platform: state entity_id: sensor.family_room_analysis to: tidy condition: - condition: state entity_id: input_boolean.family_room_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.notifications_enabled state: 'on' - condition: template value_template: '{% set from_state = trigger.from_state.state if trigger.from_state else ''unknown'' %} {{ from_state in [''unknown'', ''unavailable'', none] }} ' action: - service: notify.parents data: title: Family Room Looking Good! ✨ message: The family room is nice and tidy. Great job keeping it organized! data: tag: family_room_good - id: trigger_kitchen_analysis alias: Trigger Kitchen AI Analysis description: Analyze kitchen cleanliness when person motion detected trigger: - platform: state entity_id: binary_sensor.kitchen_person_motion to: 'on' - platform: state entity_id: binary_sensor.kitchen_person_motion to: 'off' for: minutes: 2 - platform: state entity_id: input_boolean.force_kitchen_check to: 'on' condition: - condition: state entity_id: input_boolean.ai_detection_enabled state: 'on' - condition: state entity_id: input_boolean.kitchen_monitoring_enabled state: 'on' - condition: template value_template: '{{ states(''input_text.kitchen_camera_entity'') not in [''unknown'', ''''] }} ' - condition: template value_template: '{{ states(''input_text.ai_task_entity'') not in [''unknown'', ''unavailable'', ''''] }} ' - condition: or conditions: - condition: state entity_id: input_boolean.force_kitchen_check state: 'on' - condition: template value_template: "{% set last_check = states('input_datetime.kitchen_last_check')\ \ %} {% if last_check == 'unknown' %}\n true\n{% else %}\n {{ (as_timestamp(now())\ \ - as_timestamp(last_check)) > 300 }}\n{% endif %}\n" action: - service: input_datetime.set_datetime target: entity_id: input_datetime.kitchen_last_check data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - service: camera.snapshot target: entity_id: '{{ states(''input_text.kitchen_camera_entity'') }}' data: filename: /config/www/local/ai_image_notifications/kitchen_snapshot.jpg - service: ai_task.generate_data data: task_name: kitchen_cleanliness_analysis instructions: 'Analyze this kitchen image for food safety and basic cleanliness. Focus on: 1. Food items left out on counters (especially perishable items) 2. Dirty dishes in sink or on counters 3. Spills or messes that could attract pests 4. General tidiness that affects food preparation safety Categorize as: - "clean" if kitchen is suitable for food preparation - "needs_attention" if there are minor issues (few dishes, small spills) - "needs_cleaning" if there are food safety concerns (food left out, many dirty dishes, significant mess) Be family-friendly and focus on health/safety rather than perfection. Respond with just the category, then provide 2-3 specific helpful suggestions. ' attachments: - media_content_id: media-source://media_source/local/ai_image_notifications/kitchen_snapshot.jpg media_content_type: image/jpeg entity_id: ai_task.google_ai_task response_variable: kitchen_ai_response - service: variable.update_sensor data: value: "{% if 'needs_cleaning' in kitchen_ai_response.data | lower %}\n needs_cleaning\n\ {% elif 'needs_attention' in kitchen_ai_response.data | lower %}\n needs_attention\n\ {% elif 'clean' in kitchen_ai_response.data | lower %}\n clean\n{% else %}\n\ \ unknown\n{% endif %}\n" attributes: timestamp: '{{ now() }}' tasks: "{% set response = kitchen_ai_response.data %} {% set ns = namespace(filtered=[])\ \ %} {% for line in response.split('\\n') %}\n {% if not ('needs_cleaning'\ \ in line.lower() or 'needs_attention' in line.lower() or 'clean' in line.lower())\ \ %}\n {% set ns.filtered = ns.filtered + [line] %}\n {% endif %}\n\ {% endfor %} {{ ns.filtered | join('\\n') | trim }}\n" replace_attributes: true target: entity_id: sensor.kitchen_clean_status - service: input_boolean.turn_off target: entity_id: input_boolean.force_kitchen_check - id: kitchen_cleaned_acknowledgment alias: Kitchen Cleaned Acknowledgment description: Acknowledge when kitchen has been cleaned trigger: - platform: state entity_id: sensor.kitchen_analysis from: needs_cleaning to: clean condition: - condition: state entity_id: input_boolean.notifications_enabled state: 'on' action: - event: UNotify event_data_template: message: clear_notification message_target: liam tag: kitchen_cleanup - event: UNotify event_data_template: message_speak: Awesome job cleaning the kitchen! You're doing great! message_display: Kitchen Clean! ✨ message: Great job cleaning up the kitchen! It looks fantastic - you're awesome! 🌟 priority: normal channel: General aiprompt: 'no' message_target: liam tag: kitchen_cleaned - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: Kitchen cleaned at {{ now().strftime('%H:%M') }} - great work! priority: low channel: General aiprompt: 'no' message_target: parents tag: kitchen_status - id: kitchen_cleanup_notification alias: Kitchen Cleanup Notification description: Send notifications when kitchen needs cleaning trigger: - platform: state entity_id: sensor.kitchen_analysis to: needs_cleaning condition: - condition: state entity_id: input_boolean.kitchen_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.notifications_enabled state: 'on' - condition: template value_template: "{% set last_notification = states('input_datetime.last_kitchen_notification')\ \ %} {% if last_notification == 'unknown' %}\n true\n{% else %}\n {{ (as_timestamp(now())\ \ - as_timestamp(last_notification)) / 60 > states('input_number.notification_cooldown')\ \ | int }}\n{% endif %}\n" action: - action: input_datetime.set_datetime target: entity_id: input_datetime.last_kitchen_notification data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message_speak: '{% if states(''input_text.notification_target'') == ''liam'' %} Hey Liam, the kitchen needs some attention when you have a moment {% else %} no {% endif %} ' message_display: '{% if states(''input_text.notification_target'') == ''liam'' %} Kitchen Needs Cleaning 🍽️ {% else %} no {% endif %} ' message: Hey, when you're done in the kitchen, {{ state_attr('sensor.kitchen_analysis', 'specific_tasks') | default('please tidy up a bit') | lower }}. priority: normal channel: General aiprompt: 'no' message_target: '{{ states(''input_text.notification_target'') }}' tag: kitchen_cleanup - id: morning_dog_walk_reminder alias: Morning Dog Walk Reminder description: Remind to walk dog in the morning/afternoon (12pm-3pm) trigger: - platform: time at: '12:00:00' - platform: time at: '12:30:00' - platform: time at: '13:00:00' condition: - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.notifications_enabled state: 'on' - condition: state entity_id: input_boolean.walk_in_progress state: 'off' - condition: template value_template: '{% set morning_walk = states(''input_datetime.morning_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ morning_walk == ''unknown'' or morning_walk[:10] != today }} ' action: - event: UNotify event_data_template: message_speak: Time for your morning dog walk! Don't forget the leash! message_display: Morning Dog Walk Time πŸ• message: Time for your morning dog walk! It's {{ now().strftime('%H:%M') }} - grab the leash and have a great walk! πŸ• priority: normal channel: General aiprompt: 'no' message_target: liam tag: morning_dog_walk - id: morning_walk_auto_complete alias: Morning Walk Auto Complete description: Automatically mark morning walk as complete when detected (6am-3pm) trigger: - platform: state entity_id: sensor.driveway_analysis to: ending_dog_walk condition: - condition: time after: 06:00:00 before: '15:00:00' - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' - condition: template value_template: '{% set morning_walk = states(''input_datetime.morning_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ morning_walk == ''unknown'' or morning_walk[:10] != today }} ' action: - service: input_boolean.turn_off target: entity_id: input_boolean.walk_in_progress - action: input_datetime.set_datetime target: entity_id: input_datetime.morning_walk_done data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message: clear_notification message_target: liam tag: morning_dog_walk - event: UNotify event_data_template: message: clear_notification message_target: liam tag: walk_started - event: UNotify event_data_template: message_speak: Awesome job taking the dog for a morning walk! You're the best! message_display: Morning Walk Complete! πŸŽ‰ message: "Great job taking the dog for their morning walk! You''re awesome!\ \ {% set start_time = states('input_datetime.current_walk_started') %} {%\ \ if start_time != 'unknown' %}\n {% set duration = ((as_timestamp(now())\ \ - as_timestamp(start_time)) / 60) | round(0) %}\n Walk duration: {{ duration\ \ }} minutes.\n{% endif %} \U0001F415❀️\n" priority: normal channel: General aiprompt: 'no' message_target: liam tag: morning_walk_complete - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: "Morning walk completed at {{ now().strftime('%H:%M') }}. {% set start_time\ \ = states('input_datetime.current_walk_started') %} {% if start_time != 'unknown'\ \ %}\n {% set duration = ((as_timestamp(now()) - as_timestamp(start_time))\ \ / 60) | round(0) %}\n Duration: {{ duration }} minutes.\n{% endif %}\n" priority: low channel: General aiprompt: 'no' message_target: parents tag: morning_walk_status - id: unclear_walk_return_notification alias: Unclear Walk Return Notification description: Notify user when walk return analysis is unclear during active walk trigger: - platform: state entity_id: sensor.driveway_analysis to: unclear condition: - condition: state entity_id: input_boolean.walk_in_progress state: 'on' - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' action: - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: Someone returned to the driveway during the walk, but I couldn't clearly see if the dog was with them due to lighting or positioning. Did the walk just finish? priority: normal channel: General aiprompt: 'no' message_target: parents tag: unclear_walk_return actions: - action: confirm_walk_complete title: Yes, Walk Complete βœ… - action: walk_still_ongoing title: No, Still Walking πŸšΆβ€β™‚οΈ - id: handle_unclear_walk_response alias: Handle Unclear Walk Response description: Process user's response to unclear walk return notification trigger: - platform: event event_type: mobile_app_notification_action event_data: action: confirm_walk_complete id: walk_complete - platform: event event_type: mobile_app_notification_action event_data: action: walk_still_ongoing id: still_walking condition: - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' action: - event: UNotify event_data_template: message: clear_notification message_target: parents tag: unclear_walk_return - choose: - conditions: - condition: trigger id: walk_complete sequence: - service: input_boolean.turn_off target: entity_id: input_boolean.walk_in_progress - choose: - conditions: - condition: time after: 06:00:00 before: '15:00:00' sequence: - condition: template value_template: '{% set morning_walk = states(''input_datetime.morning_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ morning_walk == ''unknown'' or morning_walk[:10] != today }} ' - action: input_datetime.set_datetime target: entity_id: input_datetime.morning_walk_done data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message: clear_notification message_target: liam tag: morning_dog_walk - event: UNotify event_data_template: message_speak: Awesome job with the morning walk! You're the best! message_display: Morning Walk Complete! πŸ•β€οΈ message: Thanks for walking the dog! Morning walk marked as complete - you're amazing! priority: normal channel: General aiprompt: 'no' message_target: liam tag: walk_acknowledgment - conditions: - condition: time after: '15:00:00' before: '22:00:00' sequence: - condition: template value_template: '{% set evening_walk = states(''input_datetime.evening_walk_done'') %} {% set today = now().strftime(''%Y-%m-%d'') %} {{ evening_walk == ''unknown'' or evening_walk[:10] != today }} ' - action: input_datetime.set_datetime target: entity_id: input_datetime.evening_walk_done data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message: clear_notification message_target: liam tag: evening_dog_walk - event: UNotify event_data_template: message_speak: Excellent job with the evening walk! You're amazing! message_display: Evening Walk Complete! πŸ•β€οΈ message: Thanks for walking the dog! Evening walk marked as complete - you're amazing! priority: normal channel: General aiprompt: 'no' message_target: liam tag: walk_acknowledgment - conditions: - condition: trigger id: still_walking sequence: - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: Got it! Walk marked as still in progress. I'll keep monitoring for the return. priority: low channel: General aiprompt: 'no' message_target: parents tag: walk_acknowledgment - id: walk_started_detection alias: Walk Started Detection description: Detect when someone starts a dog walk and clear reminders trigger: - platform: state entity_id: sensor.driveway_analysis to: starting_dog_walk condition: - condition: state entity_id: input_boolean.dog_walk_monitoring_enabled state: 'on' - condition: state entity_id: input_boolean.walk_in_progress state: 'off' action: - service: input_boolean.turn_on target: entity_id: input_boolean.walk_in_progress - service: input_datetime.set_datetime target: entity_id: input_datetime.current_walk_started data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - event: UNotify event_data_template: message: clear_notification message_target: liam tag: morning_dog_walk - event: UNotify event_data_template: message: clear_notification message_target: liam tag: evening_dog_walk - event: UNotify event_data_template: message_speak: Great! You're taking the dog for a walk - have a wonderful time! message_display: Walk Started! πŸšΆβ€β™‚οΈπŸ• message: Awesome! You're taking the dog for a walk - have a great time together! πŸ•β€οΈ priority: normal channel: General aiprompt: 'no' message_target: liam tag: walk_started - event: UNotify event_data_template: message_speak: 'no' message_display: 'no' message: Dog walk started at {{ now().strftime('%H:%M') }}. priority: low channel: General aiprompt: 'no' message_target: parents tag: walk_started_status