###############################################################################
#   @author         :   Jeffrey Stone 
#   @date           :   02/19/2019
#   @package        :   Presence
#   @description    :   A Collection of Presence Related Trackers and Sensors 
###############################################################################

input_datetime:
  last_time_home_jeff:
    name: Jeff Last Seen
    has_date: true
    has_time: true
  last_time_home_kat:
    name: Kat Last Seen
    has_date: true
    has_time: true
  last_time_home_skylar:
    name: Skylar Last Seen
    has_date: true
    has_time: true


# Testing Proximity Sensors
proximity:
  home_jeff:
    devices:
      - device_tracker.life360_jeffrey_stone
    zone: home
    tolerance: 5
    unit_of_measurement: mi
  home_kat:
    devices:
      - device_tracker.life360_kat_stone
    zone: home
    tolerance: 5
    unit_of_measurement: mi
  home:
    devices:
      - device_tracker.life360_jeffrey_stone
      - device_tracker.life360_kat_stone
    zone: home
    tolerance: 5
    unit_of_measurement: mi

sensor:
  - platform: template
    sensors:
      jeff_location:
        friendly_name: "Jeff's Current Location"
        unit_of_measurement: ''
        value_template: >-
            {% set person = states.person.jeffrey.state %}
            {%- if person in ['Sprouts','Kroger1','Kroger2'] %}
              Grocery Store
            {% elif person in ['HomeDepot','Lowes'] %}
              Home Improvement Store
            {% elif person in ['Walmart','Target'] %}
              Super Store
            {% else %}
              {% if person in ['not_home'] %}
                {{ states.device_tracker.life360_jeffrey_stone.attributes.address }} 
              {% else %}
                {{ states.person.jeffrey.state }}
              {%- endif %}
            {%- endif %}
  - platform: template
    sensors:
      skylar_location:
        friendly_name: "Skylar's Current Location"
        unit_of_measurement: ''
        value_template: >-
            {% if is_state('input_boolean.skylar_school', 'on') %}
              school
            {% elif is_state('calendar.skylar_events', 'on') %}
                  {{ states.calendar.skylar_events.attributes.message }}
            {%- elif is_state('person.jeffrey', 'home') and is_state('person.katherine', 'home') and is_state('input_boolean.skylar_school', 'off')%}
              home
            {%- elif is_state('person.jeffrey', 'Summit') and is_state('input_boolean.skylar_school', 'off')%}
              {{ states.sensor.kat_location.state }}
            {%- elif is_state('person.katherine', 'ZooAtlanta') and is_state('input_boolean.skylar_school', 'off')%}
              {{ states.person.jeffrey.state }}
            {% else %}
              {{ states.person.skylar.state }}
            {%- endif %}
  - platform: template
    sensors:
      kat_location:
        friendly_name: "Kat's Current Location"
        unit_of_measurement: ''
        value_template: >-
            {% set person = states.person.katherine.state %}
            {%- if person in ['Sprouts','Kroger1','Kroger2'] %}
              Grocery Store
            {% elif person in ['HomeDepot','Lowes'] %}
              Home Improvement Store
            {% elif person in ['Walmart','Target'] %}
              Super Store
            {% else %}
              {%- if person in ['ZooAtlanta'] %}
                Zoo Atlanta
              {% elif person in ['not_home'] %}
                {{ states.device_tracker.life360_kat_stone.attributes.address }} 
              {% else %}
                {{ states.person.katherine.state }}
              {%- endif %}
            {%- endif %}
  - platform: mqtt
    name: "Family Status"
    state_topic: "house/family/status"
    payload_available: "online"
    payload_not_available: "offline"
  - platform: mqtt
    name: "Family Arrived"
    state_topic: "house/family/arrived"
    payload_available: "online"
    payload_not_available: "offline"
  - platform: template
    sensors:
      jeff_home:
        value_template: >-
          {{ is_state('device_tracker.jeffrey_s_iphone_11', 'home') or is_state('device_tracker.jeffrey_s_iphone_11_app', 'home')
             or is_state('device_tracker.life360_jeffrey_stone', 'home') }}
  - platform: template
    sensors:
      kat_home:
        value_template: >-
          {{ is_state('device_tracker.iphone', 'home')
             or is_state('device_tracker.life360_kat_stone', 'home') or is_state('device_tracker.iphone', 'home') }}

automation:
  - id: skylar_is_awake
    alias: Skylar is Awake
    initial_state: true
    trigger:
      - platform: state
        entity_id: binary_sensor.skylar_bedroom_motion_occupancy
        to: 'on'
        from: 'off'
      - platform: state
        entity_id: binary_sensor.skylar_room_occupancy
        to: 'on'
        from: 'off'
    condition:
      - condition: time
        after: '05:00:00'
        before: '08:30:00'
      - condition: state
        entity_id: input_boolean.skylar_awake
        state: 'off'
    action:
      - service: input_datetime.set_datetime
        entity_id: input_datetime.skylar_awake_at
        data:
          time: "{{ now().strftime('%H:%M') }}"
      - service: input_boolean.turn_on
        entity_id: input_boolean.skylar_awake

  - id: skylar_early_morning_tv
    alias: Skylar Early Morning TV
    initial_state: true
    trigger:
      - platform: state
        entity_id: media_player.theater_tv
        to: 'off'
        from: 'on'
      - platform: state
        entity_id: media_player.croft_tv
        to: 'playing'
    condition:
      - condition: time
        after: '05:00:00'
        before: '08:30:00'
      - condition: state
        entity_id: input_boolean.skylar_dressed_reminder
        state: 'off'
    action:
      - service: script.status_annc
        data:
          who: >-
            {% if is_state('media_player.theater_tv', 'on') %}
              theater 
            {% else %}
              croft
            {% endif %}
          call_interuption: 1
          call_skylar_dressed_reminder: 1
      - service: input_boolean.turn_on
        entity_id: input_boolean.skylar_dressed_reminder

  - id: kat_arrives_zoo
    alias: Kat Arrives at Zoo
    initial_state: true
    trigger:
    - platform: zone
      event: enter
      zone: zone.zoo_atlanta
      entity_id: person.katherine
    action:
    - service: input_boolean.turn_off
      entity_id: input_boolean.kat_travel_monitor
    - service: script.status_annc
      data:
        who: '{{ states.sensor.room_presence.state }}'
        speech_message: 'Kat has arrived at work.'
  
  - id: kat_leaves_zoo
    alias: Kat Leaves Zoo Notification
    initial_state: true
    trigger:
    - platform: zone
      event: leave
      zone: zone.zoo_atlanta
      entity_id: person.katherine
    action:
    - service: input_boolean.turn_on
      entity_id: input_boolean.kat_travel_monitor
    - service: script.status_annc
      data_template:
        who: '{{ states.sensor.room_presence.state }}'
        call_interpruption: 1 
        call_kat_location: 1
        

  - id: skylar_at_school
    alias: Skylar is at School
    trigger:
    - entity_id: person.jeffrey
      event: leave
      platform: zone
      zone: zone.starling
    - entity_id: person.katherine
      event: leave
      platform: zone
      zone: zone.starling
    - entity_id: person.skylar
      event: enter
      platform: zone
      zone: zone.starling
    condition:
      - condition: time
        before: "13:30:00"
        weekday:
          - mon
          - tue
          - wed
          - thu
          - fri
      - condition: state 
        entity_id: input_boolean.skylar_school
        state: 'off'
    action:
    - service: input_boolean.turn_on
      entity_id: input_boolean.skylar_school
    - service: script.text_alert
      data:
        who: parents
        message: "Skylar has been dropped off at school."
    initial_state: true

  - id: skylar_left_school
    alias: Skylar left School
    trigger:
    - entity_id: person.jeffrey
      event: leave
      platform: zone
      zone: zone.starling
    - entity_id: person.katherine
      event: leave
      platform: zone
      zone: zone.starling
    - entity_id: person.skylar
      event: leave
      platform: zone
      zone: zone.starling
    condition:
      - condition: time
        after: "11:30:00"
        weekday:
          - mon
          - tue
          - wed
          - thu
          - fri
      - condition: state 
        entity_id: input_boolean.skylar_school
        state: 'on'
    action:
    - service: input_boolean.turn_off
      entity_id: input_boolean.skylar_school
    - service: script.text_alert
      data:
        who: parents
        message: "Skylar has been picked up from school."
    initial_state: true

  
  
  - id: jeff_arrives_summit
    alias: Jeff Arrives At Summit
    trigger:
    - entity_id: person.jeffrey
      event: enter
      platform: zone
      zone: zone.summit
    action:
    - service: script.text_notify
      data:
        who: "kat"
        message: "Jeff has arrived at Summit"
    initial_state: true
  
  - id: jeff_arrives_summit_notification
    alias: Notify Kat Jeff At Summit
    trigger:
    - entity_id: person.jeffrey
      event: enter
      platform: zone
      zone: zone.summit
    action:
    - service: script.jeff_destination_na
    initial_state: true
  
  - id: jeff_leaves_summit
    alias: Jeff Leaves Summit
    initial_state: true
    trigger:
    - entity_id: person.jeffrey
      event: leave
      platform: zone
      zone: zone.summit
    action:
    - service: input_boolean.turn_off
      entity_id: input_boolean.jeff_traffic_alert_home
  
  - id: welcome_home
    alias: Welcome Home
    mode: restart
    trigger:
      - platform: state
        entity_id:
          - person.jeffrey
          - person.katherine
          - person.uncle_matt
          - person.papa
          - person.skylar
        from: 'not_home'
        to: 'home'
    action:
    - choose:
      - conditions:
        - condition: state
          entity_id: input_boolean.welcome_home
          state: "on"
        sequence:
        - service: script.turn_on 
          entity_id: script.welcome_briefing
      default: 
      - service: group.set
        data:
          object_id: "arriving"
          add_entities: >-
            {{ trigger.to_state.entity_id }}
      - wait_template: "{{ is_state('binary_sensor.laundry_room_door', 'on') }}"
        timeout: '00:3:00'   
      - service: script.status_annc
        data_template:
          who: '{{ states.sensor.room_presence.state }}'
          call_interuption: 1
          speech_message: >
            {% set person = expand('group.arriving')|map(attribute='name')|join(' and ') %}
            {% set peoplecount = expand('group.arriving') | count %}
            {% if peoplecount == 1 %}
              {% set is_are = ' is ' %}
              {% set has_have = ' has ' %}
            {% else %}
              {% set is_are = ' are ' %}
              {% set has_have = ' have ' %}
            {% endif %}
            {%- macro greeting_sentence(person, is_are, has_have) -%}
            {{ [
              person ~ has_have + " arrived.",
              "My sensors are picking up the presence of additional humans. " ~ person ~ has_have + " been identified as home.",
              "Guess who is home?" ~ person ~ is_are,
              "I am sensing a disturbance in the force. "  ~ person +" must be home!",
              person ~ is_are + "now in the house.",
              person  ~ is_are + " now here.  Hash tag Welcome Home.",
              person  ~ is_are + " now here.  Hash tag Home.",
              "I know a secret! "  ~ person ~ is_are +" home!",
              "Just a quick announcement. " ~ person ~ has_have +" arrived!",
              "Hey" ~ person + "! High Five! Glad you are finally home.",
              "Just a quick announcement. " ~ person ~ has_have + "  arrived!",
              person ~ has_have + " finally made it home."
              ] | random }}
            {%- endmacro -%}
            {{greeting_sentence(person, is_are, has_have)}}
      - delay: 00:02:00  
      - service: group.set
        data:
          object_id: "arriving"
          entities: []     
          
  - id: guests_have_arrived
    alias: Guests have arrived
    trigger:
    - entity_id: person.papa
      event: enter
      platform: zone
      zone: zone.home
    - entity_id: person.uncle_matt
      event: enter
      platform: zone
      zone: zone.home
    action:
    - service: script.standby
    - service: script.family_is_home
    - service: input_boolean.turn_on
      entity_id: input_boolean.guest_mode
    initial_state: true


  - id: disable_bad_traffic_home_jeff
    alias: Disabling Jeff Bad Traffic Home
    initial_state: true
    trigger:
    - platform: numeric_state
      entity_id: sensor.jeff_ett_home
      below: 40
    - platform: state
      entity_id: sensor.jeff_destination
      to: Home
    condition:
    - condition: state
      entity_id: input_boolean.jeff_traffic_alert_home
      state: 'on'
    action:
    - service: input_boolean.turn_off
      entity_id: input_boolean.jeff_traffic_alert_home

script:
  family_is_home:
    sequence:
    - condition: state
      entity_id: sensor.family_status
      state: Away
    - service: script.standby
    - service: mqtt.publish
      data:
        topic: house/family/status
        payload_template: Home
        retain: true
    - service: script.turn_on
      entity_id: script.welcome_briefing 

  family_is_away:
    sequence:
    - condition: state
      entity_id: sensor.family_status
      state: Home
    - service: script.appliances_off
    - service: scene.turn_on
      entity_id: scene.lights_out
    - service: input_boolean.turn_on
      entity_id: input_boolean.sentry_mode
    - service: scene.turn_on
      entity_id: scene.all_fans_off
    - service: mqtt.publish
      data:
        topic: house/family/status
        payload_template: Away
        retain: true
    - service: input_boolean.turn_on
      entity_id: input_boolean.welcome_home

  reset_skylar_sensors:
    sequence:
      - delay: 02:00:00
      - service: input_datetime.set_datetime
        entity_id: input_datetime.skylar_awake_at
        data:
          time: "00:00:00"
      - service: input_boolean.turn_off
        entity_id: input_boolean.skylar_awake
