###############################################################################
#   @author         :   Jeffrey Stone 
#   @date           :   04/11/2020
#   @package        :   Audio
#   @description    :   Audio related configuration. 
#   @notes          :   This package assumes you are running version .115.0 or greater. 
#
###############################################################################


################################
# Media Player section for any media players you want to define. Most of these are setup via the integrations flow in the UI, 
# but if not you may need to modify the following section. 
# For more info on Media Players visit https://www.home-assistant.io/integrations/media_player/
# MODIFY this section as needed or comment it out completely if not needed.
# media_player:
  # - platform: yamaha
  #   host: 192.168.7.152

################################
# Media extractor is used for playing youtube audio. For more info ->https://www.home-assistant.io/integrations/media_extractor/
#
# If you have this enabled in another package or in your configuration.yaml comment out the line below
media_extractor:


############################
# input_datetime (https://www.home-assistant.io/integrations/input_datetime/)
# 
# This is simply so we can track last called alexa.     
input_datetime:
  last_time_alexa_called:
    name: Last Time Alexa Called
    has_date: true
    has_time: true


################################
# Scripts to handle audio
script:

  ################################
  # local_audio is meant to be used to play audio in your media folder. (https://www.home-assistant.io/integrations/media_source/)
  # 
  # Before using make sure you update as needed.
  # 
  # To call this using in the action section of your automation:
  # 
  # - service: script.local_audio
  #   data:
  #     speaker: main
  #     volume: .5
  #     media: /media/local_audio.mp3
  #
  local_audio:
    sequence:
    # Ensure that audible notifications are allowed. Comment out if not needed.
    - condition: state
      entity_id: input_boolean.audible_notifications
      state: 'on'
    # Ensure the family is home. If you are using a group to track the family, or a person just update as needed. Comment out if not needed.
    - condition: state
      entity_id: group.family
      state: 'home'
    # Update the media player with the one you want to use
    - service: media_player.turn_on
      data:
        entity_id: >
          {{ speaker }}
    # This sets the voume via a parameter when the script is called, and should be a value between .1 and 1.0
    - service: media_player.volume_set
      data:
        entity_id: >
          {{ speaker }}
        volume_level: >
          {{ volume }}
    - delay: 00:00:05
    # This tells it to play the media and is set when the script is called. 
    - service: media_player.play_media
      data:
        entity_id: >
          {{ speaker }}
        media_content_type: "music"
        media_content_id: >
          {{ media }}
  
  
  ################################
  # youtube_audio is meant to be used to play audio from well youtube. 
  # This scrtip requires the media_extractor integration.
  # 
  # Before using make sure you update as needed.
  # 
  # To call this using in the action section of your automation:
  # 
  # - service: script.youtube_audio
  #   data:
  #     speaker: main
  #     volume: .5
  #     media: https://www.youtube.com/watch?v=pVeX4C9B1Lk
  #
  youtube_audio:
    sequence:
    # Ensure that audible notifications are allowed. Comment out if not needed.
    - condition: state
      entity_id: input_boolean.audible_notifications
      state: 'on'
    # Ensure the family is home. If you are using a group to track the family, or a person just update as needed. Comment out if not needed.
    - condition: state
      entity_id: group.family
      state: 'home'
    # Update the media player with the one you want to use
    - service: media_player.turn_on
      data:
        entity_id: >
          {{ speaker }}
    # This sets the voume via a parameter when the script is called, and should be a value between .1 and 1.0
    - service: media_player.volume_set
      data:
        entity_id: >
          {{ speaker }}
        volume_level: >
          {{ volume }}
    # This tells it to play the media and is set when the script is called.
    #  media_content_type: video/Youtube
    - service: media_extractor.play_media
      data:
        entity_id: >
          {{ speaker }}
        media_content_type: music
        media_content_id: >
          {{ media }}

automation:
  - id: e1cb2fdc-0423-11eb-adc1-0242ac120002
    alias: Set Room Presence
    mode: restart
    trigger:
      - platform: state
        entity_id: sensor.room_audio
    action:
      - service: input_text.set_value
        data_template:
          entity_id: input_text.room_presence
          value: '{{ states(''sensor.room_audio'') }}'
      - service: mqtt.publish
        data:
          topic: house/presence/current_room
          payload: '{{ states(''sensor.room_audio'') }}'
          retain: true

  - id: e1cb287a-0423-11eb-adc1-0242ac120002
    alias: Notification Volume Dim
    initial_state: true
    trigger:
      - platform: state
        entity_id: input_boolean.audible_notifications
        to: 'off'
    action:
      - service: media_player.volume_set
        data:
          entity_id:
          - media_player.kitchen_display
          - media_player.kitchen_echo
          - media_player.upstairs_speaker
          - media_player.croft_speaker
          volume_level: .3

  - id: e1cb27bc-0423-11eb-adc1-0242ac120002
    alias: Notification Volume Normal
    initial_state: true
    trigger:
      - platform: state
        entity_id: input_boolean.audible_notifications
        to: 'on'
    action:
      - service: media_player.volume_set
        data:
          entity_id:
          - media_player.kitchen_display
          - media_player.kitchen_echo
          - media_player.upstairs_speaker
          - media_player.croft_speaker
          - media_player.ha_blue
          - media_player.living_room_echo
          - media_player.master_bedroom_speaker
          - media_player.skylars_bedroom_speaker
          volume_level: .5

  - id: e1cb17ea-0423-11eb-adc1-0242ac120002
    alias: Set Last Alexa Called Time 
    initial_state: true
    trigger:
      - platform: state
        entity_id: 
        - media_player.living_room_echo
        - media_player.kitchen_echo
        - media_player.skylars_echo
    condition:
      - condition: template
        value_template: '{{ trigger.to_state.attributes.last_called_timestamp | float > trigger.from_state.attributes.last_called_timestamp | float }}'   # Alexa has been triggered
    action:
      - service: input_datetime.set_datetime
        target:
          entity_id: input_datetime.last_time_alexa_called
        data:
          datetime: '{{ now().strftime(''%Y-%m-%d %H:%M:%S'') }}'
    
sensor:
  - platform: mqtt
    name: "Room Presence"
    state_topic: "house/presence/current_room"
  - platform: template
    sensors:
      room_audio:
        friendly_name: "Room Audio"
        value_template: >-
          {%- set last_alexa_called_seconds = (now() - as_local(states.media_player | selectattr('attributes.last_called','eq',True) | map(attribute='last_updated') | first)).seconds -%}
          {%- if last_alexa_called_seconds <= 60 %}  
            {{ states.media_player | selectattr('attributes.last_called','eq',True) | map(attribute='entity_id') | first }}
          {% elif expand('group.occupancy') | selectattr('state', 'eq', 'on') | list | count >= 1 %}
            {% set sensor = expand('group.occupancy') | selectattr('state', 'eq', 'on') | sort(attribute='last_changed') | last %}
              {% if is_state('input_boolean.audible_notifications', 'off') %}
                {% if sensor.name == 'Master Bedroom Motion occupancy' %}
                  master_bedroom
                {% else %}
                  kitchen      
                {%- endif %}
              {% else %} 
                {% if sensor.name == 'Master Bedroom Motion occupancy' %}
                    master_bedroom
                {% elif sensor.name in ('Back Door Motion','Kitchen Motion Occupancy' ) %}
                    kitchen
                {% elif sensor.name in ('Living Room Motion Occupancy' ) %}
                    living_room
                {% elif sensor.name in ('Skylar Bedroom Motion occupancy' ) %}
                    skylar_bedroom
                {% else %}
                  main
                {%- endif %}
            {%- endif %}
          {% elif is_state('media_player.theater_tv', 'on') %}
            theater
          {% else %}
            {{ states('sensor.room_presence') }}
          {% endif %}
      alexa_audio:
        friendly_name: "Alexa Audio"
        value_template: >-
            {%- if is_state('sensor.last_alexa', 'media_player.living_room_echo') %}
              living_room
            {% elif is_state('sensor.last_alexa', 'media_player.kitchen_echo') %}
              kitchen
            {% elif is_state('sensor.last_alexa', 'media_player.skylar_s_bedroom') %}
              skylar_bedroom
            {% else %}
              main
            {%- endif %}
      last_alexa:
        value_template: >
          {{ states.media_player | selectattr('attributes.last_called','eq',True) | map(attribute='entity_id') | first }}