###############################################################################
#   @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:

################################
# 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:
  #     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: sensor.family_status
      state: Home
    # Update the media player with the one you want to use
    - service: media_player.turn_on
      entity_id: media_player.ha_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: media_player.ha_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
      entity_id: media_player.ha_speaker
      data:
        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:
  #     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: sensor.family_status
      state: Home
    # Update the media player with the one you want to use
    - service: media_player.turn_on
      entity_id: media_player.ha_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_template:
        entity_id: media_player.ha_speaker
        volume_level: >
          {{ volume }}
    # This tells it to play the media and is set when the script is called. 
    - service: media_extractor.play_media
      entity_id: media_player.ha_speaker
      data_template:
        media_content_type: video/youtube
        media_content_id: >
          {{ media }}

automation:
  - id: e1cb2fdc-0423-11eb-adc1-0242ac120002
    alias: Set Room Presence
    mode: restart
    trigger:
      - platform: state
        entity_id:
          - binary_sensor.master_bedroom_motion_occupancy
          - binary_sensor.kitchen_motion_occupancy
          - binary_sensor.living_room_motion_occupancy
          - binary_sensor.skylar_bedroom_motion_occupancy
          - binary_sensor.croft_occupancy
          - binary_sensor.back_door_motion
        from: 'off'
        to: 'on'
      - platform: state
        entity_id: 
          - media_player.kitchen_echo
          - media_player.living_room_echo
          - media_player.skylar_s_bedroom
        attribute: last_called
        to: True
    action:
      - service: input_text.set_value
        data_template:
          entity_id: input_text.room_presence
          value: >
            {% set room = trigger.to_state.attributes.friendly_name %}
            {% if room == 'Kitchen Echo' %}
              kitchen
            {% elif room == 'Living Room Echo' %}
              main
            {% elif room == 'Skylar\'s Bedroom' %}
              skylar_bedroom
            {%- elif is_state('media_player.theater_tv', 'on') %}
              theater
            {% elif room == 'Kitchen Motion occupancy' or room == 'Back Door Motion'%}
              kitchen
            {% elif room == 'Master Bedroom Motion occupancy' %}
              master_bedroom
            {% elif room == 'Living Room Motion occupancy' or room == 'Living Room Echo' %}
              main
            {% elif room == 'Croft Occupancy' %}
              croft
            {% elif room == 'Skylar Bedroom Motion occupancy' or room == 'Skylar\'s Bedroom' %}
              skylar_bedroom
            {% else %}
              main
            {% endif %}
      - service: mqtt.publish
        data:
          topic: house/presence/current_room
          payload: >
            {% set room = trigger.to_state.attributes.friendly_name %}
            {% if room == 'Kitchen Echo' %}
              kitchen
            {% elif room == 'Living Room Echo' %}
              main
            {% elif room == 'Skylar\'s Bedroom' %}
              skylar_bedroom
            {%- elif is_state('media_player.theater_tv', 'on') %}
              theater
            {% elif room == 'Kitchen Motion occupancy' or room == 'Back Door Motion'%}
              kitchen
            {% elif room == 'Master Bedroom Motion occupancy' %}
              master_bedroom
            {% elif room == 'Living Room Motion occupancy' or room == 'Living Room Echo' %}
              main
            {% elif room == 'Croft Occupancy' %}
              croft
            {% elif room == 'Skylar Bedroom Motion occupancy' or room == 'Skylar\'s Bedroom' %}
              skylar_bedroom
            {% else %}
              main
            {% endif %}
          retain: true
      


sensor:
  - platform: mqtt
    name: "Room Presence"
    state_topic: "house/presence/current_room"
  - platform: template
    sensors:
      room_audio:
        friendly_name: "Room Audio"
        value_template: >-
          {%- if is_state('media_player.theater_tv', 'on') %}
              theater
          {% else %}
            {% set sensor_count = expand('group.occupancy') | selectattr('state', 'eq', 'on') | list | count %}
            {% if sensor_count >= 1 %}
              {% for sensor in expand('group.occupancy') %}
                {% if as_timestamp(sensor.last_changed) == as_timestamp(expand('group.occupancy') | selectattr('state', 'eq', 'on') | map(attribute='last_changed') | max) %}
                  {% if is_state('input_boolean.audible_notifications', 'on') %}
                    {% if sensor.name == 'Kitchen Motion Occupancy' %}
                      kitchen
                    {% elif sensor.name == 'Master Bedroom Motion Occupancy' %}
                      master_bedroom
                    {% else %}
                      main
                    {%- endif %}
                  {% else %}
                    {% if sensor.name == 'Croft Occupancy' %}
                      croft
                    {% else %}
                      kitchen
                    {%- endif %}
                  {% endif %}
                {% endif %}
              {% endfor %}
            {% endif %}
          {% endif %}
      alexa_audio:
        friendly_name: "Alexa Audio"
        value_template: >-
            {%- if is_state('sensor.last_alexa', 'media_player.living_room_echo') %}
              main
            {% 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 }}