text: import esphome.codegen as cg
  import esphome.config_validation as cv
  from esphome.const import CONF_HIGH_VOLTAGE_REFERENCE, CONF_ID, CONF_IIR_FILTER, \
      CONF_LOW_VOLTAGE_REFERENCE, CONF_MEASUREMENT_DURATION, CONF_SETUP_MODE, CONF_SLEEP_DURATION, \
      CONF_VOLTAGE_ATTENUATION, ESP_PLATFORM_ESP32
  from esphome.core import TimePeriod
  
  AUTO_LOAD = ['binary_sensor']
  ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
  
  esp32_touch_ns = cg.esphome_ns.namespace('esp32_touch')
  ESP32TouchComponent = esp32_touch_ns.class_('ESP32TouchComponent', cg.Component)
  
  
  def validate_voltage(values):
      def validator(value):
          if isinstance(value, float) and value.is_integer():
              value = int(value)
          value = cv.string(value)
          if not value.endswith('V'):
              value += 'V'
          return cv.one_of(*values)(value)
  
      return validator
  
  
  LOW_VOLTAGE_REFERENCE = {
      '0.5V': cg.global_ns.TOUCH_LVOLT_0V5,
      '0.6V': cg.global_ns.TOUCH_LVOLT_0V6,
      '0.7V': cg.global_ns.TOUCH_LVOLT_0V7,
      '0.8V': cg.global_ns.TOUCH_LVOLT_0V8,
  }
  HIGH_VOLTAGE_REFERENCE = {
      '2.4V': cg.global_ns.TOUCH_HVOLT_2V4,
      '2.5V': cg.global_ns.TOUCH_HVOLT_2V5,
      '2.6V': cg.global_ns.TOUCH_HVOLT_2V6,
      '2.7V': cg.global_ns.TOUCH_HVOLT_2V7,
  }
  VOLTAGE_ATTENUATION = {
      '1.5V': cg.global_ns.TOUCH_HVOLT_ATTEN_1V5,
      '1V': cg.global_ns.TOUCH_HVOLT_ATTEN_1V,
      '0.5V': cg.global_ns.TOUCH_HVOLT_ATTEN_0V5,
      '0V': cg.global_ns.TOUCH_HVOLT_ATTEN_0V,
  }
  
  CONFIG_SCHEMA = cv.Schema({
      cv.GenerateID(): cv.declare_id(ESP32TouchComponent),
      cv.Optional(CONF_SETUP_MODE, default=False): cv.boolean,
      cv.Optional(CONF_IIR_FILTER, default='0ms'): cv.positive_time_period_milliseconds,
      cv.Optional(CONF_SLEEP_DURATION, default='27306us'):
          cv.All(cv.positive_time_period, cv.Range(max=TimePeriod(microseconds=436906))),
      cv.Optional(CONF_MEASUREMENT_DURATION, default='8192us'):
          cv.All(cv.positive_time_period, cv.Range(max=TimePeriod(microseconds=8192))),
      cv.Optional(CONF_LOW_VOLTAGE_REFERENCE, default='0.5V'):
          validate_voltage(LOW_VOLTAGE_REFERENCE),
      cv.Optional(CONF_HIGH_VOLTAGE_REFERENCE, default='2.7V'):
          validate_voltage(HIGH_VOLTAGE_REFERENCE),
      cv.Optional(CONF_VOLTAGE_ATTENUATION, default='0V'): validate_voltage(VOLTAGE_ATTENUATION),
  }).extend(cv.COMPONENT_SCHEMA)
  
  
  def to_code(config):
      touch = cg.new_Pvariable(config[CONF_ID])
      yield cg.register_component(touch, config)
  
      cg.add(touch.set_setup_mode(config[CONF_SETUP_MODE]))
      cg.add(touch.set_iir_filter(config[CONF_IIR_FILTER]))
  
      sleep_duration = int(round(config[CONF_SLEEP_DURATION].total_microseconds * 0.15))
      cg.add(touch.set_sleep_duration(sleep_duration))
  
      measurement_duration = int(round(config[CONF_MEASUREMENT_DURATION].total_microseconds *
                                       7.99987793))
      cg.add(touch.set_measurement_duration(measurement_duration))
  
      cg.add(touch.set_low_voltage_reference(
          LOW_VOLTAGE_REFERENCE[config[CONF_LOW_VOLTAGE_REFERENCE]]))
      cg.add(touch.set_high_voltage_reference(
          HIGH_VOLTAGE_REFERENCE[config[CONF_HIGH_VOLTAGE_REFERENCE]]))
      cg.add(touch.set_voltage_attenuation(VOLTAGE_ATTENUATION[config[CONF_VOLTAGE_ATTENUATION]]))
  