esphome:
  name: $devicename
  comment: $devicecomment
  platform: ESP8266
  board: d1_mini
  build_path: build/test3
  on_boot:
    - wait_until:
        - api.connected
        - wifi.connected
  includes:
    - custom.h

substitutions:
  devicename: test3
  devicecomment: test3 device

api:
  port: 8000
  password: 'pwd'
  reboot_timeout: 0min
  services:
    - service: hello_world
      variables:
        name: string
      then:
        - logger.log:
            format: 'Hello World %s!'
            args:
              - name.c_str()
    - service: empty_service
      then:
        - logger.log: 'Service Called'
    - service: all_types
      variables:
        bool_: bool
        int_: int
        float_: float
        string_: string
      then:
        - logger.log: 'Something happened'
        - stepper.set_target:
            id: my_stepper2
            target: !lambda 'return int_;'
    - service: array_types
      variables:
        bool_arr: bool[]
        int_arr: int[]
        float_arr: float[]
        string_arr: string[]
      then:
        - logger.log:
            format: 'Bool: %s (%u), Int: %d (%u), Float: %f (%u), String: %s (%u)'
            args:
              - YESNO(bool_arr[0])
              - bool_arr.size()
              - int_arr[0]
              - int_arr.size()
              - float_arr[0]
              - float_arr.size()
              - string_arr[0].c_str()
              - string_arr.size()
    - service: dfplayer_next
      then:
        - dfplayer.play_next:
    - service: dfplayer_previous
      then:
        - dfplayer.play_previous:
    - service: dfplayer_play
      variables:
        file: int
      then:
        - dfplayer.play: !lambda 'return file;'
    - service: dfplayer_play_loop
      variables:
        file: int
        loop_: bool
      then:
        - dfplayer.play:
            file: !lambda 'return file;'
            loop: !lambda 'return loop_;'
    - service: dfplayer_play_folder
      variables:
        folder: int
        file: int
      then:
        - dfplayer.play_folder:
            folder: !lambda 'return folder;'
            file: !lambda 'return file;'

    - service: dfplayer_play_loo_folder
      variables:
        folder: int
      then:
        - dfplayer.play_folder:
            folder: !lambda 'return folder;'
            loop: True

    - service: dfplayer_set_device
      variables:
        device: int
      then:
        - dfplayer.set_device:
            device: TF_CARD

    - service: dfplayer_set_volume
      variables:
        volume: int
      then:
        - dfplayer.set_volume: !lambda 'return volume;'
    - service: dfplayer_set_eq
      variables:
        preset: int
      then:
        - dfplayer.set_eq: !lambda 'return static_cast<dfplayer::EqPreset>(preset);'

    - service: dfplayer_sleep
      then:
        - dfplayer.sleep

    - service: dfplayer_reset
      then:
        - dfplayer.reset

    - service: dfplayer_start
      then:
        - dfplayer.start

    - service: dfplayer_pause
      then:
        - dfplayer.pause

    - service: dfplayer_stop
      then:
        - dfplayer.stop

    - service: dfplayer_random
      then:
        - dfplayer.random

wifi:
  ssid: 'MySSID'
  password: 'password1'

i2c:
  sda: 4
  scl: 5
  scan: False

spi:
  clk_pin: GPIO12
  mosi_pin: GPIO13
  miso_pin: GPIO14

uart:
  tx_pin: GPIO1
  rx_pin: GPIO3
  baud_rate: 115200

ota:
  safe_mode: True
  port: 3286

logger:
  hardware_uart: UART1
  level: DEBUG
  esp8266_store_log_strings_in_flash: false

web_server:

deep_sleep:
  run_duration: 20s
  sleep_duration: 50s

sensor:
  - platform: apds9960
    type: proximity
    name: APDS9960 Proximity
  - platform: apds9960
    type: clear
    name: APDS9960 Clear
  - platform: apds9960
    type: red
    name: APDS9960 Red
  - platform: apds9960
    type: green
    name: APDS9960 Green
  - platform: apds9960
    type: blue
    name: APDS9960 Blue
  - platform: homeassistant
    entity_id: sensor.hello_world
    id: ha_hello_world
  - platform: am2320
    temperature:
      name: "Temperature"
    humidity:
      name: "Humidity"
  - platform: adc
    pin: VCC
    id: my_sensor
    filters:
      - offset: 5.0
      - multiply: 2.0
      - filter_out: NAN
      - sliding_window_moving_average:
      - exponential_moving_average:
      - lambda: 'return 0;'
      - delta: 100
      - throttle: 100ms
      - debounce: 500s
      - calibrate_linear:
          - 0 -> 0
          - 100 -> 100
      - calibrate_polynomial:
          degree: 3
          datapoints:
            - 0 -> 0
            - 100 -> 200
            - 400 -> 500
            - -50 -> -1000
            - -100 -> -10000
  - platform: resistance
    sensor: my_sensor
    configuration: DOWNSTREAM
    resistor: 10kΩ
    reference_voltage: 3.3V
    name: Resistance
    id: resist
  - platform: ntc
    sensor: resist
    name: NTC Sensor
    calibration:
      b_constant: 3950
      reference_resistance: 10k
      reference_temperature: 25°C
  - platform: ntc
    sensor: resist
    name: NTC Sensor2
    calibration:
      - 10.0kOhm -> 25°C
      - 27.219kOhm -> 0°C
      - 14.674kOhm -> 15°C
  - platform: ct_clamp
    sensor: my_sensor
    name: CT Clamp
    sample_duration: 500ms
    update_interval: 5s

  - platform: tcs34725
    red_channel:
      name: Red Channel
    green_channel:
      name: Green Channel
    blue_channel:
      name: Blue Channel
    clear_channel:
      name: Clear Channel
    illuminance:
      name: Illuminance
    color_temperature:
      name: Color Temperature
    integration_time: 700ms
    gain: 60x
  - platform: custom
    lambda: |-
      auto s = new CustomSensor();
      App.register_component(s);
      return {s};
    sensors:
      - id: custom_sensor
        name: Custom Sensor
  - platform: binary_sensor_map
    name: Binary Sensor Map
    type: group
    channels:
      - binary_sensor: bin1
        value: 10.0
      - binary_sensor: bin2
        value: 15.0
      - binary_sensor: bin3
        value: 100.0
  - platform: ade7953
    voltage:
      name: ADE7953 Voltage
    current_a:
      name: ADE7953 Current A
    current_b:
      name: ADE7953 Current B
    active_power_a:
      name: ADE7953 Active Power A
    active_power_b:
      name: ADE7953 Active Power B
  - platform: pzem004t
    voltage:
      name: "PZEM00T Voltage"
    current:
      name: "PZEM004T Current"
    power:
      name: "PZEM004T Power"
  - platform: pzemac
    voltage:
      name: "PZEMAC Voltage"
    current:
      name: "PZEMAC Current"
    power:
      name: "PZEMAC Power"
    frequency:
      name: "PZEMAC Frequency"
    power_factor:
      name: "PZEMAC Power Factor"
  - platform: pzemdc
    voltage:
      name: "PZEMDC Voltage"
    current:
      name: "PZEMDC Current"
    power:
      name: "PZEMDC Power"

time:
- platform: homeassistant

apds9960:
  address: 0x20
  update_interval: 60s

mpr121:
  id: mpr121_first
  address: 0x5A

binary_sensor:
  - platform: apds9960
    direction: up
    name: APDS9960 Up
    device_class: motion
    filters:
      - invert
      - delayed_on: 20ms
      - delayed_off: 20ms
      - lambda: 'return false;'
    on_state:
      - logger.log: New state
    id: my_binary_sensor
  - platform: apds9960
    direction: down
    name: APDS9960 Down
  - platform: apds9960
    direction: left
    name: APDS9960 Left
  - platform: apds9960
    direction: right
    name: APDS9960 Right
  - platform: homeassistant
    entity_id: binary_sensor.hello_world
    id: ha_hello_world_binary
  - platform: mpr121
    id: touchkey0
    channel: 0
    name: "touchkey0"
  - platform: mpr121
    channel: 1
    name: "touchkey1"
    id: bin1
  - platform: mpr121
    channel: 2
    name: "touchkey2"
    id: bin2
  - platform: mpr121
    channel: 3
    name: "touchkey3"
    id: bin3
    on_press:
      then:
        - switch.toggle: mpr121_toggle
  - platform: ttp229_lsf
    channel: 1
    name: TTP229 LSF Test
  - platform: ttp229_bsf
    channel: 1
    name: TTP229 BSF Test
  - platform: custom
    lambda: |-
      auto s = new CustomBinarySensor();
      App.register_component(s);
      return {s};
    binary_sensors:
      - id: custom_binary_sensor
        name: Custom Binary Sensor

globals:
  - id: my_global_string
    type: std::string
    initial_value: '""'

remote_receiver:
  pin: GPIO12
  dump: []

status_led:
  pin: GPIO2

text_sensor:
  - platform: version
    name: "ESPHome Version"
    icon: mdi:icon
    id: version_sensor
    on_value:
      - lambda: !lambda |-
          ESP_LOGD("main", "The state is %s=%s", x.c_str(), id(version_sensor).state.c_str());
      - script.execute: my_script
      - script.wait: my_script
      - script.stop: my_script
      - homeassistant.service:
          service: notify.html5
          data:
            title: New Humidity
          data_template:
            message: The humidity is {{ my_variable }}%.
          variables:
            my_variable: |-
              return id(version_sensor).state;
  - platform: template
    name: "Template Text Sensor"
    lambda: |-
      return {"Hello World"};
  - platform: homeassistant
    entity_id: sensor.hello_world2
    id: ha_hello_world2
  - platform: custom
    lambda: |-
      auto s = new CustomTextSensor();
      App.register_component(s);
      return {s};
    text_sensors:
      - id: custom_text_sensor
        name: Custom Text Sensor

script:
  - id: my_script
    then:
      - lambda: 'ESP_LOGD("main", "Hello World!");'

switch:
  - platform: template
    name: "mpr121_toggle"
    id: mpr121_toggle
    optimistic: True
  - platform: gpio
    id: gpio_switch1
    pin:
      mcp23017: mcp23017_hub
      number: 0
      mode: OUTPUT
    interlock: &interlock [gpio_switch1, gpio_switch2, gpio_switch3]
  - platform: gpio
    id: gpio_switch2
    pin:
      mcp23008: mcp23008_hub
      number: 0
      mode: OUTPUT
    interlock: *interlock
  - platform: gpio
    id: gpio_switch3
    pin: GPIO1
    interlock: *interlock
  - platform: custom
    lambda: |-
      auto s = new CustomSwitch();
      return {s};
    switches:
      - id: custom_switch
        name: Custom Switch

custom_component:
   lambda: |-
     auto s = new CustomComponent();
     s->set_update_interval(15000);
     return {s};

stepper:
  - platform: uln2003
    id: my_stepper
    pin_a: GPIO12
    pin_b: GPIO13
    pin_c: GPIO14
    pin_d: GPIO15
    sleep_when_done: no
    step_mode: HALF_STEP
    max_speed: 250 steps/s
    acceleration: inf
    deceleration: inf
  - platform: a4988
    id: my_stepper2
    step_pin: GPIO1
    dir_pin: GPIO2
    max_speed: 0.1 steps/s
    acceleration: 10 steps/s^2
    deceleration: 10 steps/s^2

interval:
  interval: 5s
  then:
    - logger.log: "Interval Run"
    - stepper.set_target:
        id: my_stepper2
        target: 500
    - stepper.set_target:
        id: my_stepper
        target: !lambda 'return 0;'
    - stepper.report_position:
        id: my_stepper2
        position: 0
    - stepper.report_position:
        id: my_stepper
        position: !lambda 'return 50/100.0;'

climate:
  - platform: bang_bang
    name: Bang Bang Climate
    sensor: ha_hello_world
    default_target_temperature_low: 18°C
    default_target_temperature_high: 24°C
    idle_action:
      - switch.turn_on: gpio_switch1
    cool_action:
      - switch.turn_on: gpio_switch2
    heat_action:
      - switch.turn_on: gpio_switch1
    away_config:
      default_target_temperature_low: 16°C
      default_target_temperature_high: 20°C

cover:
  - platform: endstop
    name: Endstop Cover
    stop_action:
      - switch.turn_on: gpio_switch1
    open_endstop: my_binary_sensor
    open_action:
      - switch.turn_on: gpio_switch1
    open_duration: 5min
    close_endstop: my_binary_sensor
    close_action:
      - switch.turn_on: gpio_switch2
      - output.set_level:
          id: out
          level: 50%
      - output.esp8266_pwm.set_frequency:
          id: out
          frequency: 500.0Hz
      - output.esp8266_pwm.set_frequency:
          id: out
          frequency: !lambda 'return 500.0;'
      - servo.write:
          id: my_servo
          level: -100%
      - servo.write:
          id: my_servo
          level: !lambda 'return -1.0;'
      - delay: 2s
      - servo.detach: my_servo
    close_duration: 4.5min
    max_duration: 10min
  - platform: time_based
    name: Time Based Cover
    stop_action:
      - switch.turn_on: gpio_switch1
    open_action:
      - switch.turn_on: gpio_switch1
    open_duration: 5min
    close_action:
      - switch.turn_on: gpio_switch2
    close_duration: 4.5min
  - platform: template
    name: Template Cover with Tilt
    tilt_lambda: "return 0.5;"
    tilt_action:
      - output.set_level:
          id: out
          level: !lambda "return tilt;"


output:
  - platform: esp8266_pwm
    id: out
    pin: D3
    frequency: 50Hz
  - platform: custom
    type: binary
    lambda: |-
      auto s = new CustomBinaryOutput();
      App.register_component(s);
      return {s};
    outputs:
      - id: custom_binary
  - platform: custom
    type: float
    lambda: |-
      auto s = new CustomFloatOutput();
      App.register_component(s);
      return {s};
    outputs:
      - id: custom_float

mcp23017:
  id: mcp23017_hub
  
mcp23008:
  id: mcp23008_hub

light:
  - platform: neopixelbus
    name: Neopixelbus Light
    pin: GPIO1
    type: GRBW
    variant: SK6812
    method: ESP8266_UART0
    num_leds: 100

servo:
  id: my_servo
  output: out
  restore: true

ttp229_lsf:

ttp229_bsf:
  sdo_pin: D0
  scl_pin: D1

sim800l:
  on_sms_received:
    - lambda: |-
        std::string str;
        str = sender;
        str = message;
    - sim800l.send_sms:
        message: 'hello you'
        recipient: '+1234'

dfplayer:
  on_finished_playback:
    then:
      if:
        condition:
          not:
            dfplayer.is_playing
        then:
          logger.log: 'Playback finished event'
