- mode: single alias: Alexroom Light Switch id: alexroom_light_switch description: Handle actions from the Senic Wall Switch in the lalexroom triggers: - trigger: state entity_id: - sensor.senic_wall_switch_alexroom_action from: null to: press_1 - trigger: state entity_id: - sensor.senic_wall_switch_alexroom_action from: null to: press_2 - trigger: state entity_id: - sensor.senic_wall_switch_alexroom_action from: null to: press_3 - trigger: state entity_id: - sensor.senic_wall_switch_alexroom_action from: null to: press_4 - trigger: state entity_id: - sensor.aqara_switch_alexroom_action from: null to: single - trigger: state entity_id: - sensor.aqara_switch_alexroom_action from: null to: double conditions: [] actions: - choose: - conditions: - condition: template value_template: "{{\n states.sensor.senic_wall_switch_alexroom_action.state\ \ == 'press_2'\n}}" sequence: - action: switch.toggle target: entity_id: switch.shelly_1gen4_light_alexroom - action: system_log.write data: level: info message: Light toggled by Senic Wall Switch logger: homeassistant.components.automation.alexroom_light_switch - conditions: - condition: template value_template: "{{\n states.sensor.aqara_switch_alexroom_action.state ==\ \ 'single'\n or states.sensor.aqara_switch_alexroom_action.state == 'double'\n\ }}" sequence: - action: switch.toggle target: entity_id: switch.shelly_1gen4_light_alexroom - action: system_log.write data: level: info message: Light toggled by Aqara Button Switch logger: homeassistant.components.automation.alexroom_light_switch - alias: Alexroom Nanoleaf Lines id: alexroom_nanoleaf_lines description: Turn on the nanoleaf lines when power consumption is above 50W mode: single triggers: - trigger: numeric_state entity_id: - sensor.aqara_wall_outlet_alexroom_power above: 40 - trigger: numeric_state entity_id: - sensor.aqara_wall_outlet_alexroom_power for: seconds: 10 below: 40 actions: - choose: - conditions: - condition: numeric_state entity_id: sensor.aqara_wall_outlet_alexroom_power above: 40 sequence: - action: light.turn_on target: entity_id: light.lines_5c30 - conditions: - condition: numeric_state entity_id: sensor.aqara_wall_outlet_alexroom_power below: 40 sequence: - action: light.turn_off target: entity_id: light.lines_5c30 - alias: basement_light id: basement_light description: Turn on the basement light when motion is detected mode: single triggers: - trigger: state entity_id: - group.motion_basement to: 'on' - trigger: state entity_id: - group.motion_basement to: 'off' for: minutes: 10 - trigger: time at: 08:00:01 - trigger: time at: '23:00:01' conditions: [] actions: - choose: - conditions: - condition: state entity_id: group.motion_basement state: 'on' - condition: time after: 08:00:00 before: '23:00:00' - condition: or conditions: - condition: state entity_id: light.gledopto_dimmer_stairs_basement state: 'off' - condition: state entity_id: light.basement state: 'off' - condition: numeric_state entity_id: light.basement attribute: brightness below: 235 above: 235 sequence: - action: light.turn_on target: entity_id: - light.gledopto_dimmer_stairs_basement data: brightness: 255 - action: scene.turn_on target: entity_id: scene.basement_working - action: system_log.write data: level: info message: scene.basement_working turned on logger: homeassistant.components.automation.basement_light - conditions: - condition: state entity_id: group.motion_basement state: 'on' - condition: time after: '23:00:00' before: 08:00:00 - condition: or conditions: - condition: state entity_id: light.gledopto_dimmer_stairs_basement state: 'off' - condition: state entity_id: light.basement state: 'off' - condition: numeric_state entity_id: light.basement attribute: brightness below: 115 above: 115 sequence: - action: light.turn_on target: entity_id: - light.gledopto_dimmer_stairs_basement data: brightness: 255 - action: scene.turn_on target: entity_id: scene.basement_relax - action: system_log.write data: level: info message: scene.basement_relax turned on logger: homeassistant.components.automation.basement_light - conditions: - condition: state entity_id: group.motion_basement state: 'off' for: hours: 0 minutes: 10 seconds: 0 - condition: or conditions: - condition: state entity_id: light.gledopto_dimmer_stairs_basement state: 'on' - condition: state entity_id: light.basement state: 'on' sequence: - action: light.turn_off target: entity_id: - light.basement - light.gledopto_dimmer_stairs_basement - action: system_log.write data: level: info message: light.basement turned off logger: homeassistant.components.automation.basement_light - alias: Basement Power on Light Relay if off id: basement_light_relay description: Turn on the basement light relay if it is off mode: single triggers: - trigger: state entity_id: - switch.switch_basement_relay to: 'off' conditions: [] actions: - action: switch.turn_on data: {} target: entity_id: switch.switch_basement_relay - alias: bathroom_nanoleaf id: bathroom_nanoleaf description: Bathroom Nanoleaf Skylight motion automation mode: single triggers: - trigger: state entity_id: - binary_sensor.sensor_bathroom_sr501_pir_motion to: 'on' - trigger: state entity_id: - binary_sensor.sensor_bathroom_sr501_pir_motion to: 'off' for: hours: 0 minutes: 10 seconds: 0 conditions: [] actions: - choose: - conditions: - condition: state entity_id: binary_sensor.sensor_bathroom_sr501_pir_motion state: 'on' - condition: time after: 08:00:00 before: 00:00:00 - condition: state entity_id: light.skylight_8a41 state: 'off' sequence: - action: light.turn_on target: entity_id: light.skylight_8a41 data: brightness: 255 - action: system_log.write data: level: info message: light.skylight_8a41 turned on (brightness=255) logger: homeassistant.components.automation.bathroom_nanoleaf - conditions: - condition: state entity_id: binary_sensor.sensor_bathroom_sr501_pir_motion state: 'on' - condition: time after: 00:00:00 before: 08:00:00 - condition: state entity_id: light.skylight_8a41 state: 'off' sequence: - action: light.turn_on target: entity_id: light.skylight_8a41 data: brightness: 77 - action: system_log.write data: level: info message: light.skylight_8a41 turned on (brightness=77) logger: homeassistant.components.automation.bathroom_nanoleaf - conditions: - condition: state entity_id: binary_sensor.sensor_bathroom_sr501_pir_motion state: 'off' for: hours: 0 minutes: 10 seconds: 0 - condition: state entity_id: light.skylight_8a41 state: 'on' sequence: - action: light.turn_off target: entity_id: light.skylight_8a41 - action: system_log.write data: level: info message: light.skylight_8a41 turned off logger: homeassistant.components.automation.bathroom_nanoleaf - alias: Bedroom Aqara Switches id: bedroom_aqara_switches description: 'Controls skylight with Aqara switches - single press toggles light, double press cycles between brightness levels ' mode: queued max_exceeded: silent trigger: - platform: state entity_id: - sensor.aqara_switch_bedroom_1_action - sensor.aqara_switch_bedroom_2_action condition: - condition: template value_template: '{{ trigger.to_state.state in [''single'', ''double''] }} ' variables: action_type: '{{ trigger.to_state.state }}' current_brightness: '{{ state_attr(''light.skylight_9aa7'', ''brightness'') | default(120) }}' action: - choose: - conditions: - condition: template value_template: '{{ action_type == ''single'' }}' sequence: - service: light.toggle target: entity_id: light.skylight_9aa7 - conditions: - condition: template value_template: '{{ action_type == ''double'' }}' sequence: - choose: - conditions: - condition: template value_template: '{{ current_brightness >= 50 }}' sequence: - service: light.turn_on target: entity_id: light.skylight_9aa7 data: brightness: 50 - conditions: - condition: template value_template: '{{ current_brightness < 50 }}' sequence: - service: light.turn_on target: entity_id: light.skylight_9aa7 data: brightness: 120 - alias: Bedroom Galaxy Light Projector Auto On id: bedroom_galaxy_light_projector_auto_on description: 'Automatically turns on the bedroom galaxy light projector after 5 minutes when the door is closed after 22:00. ' mode: single trigger: - platform: state entity_id: binary_sensor.aqara_contact_door_bedroom_contact to: 'off' for: minutes: 5 condition: - condition: template value_template: "{{\n states('sensor.galaxy_projector_bedroom_lock_status') !=\ \ 'locked'\n and states('light.galaxy_light_projector_2') == 'off'\n and states('binary_sensor.aqara_contact_door_bedroom_contact')\ \ == 'off'\n and (now().hour >= 22 or now.hour <= 1)\n}}\n" action: - service: rest_command.create_lock data: name: bedroom_galaxy_light_projector owner: homeassistant-automation duration: 9h - service: light.turn_on target: entity_id: light.galaxy_light_projector_2 - service: system_log.write data: level: info message: Bedroom Galaxy Light Projector turned on after door closed at night. logger: homeassistant.components.automation.bedroom_galaxy_light_projector_auto_on - alias: Bedroom Power on Light Relay if off id: bedroom_light_relay description: Turn on the bedroom light relay if it is off mode: single triggers: - trigger: state entity_id: - switch.aqara_wall_switch_bedroom to: 'off' conditions: [] actions: - action: switch.turn_on data: {} target: entity_id: switch.aqara_wall_switch_bedroom - alias: Climate Bedroom Auto Off At Night id: climate_bedroom_auto_off_at_night description: 'Automatically turns off the bedroom AC after 23:00 ' mode: single trigger: - platform: time_pattern minutes: /5 condition: - condition: template value_template: "{{\n states('climate.bedroom') == 'cool'\n and states('sensor.hisense_ac_bedroom_automation_block_status')\ \ == 'allowed'\n and (now().hour >= 23 or now().hour < 6)\n}}\n" actions: - action: rest_command.release_lock data: name: hisense_ac_bedroom - action: climate.turn_off target: entity_id: climate.bedroom - action: system_log.write data: level: info message: Bedroom AC turned off after 23:00. logger: homeassistant.components.automation.climate_bedroom_auto_off_at_night - alias: Climate Bedroom Auto Off on Target Temp id: climate_bedroom_auto_off_on_target_temp description: 'Automatically turns off the bedroom AC when the temperature drops below 22°C and the minimum run time has been met. ' mode: single trigger: - platform: time_pattern minutes: /5 - platform: numeric_state entity_id: sensor.qingping_bedroom_temperature below: 22 for: minutes: 5 condition: - condition: template value_template: "{% set ac_start_timestamp = as_timestamp(states.input_datetime.climate_bedroom_start_time.state)\ \ %} {% set current_timestamp = now().timestamp() %} {% set ac_run_time = (current_timestamp\ \ - ac_start_timestamp) / 60 %} {{\n states('climate.bedroom') == 'cool'\n\ \ and states('sensor.qingping_bedroom_temperature') | float <= 22\n and ac_run_time\ \ > 30\n}}\n" actions: - action: rest_command.release_lock data: name: hisense_ac_bedroom - action: rest_command.create_lock data: name: hisense_ac_bedroom owner: homeassistant-automation duration: 20m - action: climate.turn_off target: entity_id: climate.bedroom - action: system_log.write data: level: info message: Bedroom AC turned off due to target temp reached. logger: homeassistant.components.automation.climate_bedroom_auto_off_on_target_temp - alias: Climate Bedroom Auto Off on Window Open id: climate_bedroom_auto_off_on_window_open description: 'Automatically turns off the bedroom AC when the window is open for more than 5 minutes. The automation checks every 5 minutes and respects the state of the climate and window sensors. ' mode: single trigger: - platform: time_pattern minutes: /5 - platform: state entity_id: binary_sensor.aqara_contact_window_bedroom_contact to: 'on' for: minutes: 5 condition: - condition: template value_template: "{% set last_changed = states.binary_sensor.aqara_contact_window_bedroom_contact.last_changed\ \ %} {{\n states('climate.bedroom') == 'on'\n and states('binary_sensor.aqara_contact_window_bedroom_contact')\ \ == 'on'\n and last_changed is not none\n and (as_timestamp(now()) - as_timestamp(last_changed))\ \ > 300\n}}\n" action: - choose: - conditions: - condition: state entity_id: binary_sensor.aqara_contact_window_bedroom_contact state: 'on' - condition: template value_template: "{% set last_changed = states.binary_sensor.aqara_contact_window_bedroom_contact.last_changed\ \ %} {{\n last_changed is not none\n and (as_timestamp(now()) - as_timestamp(last_changed))\ \ > 300\n}}\n" sequence: - service: rest_command.release_lock data: name: hisense_ac_bedroom - service: climate.turn_off target: entity_id: climate.bedroom - service: system_log.write data: level: info message: Bedroom AC turned off due to open window for more than 5 minutes logger: homeassistant.components.automation.climate_bedroom_auto_off - alias: Bedroom AC Auto On id: climatge_bedroom_auto_on description: 'Automatically turns on the bedroom AC when the temperature is above 23°C, the window is closed, and the weather forecast temperature is above 25°C. The automation checks every 5 minutes and respects time constraints. ' mode: single trigger: - platform: time_pattern minutes: /5 condition: - condition: template value_template: "{% set current_time = now() %} {% set is_weekend = current_time.weekday()\ \ >= 5 %} {% set start_time = '08:30' if is_weekend else '07:30' %} {% set end_time\ \ = '23:00' if is_weekend else '22:00' %} {{\n current_time.strftime('%H:%M')\ \ >= start_time\n and current_time.strftime('%H:%M') < end_time\n and states('sensor.qingping_bedroom_temperature')\ \ | float > 23\n and states('binary_sensor.aqara_contact_window_bedroom_contact')\ \ == 'off'\n and states('sensor.weather_forecast_temperature_forecast') | float\ \ > 25\n and states('sensor.hisense_ac_bedroom_lock_status') != 'locked'\n\ \ and states('sensor.hisense_ac_bedroom_automation_block_status') == 'allowed'\n\ }}\n" actions: - action: script.cool_bedroom data: reason: hot day and bedroom temperature to high - alias: Climate Bedroom Manual Control id: climate_bedroom_manual_control description: Handle manual AC button presses and override automation mode: restart triggers: - platform: state entity_id: climate.bedroom to: 'on' id: manual_on - platform: state entity_id: climate.bedroom to: 'off' id: manual_off conditions: - condition: template value_template: "{{\n trigger.from_state is not none and\n trigger.from_state.state\ \ in ['on', 'off'] and\n trigger.to_state.state in ['on', 'off'] and\n trigger.from_state.state\ \ != trigger.to_state.state\n}}\n" - condition: template value_template: "{% set context_id = trigger.to_state.context.id %} {% set user_id\ \ = trigger.to_state.context.user_id %} {% set parent_id = trigger.to_state.context.parent_id\ \ %}\n{# Manual UI/App control - user_id is present #} {% if user_id is not\ \ none %}\n true\n{# Physical button or external control - context.id is None\ \ #} {% elif context_id is none %}\n true\n{# Exclude our own automation contexts\ \ #} {% elif 'climate_bedroom_auto_off_on_window_open' in (context_id or '')\ \ %}\n false\n{% elif 'climate_bedroom_auto_off_on_target_temp' in (context_id\ \ or '') %}\n false\n{% elif 'climate_bedroom_auto_on' in (context_id or '')\ \ %}\n false\n{% elif 'cool_bedroom' in (context_id or '') %}\n false\n{#\ \ Allow other automations to be treated as manual (e.g., other cooling scripts)\ \ #} {% else %}\n true\n{% endif %}\n" actions: - service: system_log.write data: level: info message: 'Manual control detected - Context ID: {{ trigger.to_state.context.id }}, User ID: {{ trigger.to_state.context.user_id }}, Parent ID: {{ trigger.to_state.context.parent_id }}, New state: {{ trigger.to_state.state }}, Old state: {{ trigger.from_state.state }}} ' logger: homeassistant.components.automation.climate_bedroom_manual_control - choose: - conditions: - condition: trigger id: manual_on sequence: - service: rest_command.release_lock data: name: hisense_ac_bedroom - service: rest_command.create_lock data: name: hisense_ac_bedroom owner: homeassistant-{{ trigger.to_state.context.user_id }} duration: 1h - service: system_log.write data: level: info message: Bedroom cooling manual started by user logger: homeassistant.components.automation.climate_bedroom_manual_control - conditions: - condition: trigger id: manual_off sequence: - service: rest_command.release_lock data: name: hisense_ac_bedroom - service: rest_command.create_lock data: name: hisense_ac_bedroom owner: homeassistant-{{ trigger.to_state.context.user_id }} duration: 1h - service: system_log.write data: level: info message: Bedroom cooling manual stoped by user logger: homeassistant.components.automation.climate_bedroom_manual_control - alias: Climate Bedroom Track Start Time id: climate_bedroom_track_start_time description: 'Updates the climate_bedroom_start_time whenever the bedroom AC changes from off to any active mode ' mode: single trigger: - platform: state entity_id: climate.bedroom from: 'off' condition: - condition: template value_template: "{{\n trigger.to_state.state != 'off' and\n trigger.to_state.state\ \ != 'unknown' and\n trigger.to_state.state != 'unavailable'\n}}\n" action: - service: input_datetime.set_datetime target: entity_id: input_datetime.climate_bedroom_start_time data: datetime: '{{ now() }}' - service: system_log.write data: level: info message: 'Updated Bedroom AC start time: mode changed from off to {{ trigger.to_state.state }}' logger: homeassistant.components.automation.track_ac_bedroom_start_time - alias: Climate Livingroom Auto Off At Night id: climate_livingroom_auto_off_at_night description: 'Automatically turns off the livingroom AC after 23:00 ' mode: single trigger: - platform: time_pattern minutes: /5 condition: - condition: template value_template: "{{\n states('climate.livingroom') == 'cool'\n and states('sensor.hisense_ac_livingroom_automation_block_status')\ \ == 'allowed'\n and (now().hour >= 23 or now().hour < 6)\n}}\n" actions: - action: rest_command.release_lock data: name: hisense_ac_livingroom - action: climate.turn_off target: entity_id: climate.livingroom - action: system_log.write data: level: info message: Livingroom AC turned off after 23:00. logger: homeassistant.components.automation.climate_livingroom_auto_off_at_night - alias: Climate Livingroom Auto Off on Target Temp id: climate_livingroom_auto_off_on_target_temp description: 'Automatically turns off the livingroom AC when the temperature drops below 22°C and the minimum run time has been met. ' mode: single trigger: - platform: time_pattern minutes: /5 - platform: numeric_state entity_id: sensor.qingping_livingroom_temperature below: 22 for: minutes: 5 condition: - condition: template value_template: "{% set ac_start_timestamp = as_timestamp(states.input_datetime.climate_livingroom_start_time.state)\ \ %} {% set current_timestamp = now().timestamp() %} {% set ac_run_time = (current_timestamp\ \ - ac_start_timestamp) / 60 %} {{\n states('climate.livingroom') == 'cool'\n\ \ and states('sensor.qingping_livingroom_temperature') | float <= 22\n and\ \ ac_run_time > 30\n}}\n" actions: - action: rest_command.release_lock data: name: hisense_ac_livingroom - action: rest_command.create_lock data: name: hisense_ac_livingroom owner: homeassistant-automation duration: 20m - action: climate.turn_off target: entity_id: climate.livingroom - action: system_log.write data: level: info message: Livingroom AC turned off due to target temp reached. logger: homeassistant.components.automation.climate_livingroom_auto_off_on_target_temp - alias: Livingroom AC Auto On id: climatge_livingroom_auto_on description: 'Automatically turns on the livingroom AC when the temperature is above 23°C, and the weather forecast temperature is above 25°C. The automation checks every 5 minutes and respects time constraints. ' mode: single trigger: - platform: time_pattern minutes: /5 condition: - condition: template value_template: "{% set current_time = now() %} {% set is_weekend = current_time.weekday()\ \ >= 5 %} {% set start_time = '08:30' if is_weekend else '07:30' %} {% set end_time\ \ = '23:00' if is_weekend else '22:00' %} {{\n current_time.strftime('%H:%M')\ \ >= start_time\n and current_time.strftime('%H:%M') < end_time\n and states('sensor.qingping_livingroom_temperature')\ \ | float > 23\n and states('sensor.weather_forecast_temperature_forecast')\ \ | float > 25\n and states('sensor.hisense_ac_livingroom_lock_status') !=\ \ 'locked'\n and states('sensor.hisense_ac_livingroom_automation_block_status')\ \ == 'allowed'\n}}\n" actions: - action: script.cool_livingroom data: reason: hot day and livingroom temperature to high - alias: Climate Livingroom Manual Control id: climate_livingroom_manual_control description: Handle manual AC button presses and override automation mode: restart triggers: - platform: state entity_id: climate.livingroom to: 'on' id: manual_on - platform: state entity_id: climate.livingroom to: 'off' id: manual_off conditions: - condition: template value_template: "{{\n trigger.from_state is not none and\n trigger.from_state.state\ \ in ['on', 'off'] and\n trigger.to_state.state in ['on', 'off'] and\n trigger.from_state.state\ \ != trigger.to_state.state\n}}\n" - condition: template value_template: "{% set context_id = trigger.to_state.context.id %} {% set user_id\ \ = trigger.to_state.context.user_id %} {% set parent_id = trigger.to_state.context.parent_id\ \ %}\n{# Manual UI/App control - user_id is present #} {% if user_id is not\ \ none %}\n true\n{# Physical button or external control - context.id is None\ \ #} {% elif context_id is none %}\n true\n{# Exclude our own automation contexts\ \ #} {% elif 'climate_livingroom_auto_off_on_window_open' in (context_id or\ \ '') %}\n false\n{% elif 'climate_livingroom_auto_off_on_target_temp' in (context_id\ \ or '') %}\n false\n{% elif 'climate_livingroom_auto_on' in (context_id or\ \ '') %}\n false\n{% elif 'cool_livingroom' in (context_id or '') %}\n false\n\ {# Allow other automations to be treated as manual (e.g., other cooling scripts)\ \ #} {% else %}\n true\n{% endif %}\n" actions: - service: system_log.write data: level: info message: 'Manual control detected - Context ID: {{ trigger.to_state.context.id }}, User ID: {{ trigger.to_state.context.user_id }}, Parent ID: {{ trigger.to_state.context.parent_id }}, New state: {{ trigger.to_state.state }}, Old state: {{ trigger.from_state.state }}} ' logger: homeassistant.components.automation.climate_livingroom_manual_control - choose: - conditions: - condition: trigger id: manual_on sequence: - service: rest_command.release_lock data: name: hisense_ac_livingroom - service: rest_command.create_lock data: name: hisense_ac_livingroom owner: homeassistant-{{ trigger.to_state.context.user_id }} duration: 60m - service: system_log.write data: level: info message: Livingroom cooling manual started by user logger: homeassistant.components.automation.climate_livingroom_manual_control - conditions: - condition: trigger id: manual_off sequence: - service: rest_command.release_lock data: name: hisense_ac_livingroom - service: rest_command.create_lock data: name: hisense_ac_livingroom owner: homeassistant-{{ trigger.to_state.context.user_id }} duration: 60m - service: system_log.write data: level: info message: Livingroom cooling manual stoped by user logger: homeassistant.components.automation.climate_livingroom_manual_control - alias: Climate Livingroom Track Start Time id: climate_livingroom_track_start_time description: 'Updates the climate_livingroom_start_time whenever the Livingroom AC changes from off to any active mode ' mode: single trigger: - platform: state entity_id: climate.livingroom from: 'off' condition: - condition: template value_template: "{{\n trigger.to_state.state != 'off' and\n trigger.to_state.state\ \ != 'unknown' and\n trigger.to_state.state != 'unavailable'\n}}\n" action: - service: input_datetime.set_datetime target: entity_id: input_datetime.climate_livingroom_start_time data: datetime: '{{ now() }}' - service: system_log.write data: level: info message: 'Updated Livingroom AC start time: mode changed from off to {{ trigger.to_state.state }}' logger: homeassistant.components.automation.track_ac_livingroom_start_time - alias: Domiroom Ceiling Light motion automation id: domiroom_ceiling_light description: Turn on the ceiling light when motion is detected in the room mode: single trigger: - platform: state entity_id: group.motion_domiroom to: 'on' condition: - condition: time after: 09:00:00 before: '20:00:00' - condition: numeric_state entity_id: sensor.aqara_wall_outlet_dominikroom_power below: 50 actions: - action: light.turn_on target: entity_id: light.led_ceiling_light_domiroom - alias: Domiroom Nanoleaf automation id: domiroom_nanoleaf description: Turn on the nanoleaf shape when computer is on mode: single triggers: - trigger: numeric_state entity_id: - sensor.aqara_wall_outlet_dominikroom_power above: 100 - trigger: numeric_state entity_id: - sensor.aqara_wall_outlet_dominikroom_power for: seconds: 10 below: 100 actions: - choose: - conditions: - condition: numeric_state entity_id: sensor.aqara_wall_outlet_dominikroom_power above: 100 sequence: - action: light.turn_on target: entity_id: light.shapes_a6dc - conditions: - condition: numeric_state entity_id: sensor.aqara_wall_outlet_dominikroom_power below: 100 sequence: - action: light.turn_off target: entity_id: light.shapes_a6dc - alias: Auto-lock front door when closed id: entrance_nuki_autolock mode: single description: Automatically locks Nuki when door has been closed for 30 seconds triggers: - platform: state entity_id: binary_sensor.aqara_contact_door_entrance_contact to: 'off' for: seconds: 30 - platform: state entity_id: lock.nuki to: unlocked for: minutes: 2 conditions: - condition: state entity_id: lock.nuki state: unlocked - condition: state entity_id: binary_sensor.aqara_contact_door_entrance_contact state: 'off' actions: - service: lock.lock target: entity_id: lock.nuki - alias: frontdoor_camera_motion_snapshots id: frontdoor_camera_motion_snapshots description: Take snapshots when front door motion is detected mode: single triggers: - trigger: state entity_id: - binary_sensor.front_door_motion to: 'on' actions: - repeat: sequence: - action: button.press data: entity_id: button.front_door_take_snapshot - delay: 3 - action: homeassistant.update_entity data: entity_id: - camera.front_door_snapshot - action: camera.snapshot data: filename: /data/ring-snapshots/{{ now().strftime("%Y-%m-%d_%H-%M-%S") }}_{{repeat.index}}.jpg target: entity_id: camera.front_door_snapshot - delay: 15 while: - condition: state entity_id: binary_sensor.front_door_motion state: 'on' - alias: Garden Herb Irrigation id: garden_herb_irrigation description: Water herbs after sunrise and during hot days, with lock tracking mode: single triggers: - platform: sun event: sunrise offset: +01:00:00 id: morning_watering conditions: [] actions: - choose: - conditions: - condition: trigger id: morning_watering - condition: template value_template: '{{ not (states(''sensor.openmeteo_precipitation'') | float(0) > 0) }}' - condition: template value_template: '{{ states(''sensor.woox_irrigation_garden_automation_block_status'') == ''allowed'' }}' sequence: - service: script.start_herb_watering data: reason: Morning watering after sunrise - alias: Garden Herb Irrigation Auto Off id: garden_herb_irrigation_auto_off description: Turn off garden irrigation system when lock has been expired or in malfunction state mode: single trigger: - platform: time_pattern minutes: /1 condition: - condition: state entity_id: switch.woox_irrigation_garden state: 'on' - condition: template value_template: '{{ states(''sensor.woox_irrigation_garden_lock_status'') != ''locked'' }} ' action: - choose: - conditions: - condition: template value_template: '{{ states(''sensor.woox_irrigation_garden_lock_status'') == ''unlocked'' }} ' sequence: - service: switch.turn_off target: entity_id: switch.woox_irrigation_garden - service: system_log.write data: level: info message: 'Irrigation cleanup: Garden valve turned off after normal lock expiration' logger: homeassistant.components.automation.garden_herb_irrigation_auto_off - conditions: - condition: template value_template: "{% set lock_status = states.sensor.woox_irrigation_garden_lock_status.state\ \ %} {% set last_changed = states.sensor.woox_irrigation_garden_lock_status.last_changed\ \ %} {{ lock_status not in ['locked', 'unlocked'] and\n last_changed\ \ is not none and\n (as_timestamp(now()) - as_timestamp(last_changed))\ \ > 180 }}\n" sequence: - service: switch.turn_off target: entity_id: switch.woox_irrigation_garden - service: system_log.write data: level: warning message: 'Irrigation emergency shutdown: Garden lock service in unknown state ({{ states(''sensor.woox_irrigation_garden_lock_status'') }}) for 3+ minutes' logger: homeassistant.components.automation.garden_herb_irrigation_auto_off - alias: Garden Herb Irrigation Manual Control id: garden_herb_irrigation_manual_control description: Handle manual irrigation button presses and override automation mode: restart triggers: - platform: state entity_id: switch.woox_irrigation_garden to: 'on' id: manual_on - platform: state entity_id: switch.woox_irrigation_garden to: 'off' id: manual_off conditions: - condition: template value_template: "{{ trigger.from_state is not none and\n trigger.from_state.state\ \ in ['on', 'off'] and\n trigger.to_state.state in ['on', 'off'] and\n \ \ trigger.from_state.state != trigger.to_state.state }}\n" - condition: template value_template: "{% set context_id = trigger.to_state.context.id %} {% set user_id\ \ = trigger.to_state.context.user_id %} {% set parent_id = trigger.to_state.context.parent_id\ \ %}\n{# Manual UI/App control - user_id is present #} {% if user_id is not\ \ none %}\n true\n{# Physical button or external control - context.id is None\ \ #} {% elif context_id is none %}\n true\n{# Exclude our own automation contexts\ \ #} {% elif 'garden_herb_irrigation_auto_off' in (context_id or '') %}\n false\n\ {% elif 'garden_herb_irrigation' in (context_id or '') %}\n false\n{% elif\ \ 'start_herb_watering' in (context_id or '') %}\n false\n{# Allow other automations\ \ to be treated as manual (e.g., other irrigation scripts) #} {% else %}\n \ \ true\n{% endif %}\n" actions: - service: system_log.write data: level: info message: 'Switch state change detected - Context ID: {{ trigger.to_state.context.id }}, User ID: {{ trigger.to_state.context.user_id }}, Parent ID: {{ trigger.to_state.context.parent_id }}, New state: {{ trigger.to_state.state }}, Old state: {{ trigger.from_state.state }} ' logger: homeassistant.components.automation.garden_herb_irrigation_manual_control - choose: - conditions: - condition: trigger id: manual_on sequence: - service: rest_command.release_lock data: name: woox_irrigation_garden - service: rest_command.create_lock data: name: woox_irrigation_garden owner: homeassistant-{{ trigger.to_state.context.user_id }} duration: 15m - service: counter.increment target: entity_id: counter.daily_herb_watering_count - service: system_log.write data: level: info message: Manual irrigation started by user logger: homeassistant.components.automation.garden_herb_irrigation_manual_control - conditions: - condition: trigger id: manual_off sequence: - service: rest_command.release_lock data: name: woox_irrigation_garden - service: rest_command.create_lock data: name: woox_irrigation_garden owner: homeassistant-{{ trigger.to_state.context.user_id }} duration: 1h - service: system_log.write data: level: info message: Manual irrigation stopped by user - automation blocked for 1 hour logger: homeassistant.components.automation.garden_herb_irrigation_manual_control - alias: Garden Tomato Irrigation id: garden_tomato_irrigation description: Water tomatoes after sunrise and during hot days, with lock tracking mode: single triggers: - platform: sun event: sunrise offset: +00:30:00 id: morning_watering conditions: [] actions: - choose: - conditions: - condition: trigger id: morning_watering - condition: template value_template: '{{ not (states(''sensor.openmeteo_precipitation'') | float(0) > 0) }}' - condition: template value_template: '{{ states(''sensor.woox_irrigation_garden2_automation_block_status'') == ''allowed'' }}' sequence: - service: script.start_tomato_watering data: reason: Morning watering after sunrise - alias: Garden Tomato Irrigation Auto Off id: garden_tomato_irrigation_auto_off description: Turn off garden irrigation system when lock has been expired or in malfunction state mode: single trigger: - platform: time_pattern minutes: /1 condition: - condition: state entity_id: switch.woox_irrigation_garden2 state: 'on' - condition: template value_template: '{{ states(''sensor.woox_irrigation_garden2_lock_status'') != ''locked'' }} ' action: - choose: - conditions: - condition: template value_template: '{{ states(''sensor.woox_irrigation_garden2_lock_status'') == ''unlocked'' }} ' sequence: - service: switch.turn_off target: entity_id: switch.woox_irrigation_garden2 - service: system_log.write data: level: info message: 'Irrigation cleanup: Garden valve turned off after normal lock expiration' logger: homeassistant.components.automation.garden_tomato_irrigation_auto_off - conditions: - condition: template value_template: "{% set lock_status = states.sensor.woox_irrigation_garden2_lock_status.state\ \ %} {% set last_changed = states.sensor.woox_irrigation_garden2_lock_status.last_changed\ \ %} {{ lock_status not in ['locked', 'unlocked'] and\n last_changed\ \ is not none and\n (as_timestamp(now()) - as_timestamp(last_changed))\ \ > 180 }}\n" sequence: - service: switch.turn_off target: entity_id: switch.woox_irrigation_garden2 - service: system_log.write data: level: warning message: 'Irrigation emergency shutdown: Garden lock service in unknown state ({{ states(''sensor.woox_irrigation_garden2_lock_status'') }}) for 3+ minutes' logger: homeassistant.components.automation.garden_tomato_irrigation_auto_off - alias: Garden Tomato Irrigation Manual Control id: garden_tomato_irrigation_manual_control description: Handle manual irrigation button presses and override automation mode: restart triggers: - platform: state entity_id: switch.woox_irrigation_garden2 to: 'on' id: manual_on - platform: state entity_id: switch.woox_irrigation_garden2 to: 'off' id: manual_off conditions: - condition: template value_template: "{{ trigger.from_state is not none and\n trigger.from_state.state\ \ in ['on', 'off'] and\n trigger.to_state.state in ['on', 'off'] and\n \ \ trigger.from_state.state != trigger.to_state.state }}\n" - condition: template value_template: "{% set context_id = trigger.to_state.context.id %} {% set user_id\ \ = trigger.to_state.context.user_id %} {% set parent_id = trigger.to_state.context.parent_id\ \ %}\n{# Manual UI/App control - user_id is present #} {% if user_id is not\ \ none %}\n true\n{# Physical button or external control - context.id is None\ \ #} {% elif context_id is none %}\n true\n{# Exclude our own automation contexts\ \ #} {% elif 'garden_tomato_irrigation_auto_off' in (context_id or '') %}\n\ \ false\n{% elif 'garden_tomato_irrigation' in (context_id or '') %}\n false\n\ {% elif 'start_tomato_watering' in (context_id or '') %}\n false\n{# Allow\ \ other automations to be treated as manual (e.g., other irrigation scripts)\ \ #} {% else %}\n true\n{% endif %}\n" actions: - service: system_log.write data: level: info message: 'Switch state change detected - Context ID: {{ trigger.to_state.context.id }}, User ID: {{ trigger.to_state.context.user_id }}, Parent ID: {{ trigger.to_state.context.parent_id }}, New state: {{ trigger.to_state.state }}, Old state: {{ trigger.from_state.state }} ' logger: homeassistant.components.automation.garden_manual_irrigation_control - choose: - conditions: - condition: trigger id: manual_on sequence: - service: rest_command.release_lock data: name: woox_irrigation_garden2 - service: rest_command.create_lock data: name: woox_irrigation_garden2 owner: homeassistant-{{ trigger.to_state.context.user_id }} duration: 30m - service: counter.increment target: entity_id: counter.daily_tomato_watering_count - service: system_log.write data: level: info message: Manual irrigation started by user logger: homeassistant.components.automation.garden_manual_irrigation_control - conditions: - condition: trigger id: manual_off sequence: - service: rest_command.release_lock data: name: woox_irrigation_garden2 - service: rest_command.create_lock data: name: woox_irrigation_garden2 owner: homeassistant-{{ trigger.to_state.context.user_id }} duration: 1h - service: system_log.write data: level: info message: Manual irrigation stopped by user - automation blocked for 1 hour logger: homeassistant.components.automation.garden_manual_irrigation_control - alias: kitchen_nanoleaf id: kitchen_nanoleaf description: Kitchen Nanoleaf Skylight motion automation mode: single triggers: - trigger: state entity_id: - binary_sensor.mijia_motion_kitchen_occupancy to: 'on' - trigger: state entity_id: - binary_sensor.mijia_motion_kitchen_occupancy to: 'off' for: minutes: 5 - trigger: state entity_id: - group.motion_downstairs to: 'off' for: minutes: 20 conditions: [] actions: - choose: - conditions: - condition: state entity_id: binary_sensor.mijia_motion_kitchen_occupancy state: 'on' - condition: time after: 07:00:00 before: 00:00:00 - condition: or conditions: - condition: state entity_id: light.skylight_8a30 state: 'off' - condition: numeric_state entity_id: light.skylight_8a30 attribute: brightness below: 255 sequence: - action: light.turn_on target: entity_id: light.skylight_8a30 data: brightness: 255 - action: system_log.write data: level: info message: light.skylight_8a30 turned on (brightness=255) logger: homeassistant.components.automation.kitchen_nanoleaf - conditions: - condition: state entity_id: binary_sensor.mijia_motion_kitchen_occupancy state: 'on' - condition: time after: 00:00:00 before: 07:00:00 - condition: or conditions: - condition: state entity_id: light.skylight_8a30 state: 'off' - condition: numeric_state entity_id: light.skylight_8a30 attribute: brightness above: 51 sequence: - action: light.turn_on target: entity_id: light.skylight_8a30 data: brightness: 51 - action: system_log.write data: level: info message: light.skylight_8a30 turned on (brightness=51) logger: homeassistant.components.automation.kitchen_nanoleaf - conditions: - condition: state entity_id: binary_sensor.mijia_motion_kitchen_occupancy state: 'off' for: hours: 0 minutes: 5 seconds: 0 - condition: state entity_id: light.skylight_8a30 state: 'on' - condition: numeric_state entity_id: light.skylight_8a30 attribute: brightness above: 51 sequence: - action: light.turn_on target: entity_id: light.skylight_8a30 data: brightness: 51 - action: system_log.write data: level: info message: light.skylight_8a30 turned on (brightness=51) logger: homeassistant.components.automation.kitchen_nanoleaf - conditions: - condition: state entity_id: group.motion_downstairs state: 'off' for: minutes: 15 - condition: state entity_id: light.skylight_8a30 state: 'on' sequence: - action: light.turn_off target: entity_id: light.skylight_8a30 - action: system_log.write data: level: info message: light.skylight_8a30 turned off logger: homeassistant.components.automation.kitchen_nanoleaf - alias: laundryroom_light id: laundryroom_light description: Laundryroom light motion automation mode: single triggers: - trigger: state entity_id: - binary_sensor.mijia_motion_laundryroom_occupancy to: 'on' - trigger: state entity_id: - binary_sensor.mijia_motion_laundryroom_occupancy to: 'off' for: hours: 0 minutes: 5 seconds: 0 conditions: [] actions: - choose: - conditions: - condition: state entity_id: binary_sensor.mijia_motion_laundryroom_occupancy state: 'on' - condition: state entity_id: switch.shelly_1gen4_light_laundryroom state: 'off' sequence: - action: switch.turn_on target: entity_id: switch.shelly_1gen4_light_laundryroom - action: system_log.write data: level: info message: light laundryroom turned on logger: homeassistant.components.automation.laundryroom_light - conditions: - condition: state entity_id: binary_sensor.mijia_motion_laundryroom_occupancy state: 'off' for: hours: 0 minutes: 5 seconds: 0 - condition: state entity_id: switch.shelly_1gen4_light_laundryroom state: 'on' sequence: - action: switch.turn_off target: entity_id: switch.shelly_1gen4_light_laundryroom - action: system_log.write data: level: info message: light laundryroom turned off logger: homeassistant.components.automation.laundryroom_light - mode: single alias: Laundryroom Light Switch id: laundryroom_light_switch description: Handle actions from the Senic Wall Switch in the laundryroom triggers: - trigger: state entity_id: - sensor.senic_wall_switch_laundryroom_action from: null to: press_1 - trigger: state entity_id: - sensor.senic_wall_switch_laundryroom_action from: null to: press_2 - trigger: state entity_id: - sensor.senic_wall_switch_laundryroom_action from: null to: press_3 conditions: [] actions: - choose: - conditions: - condition: template value_template: "{{\n states.sensor.senic_wall_switch_laundryroom_action.state\ \ == 'press_1'\n and states.switch.shelly_1gen4_light_laundryroom.state\ \ == 'off'\n}}" sequence: - action: switch.turn_on target: entity_id: switch.shelly_1gen4_light_laundryroom - action: system_log.write data: level: info message: Light turned ON by Senic Wall Switch logger: homeassistant.components.automation.laundryroom_light_switch - conditions: - condition: template value_template: "{{\n states.sensor.senic_wall_switch_laundryroom_action.state\ \ == 'press_2'\n and states.switch.shelly_1gen4_light_laundryroom.state\ \ == 'on'\n}}" sequence: - action: switch.turn_off target: entity_id: switch.shelly_1gen4_light_laundryroom - action: system_log.write data: level: info message: Light turned OFF by Senic Wall Switch logger: homeassistant.components.automation.laundryroom_light_switch - conditions: - condition: template value_template: "{{\n states.sensor.senic_wall_switch_laundryroom_action.state\ \ == 'press_3'\n and states.switch.shelly_1gen4_ventilation_laundryroom.state\ \ == 'off'\n}}" sequence: - action: switch.turn_on target: entity_id: switch.shelly_1gen4_ventilation_laundryroom - action: system_log.write data: level: info message: Ventilation turned ON by Senic Wall Switch logger: homeassistant.components.automation.laundryroom_light_switch - alias: Livingroom Nanoleaf Elements id: livingroom_nanoleaf_elements description: 'Turn on the nanoleaf when motion downstairs is detected, turn off when no motion is detected for 15 minutes. ' mode: single triggers: - trigger: state entity_id: - group.motion_downstairs from: 'off' to: 'on' - trigger: state entity_id: - group.motion_downstairs to: 'off' for: minutes: 15 actions: - choose: - conditions: - condition: template value_template: "{{\n states('light.elements_d689') == 'off'\n and states('group.motion_downstairs')\ \ == 'on'\n}}\n" sequence: - service: light.turn_on target: entity_id: light.elements_d689 - service: system_log.write data: level: info message: light.elements_d689 turned on logger: homeassistant.components.automation.livingroom_nanoleaf_elements - conditions: - condition: template value_template: "{{\n states('light.elements_d689') == 'on'\n and states('group.motion_downstairs')\ \ == 'off'\n and as_timestamp(now()) - as_timestamp(states.group.motion_downstairs.last_changed)\ \ >= 900\n}}\n" sequence: - service: light.turn_off target: entity_id: light.lines_5c30 - service: system_log.write data: level: info message: light.elements_d689 turned off logger: homeassistant.components.automation.livingroom_nanoleaf_elements - alias: office_light id: office_light description: Turn on the office light when motion is detected mode: single triggers: - trigger: state entity_id: - group.motion_office to: 'on' - trigger: state entity_id: - group.motion_office to: 'off' for: minutes: 10 - trigger: state entity_id: - group.motion_office to: 'off' for: minutes: 15 - trigger: state entity_id: - group.motion_office to: 'off' for: minutes: 20 - trigger: time at: 06:00:01 - trigger: time at: 08:00:01 - trigger: time at: '12:00:01' - trigger: time at: '14:00:01' - trigger: time at: '21:00:01' - trigger: time at: '23:00:01' - trigger: time at: 00:00:01 conditions: [] actions: - choose: - conditions: - condition: time after: '23:00:00' before: 06:00:00 - condition: template value_template: "{{\n states('sensor.office_light_automation_block_status')\ \ == 'allowed'\n and states('group.motion_office') == 'on'\n and (\n \ \ states('light.office') == 'off'\n or state_attr('light.office', 'brightness')\ \ != 45\n )\n}}" sequence: - action: scene.turn_on data: {} target: entity_id: scene.office_night - action: system_log.write data: level: info message: scene.office_night turned on logger: homeassistant.components.automation.office_light - conditions: - condition: time after: 06:00:00 before: 08:00:00 - condition: template value_template: "{{\n states('sensor.office_light_automation_block_status')\ \ == 'allowed'\n and states('group.motion_office') == 'on'\n and (\n \ \ states('light.office') == 'off'\n or state_attr('light.office', 'brightness')\ \ != 220\n )\n}}" sequence: - action: scene.turn_on data: {} target: entity_id: scene.office_reading - action: system_log.write data: level: info message: scene.office_reading turned on logger: homeassistant.components.automation.office_light - conditions: - condition: or conditions: - condition: time after: 08:00:00 before: '12:00:00' - condition: time after: '14:00:00' before: '21:00:00' - condition: template value_template: "{{\n states('sensor.office_light_automation_block_status')\ \ == 'allowed'\n and states('group.motion_office') == 'on'\n and (\n \ \ states('light.office') == 'off'\n or state_attr('light.office', 'brightness')\ \ != 235\n )\n}}" sequence: - action: scene.turn_on data: {} target: entity_id: scene.office_working - action: system_log.write data: level: info message: scene.office_working turned on logger: homeassistant.components.automation.office_light - conditions: - condition: time after: '12:00:00' before: '14:00:00' - condition: template value_template: "{{\n states('sensor.office_light_automation_block_status')\ \ == 'allowed'\n and states('group.motion_office') == 'on'\n and (\n \ \ states('light.office') == 'off'\n or state_attr('light.office', 'brightness')\ \ != 255\n )\n}}" sequence: - action: scene.turn_on data: {} target: entity_id: scene.office_concentration - action: system_log.write data: level: info message: scene.office_concentration turned on logger: homeassistant.components.automation.office_light - conditions: - condition: time after: '21:00:00' before: '23:00:00' - condition: template value_template: "{{\n states('sensor.office_light_automation_block_status')\ \ == 'allowed'\n and states('group.motion_office') == 'on'\n and (\n \ \ states('light.office') == 'off'\n or state_attr('light.office', 'brightness')\ \ != 170\n )\n}}" sequence: - action: scene.turn_on data: {} target: entity_id: scene.office_evening - action: system_log.write data: level: info message: scene.office_evening turned on logger: homeassistant.components.automation.office_light - conditions: - condition: state entity_id: group.motion_office state: 'off' for: minutes: 10 - condition: time after: 00:00:00 before: 08:00:00 - condition: state entity_id: light.office state: 'on' sequence: - action: light.turn_off target: entity_id: light.office - action: system_log.write data: level: info message: light.office turned off logger: homeassistant.components.automation.office_light - conditions: - condition: state entity_id: group.motion_office state: 'off' for: minutes: 15 - condition: time after: 08:00:00 before: 00:00:00 - condition: state entity_id: light.office state: 'on' sequence: - action: scene.turn_on data: {} target: entity_id: scene.office_relax - action: system_log.write data: level: info message: scene.office_relax turned on logger: homeassistant.components.automation.office_light - conditions: - condition: state entity_id: group.motion_office state: 'off' for: minutes: 20 - condition: time after: 08:00:00 before: 00:00:00 - condition: state entity_id: light.office state: 'on' sequence: - action: light.turn_off target: entity_id: light.office - action: system_log.write data: level: info message: light.office turned off logger: homeassistant.components.automation.office_light - alias: Office Light Manual Control id: office_light_manual_control description: Handle manual scene changes and override automation for 1 hour mode: restart triggers: - trigger: event event_type: call_service event_data: domain: scene service: turn_on service_data: entity_id: scene.office_reading id: scene_change - trigger: event event_type: call_service event_data: domain: scene service: turn_on service_data: entity_id: scene.office_working id: scene_change - trigger: event event_type: call_service event_data: domain: scene service: turn_on service_data: entity_id: scene.office_concentration id: scene_change - trigger: event event_type: call_service event_data: domain: scene service: turn_on service_data: entity_id: scene.office_evening id: scene_change - trigger: event event_type: call_service event_data: domain: scene service: turn_on service_data: entity_id: scene.office_night id: scene_change - trigger: event event_type: call_service event_data: domain: scene service: turn_on service_data: entity_id: scene.office_relax id: scene_change - trigger: state entity_id: light.office to: 'on' id: light_on - trigger: state entity_id: light.office to: 'off' id: light_off conditions: - condition: template value_template: "{% macro is_manual_control(context_id, user_id) %}\n {# Manual\ \ UI/App control - user_id is present #}\n {% if user_id is not none %}\n \ \ true\n {# Physical button or external control - context.id is None #}\n\ \ {% elif context_id is none %}\n true\n {# Skip if our own automation\ \ triggered it #}\n {% elif context_id and 'office_light' in context_id %}\n\ \ false\n {% else %}\n true\n {% endif %}\n{% endmacro %}\n{% if trigger.id\ \ == 'scene_change' %}\n {# Event trigger - use trigger.event.context #}\n\ \ {% set context_id = trigger.event.context.id %}\n {% set user_id = trigger.event.context.user_id\ \ %}\n {{ is_manual_control(context_id, user_id) }}\n{% elif trigger.id in\ \ ['light_on', 'light_off'] %}\n {# State trigger - use trigger.to_state.context\ \ #}\n {% set context_id = trigger.to_state.context.id %}\n {% set user_id\ \ = trigger.to_state.context.user_id %}\n {% set from_state = trigger.from_state.state\ \ %}\n {% set to_state = trigger.to_state.state %}\n\n {# Block startup/reconnection\ \ transitions #}\n {% if from_state in ['unknown', 'unavailable'] %}\n false\n\ \ {% else %}\n {{ is_manual_control(context_id, user_id) }}\n {% endif\ \ %}\n{% else %}\n false\n{% endif %}\n" actions: - choose: - conditions: - condition: trigger id: scene_change sequence: - service: system_log.write data: level: info message: 'Office scene change detected - Context ID: {{ trigger.event.context.id }}, User ID: {{ trigger.event.context.user_id }}, Scene: {{ trigger.event.data.service_data.entity_id }} ' logger: homeassistant.components.automation.office_light_manual_control - conditions: - condition: or conditions: - condition: trigger id: light_on - condition: trigger id: light_off sequence: - service: system_log.write data: level: info message: 'Office light state change detected - Context ID: {{ trigger.to_state.context.id }}, User ID: {{ trigger.to_state.context.user_id }}, Entity: {{ trigger.entity_id }}, New state: {{ trigger.to_state.state }}, Old state: {{ trigger.from_state.state }} ' logger: homeassistant.components.automation.office_light_manual_control - service: rest_command.release_lock data: name: office_light - service: rest_command.create_lock data: name: office_light owner: "{% if trigger.id == 'scene_change' %}\n homeassistant-{{ trigger.event.context.user_id\ \ }}\n{% else %}\n homeassistant-{{ trigger.to_state.context.user_id }}\n\ {% endif %}\n" duration: 1h - service: system_log.write data: level: info message: Manual office light/scene control detected - automation blocked for 1 hour logger: homeassistant.components.automation.office_light_manual_control - alias: Reset Daily Herb Watering Counter id: reset_daily_herb_watering_counter description: Reset the daily herb watering counter at midnight mode: single triggers: - platform: time at: 00:00:00 actions: - service: counter.reset target: entity_id: counter.daily_herb_watering_count - service: system_log.write data: level: info message: Reset daily herb watering counter logger: homeassistant.components.automation.reset_daily_herb_watering_counter - alias: Reset Daily Tomato Watering Counter id: reset_daily_tomato_watering_counter description: Reset the daily tomato watering counter at midnight mode: single triggers: - platform: time at: 00:00:00 actions: - service: counter.reset target: entity_id: counter.daily_tomato_watering_count - service: system_log.write data: level: info message: Reset daily tomato watering counter logger: homeassistant.components.automation.reset_daily_tomato_watering_counter - alias: Update Configuration on Gitlab Push Event mode: single id: update_config_gitlab_push_event trigger: - platform: webhook webhook_id: secret webhook_id allowed_methods: - POST - PUT local_only: true action: - service: shell_command.update_config - alias: Ventilation Baathroom Auto Off id: ventilation_bathroom_auto_off description: 'Automatically turns off bathroom ventilation when humidity drops to 58% or below, but only after the ventilation has been running for at least 15 minutes. ' mode: single triggers: - trigger: numeric_state entity_id: sensor.aqara_climate_bathroom_humidity below: 58 - trigger: time_pattern minutes: /5 conditions: - condition: template value_template: "{% set last_changed = states.switch.shelly_1gen4_ventilation_bathroom.last_changed\ \ %} {{\n states.switch.shelly_1gen4_ventilation_bathroom.state == 'on'\n \ \ and states.sensor.aqara_climate_bathroom_humidity.state | float <= 58\n and\ \ last_changed is not none\n and (as_timestamp(now()) - as_timestamp(last_changed))\ \ >= 900\n}}\n" actions: - action: switch.turn_off target: entity_id: switch.shelly_1gen4_ventilation_bathroom - action: system_log.write data: level: info message: Ventilation turned OFF - humidity normalized logger: homeassistant.components.automation.ventilation_bathroom_auto_off - alias: Ventilation Bathroom Auto On id: ventilation_bathroom_auto_on description: 'Automatically turns on bathroom ventilation when humidity exceeds 58%. ' mode: single triggers: - trigger: time_pattern minutes: /5 conditions: - condition: template value_template: "{{\n states.switch.shelly_1gen4_ventilation_bathroom.state !=\ \ 'on'\n and states.sensor.aqara_climate_bathroom_humidity.state | float >\ \ 58\n}}\n" actions: - action: switch.turn_on target: entity_id: switch.shelly_1gen4_ventilation_bathroom - action: system_log.write data: level: info message: Ventilation turned ON - humidity over threshold logger: homeassistant.components.automation.ventilation_bathroom_auto_on - alias: Ventilation Laundryroom Auto Off id: ventilation_laundryroom_auto_off description: 'Automatically turns off laundryroom ventilation when humidity drops to 58% or below, but only after the ventilation has been running for at least 15 minutes. ' mode: single triggers: - trigger: numeric_state entity_id: sensor.aqara_climate_laundryroom_humidity below: 58 - trigger: time_pattern minutes: /5 conditions: - condition: template value_template: "{% set last_changed = states.switch.shelly_1gen4_ventilation_laundryroom.last_changed\ \ %} {{\n states.switch.shelly_1gen4_ventilation_laundryroom.state == 'on'\n\ \ and states.sensor.aqara_climate_laundryroom_humidity.state | float <= 58\n\ \ and last_changed is not none\n and (as_timestamp(now()) - as_timestamp(last_changed))\ \ >= 900\n}}\n" actions: - action: switch.turn_off target: entity_id: switch.shelly_1gen4_ventilation_laundryroom - action: system_log.write data: level: info message: Ventilation turned OFF - humidity normalized logger: homeassistant.components.automation.ventilation_laundryroom_auto_off - alias: Ventilation Laundryroom Auto On id: ventilation_laundryroom_auto_on description: 'Automatically turns on laundryroom ventilation when humidity exceeds 58%. ' mode: single triggers: - trigger: time_pattern minutes: /5 conditions: - condition: template value_template: "{{\n states.switch.shelly_1gen4_ventilation_laundryroom.state\ \ != 'on'\n and states.sensor.aqara_climate_laundryroom_humidity.state | float\ \ > 58\n}}\n" actions: - action: switch.turn_on target: entity_id: switch.shelly_1gen4_ventilation_laundryroom - action: system_log.write data: level: info message: Ventilation turned ON - humidity over threshold logger: homeassistant.components.automation.ventilation_laundryroom_auto_on