######################################################################################################
###Script to send notifications to the ChromeCast Audios during normal hours and only when we are home! Call like this:
  # action:
    # service: script.speech_engine
    # data:
    #   call_no_announcement:
    #   call_dark_outside:
    #   call_window_check:
    #   call_garage_check:
    #   call_responsibilities
    #   call_light_check
    #   call_inside_weather
    #   call_outside_weather
# # @CCOSTAN
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
######################################################################################################

speech_engine:
  sequence:
    - condition: or
      conditions:
        - condition: state
          entity_id: group.family
          state: 'home'
        - condition: state
          entity_id: input_boolean.guest_mode
          state: 'on'

    - service: script.speech_processing
      data_template:
        media_player: >-
            {% if media_player | length == 0 %}
              {% set media_player = [
                'media_player.livingroomcc',
                'media_player.bedroom_alarm_panel'
              ] %}
            {% endif %}

            {% if media_player is not string and media_player is sequence %}
              {% set media_player = media_player|join(', ') %}
            {% endif %}

            {{ media_player }}

        speech_message: >-
          {%- macro dark_outside() -%}
            {{ [
              'It is pretty dark outside. I will turn on the outside lights now.',
              'It is a little past Sunset. Time to turn on the outside lights. I am on it.',
              'I will switch on the outside lights. It is getting dark outside.',
              'Time to turn on the front lights. I will take care of it.'
            ]|random }}
          {%- endmacro -%}

          {%- macro responsibilities() -%}
            {% if now().strftime('%a') == 'Wed' or now().strftime('%a') == 'Sun' %}
              Today is {{ now().strftime('%A') }} and {{ now().strftime('%A') }} is garbage day.
            {% endif %}
            {% if now().strftime('%a') == 'Wed' %}
              Both Recycling and regular Garbage goes out. Please take out all of the garbage cans tonight.
            {% endif %}
            {% if now().strftime('%j')|int % 2 != 0 %}
              Today is Justin's day to do the chores.
            {% else %}
              Today is Paige's day to do the chores.
            {% endif %}
          {%- endmacro -%}

          {%- macro inside_weather() -%}
            Inside the house, it is {{ states.climate.downstairs.attributes['current_temperature'] }} degrees with around {{ states('sensor.downstairs_thermostat_humidity') }} percent humidity.
          {%- endmacro -%}

          {%- macro outside_weather() -%}
            Outside, it is going to be {{ states('sensor.dark_sky_minutely_summary') }}
          {%- endmacro -%}

          {%- macro light_check() -%}
            {% if states.group.all_lights.state != 'off' -%}
              There are
            {% for state in states.light if state.state == 'on' -%}
              {%- if loop.last -%}
                {{ loop.index }}
              {%- endif -%}
            {%- endfor %}
            lights on right now.
            {% set comma = joiner(', ') %}
            The
            {% for group in states.group|groupby('state') -%}
              {%- for entity in group.list if entity.state == 'on'
              and entity.name.split(' ')[1]|lower == 'lights'
              and entity.name.split(' ')[0]|lower != 'all'
              and entity.name.split(' ')[0]|lower != 'interior'
              -%}
                {{ 'and' if loop.last and not loop.first else comma() }}
                {{ entity.name|replace('Lights','')}}
              {%- endfor -%}
            {%- endfor -%}
            lights are on.
            {%- endif -%}
          {%- endmacro -%}

          {%- macro window_check() -%}
            {% if states.group.entry_points.state != 'off' -%}
              {% set comma = joiner(', ') %}
              The
              {% for state in states.binary_sensor if state.state == 'on' and state.attributes.device_class == 'opening' -%}
              {%- endfor %}
              {% for group in states.binary_sensor|groupby('state') -%}
                {%- for entity in group.list  if entity.state == 'on' and entity.attributes.device_class == 'opening'  -%}
                  {{ ' and' if loop.last and not loop.first else comma() }}
                  {{ entity.attributes.friendly_name }}
                {%- endfor -%}
              {% endfor %}
               need to be closed.
            {%- endif -%}
          {%- endmacro -%}

          {%- macro garage_check() -%}
            {% if states.group.garage_doors.state !='closed' -%}
              The
              {%- for state in states.cover -%}
              {%- endfor %}
              {% for group in states.cover|groupby('state') -%}
                {%- for entity in group.list  if entity.state == 'open' and entity.attributes.device_class == 'garage'  -%}
                  {{ ' and' if loop.last and not loop.first }}
                  {{ entity.attributes.friendly_name }}
                {%- endfor -%}
              {%- endfor %}
              need to be closed.
            {%- endif -%}
          {%- endmacro -%}

          {%- macro medicine() -%}
            {% if is_state('input_boolean.medicine', 'off') -%}
              It looks like Carlo has not taken his medicine yet. Please make sure Carlo takes his medicine now.
            {% endif -%}
          {%- endmacro -%}

          {%- macro iss() -%}
            {% if is_state('binary_sensor.iss', 'on') -%}
              Here is something interesting. The international space station is above us now. There are {{ states.binary_sensor.iss.attributes['number_of_people_in_space'] }} people in space right now.
              {{ outside_weather() }}
            {% endif -%}
          {%- endmacro -%}

          {%- macro moon() -%}
            {%- if states.sensor.moon.state == 'Full moon' -%}
              Check out the full moon tonight!
            {%- endif -%}
          {%- endmacro -%}

          {%- macro uv() -%}
            {% if states.sensor.dark_sky_uv_index.state|int >= 6 and states.sensor.dark_sky_uv_index.state|int <= 7.9 %}
              Today's UV index is {{ states.sensor.dark_sky_uv_index.state }}.  You should wear sunscreen if going outside.
            {% elif states.sensor.dark_sky_uv_index.state|int >= 8 and states.sensor.dark_sky_uv_index.state|int <=10.9 %}
              Today's UV index is {{ states.sensor.dark_sky_uv_index.state }}.  This is VERY HIGH. Be sure wear sunscreen and re-apply.
            {% elif states.sensor.dark_sky_uv_index.state|int >= 11 %}
              Today's UV index is {{ states.sensor.dark_sky_uv_index.state }}.  This is EXTREME. You should be very cautious going outside.
            {% endif %}
          {%- endmacro -%}

          {%- macro holiday() -%}
            {% if states.sensor.holiday.state != '' %}
              Today is {{ states.sensor.holiday.state }}.
            {% endif %}
          {%- endmacro -%}


          {# ********************************************* #}
          {#  ******** Start the Speech routines ********  #}
          {# ********************************************* #}

          {% if call_no_announcement != 1 %}
            {% if now().strftime('%H')|int < 12 and now().strftime('%H')|int > 6 %}
              Good morning.
            {% elif now().strftime('%H')|int >= 12 and now().strftime('%H')|int < 17 %}
              Good afternoon.
            {% else %}
              Good evening.
            {% endif %}
          {% endif %}

          {# Called from Annoucenments #}
          {{ personarriving }}

          {# Called from Nest when thermostats turn on #}
          {{ NestStatus }}

          {% if call_inside_weather == 1 %}
            {{ inside_weather() }}
          {% endif %}

          {% if call_outside_weather == 1 and is_state('sun.sun', 'above_horizon') %}
            {{ outside_weather() }}
          {% endif %}

          {{ DoorOpened }}
          {{ DoorClosed }}

          {% if call_dark_outside == 1 %}
            {{ dark_outside() }}
          {% endif %}

          {% if call_garage_check == 1 or is_state('sun.sun', 'below_horizon') %}
            {{ garage_check() }}
          {% endif %}

          {% if (call_window_check == 1 or is_state('sun.sun', 'below_horizon')) or is_state('group.entry_points', 'on') %}
            {{ window_check() }}
          {% endif %}

          {{ NewDevice }}

          {% if call_light_check == 1 %}
            {{ light_check() }}
          {% endif %}

          {% if call_responsibilities == 1 %}
            {{ responsibilities() }}
          {% endif %}

          {% if now().strftime('%H')|int > 21 %}
            {{ medicine() }}
          {% endif %}

          {% if value1 is not none %}
            {{ value1 }}
          {% endif %}

          {# call a Random fact about the house #}
          {{ ([iss, moon, uv, holiday]|random)() }}

    - service: input_boolean.turn_off
      data:
        entity_id:
          - input_boolean.home_stats
          - input_boolean.responsibilities
