---
esphome:
  name: $device_name
  comment: $device_comment
  build_path: build/test3.1
  includes:
    - custom.h

esp8266:
  board: d1_mini

substitutions:
  device_name: test3-1
  device_comment: test3-1 device
  min_sub: "0.03"
  max_sub: "12.0%"

api:

wifi:
  ssid: "MySSID"
  password: "password1"

network:
  enable_ipv6: true

web_server:
  port: 80
  version: 2

i2c:
  sda:
    allow_other_uses: true
    number: 4
  scl:
    allow_other_uses: true
    number: 5
  scan: false

spi:
  clk_pin:
    allow_other_uses: true
    number: GPIO12
  mosi_pin:
    allow_other_uses: true
    number: GPIO13
  miso_pin:
    allow_other_uses: true
    number: GPIO14

ota:
  version: 2

logger:

debug:

sensor:
  - platform: apds9960
    type: proximity
    name: APDS9960 Proximity
  - platform: vl53l0x
    name: VL53L0x Distance
    address: 0x29
    update_interval: 60s
    enable_pin:
      allow_other_uses: true
      number: GPIO13
    timeout: 200us
  - 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: 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:
      - quantile:
          window_size: 5
          send_every: 5
          send_first_at: 3
          quantile: .8
      - lambda: "return 0;"
      - delta: 100
      - throttle: 100ms
      - debounce: 500s
      - timeout: 10min
      - timeout:
          timeout: 10min
          value: 0
      - calibrate_linear:
          method: exact
          datapoints:
            - -1 -> 3
            - 0.0 -> 1.0
            - 1.0 -> 2.0
            - 2.0 -> 3.0
      - calibrate_polynomial:
          degree: 3
          datapoints:
            - 0 -> 0
            - 100 -> 200
            - 400 -> 500
            - -50 -> -1000
            - -100 -> -10000
  - platform: cd74hc4067
    id: cd74hc4067_0
    number: 0
    sensor: my_sensor
  - 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: 614ms
    gain: 60x
  - platform: custom
    lambda: |-
      auto s = new CustomSensor();
      App.register_component(s);
      return {s};
    sensors:
      - id: custom_sensor
        name: Custom Sensor

  - platform: ade7953_i2c
    irq_pin:
      allow_other_uses: true
      number: GPIO16
    voltage:
      name: ADE7953 Voltage
      id: ade7953_voltage
    current_a:
      name: ADE7953 Current A
      id: ade7953_current_a
    current_b:
      name: ADE7953 Current B
      id: ade7953_current_b
    power_factor_a:
      name: "ADE7953 Power Factor A"
    power_factor_b:
      name: "ADE7953 Power Factor B"
    apparent_power_a:
      name: "ADE7953 Apparent Power A"
    apparent_power_b:
      name: "ADE7953 Apparent Power B"
    active_power_a:
      name: ADE7953 Active Power A
    active_power_b:
      name: ADE7953 Active Power B
    reactive_power_a:
      name: "ADE7953 Reactive Power A"
    reactive_power_b:
      name: "ADE7953 Reactive Power B"
    update_interval: 1s

  - platform: ade7953_spi
    cs_pin:
      allow_other_uses: true
      number: GPIO04
    irq_pin:
      allow_other_uses: true
      number: GPIO16
    voltage:
      name: ADE7953 Voltage
    current_a:
      name: ADE7953 Current A
    current_b:
      name: ADE7953 Current B
    power_factor_a:
      name: "ADE7953 Power Factor A"
    power_factor_b:
      name: "ADE7953 Power Factor B"
    apparent_power_a:
      name: "ADE7953 Apparent Power A"
    apparent_power_b:
      name: "ADE7953 Apparent Power B"
    active_power_a:
      name: ADE7953 Active Power A
    active_power_b:
      name: ADE7953 Active Power B
    reactive_power_a:
      name: "ADE7953 Reactive Power A"
    reactive_power_b:
      name: "ADE7953 Reactive Power B"
    update_interval: 1s

  - platform: ens160
    eco2:
      name: "ENS160 eCO2"
    tvoc:
      name: "ENS160 Total Volatile Organic Compounds"
    aqi:
      name: "ENS160 Air Quality Index"
  - 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: ezo
    id: ph_ezo
    address: 99
    unit_of_measurement: pH
  - platform: tof10120
    name: Distance sensor
    update_interval: 5s

  - platform: mlx90393
    oversampling: 1
    filter: 0
    gain: 3X
    x_axis:
      name: mlxxaxis
    y_axis:
      name: mlxyaxis
    z_axis:
      name: mlxzaxis
      resolution: 17BIT
    temperature:
      name: mlxtemp
      oversampling: 2

  - platform: adc128s102
    id: adc128s102_channel_0
    channel: 0

  - platform: ade7880
    irq0_pin:
      number: GPIO13
      allow_other_uses: true
    irq1_pin:
      number: GPIO5
      allow_other_uses: true
    reset_pin:
      number: GPIO16
      allow_other_uses: true
    frequency: 60Hz
    phase_a:
      name: Channel A
      voltage: Voltage
      current: Current
      active_power: Active Power
      power_factor: Power Factor
      forward_active_energy: Forward Active Energy
      reverse_active_energy: Reverse Active Energy
      calibration:
        current_gain: 3116628
        voltage_gain: -757178
        power_gain: -1344457
        phase_angle: 188
    phase_b:
      name: Channel B
      voltage: Voltage
      current: Current
      active_power: Active Power
      power_factor: Power Factor
      forward_active_energy: Forward Active Energy
      reverse_active_energy: Reverse Active Energy
      calibration:
        current_gain: 3133655
        voltage_gain: -755235
        power_gain: -1345638
        phase_angle: 188
    phase_c:
      name: Channel C
      voltage: Voltage
      current: Current
      active_power: Active Power
      power_factor: Power Factor
      forward_active_energy: Forward Active Energy
      reverse_active_energy: Reverse Active Energy
      calibration:
        current_gain: 3111158
        voltage_gain: -743813
        power_gain: -1351437
        phase_angle: 180
    neutral:
      name: Neutral
      current: Current
      calibration:
        current_gain: 3189

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: 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

  - platform: template
    id: cover_toggle
    on_press:
      then:
        - cover.toggle: time_based_cover
        - cover.toggle: endstop_cover
        - cover.toggle: current_based_cover

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

text_sensor:
  - platform: custom
    lambda: |-
      auto s = new CustomTextSensor();
      App.register_component(s);
      return {s};
    text_sensors:
      - id: custom_text_sensor
        name: Custom Text Sensor

sm2135:
  data_pin:
    allow_other_uses: true
    number: GPIO12
  clock_pin:
    allow_other_uses: true
    number: GPIO14
  rgb_current: 20mA
  cw_current: 60mA

grove_tb6612fng:
  id: test_motor
  address: 0x14

switch:
  - platform: template
    name: mpr121_toggle
    id: mpr121_toggle
    optimistic: true
  - platform: gpio
    id: gpio_switch1
    pin:
      mcp23xxx: mcp23017_hub
      number: 0
      mode: OUTPUT
    interlock: &interlock [gpio_switch1, gpio_switch2, gpio_switch3]
  - platform: gpio
    id: gpio_switch2
    pin:
      mcp23xxx: mcp23008_hub
      number: 0
      mode: OUTPUT
    interlock: *interlock
  - platform: gpio
    id: gpio_switch3
    pin:
      allow_other_uses: true
      number: GPIO1
    interlock: *interlock
  - platform: custom
    lambda: |-
      auto s = new CustomSwitch();
      return {s};
    switches:
      - id: custom_switch
        name: Custom Switch
        on_turn_on:
          - 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(custom_text_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
  - platform: template
    name: open_vent
    id: open_vent
    optimistic: true
    on_turn_on:
      then:
        - grove_tb6612fng.run:
            channel: 1
            speed: 255
            direction: BACKWARD
            id: test_motor

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

stepper:
  - platform: uln2003
    id: my_stepper
    pin_a:
      allow_other_uses: true
      number: GPIO12
    pin_b:
      allow_other_uses: true
      number: GPIO13
    pin_c:
      allow_other_uses: true
      number: GPIO14
    pin_d:
      allow_other_uses: true
      number: GPIO15
    sleep_when_done: false
    step_mode: HALF_STEP
    max_speed: 250 steps/s
    acceleration: inf
    deceleration: inf
  - platform: a4988
    id: my_stepper2
    step_pin:
      allow_other_uses: true
      number: GPIO1
    dir_pin:
      allow_other_uses: true
      number: 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;"

cover:
  - platform: endstop
    name: Endstop Cover
    id: 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
    id: 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: current_based
    name: Current Based Cover
    id: current_based_cover
    open_sensor: ade7953_current_a
    open_moving_current_threshold: 0.5
    open_obstacle_current_threshold: 0.8
    open_duration: 12s
    open_action:
      - switch.turn_on: gpio_switch1
    close_sensor: ade7953_current_b
    close_moving_current_threshold: 0.5
    close_obstacle_current_threshold: 0.8
    close_duration: 10s
    close_action:
      - switch.turn_on: gpio_switch2
    stop_action:
      - switch.turn_off: gpio_switch1
      - switch.turn_off: gpio_switch2
    obstacle_rollback: 30%
    start_sensing_delay: 0.8s
    malfunction_detection: true
    malfunction_action:
      then:
        - logger.log: Malfunction Detected
  - 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:
      number: D3
    frequency: 50Hz
  - platform: esp8266_pwm
    id: out2
    pin:
      allow_other_uses: true
      number: D4
  - platform: custom
    type: binary
    lambda: |-
      auto s = new CustomBinaryOutput();
      App.register_component(s);
      return {s};
    outputs:
      - id: custom_binary
  - platform: sigma_delta_output
    id: sddac
    update_interval: 60s
    pin:
      allow_other_uses: true
      number: D4
    turn_on_action:
      then:
        - logger.log: "Turned on"
    turn_off_action:
      then:
        - logger.log: "Turned off"
    state_change_action:
      then:
        - logger.log:
            format: "Changed state: %d"
            args: ["state"]
  - platform: custom
    type: float
    lambda: |-
      auto s = new CustomFloatOutput();
      App.register_component(s);
      return {s};
    outputs:
      - id: custom_float
  - platform: slow_pwm
    pin:
      allow_other_uses: true
      number: GPIO5
    id: my_slow_pwm
    period: 15s
    restart_cycle_on_state_change: false
  - platform: sm2135
    id: sm2135_0
    channel: 0
  - platform: sm2135
    id: sm2135_1
    channel: 1
  - platform: sm2135
    id: sm2135_2
    channel: 2
  - platform: sm2135
    id: sm2135_3
    channel: 3
  - platform: sm2135
    id: sm2135_4
    channel: 4

mcp23017:
  id: mcp23017_hub

mcp23008:
  id: mcp23008_hub

light:
  - 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:
    allow_other_uses: true
    number: D2
  scl_pin:
    allow_other_uses: true
    number: D1

display:
  - platform: max7219digit
    cs_pin:
      allow_other_uses: true
      number: 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

button:
  - platform: output
    id: output_button
    output: out
    duration: 100ms
  - platform: wake_on_lan
    target_mac_address: 12:34:56:78:90:ab
    name: wol_test_1
    id: wol_1
  - platform: factory_reset
    name: Restart Button (Factory Default Settings)

cd74hc4067:
  pin_s0:
    allow_other_uses: true
    number: GPIO12
  pin_s1:
    allow_other_uses: true
    number: GPIO13
  pin_s2:
    allow_other_uses: true
    number: GPIO14
  pin_s3:
    allow_other_uses: true
    number: GPIO15

adc128s102:
  cs_pin:
    allow_other_uses: true
    number: GPIO12