blueprint:
  name: Outdoor Light - Sunset, Dim, Night Off, Morning On
  description: >
    Turns outdoor lights on when it gets dark, optionally dims them at a
    configured time, turns them off at a configured night time, optionally
    turns them back on in the morning if it is still dark, and finally
    turns them off again when daylight returns.

  domain: automation

  input:

    light_target:
      name: Light(s)
      selector:
        target:
          entity:
            domain: light

    enable_entity:
      name: Enable Entity (optional)
      description: >
        Automation only runs while this entity is ON.
      default:
      selector:
        entity:

    evening_elevation:
      name: Evening elevation
      description: Turn lights on below this sun elevation.
      default: -4
      selector:
        number:
          min: -12
          max: 5
          step: 0.5
          mode: slider
          unit_of_measurement: "°"

    morning_elevation:
      name: Morning elevation
      description: Turn lights off above this sun elevation.
      default: -4
      selector:
        number:
          min: -12
          max: 5
          step: 0.5
          mode: slider
          unit_of_measurement: "°"

    dim_enabled:
      name: Enable Dimming
      description: >
        Dim the lights to a configured brightness at a configured time.
      default: false
      selector:
        boolean:

    dim_time:
      name: Dim Time
      description: Time when the lights should be dimmed.
      default: "22:00:00"
      selector:
        time:

    dim_brightness:
      name: Dim Brightness
      description: Brightness percentage to use at the dim time.
      default: 20
      selector:
        number:
          min: 1
          max: 100
          step: 1
          mode: slider
          unit_of_measurement: "%"

    night_off_enabled:
      name: Enable Night Off
      default: true
      selector:
        boolean:

    night_off_time:
      name: Night Off Time
      default: "23:00:00"
      selector:
        time:

    morning_on_enabled:
      name: Enable Morning On
      default: true
      selector:
        boolean:

    morning_on_time:
      name: Morning On Time
      default: "05:30:00"
      selector:
        time:

variables:
  enable_entity: !input enable_entity
  night_off_enabled: !input night_off_enabled
  morning_on_enabled: !input morning_on_enabled
  dim_enabled: !input dim_enabled
  dim_brightness: !input dim_brightness

trigger:

  - id: evening
    platform: numeric_state
    entity_id: sun.sun
    attribute: elevation
    below: !input evening_elevation

  - id: morning
    platform: numeric_state
    entity_id: sun.sun
    attribute: elevation
    above: !input morning_elevation

  - id: dim
    platform: time
    at: !input dim_time

  - id: night_off
    platform: time
    at: !input night_off_time

  - id: morning_on
    platform: time
    at: !input morning_on_time

condition:
  - condition: template
    value_template: >
      {% if enable_entity is none %}
        true
      {% elif enable_entity == '' %}
        true
      {% else %}
        {{ is_state(enable_entity, 'on') }}
      {% endif %}

action:
  - choose:

      #
      # Evening
      #
      - conditions:
          - condition: trigger
            id: evening

        sequence:
          - service: light.turn_on
            target: !input light_target
            data:
              brightness_pct: 100

      #
      # Dim
      #
      - conditions:
          - condition: trigger
            id: dim

          - condition: template
            value_template: "{{ dim_enabled }}"

          - condition: state
            entity_id: !input light_target
            state: "on"

        sequence:
          - service: light.turn_on
            target: !input light_target
            data:
              brightness_pct: "{{ dim_brightness }}"

      #
      # Morning
      #
      - conditions:
          - condition: trigger
            id: morning

        sequence:
          - service: light.turn_off
            target: !input light_target

      #
      # Night Off
      #
      - conditions:
          - condition: trigger
            id: night_off

          - condition: template
            value_template: "{{ night_off_enabled }}"

        sequence:
          - service: light.turn_off
            target: !input light_target

      #
      # Morning On
      #
      - conditions:
          - condition: trigger
            id: morning_on

          - condition: template
            value_template: "{{ morning_on_enabled }}"

          - condition: numeric_state
            entity_id: sun.sun
            attribute: elevation
            below: !input morning_elevation

        sequence:
          - service: light.turn_on
            target: !input light_target
            data:
              brightness_pct: 100