sensor:
  - platform: template
    name: "Template Sensor"
    id: template_sens
    lambda: |-
      if (id(some_binary_sensor).state) {
        return 42.0;
      } else {
        return 0.0;
      }
    update_interval: 60s

esphome:
  on_boot:
    - sensor.template.publish:
        id: template_sens
        state: 42.0

    # Templated
    - sensor.template.publish:
        id: template_sens
        state: !lambda "return 42.0;"

    - datetime.date.set:
        id: test_date
        date:
          year: 2021
          month: 1
          day: 1
    - datetime.date.set:
        id: test_date
        date: !lambda "return {.day_of_month = 1, .month = 1, .year = 2021};"
    - datetime.date.set:
        id: test_date
        date: "2021-01-01"

binary_sensor:
  - platform: template
    id: some_binary_sensor
    name: "Garage Door Open"
    lambda: |-
      if (id(template_sens).state > 30) {
        // Garage Door is open.
        return true;
      } else {
        // Garage Door is closed.
        return false;
      }
  - platform: template
    id: other_binary_sensor
    name: "Garage Door Closed"
    condition:
      sensor.in_range:
        id: template_sens
        below: 30.0

output:
  - platform: template
    id: outputsplit
    type: float
    write_action:
      - logger.log: "write_action"

switch:
  - platform: template
    name: "Template Switch"
    lambda: |-
      if (id(some_binary_sensor).state) {
        return true;
      } else {
        return false;
      }
    turn_on_action:
      - logger.log: "turn_on_action"
    turn_off_action:
      - logger.log: "turn_off_action"

button:
  - platform: template
    name: "Template Button"
    on_press:
      - logger.log: Button Pressed

cover:
  - platform: template
    name: "Template Cover"
    lambda: |-
      if (id(some_binary_sensor).state) {
        return COVER_OPEN;
      } else {
        return COVER_CLOSED;
      }
    open_action:
      - logger.log: open_action
    close_action:
      - logger.log: close_action
    stop_action:
      - logger.log: stop_action
    optimistic: true

number:
  - platform: template
    name: "Template number"
    optimistic: true
    min_value: 0
    max_value: 100
    step: 1

select:
  - platform: template
    name: "Template select"
    optimistic: true
    options:
      - one
      - two
      - three
    initial_option: two

lock:
  - platform: template
    name: "Template Lock"
    lambda: |-
      if (id(some_binary_sensor).state) {
        return LOCK_STATE_LOCKED;
      } else {
        return LOCK_STATE_UNLOCKED;
      }
    lock_action:
      - logger.log: lock_action
    unlock_action:
      - logger.log: unlock_action
    open_action:
      - logger.log: open_action

valve:
  - platform: template
    name: "Template Valve"
    lambda: |-
      if (id(some_binary_sensor).state) {
        return VALVE_OPEN;
      } else {
        return VALVE_CLOSED;
      }
    open_action:
      - logger.log: open_action
    close_action:
      - logger.log: close_action
    stop_action:
      - logger.log: stop_action
    optimistic: true

text:
  - platform: template
    name: "Template text"
    optimistic: true
    min_length: 0
    max_length: 100
    mode: text
  - platform: template
    name: "Template text lambda"
    mode: text
    update_interval: 1s
    lambda: |
      return std::string{"Hello!"};
    set_action:
      then:
        - logger.log:
            format: Template Text set to %s
            args: ["x.c_str()"]

alarm_control_panel:
  - platform: template
    name: Alarm Panel
    codes:
      - "1234"

datetime:
  - platform: template
    name: Date
    id: test_date
    type: date
    initial_value: "2000-1-2"
    set_action:
      - logger.log: "set_value"
    on_value:
      - logger.log:
          format: "Date: %04d-%02d-%02d"
          args:
            - x.year
            - x.month
            - x.day_of_month
  - platform: template
    name: Time
    id: test_time
    type: time
    initial_value: "12:34:56am"
    set_action:
      - logger.log: "set_value"
    on_value:
      - logger.log:
          format: "Time: %02d:%02d:%02d"
          args:
            - x.hour
            - x.minute
            - x.second
  - platform: template
    name: DateTime
    id: test_datetime
    type: datetime
    initial_value: "2000-1-2 12:34:56"
    set_action:
      - logger.log: "set_value"
    on_value:
      - logger.log:
          format: "DateTime: %04d-%02d-%02d %02d:%02d:%02d"
          args:
            - x.year
            - x.month
            - x.day_of_month
            - x.hour
            - x.minute
            - x.second

time:
  - platform: sntp  # Required for datetime

wifi:  # Required for sntp time
  ap: