homeassistant:

sensor:
  - platform: template
    sensors:
      single_car_garage_door_sensor_status:
        friendly_name: Single Car Garage Door Sensor Status
        value_template: >-
          {% if states('binary_sensor.single_car_garage_door_tilt_sensor_sensor') == 'on' %}
            Open
          {% elif states('binary_sensor.single_car_garage_door_tilt_sensor_sensor') == 'off' %}
            Closed
          {% else %}
            Unknown
          {% endif %}
        icon_template: >-
          {% set door_status = states('binary_sensor.single_car_garage_door_tilt_sensor_sensor') %}
          {% if door_status == 'unknown' %}
            mdi:alert-circle
          {% else %}
            {% if door_status == 'on' %}
              mdi:garage-open
            {% else %}
              mdi:garage
            {% endif %}
          {% endif %}

  - platform: template
    sensors:
      two_car_garage_door_sensor_status:
        value_template: >-
          {% if states('binary_sensor.two_car_garage_door_tilt_sensor_sensor') == 'on' %}
            Open
          {% elif states('binary_sensor.two_car_garage_door_tilt_sensor_sensor') == 'off' %}
            Closed
          {% else %}
            Unknown
          {% endif %}
        friendly_name: Double Car Garage Door Sensor Status
        icon_template: >-
          {% set door_status = states('binary_sensor.two_car_garage_door_tilt_sensor_sensor') %}
          {% if door_status == 'unknown' %}
            mdi:alert-circle
          {% else %}
            {% if door_status == 'on' %}
              mdi:garage-open
            {% else %}
              mdi:garage
            {% endif %}
          {% endif %}

binary_sensor:
  - platform: mqtt
    state_topic: "/garage/motion"
    name: "Garage Motion"
    device_class: motion
    payload_on: "on"
    payload_off: "off"
    value_template: "{{ value }}"

  - platform: mqtt
    state_topic: "/kitchen/motion"
    name: "Kitchen Camera Motion"
    device_class: motion
    payload_on: "on"
    payload_off: "off"
    value_template: "{{ value }}"

  - platform: mqtt
    state_topic: "/frontroom/motion"
    name: "Frontroom Camera Motion"
    device_class: motion
    payload_on: "on"
    payload_off: "off"
    value_template: "{{ value }}"

###############################################################################
#                _                        _   _
#     /\        | |                      | | (_)
#    /  \  _   _| |_ ___  _ __ ___   __ _| |_ _  ___  _ __  ___
#   / /\ \| | | | __/ _ \| '_ ` _ \ / _` | __| |/ _ \| '_ \/ __|
#  / ____ \ |_| | || (_) | | | | | | (_| | |_| | (_) | | | \__ \
# /_/    \_\__,_|\__\___/|_| |_| |_|\__,_|\__|_|\___/|_| |_|___/
#
###############################################################################

automation:
  - alias: Garage Motion Reset
    initial_state: true
    trigger:
      - platform: state
        entity_id: binary_sensor.garage_motion
        to: "on"
        from: "off"
    action:
      - delay: "00:00:30"
      - service: mqtt.publish
        data:
          topic: "/garage/motion"
          payload: "off"
          retain: false

  - alias: Kitchen Camera Motion Reset
    initial_state: true
    trigger:
      - platform: state
        entity_id: binary_sensor.kitchen_camera_motion
        to: "on"
        from: "off"
    action:
      - delay: "00:00:30"
      - service: mqtt.publish
        data:
          topic: "/kitchen/motion"
          payload: "off"
          retain: false

  - alias: Frontroom Camera Motion Reset
    initial_state: true
    trigger:
      - platform: state
        entity_id: binary_sensor.frontroom_camera_motion
        to: "on"
        from: "off"
    action:
      - delay: "00:00:30"
      - service: mqtt.publish
        data:
          topic: "/frontroom/motion"
          payload: "off"
          retain: false

  ################################################################################
  # Notifies when either of the garage door is opened or closed
  ###############################################################################
  - alias: Notify Garage Door Status
    initial_state: true
    trigger:
      platform: state
      entity_id:
        - binary_sensor.two_car_garage_door_tilt_sensor_sensor
        - binary_sensor.single_car_garage_door_tilt_sensor_sensor
    condition:
      - condition: template
        value_template: "{{ trigger.from_state.state not in ['unavailable', 'unknown'] }}"
      - condition: template
        value_template: "{{ trigger.to_state.state not in ['unavailable', 'unknown'] }}"
      - condition: template
        value_template: "{{ states('input_boolean.garage_door_notifications') == 'on' }}"
    action:
      - service: switch.turn_on
        entity_id: switch.garage
      - service: script.notify_me
        data_template:
          message: >
            {% if trigger.to_state.state | lower == "on" %}
                {{ trigger.to_state.attributes.friendly_name }} is now OPENED!
            {% elif trigger.to_state.state | lower == "off" %}
                {{ trigger.to_state.attributes.friendly_name }} is now CLOSED!
            {% endif %}
      - service: script.voice_notify
        data_template:
          message: >
            {% set doors = "" %}
              {% if states('binary_sensor.two_car_garage_door_tilt_sensor_sensor') == "on"  and
                    states('binary_sensor.single_car_garage_door_tilt_sensor_sensor') == "on" %}
                {% set doors = "Attention! Both Garage Doors are OPEN" %}
              {% elif states('binary_sensor.two_car_garage_door_tilt_sensor_sensor') == "off"  and
                      states('binary_sensor.single_car_garage_door_tilt_sensor_sensor') == "off" %}
                {% set doors = "Both Garage Doors are now CLOSED" %}
              {% else %}
                {% if trigger.to_state.state | lower == "on" %}
                  Attention! Your {{ trigger.to_state.attributes.friendly_name }} is now OPENED!
                {% elif trigger.to_state.state | lower == "off" %}
                  Your {{ trigger.to_state.attributes.friendly_name }} is now CLOSED!
                {% endif %}
              {% endif %}
            {{ doors }}
      - delay: "00:00:05"
      - service: camera.snapshot
        data_template:
          entity_id: "camera.garage_camera"
          filename:
            "{{ '/home/homeassistant/.homeassistant/www/downloads/camera/garage/garage_' ~
            (states.automation.notify_garage_door_status.last_triggered ~ '').replace('-','_')
            .replace(' ', '_').replace(':','_').replace('.','_').replace('+','_') ~ '.jpg' }}"
      - service: notify.notify_smtp
        data_template:
          title: 'Garage Door Status {{ now().strftime("%d %h %Y, %I:%M:%S %p") }}'
          message: >-
            {% set doors = "" %}
            {% if states('binary_sensor.two_car_garage_door_tilt_sensor_sensor') == "on"  and
                  states('binary_sensor.single_car_garage_door_tilt_sensor_sensor') == "on" %}
              {% set doors = "Both Garage Doors are OPEN" %}
            {% elif states('binary_sensor.two_car_garage_door_tilt_sensor_sensor') == "off"  and
                    states('binary_sensor.single_car_garage_door_tilt_sensor_sensor') == "off" %}
              {% set doors = "Both Garage Doors are CLOSED" %}
            {% else %}
              {% set doors = states.binary_sensor.single_car_garage_door_tilt_sensor_sensor.name ~ " is " ~
                            ('Closed' if states('binary_sensor.single_car_garage_door_tilt_sensor_sensor') == 'off' else 'OPEN')
                             ~ " and " ~ states('binary_sensor.two_car_garage_door_tilt_sensor_sensor.name') ~ " is " ~
                            ('Closed' if states('binary_sensor.two_car_garage_door_tilt_sensor_sensor') == 'off' else 'OPEN') %}
            {% endif %}
            Your {{doors}} on {{ now().strftime("%d %h %Y, at %I:%M:%S %p") }}. Please check the garage snapshot below.
          data:
            images:
              - "{{ '/home/homeassistant/.homeassistant/www/downloads/camera/garage/garage_' ~
                (states.automation.notify_garage_door_status.last_triggered ~ '').replace('-','_')
                .replace(' ', '_').replace(':','_').replace('.','_').replace('+','_') ~ '.jpg' }}"
      - service_template: >
          {% if trigger.to_state.state | lower == "on" %}
            switch.turn_on
          {% else %}
            switch.turn_off
          {% endif%}
        data:
          entity_id: switch.garage

  # Notify Entry Door Status
  ###############################################################################
  - alias: Voice Notify Entry Door Status
    initial_state: true
    trigger:
      platform: state
      entity_id:
        - binary_sensor.aeotec_zw120_door_window_sensor_gen5_sensor
        - binary_sensor.back_door_sensor_sensor
    condition:
      - condition: template
        value_template: "{{ trigger.from_state.state not in ['unavailable', 'unknown']  }}"
    action:
      - service: script.voice_notify
        data_template:
          message: >
            {% if trigger.to_state.state | lower == "on" %}
              Your {{ trigger.to_state.attributes.friendly_name.replace('Sensor', '') }} is OPEN,
              {% if states('alarm_control_panel.home') == 'armed_home' or
                    states('alarm_control_panel.home') == 'armed_away' %}
              But your home security system is ON.
              {% endif %}
            {% elif trigger.to_state.state | lower == "off" %}
              Your {{ trigger.to_state.attributes.friendly_name.replace('Sensor', '') }} is CLOSED!
            {% endif %}
          greeting: "no"
          only_at_night: >
            {% if states('alarm_control_panel.home') == 'armed_home' %}
              no
            {% else %}
              yes
            {% endif %}

  - alias: When Front Door Opens Turn Front Room Lights ON
    initial_state: true
    trigger:
      platform: state
      entity_id: binary_sensor.aeotec_zw120_door_window_sensor_gen5_sensor
      to: "on"
    condition:
      - condition: template
        value_template: "{{ states('sun.sun') == 'below_horizon' }}"
    action:
      - service: switch.turn_on
        entity_id: switch.front_room

  - alias: When Back Door Opens Turn Kitchen Lights ON
    initial_state: true
    trigger:
      platform: state
      entity_id: binary_sensor.back_door_sensor_sensor
      to: "on"
    condition:
      - condition: template
        value_template: "{{ states('sun.sun') == 'below_horizon' }}"
    action:
      - service: switch.turn_on
        entity_id: switch.kitchen

  ################################################################################
  #  When I open the garage door
  #     if it is dark outside, OR
  #     both the garage doors are closed
  #       ==> turn the Garage lights ON, and start timer!
  ################################################################################
  - alias: Garage Lights On When Door is Opened
    initial_state: true
    trigger:
      platform: state
      entity_id: binary_sensor.garage_door_sensor_sensor
      to: "on"
    condition:
      condition: or
      conditions:
        - condition: template
          value_template: '{{states.sun.sun.state == "below_horizon"}}'
        - condition: and
          conditions:
            - condition: template
              value_template: "{{ states('binary_sensor.single_car_garage_door_tilt_sensor_sensor') == 'off' }}"
            - condition: template
              value_template: "{{ states('binary_sensor.two_car_garage_door_tilt_sensor_sensor') == 'off' }}"
    action:
      - service: switch.turn_on
        entity_id: switch.garage
      - service: timer.start
        entity_id: timer.timer_garage