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

substitutions:
  devicename: test3
  devicecomment: test3 device
  min_sub: '0.03'
  max_sub: '12.0%'

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

    - service: battery_level_percent
      variables:
        level_percent: int
      then:
        - tm1651.set_level_percent:
            id: tm1651_battery
            level_percent: !lambda 'return level_percent;'
    - service: battery_level
      variables:
        level: int
      then:
        - tm1651.set_level:
            id: tm1651_battery
            level: !lambda 'return level;'
    - service: battery_brightness
      variables:
        brightness: int
      then:
        - tm1651.set_brightness:
            id: tm1651_battery
            brightness: !lambda 'return brightness;'
    - service: battery_turn_on
      then:
        - tm1651.turn_on:
            id: tm1651_battery
    - service: battery_turn_on
      then:
        - tm1651.turn_off:
            id: tm1651_battery
    - service: pid_set_control_parameters
      then:
        - climate.pid.set_control_parameters:
            id: pid_climate
            kp: 1.0
            kd: 1.0
            ki: 1.0

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

  - id: adalight_uart
    rx_pin: GPIO3
    baud_rate: 115200

ota:
  safe_mode: True
  port: 3286
  reboot_timeout: 15min

logger:
  hardware_uart: UART1
  level: DEBUG
  esp8266_store_log_strings_in_flash: false

web_server:

deep_sleep:
  run_duration: 20s
  sleep_duration: 50s

wled:

adalight:

sensor:
  - platform: apds9960
    type: proximity
    name: APDS9960 Proximity
  - platform: vl53l0x
    name: 'VL53L0x Distance'
    address: 0x29
    update_interval: 60s
  - 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: aht10
    temperature:
      name: 'Temperature'
    humidity:
      name: 'Humidity'
  - 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
    irq_pin: GPIO16
    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'
    energy:
      name: 'PZEMAC Energy'
    frequency:
      name: 'PZEMAC Frequency'
    power_factor:
      name: 'PZEMAC Power Factor'
  - platform: pzemdc
    voltage:
      name: 'PZEMDC Voltage'
    current:
      name: 'PZEMDC Current'
    power:
      name: 'PZEMDC Power'
  - platform: tmp102
    name: 'TMP102 Temperature'
  - platform: hm3301
    pm_1_0:
      name: 'PM1.0'
    pm_2_5:
      name: 'PM2.5'
    pm_10_0:
      name: 'PM10.0'
    aqi:
      name: 'AQI'
      calculation_type: 'AQI'
  - platform: pmsx003
    type: PMSX003
    pm_1_0:
      name: 'PM 1.0 Concentration'
    pm_2_5:
      name: 'PM 2.5 Concentration'
    pm_10_0:
      name: 'PM 10.0 Concentration'
  - platform: pmsx003
    type: PMS5003T
    pm_2_5:
      name: 'PM 2.5 Concentration'
    temperature:
      name: 'PMS Temperature'
    humidity:
      name: 'PMS Humidity'
  - platform: pmsx003
    type: PMS5003ST
    pm_2_5:
      name: 'PM 2.5 Concentration'
    temperature:
      name: 'PMS Temperature'
    humidity:
      name: 'PMS Humidity'
    formaldehyde:
      name: 'PMS Formaldehyde Concentration'
  - platform: cse7766
    voltage:
      name: 'CSE7766 Voltage'
    current:
      name: 'CSE7766 Current'
    power:
      name: 'CSE776 Power'
  - platform: ezo
    id: ph_ezo
    address: 99
    unit_of_measurement: 'pH'

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
  - platform: thermostat
    name: Thermostat 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
    dry_action:
      - switch.turn_on: gpio_switch2
    fan_only_action:
      - switch.turn_on: gpio_switch1
    auto_mode:
      - switch.turn_on: gpio_switch2
    off_mode:
      - switch.turn_on: gpio_switch1
    heat_mode:
      - switch.turn_on: gpio_switch2
    cool_mode:
      - switch.turn_on: gpio_switch1
    dry_mode:
      - switch.turn_on: gpio_switch2
    fan_only_mode:
      - switch.turn_on: gpio_switch1
    fan_mode_auto_action:
      - switch.turn_on: gpio_switch2
    fan_mode_on_action:
      - switch.turn_on: gpio_switch1
    fan_mode_off_action:
      - switch.turn_on: gpio_switch2
    fan_mode_low_action:
      - switch.turn_on: gpio_switch1
    fan_mode_medium_action:
      - switch.turn_on: gpio_switch2
    fan_mode_high_action:
      - switch.turn_on: gpio_switch1
    fan_mode_middle_action:
      - switch.turn_on: gpio_switch2
    fan_mode_focus_action:
      - switch.turn_on: gpio_switch1
    fan_mode_diffuse_action:
      - switch.turn_on: gpio_switch2
    swing_off_action:
      - switch.turn_on: gpio_switch1
    swing_horizontal_action:
      - switch.turn_on: gpio_switch2
    swing_vertical_action:
      - switch.turn_on: gpio_switch1
    swing_both_action:
      - switch.turn_on: gpio_switch2
    hysteresis: 0.2
    away_config:
      default_target_temperature_low: 16°C
      default_target_temperature_high: 20°C
  - platform: pid
    id: pid_climate
    name: 'PID Climate Controller'
    sensor: ha_hello_world
    default_target_temperature: 21°C
    heat_output: my_slow_pwm
    control_parameters:
      kp: 0.0
      ki: 0.0
      kd: 0.0

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;'
    position_action:
      - output.set_level:
          id: out
          level: !lambda 'return pos;'

output:
  - platform: esp8266_pwm
    id: out
    pin: D3
    frequency: 50Hz
  - platform: esp8266_pwm
    id: out2
    pin: D4
  - 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
  - platform: ac_dimmer
    id: dimmer1
    gate_pin: GPIO5
    zero_cross_pin: GPIO12
  - platform: slow_pwm
    pin: GPIO5
    id: my_slow_pwm
    period: 15s

mcp23017:
  id: mcp23017_hub

mcp23008:
  id: mcp23008_hub

e131:

light:
  - platform: neopixelbus
    name: Neopixelbus Light
    pin: GPIO1
    type: GRBW
    variant: SK6812
    method: ESP8266_UART0
    num_leds: 100
    effects:
      - wled:
      - adalight:
          uart_id: adalight_uart
      - e131:
          universe: 1
  - platform: hbridge
    name: Icicle Lights
    pin_a: out
    pin_b: out2

servo:
  id: my_servo
  output: out
  restore: true
  min_level: $min_sub
  max_level: $max_sub

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'
tm1651:
  id: tm1651_battery
  clk_pin: D6
  dio_pin: D5

rf_bridge:
  on_code_received:
    - lambda: |-
        uint32_t test;
        test = data.sync;
        test = data.low;
        test = data.high;
        test = data.code;
    - rf_bridge.send_code:
        sync: 0x1234
        low: 0x1234
        high: 0x1234
        code: 0x123456
    - rf_bridge.learn

  on_advanced_code_received:
    - lambda: |-
        uint32_t test;
        std::string test_code;
        test = data.length;
        test = data.protocol;
        test_code = data.code;
    - rf_bridge.start_advanced_sniffing
    - rf_bridge.stop_advanced_sniffing
    - rf_bridge.send_advanced_code:
        length: 0x04
        protocol: 0x01
        code: 'ABC123'
    - rf_bridge.send_raw:
        raw: 'AAA5070008001000ABC12355'
    - http_request.get:
        url: https://esphome.io
        headers:
          Content-Type: application/json
        verify_ssl: false
    - http_request.post:
        url: https://esphome.io
        verify_ssl: false
        json:
          key: !lambda |-
            return id(version_sensor).state;
          greeting: 'Hello World'
    - http_request.send:
        method: PUT
        url: https://esphome.io
        headers:
          Content-Type: application/json
        body: 'Some data'
        verify_ssl: false

display:
  - platform: max7219digit
    cs_pin: GPIO15
    num_chips: 4
    rotate_chip: 0
    intensity: 10
    scroll_mode: 'STOP'
    id: my_matrix
    lambda: |-
      it.printdigit("hello");

http_request:
  useragent: esphome/device
  timeout: 10s