- id: '1608298913447' alias: Zone Notification description: '' use_blueprint: path: homeassistant/notify_leaving_zone.yaml input: person_entity: person.jon zone_entity: zone.home notify_device: a9570941d9dcebbd74ecb611f829a0f2 - id: '1655124375247' alias: Kodi Test description: '' trigger: - platform: device device_id: 7000b71050bd8b00ed5ae05567e931c5 domain: kodi entity_id: media_player.kodi type: turn_on condition: [] action: - service: scene.turn_on target: entity_id: scene.lutron_dark metadata: {} mode: single - id: '1737827992080' alias: New automation description: '' triggers: - trigger: conversation command: testing conditions: [] actions: - action: assist_satellite.announce metadata: {} data: message: Test is successful! target: entity_id: assist_satellite.home_assistant_voice_office_assist_satellite mode: single - alias: Transition To Sleep Mode id: transition_to_sleep_mode triggers: - trigger: time at: '20:00:00' conditions: - condition: state entity_id: sensor.harmony_hub state: PowerOff - condition: state entity_id: input_boolean.extended_away_mode state: 'off' - condition: state entity_id: binary_sensor.penthouse_occupied state: 'off' actions: - action: script.set_thermostat_preset data: thermostat_entity: climate.upstairs preset: sleep - alias: Get Downstairs Thermostat Temps id: get_downstairs_thermostat_temps use_blueprint: path: climate/get_thermostat_temps.yaml input: climate_entity: climate.downstairs - alias: Get Upstairs Thermostat Temps id: get_upstairs_thermostat_temps use_blueprint: path: climate/get_thermostat_temps.yaml input: climate_entity: climate.upstairs - alias: Set Minimum Attic Temperature id: set_minimum_attic_temperature use_blueprint: path: climate/temp_extremes.yaml input: sensor_entity: sensor.attic_temp_min result_entity: input_number.min_attic_temp type: Min - alias: Set Maximum Attic Temperature id: set_maximum_attic_temperature use_blueprint: path: climate/temp_extremes.yaml input: sensor_entity: sensor.attic_temp_max result_entity: input_number.max_attic_temp type: Max - alias: Set Minimum Garage Temperature id: set_minimum_garage_temperature use_blueprint: path: climate/temp_extremes.yaml input: sensor_entity: sensor.garage_temp_min result_entity: input_number.min_garage_temp type: Min - alias: Set Maximum Garage Temperature id: set_maximum_garage_temperature use_blueprint: path: climate/temp_extremes.yaml input: sensor_entity: sensor.garage_temp_max result_entity: input_number.max_garage_temp type: Max - alias: Set Minimum Outdoor Temperature id: set_minimum_outdoor_temperature use_blueprint: path: climate/temp_extremes.yaml input: sensor_entity: sensor.porch_temp_min result_entity: input_number.min_outdoor_temp type: Min - alias: Set Maximum Outdoor Temperature id: set_maximum_outdoor_temperature use_blueprint: path: climate/temp_extremes.yaml input: sensor_entity: sensor.porch_temp_max result_entity: input_number.max_outdoor_temp type: Max - alias: Turn Off Downstairs HVAC id: turn_off_downstairs_hvac trigger: - platform: state entity_id: binary_sensor.downstairs_doors_windows from: 'off' to: 'on' for: 00:02:00 action: - service: climate.turn_off target: entity_id: climate.downstairs - alias: Turn On Downstairs HVAC id: turn_on_downstairs_hvac trigger: - platform: state entity_id: binary_sensor.downstairs_doors_windows from: 'on' to: 'off' condition: - condition: state entity_id: climate.downstairs state: 'off' action: - service: climate.turn_on target: entity_id: climate.downstairs - alias: Calculate Astronomical Condition id: calculate_astronomical_condition triggers: - trigger: sun event: sunset actions: - variables: first_hour: '{{ as_local(as_datetime(states(''sensor.astroweather_white_rabbit_gardens_sun_next_setting_astronomical''))).hour }}' - action: script.calculate_weather_metrics data: weather_entity: weather.astroweather_white_rabbit_gardens forecast_type: hourly first_hour: '{{ first_hour }}' last_hour: 23 metrics_list: - - input_number.average_astro_condition - condition - 50 - 0 - - input_number.average_astro_cloudless_percentage - cloudless_percentage - 50 - 0 - - input_number.average_astro_seeing_percentage - seeing_percentage - 50 - 0 - - input_number.average_astro_transparency_percentage - transparency_percentage - 50 - 0 - alias: Check Freezing Temperature id: check_freezing_temperature triggers: - trigger: numeric_state entity_id: - sensor.openweathermap_temperature - sensor.porch_sensor_temperature below: 30 id: awake - trigger: state entity_id: input_boolean.nighttime from: 'off' to: 'on' id: asleep conditions: '{{ is_state(''input_boolean.nighttime'', ''off'') or trigger.id == ''asleep'' }}' actions: - variables: next_hour: '{% set curr_hour = as_local(as_datetime(now())).hour %} {% set curr_minute = as_local(as_datetime(now())).minute %} {{ iif(curr_minute <= 55, curr_hour + 1, curr_hour + 2) }} ' last_hour: '{{ iif(trigger.id == ''awake'', 0, 12) }}' - action: script.calculate_weather_metrics data: weather_entity: weather.openweathermap forecast_type: hourly first_hour: '{{ next_hour }}' last_hour: '{{ last_hour }}' metrics_list: - - input_number.minimum_outdoor_temperature - temperature - 33 - 120 - if: - condition: numeric_state entity_id: input_number.minimum_outdoor_temperature below: 25 then: - action: input_boolean.turn_on target: entity_id: input_boolean.freezing_temperature - alias: Reset Freezing Temperature id: reset_freezing_temperature triggers: - trigger: numeric_state entity_id: - sensor.openweathermap_temperature - sensor.porch_sensor_temperature above: 33 actions: - action: input_boolean.turn_off target: entity_id: input_boolean.freezing_temperature - alias: Check Salt System Low Temperature id: check_salt_system_low_temperature triggers: - trigger: time at: 06:00:00 actions: - action: input_boolean.turn_off target: entity_id: input_boolean.salt_system_low_temperature - action: script.calculate_weather_metrics data: weather_entity: weather.openweathermap forecast_type: daily num_days: 3 metrics_list: - - input_number.minimum_daily_temperature - templow - 60 - 100 - - input_number.maximum_daily_temperature - temperature - 60 - 0 - if: - condition: numeric_state entity_id: - input_number.minimum_daily_temperature - input_number.maximum_daily_temperature below: 55 then: - action: input_boolean.turn_on target: entity_id: input_boolean.salt_system_low_temperature - alias: Handle Device Initialization Catch 22 id: handle_device_initialization_catch_22 trigger: - platform: homeassistant event: start action: - service: input_boolean.turn_on entity_id: input_boolean.device_initialization_catch_22 - delay: 00:01:30 - service: input_boolean.turn_off entity_id: input_boolean.device_initialization_catch_22 - alias: Handle Power Outage id: handle_power_outage trigger: - platform: state entity_id: sensor.cyber1_status_data to: OB DISCHRG for: 00:01:00 - platform: homeassistant event: start condition: - condition: state entity_id: sensor.cyber1_status_data state: OB DISCHRG action: - delay: seconds: '{{ range(2, 15) | random }}' - variables: tag: power_out title: 'Warning:' message: Power is out, shutting down PC. channel: critical tag_registry_value: '{{ {''tag'': tag, ''clear_type'': ''auto'', ''title'': title, ''message'': message, ''channel'': channel, ''timeout'': 0} }}' notification_data: '{{ {''destination'': [''mobile''], ''title'': title, ''message'': message, ''channel'': channel, ''timeout'': 0, ''tag'': tag} }}' - action: input_datetime.set_datetime target: entity_id: input_datetime.ups_power_out data_template: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - action: script.register_mobile_notification data: '{{ tag_registry_value }}' - action: script.send_notification data: '{{ notification_data }}' - action: recorder.disable - action: script.turn_off_pc - if: - condition: state entity_id: timer.vacuum state: idle then: - action: vacuum.stop entity_id: vacuum.ecovacs_deebot_none - alias: Handle UPS Critical id: handle_ups_critical trigger: - platform: numeric_state entity_id: sensor.cyber1_battery_runtime below: 420 - platform: homeassistant event: start condition: - condition: numeric_state entity_id: sensor.cyber1_battery_runtime below: 420 action: - delay: seconds: '{{ range(2, 15) | random }}' - variables: tag: ups_battery title: 'Warning:' message: UPS battery is critical, shutting down RPi. channel: critical tag_registry_value: '{{ {''tag'': tag, ''clear_type'': ''auto'', ''title'': title, ''message'': message, ''channel'': channel, ''timeout'': 0} }}' notification_data: '{{ {''destination'': [''mobile''], ''title'': title, ''message'': message, ''channel'': channel, ''timeout'': 0, ''tag'': tag} }}' - action: input_datetime.set_datetime target: entity_id: input_datetime.ups_battery_critical data_template: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - action: script.register_mobile_notification data: '{{ tag_registry_value }}' - action: script.send_notification data: '{{ notification_data }}' - delay: 3 - action: hassio.host_shutdown - alias: Handle Power Restoration id: handle_power_restoration trigger: - platform: state entity_id: sensor.cyber1_status_data to: OL CHRG for: 00:02:00 - platform: homeassistant event: start condition: - condition: state entity_id: sensor.cyber1_status_data state: OL CHRG action: - delay: seconds: '{{ range(2, 15) | random }}' - variables: tag: power_restored title: 'Attention:' message: "{% set var = namespace(outage = '', critical = '') %} {% set prefix\ \ = 'Power is restored, turning on the PC (' %} {% set keys = state_attr('sensor.mobile_tag_registry_keys',\ \ 'tags') %} {% set var.outage = 'outage: ' ~ state_attr('input_datetime.ups_power_out',\ \ 'timestamp') | timestamp_custom %} {% if 'ups_battery' in keys %}\n {%\ \ set var.critical = ', critical: ' ~ state_attr('input_datetime.ups_battery_critical',\ \ 'timestamp') | timestamp_custom %}\n{% endif %}\n{{ prefix ~ var.outage\ \ ~ var.critical ~ ')' }}\n" channel: standard tag_registry_value: '{{ {''tag'': tag, ''clear_type'': ''manual'', ''title'': title, ''message'': message, ''channel'': channel, ''timeout'': 0} }}' notification_data: '{{ {''destination'': [''mobile''], ''title'': title, ''message'': message, ''channel'': channel, ''timeout'': 0, ''tag'': tag} }}' - action: script.register_mobile_notification data: '{{ tag_registry_value }}' - action: script.send_notification data: '{{ notification_data }}' - action: script.remove_mobile_notification data: tag: power_out - action: script.remove_mobile_notification data: tag: ups_battery - action: wake_on_lan.send_magic_packet data: mac: 98-EE-CB-A6-80-EA - delay: 00:02:00 - action: recorder.enable - action: vacuum.return_to_base entity_id: vacuum.ecovacs_deebot_none - action: input_boolean.turn_off entity_id: input_boolean.theater_open - action: remote.turn_off entity_id: remote.harmony_hub - alias: Reboot NUT Service id: reboot_nut_service trigger: - platform: state entity_id: sensor.cyber1_status to: unavailable - platform: homeassistant event: start condition: - condition: state entity_id: sensor.cyber1_status state: unavailable action: - delay: seconds: '{{ range(2, 15) | random }}' - service: shell_command.reboot_nut_service - alias: Open House id: open_house triggers: - trigger: state entity_id: person.jon from: not_home to: home for: 00:00:05 actions: - action: script.turn_on target: entity_id: script.open_garage_door_north data: variables: use_info_message: false - action: script.turn_off_extended_away_mode - if: - '{{ states(''sensor.downstairs_sensor_ambient_light'') | float(0) < states(''input_number.family_room_ambient_min'') | float(0) }}' then: - action: light.turn_on target: entity_id: - light.office_lamp - light.driveway - light.front_floodlight - if: - condition: state entity_id: input_boolean.christmas_mode state: 'off' then: - action: light.turn_on target: entity_id: - light.family_room_lamp - light.hallway_lamp else: - action: script.turn_on_christmas_lights data: variables: additional_lights: daytime - if: - condition: state entity_id: person.skylar state: home then: - action: script.operate_preferred_studio_lamps data: operation: 'on' - alias: Close House id: close_house mode: queued triggers: - trigger: state entity_id: person.jon from: home to: not_home for: 00:00:05 id: jon_left - trigger: state entity_id: sun.sun from: above_horizon to: below_horizon id: sunset - trigger: homeassistant event: start id: start conditions: - or: - condition: state entity_id: person.jon state: not_home - condition: state entity_id: sun.sun state: below_horizon actions: - delay: seconds: '{{ range(2, 15) | random }}' - action: script.turn_on target: entity_id: script.close_garage_door_north data: variables: use_info_message: true - action: script.turn_on target: entity_id: script.close_garage_door_south data: variables: use_info_message: true - if: - '{{ trigger.id != ''sunset'' and not is_state(''person.jon'', ''home'') }}' then: - action: script.turn_on entity_id: script.lock_pc - if: - '{{ is_state(''binary_sensor.adults_home'', ''off'') }}' then: - action: scene.turn_on target: entity_id: - scene.lights_out - scene.fans_off_downstairs - scene.fans_off_upstairs - action: script.turn_off_fan_lights data: light_entity: '{{ expand(state_attr(''light.ceiling_fan_lights'', ''entity_id'')) | map(attribute = ''entity_id'') | list }}' - if: - '{{ trigger.id != ''jon_left'' and states(''sun.sun'') == ''below_horizon'' }}' then: - action: light.turn_off target: entity_id: - light.storage_lights - light.outdoor_lights - alias: Handle Guest Arrival Cleanup id: handle_guest_arrival_cleanup trigger: - platform: event event_type: timer.finished event_data: entity_id: timer.guest_arrival_cleanup action: - service: script.turn_on target: entity_id: script.close_garage_door_north data: variables: use_info_message: true - action: light.turn_off target: entity_id: - light.driveway - light.front_floodlight - alias: Enable Family Room AV id: enable_family_room_av triggers: - trigger: time at: 07:00:00 id: morning - trigger: time at: '16:00:00' id: afternoon conditions: - or: - and: - condition: state entity_id: binary_sensor.children_home state: 'on' - condition: trigger id: morning - condition: trigger id: afternoon actions: - condition: state entity_id: input_boolean.extended_away_mode state: 'off' - action: script.enable_family_room_av - alias: Toggle Office occupied id: toggle_office_occupied triggers: - trigger: state entity_id: binary_sensor.office_human_sensor_presence from: 'off' to: 'on' for: 00:02:00 id: 'on' - trigger: state entity_id: binary_sensor.office_human_sensor_presence from: 'on' to: 'off' for: 00:15:00 id: 'off' actions: - action: input_boolean.turn_{{ trigger.id }} target: entity_id: input_boolean.office_occupied - alias: Operate Office Fan id: operate_office_fan use_blueprint: path: devices/operate_ceiling_fans.yaml input: sensor_entity: input_boolean.office_occupied sensor_off_state: 'off' temperature_entity: sensor.office_sensor_temperature fan_entity: fan.office_fan thresholds: - 80 - 78 - 76 - alias: Operate Family Room Fan id: operate_family_room_fan use_blueprint: path: devices/operate_ceiling_fans.yaml input: sensor_entity: binary_sensor.family_room_av_system sensor_off_state: 'off' temperature_entity: sensor.main_floor_temperature fan_entity: fan.family_room_fan thresholds: - 80 - 78.5 - 74 - alias: Operate Theater Fan id: operate_theater_fan use_blueprint: path: devices/operate_ceiling_fans.yaml input: sensor_entity: sensor.harmony_hub sensor_off_state: PowerOff temperature_entity: sensor.theater_temperature fan_entity: fan.theater_fan thresholds: - 78 - 76 - 74 - alias: Turn Off Penthouse Fan id: turn_off_penthouse_fan trigger: - platform: state entity_id: switch.penthouse_fan from: 'off' to: 'on' for: 00:40:00 action: - service: switch.turn_off entity_id: switch.penthouse_fan - alias: Start Treadmill id: start_treadmill trigger: - platform: numeric_state entity_id: sensor.treadmill_current_consumption above: 200 condition: - condition: state entity_id: input_boolean.treadmill_triggered state: 'off' action: - service: input_datetime.set_datetime target: entity_id: input_datetime.treadmill_start data_template: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - service: input_boolean.turn_on target: entity_id: input_boolean.treadmill_triggered - alias: Detect Treadmill Power Unavailable id: detect_treadmill_power_unavailable trigger: - platform: state entity_id: sensor.treadmill_current_consumption to: unavailable condition: - condition: state entity_id: input_boolean.treadmill_triggered state: 'on' action: - variables: minutes_since_start: '{% from ''utilities.jinja'' import calc_time_diff %} {{ calc_time_diff(''input_datetime.treadmill_start'') | int(0) }} ' default_minutes: '{{ states(''input_number.default_treadmill_minutes'') | int(0) }}' offset_minutes: 2 - if: - '{{ minutes_since_start <= (default_minutes - offset_minutes) }}' then: - service: timer.start data: entity_id: timer.treadmill_power duration: '{{ (default_minutes - minutes_since_start) * 60 }}' else: - service: automation.trigger data: entity_id: automation.stop_treadmill skip_condition: false - alias: Detect Treadmill Power Available id: detect_treadmill_power_available trigger: - platform: state entity_id: sensor.treadmill_current_consumption from: unavailable action: - if: - condition: state entity_id: input_boolean.treadmill_triggered state: 'on' then: - if: - condition: state entity_id: timer.treadmill_power state: active then: - service: timer.cancel entity_id: timer.treadmill_power else: - service: switch.turn_off target: entity_id: switch.treadmill - alias: Handle Treadmill Power Timer id: handle_treadmill_power_timer trigger: - platform: event event_type: timer.finished event_data: entity_id: timer.treadmill_power action: - service: automation.trigger data: entity_id: automation.stop_treadmill skip_condition: false - alias: Stop Treadmill id: stop_treadmill triggers: - trigger: numeric_state entity_id: sensor.treadmill_current_consumption below: 7 conditions: - condition: state entity_id: input_boolean.treadmill_triggered state: 'on' actions: - action: input_boolean.turn_off target: entity_id: input_boolean.treadmill_triggered - action: switch.turn_off target: entity_id: switch.treadmill - action: input_number.set_value target: entity_id: input_number.treadmill_daily_time data: value: '{% set start = as_timestamp(strptime(states(''input_datetime.treadmill_start''), ''%Y-%m-%d %H:%M:%S'')) %} {% set num = (now().timestamp() - start) // 60 %} {% set minutes = (num - (num % 5)) %} {{ minutes }} ' - variables: daily_calories: "{% set weight = states('sensor.smart_scale_p1_weight') | float(0)\ \ %} {% set speed = states('input_number.treadmill_speed') | float(0) %}\ \ {% set incline = states('input_number.treadmill_incline') | int(0) %} {%\ \ set time = states('input_number.treadmill_daily_time') | int(0) / 60\ \ %} {% set ctime = 1/60 %} {% set kph = speed * 1.609344 %} {% set\ \ ckph = 2.0 * 1.609344 %} {% set wkg = weight * 0.45359237 %} {%\ \ if states('input_number.treadmill_incline') | int(0) == 0 %}\n {% set cooldown\ \ = (((ckph**3 * 0.0215) - (ckph**2 * 0.1765) + (ckph * 0.8710) + 1.4577)\ \ * wkg * ctime) | int(0) %}\n {{ cooldown + (( (kph**3 * 0.0215) - \ \ (kph**2 * 0.1765) + (kph * 0.8710) + 1.4577) * wkg * time) | int(0) }}\n\ {% elif states('input_number.treadmill_incline') | int(0) == 1 %}\n {% set\ \ cooldown = (((ckph**3 * 0.0171) - (ckph**2 * 0.1062) + (ckph * 0.6080) +\ \ 1.8600) * wkg * ctime) | int(0) %}\n {{ cooldown + (( (kph**3 * 0.0171)\ \ - (kph**2 * 0.1062) + (kph * 0.6080) + 1.8600) * wkg * time) | int(0)\ \ }}\n{% elif states('input_number.treadmill_incline') | int(0) == 2 %}\n\ \ {% set cooldown = (((ckph**3 * 0.0184) - (ckph**2 * 0.1134) + (ckph * 0.6566)\ \ + 1.9200) * wkg * ctime) | int(0) %}\n {{ cooldown + (( (kph**3 * 0.0184)\ \ - (kph**2 * 0.1134) + (kph * 0.6566) + 1.9200) * wkg * time) | int(0)\ \ }}\n{% elif states('input_number.treadmill_incline') | int(0) == 3 %}\n\ \ {% set cooldown = (((ckph**3 * 0.0196) - (ckph**2 * 0.1205) + (ckph * 0.7053)\ \ + 1.9800) * wkg * ctime) | int(0) %}\n {{ cooldown + (( (kph**3 * 0.0196)\ \ - (kph**2 * 0.1205) + (kph * 0.7053) + 1.9800) * wkg * time) | int(0)\ \ }}\n{% elif states('input_number.treadmill_incline') | int(0) == 4 %}\n\ \ {% set cooldown = (((ckph**3 * 0.0208) - (ckph**2 * 0.1277) + (ckph * 0.7539)\ \ + 2.0400) * wkg * ctime) | int(0) %}\n {{ cooldown + (( (kph**3 * 0.0208)\ \ - (kph**2 * 0.1277) + (kph * 0.7539) + 2.0400) * wkg * time) | int(0)\ \ }}\n{% elif states('input_number.treadmill_incline') | int(0) == 5 %}\n\ \ {% set cooldown = (((ckph**3 * 0.0221) - (ckph**2 * 0.1349) + (ckph * 0.8025)\ \ + 2.1000) * wkg * ctime) | int(0) %}\n {{ cooldown + (( (kph**3 * 0.0221)\ \ - (kph**2 * 0.1349) + (kph * 0.8025) + 2.1000) * wkg * time) | int(0)\ \ }}\n{% endif %}\n" - action: input_number.set_value target: entity_id: input_number.treadmill_daily_calories data: value: '{{ daily_calories }}' - action: script.register_exercise_metrics data: exercise_type: treadmill daily_calories: '{{ daily_calories }}' - action: input_number.set_value target: entity_id: input_number.treadmill_usage_minutes data: value: '{{ states(''input_number.treadmill_usage_minutes'') | int(0) + states(''input_number.treadmill_daily_time'') | int(0) }}' - alias: Check Refrigerator Off id: check_refrigerator_off use_blueprint: path: devices/monitor_device.yaml input: device_entity: switch.refrigerator component_name: tplink device_name: Refrigerator - alias: Check Microwave Off id: check_microwave_off use_blueprint: path: devices/monitor_device.yaml input: device_entity: switch.microwave component_name: tplink device_name: Microwave - alias: Check Projector Off id: check_projector_off use_blueprint: path: devices/monitor_device.yaml input: device_entity: switch.projector component_name: sonoff device_name: Projector conditional_processing: '{{ states(''input_boolean.projector_plug_powered_off'') }}' - alias: Start Vacuum id: start_vacuum triggers: - trigger: time at: 03:00:00 conditions: - condition: time weekday: - mon - condition: state entity_id: timer.vacuum state: idle actions: - if: - '{{ states(''vacuum.ecovacs_deebot_none'') != ''docked'' }}' then: - action: homeassistant.reload_config_entry target: entity_id: vacuum.ecovacs_deebot_none - wait_template: '{{ is_state(''vacuum.ecovacs_deebot_none'', ''docked'') }}' timeout: seconds: 10 - if: - '{{ states(''vacuum.ecovacs_deebot_none'') != ''docked'' }}' then: - action: script.send_notification data: destination: - persistent title: Device Alert message: Vacuum not functioning good. notification_id: vacuum_nfg - stop: Vacuum not functioning good - action: input_boolean.turn_off entity_id: - input_boolean.vacuum_kicked_off - input_boolean.vacuum_finished - action: timer.start data: entity_id: timer.vacuum duration: 01:30:00 - delay: milliseconds: 100 - action: vacuum.start entity_id: vacuum.ecovacs_deebot_none - alias: Stop Vacuum id: stop_vacuum triggers: - trigger: event event_type: timer.finished event_data: entity_id: timer.vacuum - trigger: numeric_state entity_id: sensor.ecovacs_deebot_battery below: 20 conditions: - condition: time weekday: - mon actions: - action: vacuum.return_to_base entity_id: vacuum.ecovacs_deebot_none - alias: Detect Vacuum Running id: detect_vacuum_running triggers: - trigger: state entity_id: vacuum.ecovacs_deebot_none to: cleaning conditions: - condition: time weekday: - mon - condition: state entity_id: timer.vacuum state: active actions: - action: input_boolean.turn_on entity_id: input_boolean.vacuum_kicked_off - alias: Detect Vacuum Finished id: detect_vacuum_finished triggers: - trigger: state entity_id: vacuum.ecovacs_deebot_none to: docked conditions: - condition: time weekday: - mon - condition: state entity_id: input_boolean.vacuum_kicked_off state: 'on' actions: - action: input_boolean.turn_on entity_id: input_boolean.vacuum_finished - alias: Start Washer id: start_washer trigger: - platform: state entity_id: sensor.washer_power_state from: - stop - unknown to: fill action: - service: input_datetime.set_datetime target: entity_id: input_datetime.washer_start data_template: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - service: input_select.select_option target: entity_id: input_select.washer_load_size data: option: '*sensing*' - service: input_boolean.turn_on entity_id: input_boolean.backup_laundry_log - service: script.log_laundry_event data: event_type: basic prefix: Washer message: 'starting: softener {{ states(''input_boolean.washer_fabric_softener'') }}' - alias: Set Washer Load Size id: set_washer_load_size triggers: - trigger: state entity_id: sensor.washer_power_state from: fill to: raise conditions: - condition: state entity_id: input_select.washer_state state: Wash Fill actions: - variables: washer_fill_seconds: '{% set start = as_timestamp(strptime(states(''input_datetime.washer_start''), ''%Y-%m-%d %H:%M:%S'')) %} {% set seconds = (now().timestamp() - start) | round(0) %} {{ seconds }} ' - action: input_select.select_option target: entity_id: input_select.washer_load_size data: option: "{% if washer_fill_seconds >= 180 and washer_fill_seconds < 450 %}\n\ \ Small\n{% elif washer_fill_seconds >= 450 and washer_fill_seconds < 650\ \ %}\n Medium\n{% elif washer_fill_seconds >= 650 %}\n Large\n{% else %}\n\ \ Medium\n{% endif %}\n" - action: input_number.set_value target: entity_id: input_number.washer_fill_seconds data: value: '{{ washer_fill_seconds }}' - action: script.log_laundry_event data: event_type: fill_plus_load prefix: Washer message: fill time, load size entity_id_1: input_number.washer_fill_seconds entity_id_2: input_select.washer_load_size - alias: Start Washer Wash Blackout Timer id: start_washer_wash_blackout_timer trigger: - platform: state entity_id: input_select.washer_state from: Wash Fill to: Wash action: - variables: duration: 00:01:00 - service: timer.start data: entity_id: timer.washer_wash_blackout duration: '{{ duration }}' - service: script.log_laundry_event data: event_type: timer prefix: Washer message: timer started ({{ duration }}) entity_id_1: timer.washer_wash_blackout - alias: Start Washer Rinse Fill Blackout Timer id: start_washer_rinse_fill_blackout_timer trigger: - platform: state entity_id: input_select.washer_state from: Wash Drain to: Rinse Fill condition: - condition: state entity_id: input_boolean.washer_fabric_softener state: 'on' action: - variables: duration: '{% set load_size = states(''input_select.washer_load_size'') %} {{ iif(load_size == ''Small'', ''00:03:00'', iif(load_size == ''Large'', ''00:05:00'', ''00:04:00'')) }} ' - service: timer.start data: entity_id: timer.washer_rinse_fill_blackout duration: '{{ duration }}' - service: script.log_laundry_event data: event_type: timer prefix: Washer message: timer started ({{ duration }}) entity_id_1: timer.washer_rinse_fill_blackout - alias: Start Washer Rinse Blackout Timer id: start_washer_rinse_blackout_timer trigger: - platform: state entity_id: input_select.washer_state from: Rinse Fill to: Rinse action: - variables: duration: 00:01:00 - service: timer.start data: entity_id: timer.washer_rinse_blackout duration: '{{ duration }}' - service: script.log_laundry_event data: event_type: timer prefix: Washer message: timer started ({{ duration }}) entity_id_1: timer.washer_rinse_blackout - alias: Set Washer Operation id: set_washer_operation trace: stored_traces: 20 trigger: - platform: state entity_id: sensor.washer_power_state condition: '{{ trigger.from_state and trigger.from_state.state != ''unavailable'' }}' action: - delay: 00:00:01 - variables: s: '{{ states(''input_select.washer_state'') }}' - service: input_select.select_option data: entity_id: input_select.washer_state option: "{# --Set variables-- #} {% set fr = trigger.from_state.state %} {%\ \ set to = trigger.to_state.state %} {% set t1 = states('timer.washer_rinse_fill_blackout')\ \ %} {% set t2 = states('timer.washer_rinse_blackout') %} {% set t3 = states('timer.washer_wash_blackout')\ \ %}\n{# --Ignore everything if one of the timers is running-- #} {% if t1\ \ == 'active' or t2 == 'active' or t3 == 'active' %} {{ s }}\n{# --Transition\ \ to new state based on current state and washer power state sensor change--\ \ #} {% elif fr in ['stop', 'unknown'] and to == 'fill' %} \ \ Wash Fill {% elif fr in ['fill', 'drop'] and to ==\ \ 'raise' and s == 'Wash Fill' %} Wash {% elif fr == 'raise'\ \ and to == 'drop' and s in ['Wash', 'Wash Drain'] %} Wash\ \ Drain {% elif fr in ['drop', 'raise'] and to == 'fill' and s == 'Wash\ \ Drain' %} Rinse Fill {% elif fr in ['fill', 'drop'] and to\ \ == 'raise' and s == 'Rinse Fill' %} Rinse {% elif fr == 'raise'\ \ and to == 'drop' and s == 'Rinse' %} Rinse\ \ Drain \n{# --Some washer power state sensor changes just remain in the\ \ current state-- #} {% elif fr == 'drop' and to in ['fill', 'raise'] %}\ \ {{ s }} {% elif fr == 'fill' and to in ['drop', 'raise'] %} {{ s }} {%\ \ elif fr == 'raise' and to in ['fill', 'drop'] %} {{ s }}\n{# --Catch-all,\ \ default to Off-- #} {% else %} Off {% endif %}\n" - if: - '{{ s != states(''input_select.washer_state'') }}' then: - service: script.log_laundry_event data: event_type: basic prefix: Washer message: state changed from {{ s }} to {{ states('input_select.washer_state') }} - if: - '{{ is_state(''input_select.washer_state'', ''Off'') }}' then: - service: script.log_laundry_event data: event_type: basic prefix: Washer message: stopped - service: script.update_laundry_history_time_ranges data: is_washer: true start_time: '{{ state_attr(''input_datetime.washer_start'', ''timestamp'') | int(0) }}' stop_time: '{{ as_timestamp(now()) | round(0) }}' - alias: Turn On Dryer Running id: turn_on_dryer_running triggers: - trigger: template value_template: "{{ states('sensor.dryer_sensor_temperature') not in ['unavailable',\ \ 'unknown'] and states('sensor.downstairs_temperature') not in ['unavailable',\ \ 'unknown'] and\n states('sensor.dryer_sensor_temperature') | int(0) > (states('sensor.downstairs_temperature')\ \ | int(0) + 30) }}\n" actions: - action: input_datetime.set_datetime target: entity_id: input_datetime.dryer_start data_template: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - action: counter.reset entity_id: - counter.dryer_temperature_count - counter.dryer_humidity_count - action: input_boolean.turn_on entity_id: input_boolean.dryer_running - action: input_boolean.turn_on entity_id: input_boolean.backup_laundry_log - action: script.log_laundry_event data: event_type: basic prefix: Dryer message: '{% set intemp = states(''sensor.downstairs_temperature'') %} {% set inhum = states(''sensor.downstairs_humidity'') %} {% set outtemp = states(''sensor.porch_sensor_temperature'') %} {% set outhum = states(''sensor.openweathermap_humidity'') %} starting: indoor ({{ intemp }}°, {{ inhum }}%); outdoor ({{ outtemp }}°, {{ outhum }} %) ' - action: script.log_laundry_event data: event_type: metric prefix: Dryer message: temperature detected entity_id_1: sensor.dryer_sensor_temperature - action: timer.start data: entity_id: timer.dryer_done_failsafe duration: 02:00:00 - alias: Reset Dryer Done Failsafe id: reset_dryer_done_failsafe triggers: - trigger: event event_type: timer.finished event_data: entity_id: timer.dryer_done_failsafe actions: - action: counter.reset entity_id: - counter.dryer_temperature_count - counter.dryer_humidity_count - alias: Register Dryer Event id: register_dryer_event triggers: - trigger: template value_template: '{{ states(''binary_sensor.dryer_humidity_falling'') == ''on'' and states(''sensor.dryer_sensor_humidity'') | int(0) <= 70 }}' id: humidity - trigger: state entity_id: binary_sensor.dryer_temperature_falling to: 'on' id: temperature conditions: - condition: state entity_id: input_boolean.dryer_running state: 'on' actions: - if: - '{{ trigger.id == ''temperature'' }}' then: - action: counter.increment entity_id: counter.dryer_temperature_count - action: script.log_laundry_event data: event_type: metric prefix: Dryer message: temperature falling entity_id_1: sensor.dryer_sensor_temperature else: - action: counter.increment entity_id: counter.dryer_humidity_count - action: script.log_laundry_event data: event_type: metric prefix: Dryer message: humidity falling entity_id_1: sensor.dryer_sensor_humidity - alias: Turn Off Dryer Running id: turn_off_dryer_running trigger: - platform: state entity_id: binary_sensor.dryer_done to: 'on' condition: - condition: state entity_id: input_boolean.dryer_running state: 'on' action: - service: input_boolean.turn_off entity_id: input_boolean.dryer_running - service: script.log_laundry_event data: event_type: basic prefix: Dryer message: stopped - service: script.update_laundry_history_time_ranges data: is_washer: false start_time: '{{ state_attr(''input_datetime.dryer_start'', ''timestamp'') | int(0) }}' stop_time: '{{ as_timestamp(now()) | round(0) }}' - alias: Turn On Treadmill Fan id: turn_on_treadmill_fan trigger: - platform: state entity_id: input_boolean.treadmill_triggered to: 'on' action: - choose: - conditions: - condition: numeric_state entity_id: climate.downstairs attribute: current_temperature below: 70.0 sequence: - delay: 00:10:00 - service: switch.turn_on entity_id: switch.treadmill_fan - conditions: - condition: numeric_state entity_id: climate.downstairs attribute: current_temperature below: 75.0 sequence: - delay: 00:05:00 - service: switch.turn_on entity_id: switch.treadmill_fan default: - service: switch.turn_on entity_id: switch.treadmill_fan - alias: Turn Off Treadmill Fan id: turn_off_treadmill_fan trigger: - platform: state entity_id: input_boolean.treadmill_triggered to: 'off' action: - delay: 00:02:00 - service: switch.turn_off entity_id: switch.treadmill_fan - service: script.turn_on entity_id: script.control_fan_for_temperature data: variables: fan_entity_id: fan.office_fan temperature_entity_id: sensor.main_floor_temperature thresholds: - 76 - 74 - 72 timeout: 360 - alias: Manage Echo Do Not Disturb id: manage_echo_do_not_disturb triggers: - trigger: state entity_id: input_boolean.nighttime from: 'off' to: 'on' id: 'on' - trigger: state entity_id: input_boolean.nighttime from: 'on' to: 'off' id: 'off' actions: - variables: bedroom_echoes: '{{ [''switch.master_bedroom_echo_do_not_disturb_switch'', ''switch.studio_echo_do_not_disturb_switch'', ''switch.penthouse_echo_do_not_disturb_switch''] }}' - repeat: for_each: '{{ bedroom_echoes }}' sequence: - variables: name: '{{ repeat.item.split(''.'')[1].split(''_'')[0] }}' occupied_sensor: '{{ ''binary_sensor.'' ~ name ~ ''_occupied'' }}' - if: - '{{ iif(name == ''master'' or states(occupied_sensor) == ''on'') }}' then: - action: switch.turn_{{ trigger.id }} target: entity_id: '{{ repeat.item }}' - alias: Update PC Lastboot id: update_pc_lastboot trigger: - platform: state entity_id: sensor.legion_t530_lastboot to: null condition: '{{ trigger.to_state.state not in [''unknown'', ''unavailable''] }}' action: - service: input_datetime.set_datetime target: entity_id: input_datetime.pc_lastboot data: timestamp: '{{ as_timestamp(states(''sensor.legion_t530_lastboot'')) }}' - alias: Save Monthly Calories id: save_monthly_calories trigger: - platform: state entity_id: sensor.total_monthly_calories condition: - '{{ now().day == 1 }}' - '{{ trigger.from_state and trigger.from_state.state | float(0) > 0.0 }}' variables: month: '{{ as_timestamp(trigger.from_state.last_changed) | timestamp_custom(''%b'') | lower() }}' action: - service: system_log.write data: message: '{{ ''calories from state last changed/month: '' ~ trigger.from_state.last_changed ~ '' / '' ~ month }}' level: debug - service: input_number.set_value target: entity_id: input_number.calories_curr_year_{{ month }} data: value: '{{ trigger.from_state.state | float(0) }}' - if: - '{{ month == ''dec'' }}' then: - variables: months: - jan - feb - mar - apr - may - jun - jul - aug - sep - oct - nov - dec - repeat: count: 12 sequence: - service: input_number.set_value target: entity_id: input_number.calories_prev_year_{{ months[repeat.index-1] }} data: value: '{{ states(''input_number.calories_curr_year_'' + months[repeat.index-1]) }}' - service: input_number.set_value target: entity_id: input_number.calories_curr_year_{{ months[repeat.index-1] }} data: value: 0 - alias: Copy Daily Steps id: copy_daily_steps trigger: - platform: time at: '23:59:00' action: - service: input_number.set_value target: entity_id: input_number.steps_daily data: value: '{{ states(''sensor.steps_daily'') }}' - alias: Process Workout Exercise id: process_workout_exercise use_blueprint: path: health/process_exercise.yaml input: exercise_type: workout units_entity: input_number.workout_daily_time - alias: Process Yard Work Exercise id: process_yard_work_exercise use_blueprint: path: health/process_exercise.yaml input: exercise_type: yard_work units_entity: input_number.yard_work_daily_time - alias: Process Other Exercise id: process_other_exercise use_blueprint: path: health/process_exercise.yaml input: exercise_type: other units_entity: input_number.other_daily_time - alias: Process Steps Exercise id: process_steps_exercise use_blueprint: path: health/process_exercise.yaml input: exercise_type: steps units_entity: input_number.steps_daily - alias: Perform Startup Chores id: perform_startup_chores triggers: - trigger: homeassistant event: start actions: - action: shell_command.delete_junk_log_files - action: input_boolean.turn_on data: entity_id: input_boolean.kodi_movie_list_restoration - action: pyscript.restore_input_select_options data: entity: input_select.kodi_movies file: /config/all_movies_backup - wait_template: '{{ not is_state(''input_select.kodi_movies'', ''Select'') }}' timeout: 00:00:10 - action: input_select.select_option data: entity_id: input_select.kodi_movies option: '{{ states(''input_text.current_feature'') }}' - action: input_boolean.turn_off data: entity_id: input_boolean.kodi_movie_list_restoration - delay: seconds: 30 - action: homeassistant.reload_config_entry target: entity_id: vacuum.ecovacs_deebot_none - alias: Perform MQTT Chores id: perform_mqtt_chores triggers: - trigger: mqtt topic: homeassistant/status payload: online actions: - variables: vtrack_entities: "{% set var = namespace(vtrack = []) %} {% for state in states.input_boolean\ \ %}\n {% if 'Virtual' in state.name %}\n {% set var.vtrack = var.vtrack\ \ + [state.entity_id] %}\n {% endif %}\n{% endfor %} {% for state in states.input_boolean\ \ %}\n {% if 'NFC Tag' in state.name %}\n {% set var.vtrack = var.vtrack\ \ + [state.entity_id] %}\n {% endif %}\n{% endfor %}\n{{ var.vtrack }}\n" - repeat: for_each: '{{ vtrack_entities }}' sequence: - variables: topic_suffix: '{{ repeat.item | replace(''input_boolean.'', '''') }}' - if: - '{{ states(repeat.item) == ''on'' }}' then: - action: mqtt.publish data: topic: '{{ ''homeassistant/device_tracker/'' ~ topic_suffix }}' payload: home else: - action: mqtt.publish data: topic: '{{ ''homeassistant/device_tracker/'' ~ topic_suffix }}' payload: not_home - variables: suffix: last_changed items: - '{{ ''ups_'' ~ suffix }}' - '{{ ''garage_door_north_'' ~ suffix }}' - '{{ ''garage_door_south_'' ~ suffix }}' - '{{ ''treadmill_'' ~ suffix }}' - '{{ ''washer_'' ~ suffix }}' - '{{ ''workout_'' ~ suffix }}' - repeat: count: '{{ items | length }}' sequence: - action: script.set_up_mqtt_automated_config data: domain: sensor unique_id: '{{ items[repeat.index - 1] }}' device_class: timestamp - alias: Perform Shutdown Chores id: perform_shutdown_chores trigger: - platform: homeassistant event: shutdown action: - service: shell_command.backup_log - alias: Perform Daily Chores id: perform_daily_chores triggers: - trigger: time at: 01:01:01 actions: - variables: day_of_week: '{{ as_timestamp(now()) | timestamp_custom(''%w'') | int(0) }}' day_of_month: '{{ now().day }}' - action: input_boolean.turn_off target: entity_id: input_boolean.exercise_recordable - action: input_number.set_value target: entity_id: - input_number.treadmill_daily_time - input_number.treadmill_daily_calories - input_number.workout_daily_time - input_number.workout_daily_calories - input_number.yard_work_daily_time - input_number.yard_work_daily_calories - input_number.other_daily_time - input_number.other_daily_calories - input_number.steps_daily - input_number.steps_daily_calories data: value: 0 - action: input_datetime.set_datetime target: entity_id: input_datetime.other_date data: timestamp: '{{ now().timestamp() }}' - action: automation.turn_on entity_id: - automation.determine_cpap_filter_target_day - automation.run_studio_motion_based_light - automation.update_last_alexa_device - if: - condition: state entity_id: update.zigbee2mqtt_update state: 'off' then: - action: automation.turn_on entity_id: automation.notify_zigbee_device_unavailable - action: shell_command.backup_auto_scripts_log - action: input_boolean.turn_off entity_id: input_boolean.dryer_running - if: - condition: state entity_id: input_boolean.backup_laundry_log state: 'on' then: - action: shell_command.backup_laundry_log - action: input_boolean.turn_off entity_id: input_boolean.backup_laundry_log - if: - condition: state entity_id: input_boolean.hockey_season state: 'on' then: - if: - condition: state entity_id: input_boolean.hockey_canes_active state: 'on' then: - action: homeassistant.update_entity target: entity_id: sensor.next_canes_game continue_on_error: true - if: - condition: state entity_id: input_boolean.hockey_flyers_active state: 'on' then: - action: homeassistant.update_entity target: entity_id: sensor.next_flyers_game continue_on_error: true - action: input_number.set_value target: entity_id: input_number.f150_mileage data: value: '{{ states(''input_number.f150_mileage'') | int(0) + 32 }}' - if: - condition: state entity_id: input_boolean.theater_open state: 'on' - condition: state entity_id: binary_sensor.adults_home state: 'off' - condition: state entity_id: sensor.harmony_hub state: PowerOff then: - action: input_boolean.turn_off target: entity_id: input_boolean.theater_open - action: input_boolean.turn_off target: entity_id: input_boolean.salt_system_low_temperature - action: automation.turn_on entity_id: automation.control_family_room_lamp - action: automation.turn_off entity_id: automation.control_christmas_lights - action: watchman.report data: parse_config: false create_file: true - repeat: for_each: - david - mike - sarah - skylar sequence: - if: - '{{ not is_state(''person.'' ~ repeat.item, ''home'') }}' then: - action: input_select.select_first target: entity_id: '{{ ''input_select.'' ~ repeat.item ~ ''_guest_suite'' }}' - if: - '{{ day_of_week == 0 }}' then: - action: input_number.set_value target: entity_id: - input_number.treadmill_weekly_time - input_number.treadmill_weekly_calories - input_number.workout_weekly_time - input_number.workout_weekly_calories - input_number.yard_work_weekly_time - input_number.yard_work_weekly_calories - input_number.other_weekly_time - input_number.other_weekly_calories - input_number.steps_weekly - input_number.steps_weekly_calories data: value: 0 - action: script.generate_periodic_lists data: type: all start_date: '{{ states(''sensor.date'') }}' - action: script.generate_weekly_free_time_days - action: script.generate_weekly_exercise_days - if: - '{{ day_of_month == 1 }}' then: - action: input_number.set_value target: entity_id: - input_number.treadmill_monthly_time - input_number.treadmill_monthly_calories - input_number.workout_monthly_time - input_number.workout_monthly_calories - input_number.yard_work_monthly_time - input_number.yard_work_monthly_calories - input_number.other_monthly_time - input_number.other_monthly_calories - input_number.steps_monthly - input_number.steps_monthly_calories data: value: 0 - action: counter.reset target: entity_id: - counter.treadmill_days - counter.workout_days - counter.yard_work_days - counter.other_days - counter.steps_days - counter.exercise_recordable - action: shell_command.backup_exercise_log - alias: Log Automations id: log_automations mode: queued max: 200 trace: stored_traces: 20 triggers: - trigger: event event_type: automation_triggered conditions: - condition: template value_template: "{% set skip_list = [\n 'log_automations',\n\ \ 'log_scripts',\n 'set_maximum_attic_temperature',\ \ \n 'set_maximum_garage_temperature', \n \ \ 'set_maximum_outdoor_temperature',\n 'set_minimum_attic_temperature',\ \ \n 'set_minimum_garage_temperature', \n \ \ 'set_minimum_outdoor_temperature',\n 'set_washer_operation'\n\ \ ] %}\n{{ trigger.event.data.entity_id.split('.')[1] not\ \ in skip_list }}\n" actions: - action: notify.send_message target: entity_id: notify.automations_scripts data: message: '{{ as_timestamp(trigger.event.time_fired) | timestamp_custom(''%b %d: %X'') }}: (A) {{ trigger.event.data.name }} ' - alias: Log Scripts id: log_scripts mode: queued max: 200 trace: stored_traces: 20 triggers: - trigger: event event_type: script_started conditions: - condition: template value_template: "{% set skip_list = [\n 'log_laundry_event',\n\ \ 'mobile_notification_worker',\n 'restore_lighting_on_resume',\n\ \ 'resume_cinema',\n 'resume_worker',\ \ \n 'set_datetime_offset_days', \n 'set_datetime_offset_months',\ \ \n 'set_datetime_offset_weeks', \n 'set_fan_to_speed',\ \ \n 'set_theater_dark',\n 'set_theater_dark_delay',\n\ \ 'set_theater_dim',\n 'set_theater_idle'\n\ \ ] %}\n{{ trigger.event.data.entity_id.split('.')[1] not\ \ in skip_list }}\n" actions: - action: notify.send_message target: entity_id: notify.automations_scripts data: message: '{{ as_timestamp(trigger.event.time_fired) | timestamp_custom(''%b %d: %X'') }}: (S) {{ trigger.event.data.name }} ' - alias: Change YAML Log Level id: change_yaml_log_level triggers: - trigger: state entity_id: input_select.yaml_log_level actions: - action: logger.set_level data: homeassistant.components.system_log.external: '{{ trigger.to_state.state }}' - alias: Save Notifications On Create id: save_notifications_on_create mode: queued triggers: - trigger: persistent_notification update_type: - added - updated - current conditions: '{{ trigger.notification.notification_id != ''config_entry_discovered'' }}' actions: - action: mqtt.publish data_template: topic: homeassistant/notifications/{{ trigger.notification.notification_id }} payload: "{\n 'notification_id' : \"{{ trigger.notification.notification_id\ \ }}\",\n 'title' : \"{{ trigger.notification.title }}\",\n 'message' :\ \ \"{{ trigger.notification.message }}\"\n}" retain: true - alias: Remove Saved Notifications On Dismiss id: remove_saved_notifications_on_dismiss mode: queued trigger: - trigger: persistent_notification update_type: - removed condition: '{{ trigger.notification.notification_id != ''config_entry_discovery'' }}' action: - service: mqtt.publish data_template: topic: homeassistant/notifications/{{ trigger.notification.notification_id }} retain: true - alias: Publish MQTT Automated States id: publish_mqtt_automated_states mode: parallel triggers: - trigger: state entity_id: sensor.cyber1_status_data to: OB DISCHRG for: 00:01:00 id: ups - trigger: state entity_id: cover.garage_door_north from: closed to: open id: garage_door_north - trigger: state entity_id: cover.garage_door_south from: closed to: open id: garage_door_south - trigger: state entity_id: input_select.washer_state from: 'Off' not_to: - Unknown - unknown - unavailable id: washer - trigger: state entity_id: input_boolean.treadmill_triggered from: 'off' to: 'on' id: treadmill - trigger: numeric_state entity_id: input_number.workout_daily_time above: 0 id: workout variables: valid: '{{ trigger | default(none) is not none and trigger.to_state is defined and trigger.from_state is defined }} ' timestamp: '{{ (datetime | default(now())).isoformat() }} ' unique_id: '{{ trigger.id }}_last_changed ' conditions: '{{ valid }}' actions: - action: script.publish_mqtt_automated_states data: domain: sensor unique_id: '{{ unique_id }}' state: '{{ timestamp }}' attributes: {} - alias: Toggle Zigbee Unavailable Notification id: toggle_zigbee_unavailable_notification triggers: - trigger: state entity_id: update.zigbee2mqtt_update from: 'off' to: 'on' id: 'off' - trigger: state entity_id: update.zigbee2mqtt_update from: 'on' to: 'off' id: 'on' actions: - action: automation.turn_{{ trigger.id }} entity_id: automation.notify_zigbee_device_unavailable - alias: Toggle Hockey Hobby id: toggle_hockey_hobby triggers: - trigger: state entity_id: input_boolean.hockey_season from: 'off' to: 'on' id: 'on' - trigger: state entity_id: input_boolean.hockey_season from: 'on' to: 'off' id: 'off' actions: - action: automation.turn_{{ trigger.id }} entity_id: - automation.notify_next_canes_game - automation.notify_next_flyers_game - action: input_boolean.turn_{{ trigger.id }} entity_id: - input_boolean.hockey_canes_active - input_boolean.hockey_flyers_active - alias: Respond To Mobile Text id: respond_to_mobile_text mode: queued triggers: - trigger: state entity_id: sensor.jon_galaxy_last_notification to: null variables: title: '{{ state_attr(''sensor.jon_galaxy_last_notification'', ''android.title'') }}' text: '{{ state_attr(''sensor.jon_galaxy_last_notification'', ''android.text'') }}' category: '{{ state_attr(''sensor.jon_galaxy_last_notification'', ''category'') }}' persons: "{% set var = namespace(list = []) %} {% if 'Michael' in title or 'Michael'\ \ in text %}\n {% set var.list = var.list + ['Michael'] %}\n{% endif %} {%\ \ if 'Maryam' in title or 'Maryam' in text %}\n {% set var.list = var.list\ \ + ['Maryam'] %}\n{% endif %} {% if 'Sarah' in title or 'Sarah' in text %}\n\ \ {% set var.list = var.list + ['Sarah'] %}\n{% endif %} {% if 'David' in title\ \ or 'David' in text %}\n {% set var.list = var.list + ['David'] %}\n{% endif\ \ %} {% if var.list | length == 0 %}\n {% set var.list = var.list + ['Stranger']\ \ %}\n{% endif %}\n{{ var.list }}\n" on_treadmill: '{{ states(''input_boolean.treadmill_triggered'') == ''on'' }}' sleeping: '{{ states(''input_boolean.sleeptime'') == ''on'' }}' driving: '{{ states(''binary_sensor.jon_driving'') == ''on'' }}' conditions: - and: - '{{ category != ''email'' }}' - '{{ persons[0] != ''Stranger'' }}' - or: - '{{ on_treadmill }}' - '{{ sleeping }}' - '{{ driving }}' actions: - repeat: for_each: '{{ persons }}' sequence: - variables: timer_entity: '{{ ''timer.text_response_delay_'' ~ repeat.item | lower }}' - condition: '{{ states(timer_entity) == ''idle'' }}' - variables: number: "{% if repeat.item == 'Michael' %}\n 9199246845\n{% elif repeat.item\ \ == 'Maryam' %}\n 9197571974\n{% elif repeat.item == 'Sarah' %}\n 2522302146\n\ {% elif repeat.item == 'David' %}\n 2522991689\n{% else %}\n 0000000000\n\ {% endif %}\n" activity: "{% if on_treadmill %}\n on the treadmill\n{% elif sleeping %}\n\ \ asleep, and dreaming of {{ ('sugarplums', 'aliens', 'flying', 'weasels',\ \ 'being lost in an everchanging city', 'trying to find a bathroom', 'ghosts\ \ messing with electricity') | random }}\n{% elif driving %}\n driving,\ \ or at least in a vehicle\n{% else %}\n unavailable for some unknown\ \ reason\n{% endif %}\n" - action: notify.gmail data: title: ' ' target: '{{ number ~ ''@vtext.com'' }}' message: '{{ ''Sorry, I am '' ~ activity ~ ''. I will respond when available.'' }}' - action: timer.start data: entity_id: '{{ timer_entity }}' duration: 300 - alias: Create Daily Mini ToDo List id: create_daily_mini_todo_list triggers: - trigger: time at: 05:00:00 actions: - variables: weekly_list_entities: - sensor.mini_todo_weekly_cleaning_list - sensor.mini_todo_weekly_other_list - sensor.mini_todo_weekly_yard_work_list start_date: '{% set day = now().isoweekday() %} {% set offset = iif(day <= 6, day, 0) %} {{ as_datetime(states(''sensor.date'')) - timedelta(days = offset) }} ' - repeat: for_each: '{{ weekly_list_entities }}' sequence: - if: - '{{ states(repeat.item) in [''unknown'', ''unavailable''] }}' then: - variables: type: '{{ repeat.item.split(''sensor.mini_todo_weekly_'')[-1] | replace(''_list'', '''') }}' - action: script.generate_periodic_lists data: type: '{{ type }}' start_date: '{{ start_date }}' - action: script.get_weather_metrics - event: reset_mini_todo_items - wait_template: '{{ state_attr(''sensor.daily_mini_todo_list'', ''items'') | count == 0 }}' - variables: window_lower_bound: '{{ states(''input_datetime.mini_todo_start_time'') }}' window_upper_bound: '{{ states(''input_datetime.mini_todo_end_time'') }}' start_time: '{{ states(''sensor.date'') ~ '' '' ~ window_lower_bound }}' end_time: '{{ states(''sensor.date'') ~ '' '' ~ window_upper_bound }}' total_minutes: '{{ (((as_timestamp(end_time) - as_timestamp(start_time)) / 60) - states(''input_number.mini_todo_downtime_minutes'') | int(0)) }}' - action: input_number.set_value target: entity_id: input_number.mini_todo_available_minutes data: value: '{{ total_minutes }}' - action: counter.reset target: entity_id: counter.mini_todo_tasks - action: input_boolean.turn_off data: entity_id: input_boolean.mini_todo_major_item_added - action: script.add_mini_todo_calendar_items data: window_lower_bound: '{{ window_lower_bound }}' window_upper_bound: '{{ window_upper_bound }}' start_time: '{{ start_time }}' end_time: '{{ end_time }}' - if: - '{{ states(''input_number.mini_todo_weekly_exercise_days'') | int(0) | bitwise_and(2 ** now().isoweekday()) > 0 }}' then: - variables: last_treadmill: '{{ as_timestamp(states(''sensor.treadmill_last_changed'')) }}' last_workout: '{{ as_timestamp(states(''sensor.workout_last_changed'')) }}' exercise_type: '{{ iif(last_treadmill > last_workout, ''Workout'', ''Treadmill'') }}' current_minutes: '{{ states(''input_number.mini_todo_available_minutes'') | int(0) }}' exercise_minutes: '{{ iif(last_treadmill > last_workout, states(''input_number.variables_workout_time'') | int(0) + 10, states(''input_number.default_treadmill_minutes'') | int(0) + 10) }}' - service: input_number.set_value target: entity_id: input_number.mini_todo_available_minutes data: value: '{{ current_minutes - exercise_minutes }}' - event: add_mini_todo_item event_data: value: '{{ ''ex:'' ~ exercise_type }}' - action: counter.increment target: entity_id: counter.mini_todo_tasks - if: - '{{ states(''input_number.mini_todo_weekly_free_time_days'') | int(0) | bitwise_and(2 ** now().isoweekday()) > 0 }}' then: - event: add_mini_todo_item event_data: value: ft:FREE TIME - action: counter.increment target: entity_id: counter.mini_todo_tasks - stop: Free day - action: counter.reset target: entity_id: counter.mini_todo_attempts - if: - '{{ state_attr(''sensor.mini_todo_weekly_cleaning_list'', ''items'') | length > 0 }}' then: - action: script.add_mini_todo_periodic_item data: type: cleaning - if: - '{{ state_attr(''sensor.mini_todo_weekly_yard_work_list'', ''items'') | length > 0 }}' then: - action: script.add_mini_todo_periodic_item data: type: yard_work - variables: task_count: '{{ 5 - states(''counter.mini_todo_tasks'') | int(0) }}' - repeat: while: '{{ states(''input_number.mini_todo_available_minutes'') | int(total_minutes) > 0 and states(''counter.mini_todo_tasks'') | int(0) < task_count and states(''counter.mini_todo_attempts'') | int(0) <= 10 }}' sequence: - variables: type: '{{ [''cleaning'', ''other'', ''yard_work'', ''major'', ''minor''] | random }}' - action: system_log.write data: message: '{{ ''iteration '' ~ repeat.index ~ '': type='' ~ type ~ '', avail='' ~ states(''input_number.mini_todo_available_minutes'') ~ '', tasks='' ~ states(''counter.mini_todo_tasks'') ~ '', attempts='' ~ states(''counter.mini_todo_attempts'') }}' level: debug - delay: milliseconds: 500 - choose: - conditions: '{{ type in [''cleaning'', ''other'', ''yard_work''] }}' sequence: - if: '{{ range(2) | random > 0 }}' then: - action: script.add_mini_todo_periodic_item data: type: '{{ type }}' - conditions: '{{ type in [''major'', ''minor''] }}' sequence: - if: '{{ range(2) | random > 0 }}' then: - action: script.add_mini_todo_project_item data: type: '{{ type }}' - alias: Reload Unifi Integration id: reload_unifi_integration trigger: - platform: event event_type: system_log_event event_data: name: homeassistant.components.unifi level: WARNING condition: '{{ ''received 401 Unauthorized'' in trigger.event.data.message[0] }}' action: - action: counter.increment target: entity_id: counter.unifi_integration_errors - if: - condition: numeric_state entity_id: counter.unifi_integration_errors above: 5 then: - action: homeassistant.reload_config_entry target: entity_id: sensor.udm_state - action: counter.reset target: entity_id: counter.unifi_integration_errors - alias: Reload Ecovacs Integration id: reload_ecovacs_integration triggers: - trigger: state entity_id: - vacuum.ecovacs_deebot_none - sensor.ecovacs_deebot_filter_lifespan - sensor.ecovacs_deebot_main_brush_lifespan - sensor.ecovacs_deebot_side_brush_lifespan to: unavailable for: seconds: 30 actions: - action: homeassistant.reload_config_entry target: entity_id: vacuum.ecovacs_deebot_none - alias: Toggle Control Automation id: toggle_control_automation triggers: - trigger: state entity_id: input_boolean.christmas_mode to: null actions: - variables: toggle_operation: '{{ states(''input_boolean.christmas_mode'') }}' - action: automation.turn_{{ toggle_operation }} entity_id: automation.control_family_room_light_automations - if: - '{{ is_state_attr(''sun.sun'', ''rising'', false) and is_state(''sun.sun'', ''above_horizon'') }}' then: - action: automation.turn_{{ iif(toggle_operation == 'on', 'off', 'on') }} entity_id: automation.control_family_room_lamp - action: automation.turn_{{ iif(toggle_operation == 'on', 'on', 'off') }} entity_id: automation.control_christmas_lights - alias: Control Family Room Light Automations id: control_family_room_light_automations triggers: - trigger: state entity_id: sun.sun to: null - trigger: state entity_id: sun.sun attribute: rising actions: - if: - '{{ is_state_attr(''sun.sun'', ''rising'', false) and is_state(''sun.sun'', ''above_horizon'') }}' then: - action: automation.turn_off entity_id: automation.control_family_room_lamp - if: - condition: state entity_id: binary_sensor.all_day_christmas_lights state: 'off' then: - action: automation.turn_on entity_id: automation.control_christmas_lights else: - action: automation.turn_on entity_id: automation.control_family_room_lamp - action: automation.turn_off entity_id: automation.control_christmas_lights - alias: Control Office Lamp id: control_office_lamp use_blueprint: path: lighting/lux_light.yaml input: lux_sensor: sensor.office_sensor_ambient_light light_target: light.office_lamp min_lux_level: input_number.office_ambient_min max_lux_level: input_number.office_ambient_max check_theater: false check_christmas: false - alias: Control Hallway Lamp id: control_hallway_lamp use_blueprint: path: lighting/lux_light.yaml input: lux_sensor: sensor.downstairs_sensor_ambient_light light_target: light.hallway_lamp min_lux_level: input_number.hallway_ambient_min max_lux_level: input_number.hallway_ambient_max check_theater: true check_christmas: false - alias: Control Family Room Lamp id: control_family_room_lamp use_blueprint: path: lighting/lux_light.yaml input: lux_sensor: sensor.downstairs_sensor_ambient_light light_target: light.family_room_lamp min_lux_level: input_number.family_room_ambient_min max_lux_level: input_number.family_room_ambient_max check_theater: true check_christmas: false - alias: Control Christmas Lights id: control_christmas_lights use_blueprint: path: lighting/lux_light.yaml input: lux_sensor: sensor.downstairs_sensor_ambient_light light_target: light.family_room_lamp min_lux_level: input_number.family_room_ambient_min max_lux_level: input_number.family_room_ambient_max check_theater: true check_christmas: true - alias: Control Voice Assistant Screens id: control_voice_assistant_screens triggers: - trigger: numeric_state entity_id: sensor.downstairs_sensor_ambient_light below: input_number.family_room_ambient_min id: dim - trigger: numeric_state entity_id: sensor.downstairs_sensor_ambient_light above: input_number.family_room_ambient_max id: bright actions: - if: - '{{ trigger.id == ''dim'' }}' then: - action: scene.turn_on target: entity_id: scene.voice_assistants_on_dim else: - action: scene.turn_on target: entity_id: scene.voice_assistants_on_bright - alias: Enable Extended Away Mode id: enable_extended_away_mode trigger: - platform: time at: input_datetime.extended_away_start action: - service: input_boolean.turn_on entity_id: input_boolean.extended_away_mode - service: script.set_extended_thermostat_holds data: heat_temp: '{{ states(''input_number.extended_hold_heat_temp'') }}' cool_temp: '{{ states(''input_number.extended_hold_cool_temp'') }}' - alias: Disable Extended Away Mode id: disable_extended_away_mode trigger: - platform: time at: input_datetime.extended_away_end action: - service: input_boolean.turn_off entity_id: input_boolean.extended_away_mode - service: script.remove_thermostat_hold data: thermostat_entity: climate.downstairs extended: true - service: script.remove_thermostat_hold data: thermostat_entity: climate.upstairs extended: true - alias: Control Nighttime During Extended Away id: control_nighttime_during_extended_away triggers: - trigger: time at: '22:00:00' id: 'on' - trigger: time at: 05:30:00 id: 'off' conditions: - condition: state entity_id: input_boolean.extended_away_mode state: 'on' actions: - action: timer.start data: entity_id: timer.extended_away_nighttime duration: minutes: '{{ range(5, 90) | random }}' - action: input_boolean.turn_{{ trigger.id }} target: entity_id: input_boolean.extended_away_nighttime - alias: Handle Extended Away Nighttime Timer id: handle_extended_away_nighttime_timer triggers: - trigger: event event_type: timer.finished event_data: entity_id: timer.extended_away_nighttime conditions: - condition: state entity_id: input_boolean.extended_away_mode state: 'on' actions: - action: input_boolean.turn_{{ states('input_boolean.extended_away_nighttime') }} target: entity_id: input_boolean.nighttime - alias: Run Extended Away Lights id: run_extended_away_lights trigger: - platform: state entity_id: input_boolean.extended_away_mode to: 'on' - platform: state entity_id: input_boolean.nighttime to: 'off' - platform: state entity_id: sun.sun to: below_horizon - platform: homeassistant event: start condition: - condition: state entity_id: input_boolean.extended_away_mode state: 'on' - condition: state entity_id: input_boolean.nighttime state: 'off' - condition: state entity_id: sun.sun state: below_horizon action: - delay: seconds: '{{ range(2, 15) | random }}' - variables: group_id: light.away_lights max_on: 3 normal_lights: '{{ [''light.family_room_lamp'', ''light.office_lamp''] }}' group_lights_entities: '{{ expand(group_id) | map(attribute = ''entity_id'') | list }}' group_lights_filtered_entities: '{{ expand(group_id) | rejectattr(''entity_id'', ''in'', normal_lights) | map(attribute = ''entity_id'') | list }}' - service: input_boolean.turn_off entity_id: input_boolean.extended_away_early_return - repeat: sequence: - variables: lights_on_count: '{{ expand(group_id) | selectattr(''state'', ''eq'', ''on'') | list | length }}' lights_on_entities: '{{ expand(group_id) | selectattr(''state'', ''eq'', ''on'') | map(attribute = ''entity_id'') | list }}' toggle_entity: "{% if lights_on_count > max_on %}\n {{ lights_on_entities\ \ | random }}\n{% else %}\n {{ group_lights_entities | random }}\n{%\ \ endif %}\n" - service: homeassistant.toggle data: entity_id: '{{ toggle_entity }}' - wait_template: '{{ is_state(''input_boolean.extended_away_mode'', ''off'') }}' timeout: minutes: '{{ range(10, 60) | random }}' - if: - '{{ wait.completed }}' then: - service: input_boolean.turn_on entity_id: input_boolean.extended_away_early_return until: - condition: template value_template: "{{ is_state('input_boolean.extended_away_mode', 'off') or\n\ \ is_state('input_boolean.nighttime', 'on') or\n states('sun.sun') ==\ \ 'above_horizon' }}\n" - if: - condition: state entity_id: input_boolean.extended_away_early_return state: 'off' then: - service: homeassistant.turn_off entity_id: light.away_lights else: - service: homeassistant.turn_on data: entity_id: '{{ normal_lights }}' - service: homeassistant.turn_off data: entity_id: '{{ group_lights_filtered_entities }}' - alias: Turn Off Extended Away Mode id: turn_off_extended_away_mode trigger: - platform: template value_template: '{{ states(''sensor.home_jon_distance'') | int(0) < 13000 }}' condition: '{{ is_state(''sensor.home_jon_direction_of_travel'', ''towards'') }}' action: - service: script.turn_off_extended_away_mode - alias: Run Studio Motion Based Light id: run_studio_motion_based_light trace: stored_traces: 20 use_blueprint: path: lighting/motion_light_with_fan.yaml input: motion_entity: binary_sensor.studio_motion_detector_occupancy light_entity: light.studio_bath fan_entity: switch.studio_fan no_motion_wait_fan_off: 120 no_motion_wait_fan_on: 420 additional_fan_wait: 300 - alias: Run Laundry Room Motion Based Light id: run_laundry_room_motion_based_light trace: stored_traces: 20 use_blueprint: path: lighting/motion_light.yaml input: motion_entity: binary_sensor.laundry_room_motion_detector_occupancy light_target: entity_id: light.Laundry_room no_motion_wait: 180 - alias: Run Master Bath Motion Based Light id: run_master_bath_motion_based_light trace: stored_traces: 20 use_blueprint: path: lighting/motion_light_with_fan.yaml input: motion_entity: binary_sensor.master_bath_motion_detector_occupancy light_entity: light.master_vanity fan_entity: switch.master_bath_fan no_motion_wait_fan_off: 240 no_motion_wait_fan_on: 420 additional_fan_wait: 300 lux_entity: sensor.downstairs_sensor_ambient_light min_lux_value: '{{ states(''input_number.master_suite_ambient_min'') | float(0) }}' - alias: Control Attic Light id: control_attic_light use_blueprint: path: lighting/sensor_light.yaml input: sensor_entity: binary_sensor.attic_door_sensor_contact light_target: light.attic close_toggle: input_boolean.attic_door_close_toggle - alias: Control Upstairs Entry Light id: control_upstairs_entry_light use_blueprint: path: lighting/sensor_light.yaml input: sensor_entity: binary_sensor.upstairs_entry_sensor_contact light_target: light.penthouse_hall close_toggle: input_boolean.upstairs_entry_close_toggle - alias: Control Master Closet Light id: control_master_closet_light use_blueprint: path: lighting/sensor_light.yaml input: sensor_entity: binary_sensor.master_closet_sensor_contact light_target: light.master_closet - alias: Reset Attic Door Close Toggle id: reset_attic_door_close_toggle triggers: - trigger: state entity_id: light.attic from: 'on' to: 'off' actions: - delay: 00:00:01 - action: input_boolean.turn_off target: entity_id: input_boolean.attic_door_close_toggle - alias: Reset Upstairs Entry Close Toggle id: reset_upstairs_entry_close_toggle triggers: - trigger: state entity_id: light.penthouse_hall from: 'on' to: 'off' actions: - delay: 00:00:01 - action: input_boolean.turn_off target: entity_id: input_boolean.upstairs_entry_close_toggle - alias: Turn On Guest Lights At Dark id: turn_on_guest_lights_at_dark triggers: - trigger: template value_template: '{{ is_state_attr(''sun.sun'', ''rising'', false) and states(''sensor.downstairs_sensor_ambient_light'') | float(0) < states(''input_number.studio_bedroom_ambient_min'') | float(0) }}' - trigger: homeassistant event: start conditions: - condition: state entity_id: binary_sensor.children_home state: 'on' - condition: state entity_id: person.jon state: home - condition: state entity_id: input_boolean.nighttime state: 'off' - condition: template value_template: '{{ is_state_attr(''sun.sun'', ''rising'', false) and states(''sensor.downstairs_sensor_ambient_light'') | float(0) < states(''input_number.studio_bedroom_ambient_min'') | float(0) }}' actions: - delay: seconds: '{{ range(2, 15) | random }}' - action: script.operate_preferred_studio_lamps data: operation: 'on' - alias: Turn Off Studio Night Light id: turn_off_studio_night_light triggers: - trigger: time_pattern minutes: 1 conditions: - or: - condition: state entity_id: input_select.studio_guests state: Empty - '{{ states(''sensor.downstairs_sensor_ambient_light'') | float(0) >= states(''input_number.studio_bedroom_ambient_max'') | float(0) }}' actions: - action: light.turn_on target: entity_id: light.studio_night_light - delay: milliseconds: 200 - action: light.turn_off target: entity_id: light.studio_night_light - delay: seconds: 10 - if: - condition: state entity_id: light.studio_night_light state: 'on' then: - action: script.send_notification data: destination: - persistent title: Lighting Alert message: Studio night light is still on. Perhaps millisecond delay is too short. notification_id: studio_night_light_on - alias: Turn On Outdoor Christmas Lights id: turn_on_outdoor_christmas_lights triggers: - trigger: template value_template: '{{ states(''input_boolean.christmas_mode'') == ''on'' and states(''input_boolean.christmas_outdoor'') == ''on'' and states(''sun.sun'') == ''below_horizon'' }}' actions: - action: light.turn_on target: entity_id: light.christmas_outdoor - alias: Control All Day Christmas Lights id: control_all_day_christmas_lights triggers: - trigger: time at: 07:30:00 id: morning - trigger: time at: '22:30:00' id: night - trigger: homeassistant event: start id: start conditions: - or: - and: - condition: state entity_id: person.jon state: home - condition: template value_template: '{{ trigger.id != ''night'' }}' - condition: time after: 07:30:00 before: '22:29:59' - condition: state entity_id: binary_sensor.all_day_christmas_lights state: 'on' - and: - condition: template value_template: '{{ trigger.id != ''morning'' }}' - condition: time after: '22:30:00' before: 07:29:59 - condition: state entity_id: binary_sensor.all_day_christmas_lights state: 'on' actions: - delay: seconds: '{{ range(2, 15) | random }}' - if: - condition: time after: 07:30:00 before: '22:29:59' then: - action: automation.turn_off entity_id: automation.control_christmas_lights - action: script.turn_on_christmas_lights - action: light.turn_off target: entity_id: light.family_room_lamp else: - action: script.turn_off_christmas_lights - action: automation.turn_on entity_id: automation.control_christmas_lights - alias: Reset Christmas Plugs id: reset_christmas_plugs triggers: - trigger: state entity_id: input_boolean.christmas_mode to: 'off' actions: - variables: christmas_plugs: '{{ expand(state_attr(''group.christmas_plugs'', ''entity_id'')) | map(attribute = ''entity_id'') | list }}' - repeat: for_each: '{{ christmas_plugs }}' sequence: - action: input_boolean.turn_off target: entity_id: '{{ repeat.item }}' - alias: Turn On Office Bookcase Via Alexa id: turn_on_office_bookcase_via_alexa trigger: - platform: state entity_id: input_boolean.alexa_ha_plug to: 'on' action: - service: media_player.play_media target: entity_id: media_player.family_room_echo data: media_content_id: HA Office Bookcase On media_content_type: routine metadata: {} - alias: Turn Off Office Bookcase Via Alexa id: turn_off_office_bookcase_via_alexa trigger: - platform: state entity_id: input_boolean.alexa_ha_plug to: 'off' action: - service: media_player.play_media target: entity_id: media_player.family_room_echo data: media_content_id: HA Office Bookcase Off media_content_type: routine metadata: {} - alias: Stop Bath Time id: stop_bath_time trigger: - platform: event event_type: timer.finished event_data: entity_id: timer.bath_time action: - service: automation.turn_on entity_id: automation.run_studio_motion_based_light - alias: Handle Guest Arrival id: handle_guest_arrival mode: queued triggers: - trigger: state entity_id: - person.david - person.sarah - person.mike to: home id: adult - trigger: state entity_id: - person.skylar to: home id: child actions: - variables: guest: '{{ trigger.to_state.attributes.friendly_name }}' suite: '{{ states(''input_select.'' ~ guest | lower ~ ''_guest_suite'') }}' - if: - '{{ guest != ''Mike'' or now().hour >= 16 }}' then: - action: script.add_guest_to_suite data: guest: '{{ guest }}' suite: '{{ suite }}' - if: - '{{ trigger.id == ''adult'' }}' then: - action: script.turn_on target: entity_id: script.open_garage_door_north data: variables: use_info_message: true - if: - condition: state entity_id: sun.sun state: below_horizon then: - action: light.turn_on target: entity_id: - light.driveway - light.front_floodlight - action: timer.start data: entity_id: timer.guest_arrival_cleanup duration: 00:30:00 - alias: Handle Guest Departure id: handle_guest_departure mode: queued triggers: - trigger: state entity_id: - person.david - person.sarah - person.mike from: home id: adult - trigger: state entity_id: - person.skylar from: home id: child actions: - variables: guest: '{{ trigger.to_state.attributes.friendly_name }}' suite: '{{ iif(guest in states(''input_select.studio_guests''), ''Studio'', ''Penthouse'') }}' - action: script.remove_guest_from_suite data: guest: '{{ guest }}' suite: '{{ suite }}' - if: - '{{ trigger.id == ''adult'' }}' then: - action: script.turn_on target: entity_id: script.close_garage_door_north data: variables: use_info_message: true - action: light.turn_off target: entity_id: light.outdoor_lights - alias: Modify Occupied Guest Suites id: modify_occupied_guest_suites mode: queued triggers: - trigger: state entity_id: input_select.david_guest_suite to: null id: David - trigger: state entity_id: input_select.mike_guest_suite to: null id: Mike - trigger: state entity_id: input_select.sarah_guest_suite to: null id: Sarah - trigger: state entity_id: input_select.skylar_guest_suite to: null id: Skylar actions: - condition: '{{ is_state(''person.'' ~ trigger.id | lower, ''home'') }}' - action: script.remove_guest_from_suite data: guest: '{{ trigger.id }}' suite: '{{ trigger.from_state.state }}' - action: script.add_guest_to_suite data: guest: '{{ trigger.id }}' suite: '{{ trigger.to_state.state }}' - if: - condition: state entity_id: input_boolean.switch_guest_suites state: 'on' then: - event: switch_guest_suites_complete - alias: Modify Thermostat Hold Metrics id: modify_thermostat_hold_metrics mode: queued triggers: - trigger: state entity_id: input_number.penthouse_nights_occupied to: null id: nights - trigger: state entity_id: sensor.david_temp_range to: null id: david - trigger: state entity_id: sensor.mike_temp_range to: null id: mike - trigger: state entity_id: sensor.sarah_temp_range to: null id: sarah - trigger: state entity_id: sensor.skylar_temp_range to: null id: skylar conditions: - or: - '{{ trigger.id == ''nights'' and is_state(''binary_sensor.penthouse_occupied'', ''on'') }}' - '{{ trigger.id != ''nights'' and trigger.id | title in states(''input_select.penthouse_guests'') }}' actions: - if: - condition: state entity_id: timer.thermostat_metrics_delay state: idle then: - action: timer.start data: entity_id: timer.thermostat_metrics_delay duration: minutes: '{{ states(''input_number.thermostat_metrics_delay_minutes'') }}' - action: input_boolean.turn_on target: entity_id: input_boolean.thermostat_metrics_delay_timer_started - alias: Handle Thermostat Metrics Delay Timer Expiration id: handle_thermostat_metrics_delay_timer_expiration triggers: - trigger: event event_type: timer.finished event_data: entity_id: timer.thermostat_metrics_delay - trigger: homeassistant event: start conditions: - condition: state entity_id: timer.thermostat_metrics_delay state: idle - condition: state entity_id: input_boolean.thermostat_metrics_delay_timer_started state: 'on' actions: - action: script.modify_penthouse_thermostat_hold - action: input_boolean.turn_off target: entity_id: input_boolean.thermostat_metrics_delay_timer_started - alias: Handle Thermostat Hold Delay Timer Expiration id: handle_thermostat_hold_delay_timer_expiration triggers: - trigger: event event_type: timer.finished event_data: entity_id: timer.thermostat_hold_delay - trigger: homeassistant event: start conditions: - condition: state entity_id: timer.thermostat_hold_delay state: idle - condition: state entity_id: input_boolean.thermostat_hold_delay_timer_started state: 'on' actions: - action: script.set_penthouse_thermostat_hold - action: input_boolean.turn_off target: entity_id: input_boolean.thermostat_hold_delay_timer_started - alias: Modify Active Studio Lamps id: modify_active_studio_lamps triggers: - trigger: state entity_id: input_select.preferred_studio_lamps to: null conditions: '{{ is_state(''binary_sensor.studio_occupied'', ''on'') and states(''sensor.downstairs_sensor_ambient_light'') | float(0) < states(''input_number.studio_bedroom_ambient_min'') | float(0) }}' actions: - variables: preference: '{{ states(''input_select.preferred_studio_lamps'') }}' sarah_s_lamp_operation: '{{ iif(preference in [''Sarah\''s'', ''Both''], ''on'', ''off'') }} ' skylar_s_lamp_operation: '{{ iif(preference in [''Skylar\''s'', ''Both''], ''on'', ''off'') }} ' - action: light.turn_{{ sarah_s_lamp_operation }} target: entity_id: light.sarah_s_lamp - action: light.turn_{{ skylar_s_lamp_operation }} target: entity_id: light.skylar_s_lamp - alias: Toggle Virtual Device Tracker id: toggle_virtual_device_tracker mode: queued triggers: - trigger: state entity_id: - input_boolean.virtual_david - input_boolean.virtual_maryam - input_boolean.virtual_mike - input_boolean.virtual_sarah - input_boolean.virtual_skylar to: null actions: - variables: new_state: "{% if trigger.to_state.state == 'on' %}\n home\n{% else %}\n not_home\n\ {% endif %}\n" topic_suffix: '{{ trigger.to_state.entity_id | replace(''input_boolean.'', '''') }}' - action: mqtt.publish data: topic: '{{ ''homeassistant/device_tracker/'' ~ topic_suffix }}' payload: '{{ new_state }}' - alias: Toggle Jon Phone Stationary Tracker id: toggle_jon_phone_stationary_tracker use_blueprint: path: devices/update_phone_tracker.yaml input: wifi_entity: sensor.jon_galaxy_wifi_connection ssid: White Rabbit topic_suffix: jon_phone_stationary - alias: Toggle Mike Phone Stationary Tracker id: toggle_mike_phone_stationary_tracker use_blueprint: path: devices/update_phone_tracker.yaml input: wifi_entity: sensor.mike_galaxy_wifi_connection ssid: White Rabbit topic_suffix: mike_phone_stationary - alias: Toggle Sarah Phone Stationary Tracker id: toggle_sarah_phone_stationary_tracker use_blueprint: path: devices/update_phone_tracker.yaml input: wifi_entity: sensor.sarah_pixel_wi_fi_connection ssid: White Rabbit topic_suffix: sarah_phone_stationary - alias: Toggle David Phone Stationary Tracker id: toggle_david_phone_stationary_tracker use_blueprint: path: devices/update_phone_tracker.yaml input: wifi_entity: sensor.david_s_latest_phone_wi_fi_connection ssid: White Rabbit topic_suffix: david_phone_stationary - alias: Handle Child Tag Scan id: handle_child_tag_scan triggers: - trigger: tag tag_id: 0c6d2dfd-4ad7-4281-9ec0-54756ed2d539 id: skylar - trigger: state entity_id: input_button.skylar_tag_scan id: skylar_simulated actions: - variables: tracker_entity: '{{ ''device_tracker.'' ~ trigger.id.split(''_'')[0] ~ ''_nfc_tag'' }}' new_state: "{% if states(tracker_entity) != 'home' %}\n home\n{% else %}\n\ \ not_home\n{% endif %}\n" topic_suffix: '{{ tracker_entity.split(''.'')[1] }}' toggle_action: '{{ iif(new_state == ''home'', ''on'', ''off'') }}' - action: mqtt.publish data: topic: '{{ ''homeassistant/device_tracker/'' ~ topic_suffix }}' payload: '{{ new_state }}' - alias: Set Sleep Start id: set_sleep_start triggers: - trigger: state entity_id: binary_sensor.jon_sleeping to: 'on' actions: - action: input_datetime.set_datetime target: entity_id: input_datetime.sleep_start data: datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}' - alias: Handle Jon Awake id: handle_jon_awake triggers: - trigger: state entity_id: binary_sensor.jon_sleeping from: 'on' to: 'off' actions: - variables: duration: '{{ ((as_timestamp(now().strftime(''%Y-%m-%d %H:%M:%S'')) - as_timestamp(states(''input_datetime.sleep_start''))) / 3600) | round(2) }}' echo_list: '{{ expand(integration_entities(''alexa_media'') | select(''search'', ''media_player'')) | rejectattr(''attributes.friendly_name'', ''in'', [''This Device'', ''Everywhere'']) | map(attribute = ''entity_id'') | list }}' - action: input_boolean.turn_off entity_id: - input_boolean.nighttime - input_boolean.sleeptime - action: script.turn_on target: entity_id: script.reset_bedtime_environment - action: input_number.set_value target: entity_id: input_number.sleep_duration data: value: '{{ duration }}' - delay: milliseconds: 500 - variables: normal_volume: 0.5 quiet_volume: 0.3 - repeat: for_each: '{{ echo_list }}' sequence: - variables: volume: '{{ iif((repeat.item).split(''.'')[1] == ''master_bedroom_echo'', quiet_volume, normal_volume) }}' - if: - '{{ not is_state_attr(repeat.item, ''volume_level'', volume) }}' then: - action: media_player.volume_set target: entity_id: '{{ repeat.item }}' data: volume_level: '{{ volume }}' - repeat: until: '{{ is_state(''switch.master_bedroom_echo_do_not_disturb_switch'', ''off'') }}' sequence: - event: unused_event - delay: milliseconds: 10 - variables: time: '{{ states(''sensor.sleep_duration_display'') }}' hours: '{{ time.split('':'')[0] | int(0) }}' minutes: '{{ time.split('':'')[1] | int(0) }}' hours_str: '{{ iif(hours == 1, ''hour'', ''hours'') }}' minutes_str: '{{ iif(minutes == 1, ''minute'', ''minutes'') }}' keys: '{{ state_attr(''sensor.mobile_tag_registry_keys'', ''tags'') }}' calendar: '{{ iif(''calendar_appointment'' in keys or ''calendar_home'' in keys, true, false) }}' - action: script.send_notification data: destination: - voice_assistant message: "{% set msg = 'Good morning. You slept ' ~ hours ~ ' ' ~ hours_str\ \ ~ iif(minutes | int(0) > 0, ' and ' ~ minutes ~ ' ' ~ minutes_str ~ '.',\ \ '.') %} {% if calendar == true %}\n {% set msg = msg + ' Also, check your\ \ phone for upcoming calendar items.' %}\n{% endif %}\n{{ msg }}\n" room: - master_bedroom voice_type: tts - if: - condition: numeric_state entity_id: sensor.downstairs_sensor_ambient_light below: input_number.family_room_ambient_max then: - action: scene.turn_on target: entity_id: scene.voice_assistants_on_dim else: - action: scene.turn_on target: entity_id: scene.voice_assistants_on_bright - wait_template: '{{ is_state(''script.modify_master_suite'', ''off'') }}' - action: media_player.volume_set target: entity_id: media_player.master_bedroom_echo data: volume_level: '{{ normal_volume }}' - action: script.turn_on_lights_per_conditions data: light_entity: light.kitchen_island lux_entity: sensor.downstairs_sensor_ambient_light min_lux_value: '{{ states(''input_number.kitchen_ambient_min'') | float(0) }}' - alias: Resume Cinema id: resume_cinema trace: stored_traces: 20 trigger: - platform: state entity_id: media_player.shield_tv from: - paused - idle to: playing for: 00:00:02 condition: - condition: state entity_id: input_boolean.theater_open state: 'on' action: - service: script.restore_lighting_on_resume - alias: Close Cinema id: close_cinema trigger: - platform: state entity_id: sensor.harmony_hub to: PowerOff condition: - condition: state entity_id: input_boolean.theater_open state: 'on' action: - service: script.close_cinema - alias: Handle Cinema Usage Delay id: handle_cinema_usage_delay trigger: - platform: event event_type: timer.finished event_data: entity_id: timer.cinema_usage_delay action: - if: - '{{ states(''input_boolean.theater_open'') == ''off'' }}' then: - service: script.open_cinema else: - service: script.close_cinema - alias: Handle Projector Error id: handle_projector_error triggers: - trigger: event event_type: system_log_event event_data: name: custom_components.epson_projector_link.projector.projector level: ERROR conditions: '{{ ''Lamp ON failure'' in trigger.event.data.message[0] }}' actions: - variables: delay_time: 00:02:30 - action: input_boolean.turn_on target: entity_id: input_boolean.projector_error_handling - action: script.send_notification data: destination: - voice_assistant message: Projector lamp error detected. Please wait a few minutes while I try to fix it. room: - family_room - theater voice_type: announce - delay: '{{ delay_time }}' - action: script.send_notification data: destination: - voice_assistant message: I'm resetting the projector. room: - family_room - theater voice_type: tts - action: input_boolean.turn_on entity_id: input_boolean.projector_plug_powered_off - action: switch.turn_off entity_id: switch.projector - delay: 00:00:30 - action: switch.turn_on entity_id: switch.projector - delay: 00:00:01 - action: input_boolean.turn_off entity_id: input_boolean.projector_plug_powered_off - action: script.send_notification data: destination: - voice_assistant message: I'm turning the projector back on. Keep your fingers crossed! room: - family_room - theater voice_type: tts - delay: 00:00:05 - action: remote.send_command entity_id: remote.harmony_hub data: command: PowerOn device: Epson Projector - wait_template: '{{ states(''media_player.epson_projector'') in [''warmup'', ''on''] or is_state(''input_boolean.projector_active'', ''on'') }}' timeout: '{{ delay_time }}' - if: - '{{ states(''media_player.epson_projector'') in [''warmup'', ''on''] or is_state(''input_boolean.projector_active'', ''on'') }}' then: - action: input_boolean.turn_off target: entity_id: input_boolean.projector_error_handling - alias: Toggle Projector Active id: toggle_projector_active triggers: - trigger: numeric_state entity_id: sensor.projector_power above: 250 for: seconds: 10 id: 'on' - trigger: numeric_state entity_id: sensor.projector_power below: 250 for: seconds: 10 id: 'off' actions: - variables: projector_state1: '{{ states(''media_player.epson_projector'') }}' projector_error1: '{{ states(''input_boolean.projector_error_handling'') }}' projector_active1: '{{ states(''input_boolean.projector_active'') }}' - action: input_boolean.turn_{{ trigger.id }} target: entity_id: input_boolean.projector_active - delay: 00:00:01 - variables: projector_state2: '{{ states(''media_player.epson_projector'') }}' projector_error2: '{{ states(''input_boolean.projector_error_handling'') }}' projector_active2: '{{ states(''input_boolean.projector_active'') }}' - action: system_log.write data: message: '{{ ''Projector active changed from '' ~ projector_active1 ~ '' to '' ~ projector_active2 }}' level: info - alias: Determine Projector State id: determine_projector_state triggers: - trigger: template value_template: '{{ (states(''media_player.epson_projector'') in [''warmup'', ''on''] and is_state(''input_boolean.projector_error_handling'', ''off'')) or is_state(''input_boolean.projector_active'', ''on'') }}' id: success - trigger: event event_type: timer.finished event_data: entity_id: timer.projector_status id: failure actions: - if: - '{{ trigger.id == ''success'' }}' then: - action: timer.cancel target: entity_id: timer.projector_status - action: script.turn_on entity_id: script.perform_post_open_tasks else: - if: - '{{ not (states(''media_player.epson_projector'') in [''warmup'', ''on''] and is_state(''input_boolean.projector_error_handling'', ''off'')) or is_state(''input_boolean.projector_active'', ''on'') }}' then: - action: script.send_notification data: destination: - voice_assistant message: I'm sorry, but I failed to fix a projector lamp error. room: - family_room - theater voice_type: announce - alias: Log Projector State id: log_projector_state triggers: - trigger: state entity_id: media_player.epson_projector to: null actions: - action: system_log.write data: message: '{{ ''Projector state changed from '' ~ trigger.from_state.state ~ '' to '' ~ trigger.to_state.state }}' level: info - alias: Initialize Turn On Volume id: initialize_turn_on_volume trigger: - platform: state entity_id: media_player.marantz_sr7012 from: 'off' to: 'on' action: - delay: 00:00:30 - service: media_player.volume_set data: entity_id: media_player.marantz_sr7012 volume_level: 0.6 - alias: Initialize Application Volume id: initialize_application_volume trigger: - platform: state entity_id: input_number.selected_app_volume to: null action: - variables: selected_app: '{{ states(''input_select.volume_application'').replace('' '', ''_'') | lower }}' selected_app_volume_entity: '{{ ''input_number.'' ~ selected_app ~ ''_volume'' }}' - service: script.set_application_volume data: volume_entity: '{{ selected_app_volume_entity }}' volume: '{{ trigger.to_state.state }}' - alias: Initialize Amazon Prime Volume id: initialize_amazon_prime_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: Amazon Prime - alias: Initialize AMC Plus Volume id: initialize_amc_plus_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: AMC+ - alias: Initialize Disney Plus Volume id: initialize_disney_plus_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: Disney+ - alias: Initialize ESPN Volume id: initialize_espn_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: ESPN - alias: Initialize HBO Max Volume id: initialize_hbo_max_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: HBO Max - alias: Initialize Hulu Volume id: initialize_hulu_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: Hulu - alias: Initialize Kodi Volume id: initialize_kodi_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: Kodi - alias: Initialize Netflix Volume id: initialize_netflix_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: Netflix - alias: Initialize Paramount Plus Volume id: initialize_paramount_plus_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: Paramount+ - alias: Initialize Peacock Volume id: initialize_peacock_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: Peacock - alias: Initialize Youtube TV Volume id: initialize_youtube_tv_volume use_blueprint: path: theater/shield_app_volume.yaml input: appl_name: Youtube TV - alias: Initialize Bluray Volume id: initialize_bluray_volume use_blueprint: path: theater/harmony_device_volume.yaml input: device_name: BD Player - alias: Initialize Laserdisc Volume id: initialize_laserdisc_volume use_blueprint: path: theater/harmony_device_volume.yaml input: device_name: LD Player - alias: Save Feature Movie Name id: save_feature_movie_name trigger: - platform: state entity_id: input_select.kodi_movies condition: - condition: state entity_id: input_boolean.kodi_movie_list_restoration state: 'off' - '{{ ( trigger.to_state.state ) != ( ''Select'' ) and ( trigger.to_state.state ) != ( ''unknown'' ) }}' action: - service: system_log.write data: message: 'feature movie name: ''{{ trigger.to_state.state }}''' level: debug - service: input_text.set_value data_template: entity_id: input_text.current_feature value: '{{ ( trigger.to_state.state ) }}' - alias: Process Kodi Command Result id: process_kodi_command_result mode: queued triggers: - trigger: event event_type: kodi_call_method_result event_data: result_ok: true input: method: VideoLibrary.GetMovies id: movies - trigger: event event_type: kodi_call_method_result event_data: result_ok: true input: method: VideoLibrary.GetMusicVideos id: videos - trigger: event event_type: kodi_call_method_result event_data: result_ok: true input: method: VideoLibrary.GetMovieSets id: sets - trigger: event event_type: kodi_call_method_result event_data: result_ok: false id: bad actions: - choose: - conditions: '{{ trigger.id == ''movies'' }}' sequence: - choose: - conditions: '{{ trigger.event.data.result.limits.total == 1 }}' sequence: - action: script.process_single_kodi_movie_result data: result: '{{ trigger.event.data.result }}' - conditions: '{{ trigger.event.data.result.limits.total > 1 }}' sequence: - action: script.process_all_kodi_movies_result data: result: '{{ trigger.event.data.result }}' default: - action: system_log.write data: message: Kodi GetMovies command returned 0 results. level: warning - conditions: '{{ trigger.id == ''videos'' }}' sequence: - action: script.process_kodi_videos_result data: result: '{{ trigger.event.data.result }}' - conditions: '{{ trigger.id == ''sets'' }}' sequence: - action: input_boolean.turn_on target: entity_id: input_boolean.kodi_activated default: - action: system_log.write data: message: Kodi {{ trigger.event.data.input.method }} call failed. level: warning - alias: Handle Kodi Video Call Error id: handle_kodi_video_call_error triggers: - trigger: event event_type: system_log_event event_data: name: homeassistant.components.kodi.media_player level: WARNING conditions: - '{{ ''TransportError trying to run API method media_player.kodi.VideoLibrary.GetMusicVideos'' in trigger.event.data.message[0] }}' actions: - action: input_boolean.turn_on data: entity_id: input_boolean.kodi_video_call_error - alias: Update Last Alexa Device id: update_last_alexa_device mode: queued triggers: - trigger: state entity_id: - media_player.family_room_echo - media_player.master_bedroom_echo - media_player.office_echo - media_player.penthouse_echo - media_player.studio_echo - media_player.theater_echo attribute: last_called to: true actions: - event: update_last_alexa_sensor - alias: Update Last Nabu Device id: update_last_nabu_device triggers: - trigger: state entity_id: - assist_satellite.family_room_nabu_assist_satellite - assist_satellite.office_nabu_assist_satellite - assist_satellite.studio_nabu_assist_satellite - assist_satellite.theater_nabu_assist_satellite from: listening to: processing actions: - if: - '{{ states(''input_text.last_nabu_device'') == trigger.entity_id }}' then: - action: input_text.set_value target: entity_id: input_text.last_nabu_device data: value: reset - action: input_text.set_value target: entity_id: input_text.last_nabu_device data: value: '{{ trigger.entity_id }}'