esphome 2025.6.2__py3-none-any.whl → 2025.7.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/__main__.py +1 -3
- esphome/codegen.py +2 -0
- esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
- esphome/components/adc/__init__.py +25 -1
- esphome/components/adc/adc_sensor.h +11 -11
- esphome/components/adc/adc_sensor_common.cpp +1 -1
- esphome/components/adc/adc_sensor_esp32.cpp +16 -8
- esphome/components/ade7880/ade7880.h +0 -2
- esphome/components/ads1115/ads1115.h +0 -1
- esphome/components/ads1118/ads1118.h +0 -1
- esphome/components/ags10/ags10.h +0 -2
- esphome/components/aic3204/aic3204.h +0 -1
- esphome/components/alarm_control_panel/__init__.py +5 -2
- esphome/components/alpha3/alpha3.h +0 -1
- esphome/components/am43/cover/am43_cover.h +0 -1
- esphome/components/am43/sensor/am43_sensor.h +0 -1
- esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
- esphome/components/anova/anova.cpp +5 -1
- esphome/components/anova/anova.h +0 -1
- esphome/components/apds9960/apds9960.cpp +1 -1
- esphome/components/api/__init__.py +42 -20
- esphome/components/api/api_connection.cpp +318 -391
- esphome/components/api/api_connection.h +206 -126
- esphome/components/api/api_frame_helper.cpp +89 -124
- esphome/components/api/api_frame_helper.h +57 -45
- esphome/components/api/api_pb2.cpp +414 -4350
- esphome/components/api/api_pb2.h +287 -198
- esphome/components/api/api_pb2_dump.cpp +4333 -0
- esphome/components/api/api_pb2_service.cpp +180 -425
- esphome/components/api/api_pb2_service.h +7 -6
- esphome/components/api/api_pb2_size.h +2 -4
- esphome/components/api/api_server.cpp +138 -167
- esphome/components/api/api_server.h +66 -12
- esphome/components/api/client.py +10 -4
- esphome/components/api/list_entities.cpp +36 -105
- esphome/components/api/list_entities.h +31 -23
- esphome/components/api/proto.h +26 -3
- esphome/components/api/subscribe_state.cpp +23 -29
- esphome/components/api/subscribe_state.h +26 -19
- esphome/components/as5600/as5600.h +0 -1
- esphome/components/async_tcp/__init__.py +14 -5
- esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
- esphome/components/atm90e32/atm90e32.cpp +2 -1
- esphome/components/audio/audio_decoder.cpp +1 -1
- esphome/components/audio/audio_transfer_buffer.cpp +2 -2
- esphome/components/b_parasite/b_parasite.h +0 -1
- esphome/components/bedjet/bedjet_hub.cpp +5 -1
- esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
- esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
- esphome/components/bh1750/bh1750.cpp +5 -5
- esphome/components/binary_sensor/__init__.py +82 -5
- esphome/components/binary_sensor/automation.h +19 -1
- esphome/components/binary_sensor/binary_sensor.cpp +12 -30
- esphome/components/binary_sensor/binary_sensor.h +11 -25
- esphome/components/binary_sensor/filter.cpp +29 -24
- esphome/components/binary_sensor/filter.h +20 -10
- esphome/components/ble_client/output/ble_binary_output.h +0 -1
- esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
- esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
- esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
- esphome/components/ble_client/sensor/ble_sensor.h +0 -1
- esphome/components/ble_client/switch/ble_switch.h +0 -1
- esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
- esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
- esphome/components/ble_presence/ble_presence_device.h +0 -1
- esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
- esphome/components/ble_scanner/ble_scanner.h +0 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
- esphome/components/bme680/sensor.py +1 -1
- esphome/components/bmp581/bmp581.h +0 -2
- esphome/components/button/__init__.py +5 -2
- esphome/components/camera/__init__.py +1 -0
- esphome/components/camera/camera.cpp +22 -0
- esphome/components/camera/camera.h +80 -0
- esphome/components/canbus/__init__.py +1 -0
- esphome/components/cap1188/cap1188.h +0 -1
- esphome/components/captive_portal/__init__.py +12 -2
- esphome/components/captive_portal/captive_portal.cpp +12 -2
- esphome/components/captive_portal/captive_portal.h +5 -2
- esphome/components/ccs811/ccs811.h +0 -2
- esphome/components/climate/__init__.py +5 -2
- esphome/components/cm1106/sensor.py +2 -2
- esphome/components/const/__init__.py +2 -0
- esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
- esphome/components/copy/button/copy_button.h +0 -1
- esphome/components/copy/cover/copy_cover.h +0 -1
- esphome/components/copy/fan/copy_fan.h +0 -1
- esphome/components/copy/lock/copy_lock.h +0 -1
- esphome/components/copy/number/copy_number.h +0 -1
- esphome/components/copy/select/copy_select.h +0 -1
- esphome/components/copy/sensor/copy_sensor.h +0 -1
- esphome/components/copy/switch/copy_switch.h +0 -1
- esphome/components/copy/text/copy_text.h +0 -1
- esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
- esphome/components/cover/__init__.py +5 -2
- esphome/components/cs5460a/cs5460a.h +0 -1
- esphome/components/datetime/__init__.py +4 -2
- esphome/components/debug/__init__.py +20 -0
- esphome/components/deep_sleep/__init__.py +43 -9
- esphome/components/demo/__init__.py +2 -2
- esphome/components/display/display.cpp +4 -3
- esphome/components/display/display.h +0 -2
- esphome/components/display/display_buffer.cpp +1 -1
- esphome/components/ds2484/__init__.py +1 -0
- esphome/components/ds2484/ds2484.cpp +209 -0
- esphome/components/ds2484/ds2484.h +43 -0
- esphome/components/ds2484/one_wire.py +37 -0
- esphome/components/duty_time/duty_time_sensor.h +0 -1
- esphome/components/ens160_base/ens160_base.h +0 -1
- esphome/components/es7210/es7210.h +0 -1
- esphome/components/es7243e/es7243e.h +0 -1
- esphome/components/es8156/es8156.h +0 -1
- esphome/components/es8311/es8311.h +0 -1
- esphome/components/es8388/es8388.h +0 -1
- esphome/components/esp32/__init__.py +102 -135
- esphome/components/esp32/core.cpp +0 -4
- esphome/components/esp32/gpio.h +1 -1
- esphome/components/esp32/helpers.cpp +69 -0
- esphome/components/esp32_ble/ble.cpp +5 -6
- esphome/components/esp32_ble/ble.h +29 -14
- esphome/components/esp32_ble/ble_event.h +6 -6
- esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
- esphome/components/esp32_ble_client/ble_client_base.h +24 -9
- esphome/components/esp32_ble_tracker/__init__.py +2 -8
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
- esphome/components/esp32_camera/__init__.py +111 -97
- esphome/components/esp32_camera/esp32_camera.cpp +41 -31
- esphome/components/esp32_camera/esp32_camera.h +35 -30
- esphome/components/esp32_camera_web_server/__init__.py +2 -1
- esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
- esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
- esphome/components/esp32_hall/sensor.py +2 -21
- esphome/components/esp32_hosted/__init__.py +101 -0
- esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
- esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
- esphome/components/esp32_rmt/__init__.py +0 -58
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
- esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
- esphome/components/esp32_rmt_led_strip/light.py +14 -76
- esphome/components/esp32_touch/esp32_touch.h +174 -28
- esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
- esphome/components/esp32_touch/esp32_touch_v1.cpp +238 -0
- esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
- esphome/components/esp8266/__init__.py +1 -0
- esphome/components/esp8266/gpio.cpp +10 -10
- esphome/components/esp8266/helpers.cpp +31 -0
- esphome/components/esphome/ota/__init__.py +1 -0
- esphome/components/esphome/ota/ota_esphome.cpp +24 -19
- esphome/components/ethernet/__init__.py +42 -23
- esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
- esphome/components/ethernet/ethernet_component.cpp +69 -29
- esphome/components/ethernet/ethernet_component.h +18 -10
- esphome/components/event/__init__.py +5 -2
- esphome/components/ezo/ezo.h +0 -1
- esphome/components/ezo_pmp/ezo_pmp.h +0 -1
- esphome/components/fan/__init__.py +5 -2
- esphome/components/feedback/feedback_cover.h +0 -1
- esphome/components/font/__init__.py +92 -82
- esphome/components/font/font.cpp +9 -2
- esphome/components/font/font.h +20 -5
- esphome/components/fs3000/fs3000.h +0 -1
- esphome/components/gcja5/gcja5.h +0 -1
- esphome/components/gl_r01_i2c/__init__.py +0 -0
- esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
- esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
- esphome/components/gl_r01_i2c/sensor.py +36 -0
- esphome/components/gp8403/gp8403.h +0 -1
- esphome/components/gpio/binary_sensor/__init__.py +17 -0
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
- esphome/components/he60r/he60r.h +0 -1
- esphome/components/heatpumpir/climate.py +2 -1
- esphome/components/heatpumpir/heatpumpir.cpp +1 -0
- esphome/components/heatpumpir/heatpumpir.h +1 -0
- esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
- esphome/components/host/__init__.py +2 -1
- esphome/components/host/helpers.cpp +57 -0
- esphome/components/http_request/__init__.py +19 -1
- esphome/components/http_request/http_request.h +1 -1
- esphome/components/http_request/http_request_arduino.cpp +0 -1
- esphome/components/http_request/http_request_arduino.h +1 -0
- esphome/components/http_request/http_request_idf.cpp +0 -1
- esphome/components/http_request/ota/ota_http_request.cpp +1 -1
- esphome/components/http_request/update/http_request_update.cpp +28 -9
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
- esphome/components/hydreon_rgxx/sensor.py +1 -1
- esphome/components/i2c/__init__.py +23 -11
- esphome/components/i2c/i2c_bus.h +8 -1
- esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
- esphome/components/i2c/i2c_bus_arduino.h +6 -3
- esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
- esphome/components/i2c_device/i2c_device.h +0 -1
- esphome/components/i2s_audio/__init__.py +2 -10
- esphome/components/i2s_audio/i2s_audio.cpp +1 -5
- esphome/components/i2s_audio/media_player/__init__.py +2 -2
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
- esphome/components/iaqcore/iaqcore.h +0 -2
- esphome/components/image/__init__.py +123 -24
- esphome/components/improv_serial/improv_serial_component.cpp +0 -4
- esphome/components/ina219/ina219.cpp +7 -0
- esphome/components/ina219/ina219.h +1 -0
- esphome/components/ina260/ina260.h +0 -2
- esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
- esphome/components/inkplate6/display.py +15 -0
- esphome/components/inkplate6/inkplate.cpp +2 -2
- esphome/components/integration/integration_sensor.h +0 -1
- esphome/components/internal_temperature/internal_temperature.cpp +8 -27
- esphome/components/internal_temperature/sensor.py +0 -26
- esphome/components/interval/interval.h +0 -2
- esphome/components/ld2410/button/__init__.py +3 -3
- esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
- esphome/components/ld2410/ld2410.cpp +430 -261
- esphome/components/ld2410/ld2410.h +44 -146
- esphome/components/ld2410/number/__init__.py +2 -2
- esphome/components/ld2410/sensor.py +1 -1
- esphome/components/ld2410/switch/__init__.py +1 -1
- esphome/components/ld2420/ld2420.cpp +196 -100
- esphome/components/ld2420/ld2420.h +46 -118
- esphome/components/ld2420/number/__init__.py +2 -2
- esphome/components/ld2420/sensor/__init__.py +6 -2
- esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
- esphome/components/ld2450/button/__init__.py +3 -3
- esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
- esphome/components/ld2450/ld2450.cpp +384 -232
- esphome/components/ld2450/ld2450.h +60 -69
- esphome/components/ld2450/switch/__init__.py +1 -1
- esphome/components/ledc/ledc_output.cpp +1 -63
- esphome/components/libretiny/__init__.py +4 -3
- esphome/components/libretiny/const.py +5 -0
- esphome/components/libretiny/generate_components.py +1 -0
- esphome/components/libretiny/helpers.cpp +35 -0
- esphome/components/libretiny/lt_component.cpp +5 -3
- esphome/components/light/__init__.py +4 -2
- esphome/components/light/addressable_light.h +3 -3
- esphome/components/light/light_call.cpp +180 -243
- esphome/components/light/light_call.h +72 -20
- esphome/components/light/light_color_values.h +14 -14
- esphome/components/light/light_state.h +15 -13
- esphome/components/light/transformers.h +2 -2
- esphome/components/ln882x/__init__.py +52 -0
- esphome/components/ln882x/boards.py +285 -0
- esphome/components/lock/__init__.py +5 -2
- esphome/components/logger/__init__.py +40 -3
- esphome/components/logger/logger.cpp +47 -12
- esphome/components/logger/logger.h +80 -49
- esphome/components/logger/logger_esp32.cpp +3 -3
- esphome/components/lps22/__init__.py +0 -0
- esphome/components/lps22/lps22.cpp +75 -0
- esphome/components/lps22/lps22.h +27 -0
- esphome/components/lps22/sensor.py +58 -0
- esphome/components/ltr390/ltr390.h +0 -1
- esphome/components/ltr501/ltr501.h +0 -1
- esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
- esphome/components/lvgl/__init__.py +1 -1
- esphome/components/lvgl/schemas.py +66 -6
- esphome/components/lvgl/styles.py +24 -16
- esphome/components/lvgl/widgets/__init__.py +12 -2
- esphome/components/lvgl/widgets/lv_bar.py +40 -19
- esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
- esphome/components/max9611/max9611.h +0 -1
- esphome/components/mcp23016/__init__.py +1 -1
- esphome/components/mcp23xxx_base/__init__.py +1 -1
- esphome/components/mcp4461/__init__.py +1 -1
- esphome/components/mcp4461/output/__init__.py +3 -2
- esphome/components/mcp9600/mcp9600.h +0 -2
- esphome/components/md5/md5.cpp +3 -3
- esphome/components/md5/md5.h +1 -6
- esphome/components/mdns/__init__.py +22 -11
- esphome/components/media_player/__init__.py +4 -3
- esphome/components/micro_wake_word/__init__.py +1 -5
- esphome/components/micro_wake_word/streaming_model.cpp +2 -2
- esphome/components/microphone/microphone.cpp +7 -9
- esphome/components/microphone/microphone.h +0 -2
- esphome/components/mipi_spi/display.py +1 -0
- esphome/components/mmc5603/mmc5603.cpp +1 -1
- esphome/components/modbus/modbus.cpp +33 -15
- esphome/components/modbus/modbus.h +9 -0
- esphome/components/modbus_controller/__init__.py +42 -10
- esphome/components/modbus_controller/modbus_controller.cpp +92 -11
- esphome/components/modbus_controller/modbus_controller.h +61 -7
- esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
- esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
- esphome/components/mpl3115a2/mpl3115a2.h +0 -2
- esphome/components/mqtt/__init__.py +16 -0
- esphome/components/mqtt/mqtt_backend.h +2 -1
- esphome/components/mqtt/mqtt_backend_esp32.cpp +126 -45
- esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
- esphome/components/mqtt/mqtt_client.cpp +15 -9
- esphome/components/mqtt/mqtt_client.h +8 -3
- esphome/components/ms8607/ms8607.h +0 -1
- esphome/components/neopixelbus/light.py +4 -1
- esphome/components/neopixelbus/neopixelbus_light.h +1 -1
- esphome/components/network/__init__.py +4 -1
- esphome/components/network/ip_address.h +1 -0
- esphome/components/nextion/__init__.py +16 -0
- esphome/components/nextion/base_component.py +1 -0
- esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
- esphome/components/nextion/display.py +14 -4
- esphome/components/nextion/nextion.cpp +166 -101
- esphome/components/nextion/nextion.h +84 -53
- esphome/components/nextion/nextion_commands.cpp +11 -10
- esphome/components/nextion/nextion_component.cpp +28 -28
- esphome/components/nextion/nextion_component.h +53 -18
- esphome/components/nextion/nextion_component_base.h +3 -0
- esphome/components/nextion/nextion_upload.cpp +36 -0
- esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
- esphome/components/nextion/nextion_upload_idf.cpp +9 -33
- esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
- esphome/components/nextion/switch/nextion_switch.cpp +1 -1
- esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
- esphome/components/nfc/nfc.cpp +3 -22
- esphome/components/nfc/nfc.h +3 -3
- esphome/components/number/__init__.py +5 -2
- esphome/components/online_image/__init__.py +5 -0
- esphome/components/online_image/online_image.cpp +6 -2
- esphome/components/online_image/online_image.h +4 -1
- esphome/components/opentherm/opentherm.cpp +7 -12
- esphome/components/openthread/__init__.py +47 -40
- esphome/components/openthread/const.py +1 -0
- esphome/components/openthread/openthread_esp.cpp +27 -5
- esphome/components/opt3001/__init__.py +0 -0
- esphome/components/opt3001/opt3001.cpp +122 -0
- esphome/components/opt3001/opt3001.h +27 -0
- esphome/components/opt3001/sensor.py +35 -0
- esphome/components/ota/__init__.py +17 -0
- esphome/components/ota/ota_backend.h +27 -1
- esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
- esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
- esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
- esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
- esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
- esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
- esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
- esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
- esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
- esphome/components/ota/ota_backend_esp_idf.h +1 -0
- esphome/components/packages/__init__.py +5 -2
- esphome/components/packet_transport/binary_sensor.py +61 -4
- esphome/components/packet_transport/packet_transport.cpp +31 -1
- esphome/components/packet_transport/packet_transport.h +11 -5
- esphome/components/pcf8574/__init__.py +1 -1
- esphome/components/pi4ioe5v6408/__init__.py +84 -0
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
- esphome/components/pmsa003i/pmsa003i.h +0 -1
- esphome/components/pmsx003/pmsx003.h +0 -1
- esphome/components/pn7150/pn7150.cpp +7 -7
- esphome/components/pn7150/pn7150.h +0 -1
- esphome/components/pn7160/pn7160.cpp +7 -7
- esphome/components/pn7160/pn7160.h +0 -1
- esphome/components/preferences/syncer.h +2 -0
- esphome/components/prometheus/prometheus_handler.h +1 -1
- esphome/components/psram/psram.cpp +0 -20
- esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
- esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
- esphome/components/pulse_width/pulse_width.h +0 -1
- esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
- esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
- esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
- esphome/components/qr_code/__init__.py +13 -10
- esphome/components/qwiic_pir/qwiic_pir.h +0 -1
- esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
- esphome/components/rc522/rc522.h +0 -1
- esphome/components/rdm6300/rdm6300.h +0 -2
- esphome/components/remote_base/__init__.py +7 -5
- esphome/components/remote_base/remote_base.cpp +24 -21
- esphome/components/remote_base/remote_base.h +3 -26
- esphome/components/remote_receiver/__init__.py +40 -46
- esphome/components/remote_receiver/remote_receiver.h +4 -18
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
- esphome/components/remote_transmitter/__init__.py +42 -43
- esphome/components/remote_transmitter/remote_transmitter.h +2 -14
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
- esphome/components/resistance/resistance_sensor.h +0 -1
- esphome/components/rp2040/__init__.py +1 -0
- esphome/components/rp2040/helpers.cpp +55 -0
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
- esphome/components/rtttl/__init__.py +4 -4
- esphome/components/rtttl/rtttl.cpp +10 -1
- esphome/components/ruuvitag/ruuvitag.h +0 -1
- esphome/components/safe_mode/safe_mode.cpp +2 -0
- esphome/components/safe_mode/safe_mode.h +4 -1
- esphome/components/scd30/scd30.h +0 -1
- esphome/components/scd30/sensor.py +2 -2
- esphome/components/scd4x/scd4x.cpp +61 -54
- esphome/components/scd4x/scd4x.h +17 -15
- esphome/components/scd4x/sensor.py +4 -4
- esphome/components/script/script.h +0 -2
- esphome/components/sdp3x/sensor.py +1 -1
- esphome/components/select/__init__.py +5 -2
- esphome/components/sen5x/sen5x.h +0 -1
- esphome/components/senseair/senseair.h +0 -1
- esphome/components/sensor/__init__.py +4 -2
- esphome/components/sensor/filter.cpp +1 -1
- esphome/components/sensor/sensor.cpp +12 -6
- esphome/components/sensor/sensor.h +13 -5
- esphome/components/servo/servo.h +0 -1
- esphome/components/sfa30/sfa30.h +0 -1
- esphome/components/sgp30/sgp30.h +0 -1
- esphome/components/sgp4x/sgp4x.h +0 -1
- esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
- esphome/components/sht4x/sht4x.h +0 -1
- esphome/components/sm300d2/sm300d2.h +0 -2
- esphome/components/smt100/sensor.py +8 -4
- esphome/components/smt100/smt100.cpp +5 -5
- esphome/components/smt100/smt100.h +3 -3
- esphome/components/sn74hc595/__init__.py +1 -1
- esphome/components/sn74hc595/sn74hc595.cpp +5 -4
- esphome/components/sntp/sntp_component.cpp +9 -3
- esphome/components/sntp/time.py +2 -0
- esphome/components/socket/__init__.py +17 -0
- esphome/components/spi/__init__.py +27 -6
- esphome/components/spi/spi.cpp +3 -2
- esphome/components/spi/spi.h +9 -3
- esphome/components/spi/spi_arduino.cpp +3 -5
- esphome/components/spi/spi_esp_idf.cpp +40 -21
- esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
- esphome/components/sps30/sps30.h +0 -1
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/st7701s/st7701s.cpp +0 -4
- esphome/components/status/status_binary_sensor.h +0 -2
- esphome/components/substitutions/__init__.py +76 -19
- esphome/components/substitutions/jinja.py +99 -0
- esphome/components/sun/sun.cpp +3 -4
- esphome/components/switch/__init__.py +5 -2
- esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
- esphome/components/sx126x/__init__.py +317 -0
- esphome/components/sx126x/automation.h +62 -0
- esphome/components/sx126x/packet_transport/__init__.py +26 -0
- esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
- esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
- esphome/components/sx126x/sx126x.cpp +523 -0
- esphome/components/sx126x/sx126x.h +140 -0
- esphome/components/sx126x/sx126x_reg.h +163 -0
- esphome/components/sx127x/__init__.py +325 -0
- esphome/components/sx127x/automation.h +62 -0
- esphome/components/sx127x/packet_transport/__init__.py +26 -0
- esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
- esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
- esphome/components/sx127x/sx127x.cpp +498 -0
- esphome/components/sx127x/sx127x.h +128 -0
- esphome/components/sx127x/sx127x_reg.h +295 -0
- esphome/components/syslog/esphome_syslog.cpp +5 -3
- esphome/components/syslog/esphome_syslog.h +1 -1
- esphome/components/tca9555/__init__.py +1 -1
- esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
- esphome/components/text/__init__.py +5 -2
- esphome/components/text_sensor/__init__.py +5 -2
- esphome/components/thermostat/thermostat_climate.cpp +34 -31
- esphome/components/thermostat/thermostat_climate.h +43 -39
- esphome/components/time/__init__.py +16 -2
- esphome/components/time/real_time_clock.cpp +4 -0
- esphome/components/time/real_time_clock.h +5 -1
- esphome/components/tlc5971/tlc5971.cpp +4 -1
- esphome/components/tmp1075/tmp1075.h +0 -2
- esphome/components/tof10120/tof10120_sensor.h +0 -1
- esphome/components/tormatic/tormatic_cover.h +0 -1
- esphome/components/total_daily_energy/total_daily_energy.h +0 -1
- esphome/components/tsl2591/tsl2591.cpp +1 -1
- esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
- esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
- esphome/components/tx20/tx20.cpp +2 -2
- esphome/components/uart/__init__.py +18 -0
- esphome/components/uart/uart_component_esp_idf.cpp +1 -5
- esphome/components/update/__init__.py +5 -2
- esphome/components/update/update_entity.h +8 -0
- esphome/components/usb_host/__init__.py +5 -2
- esphome/components/valve/__init__.py +5 -2
- esphome/components/vbus/vbus.h +0 -1
- esphome/components/veml3235/veml3235.h +0 -1
- esphome/components/veml7700/veml7700.h +0 -1
- esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
- esphome/components/voice_assistant/voice_assistant.cpp +4 -4
- esphome/components/watchdog/watchdog.cpp +0 -4
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
- esphome/components/web_server/__init__.py +34 -19
- esphome/components/web_server/ota/__init__.py +32 -0
- esphome/components/web_server/ota/ota_web_server.cpp +210 -0
- esphome/components/web_server/ota/ota_web_server.h +26 -0
- esphome/components/web_server/web_server.cpp +311 -430
- esphome/components/web_server/web_server.h +33 -23
- esphome/components/web_server/web_server_v1.cpp +4 -5
- esphome/components/web_server_base/__init__.py +5 -2
- esphome/components/web_server_base/web_server_base.cpp +2 -94
- esphome/components/web_server_base/web_server_base.h +5 -25
- esphome/components/web_server_idf/multipart.cpp +254 -0
- esphome/components/web_server_idf/multipart.h +86 -0
- esphome/components/web_server_idf/utils.cpp +32 -0
- esphome/components/web_server_idf/utils.h +10 -0
- esphome/components/web_server_idf/web_server_idf.cpp +162 -16
- esphome/components/web_server_idf/web_server_idf.h +11 -10
- esphome/components/wiegand/wiegand.cpp +2 -2
- esphome/components/wifi/__init__.py +18 -0
- esphome/components/wifi/wifi_component.cpp +17 -22
- esphome/components/wifi/wifi_component.h +27 -23
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
- esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
- esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
- esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
- esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
- esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
- esphome/components/wireguard/__init__.py +2 -11
- esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
- esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
- esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
- esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
- esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
- esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
- esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
- esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
- esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
- esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
- esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
- esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
- esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
- esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
- esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
- esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
- esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
- esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
- esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
- esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
- esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
- esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
- esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
- esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
- esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
- esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
- esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
- esphome/components/zyaura/zyaura.h +0 -1
- esphome/config.py +88 -22
- esphome/config_helpers.py +74 -1
- esphome/config_validation.py +12 -1
- esphome/const.py +65 -10
- esphome/core/__init__.py +18 -2
- esphome/core/application.cpp +163 -10
- esphome/core/application.h +145 -165
- esphome/core/area.h +19 -0
- esphome/core/automation.h +58 -9
- esphome/core/color.cpp +3 -5
- esphome/core/color.h +16 -16
- esphome/core/component.cpp +151 -18
- esphome/core/component.h +98 -4
- esphome/core/component_iterator.cpp +7 -7
- esphome/core/component_iterator.h +9 -7
- esphome/core/config.py +155 -6
- esphome/core/controller.cpp +4 -2
- esphome/core/controller.h +1 -1
- esphome/core/datatypes.h +2 -2
- esphome/core/defines.h +17 -2
- esphome/core/device.h +20 -0
- esphome/core/entity_base.cpp +20 -15
- esphome/core/entity_base.h +76 -0
- esphome/core/entity_helpers.py +162 -1
- esphome/core/event_pool.h +81 -0
- esphome/core/helpers.cpp +75 -230
- esphome/core/helpers.h +164 -104
- esphome/core/lock_free_queue.h +151 -0
- esphome/core/log.cpp +2 -2
- esphome/core/log.h +2 -0
- esphome/core/optional.h +5 -0
- esphome/core/ring_buffer.cpp +2 -2
- esphome/core/scheduler.cpp +278 -103
- esphome/core/scheduler.h +157 -17
- esphome/core/time.cpp +5 -5
- esphome/core/time.h +5 -5
- esphome/cpp_generator.py +17 -0
- esphome/cpp_helpers.py +0 -22
- esphome/cpp_types.py +3 -1
- esphome/dashboard/entries.py +1 -1
- esphome/dashboard/util/text.py +5 -21
- esphome/dashboard/web_server.py +9 -1
- esphome/helpers.py +47 -0
- esphome/loader.py +15 -1
- esphome/pins.py +14 -8
- esphome/wizard.py +16 -3
- esphome/writer.py +21 -3
- esphome/yaml_util.py +0 -2
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +593 -533
- esphome/components/esp32_ble/ble_event_pool.h +0 -72
- esphome/components/esp32_ble/queue.h +0 -85
- esphome/components/esp32_hall/esp32_hall.cpp +0 -25
- esphome/components/esp32_hall/esp32_hall.h +0 -23
- esphome/components/esp32_touch/esp32_touch.cpp +0 -355
- esphome/components/ld2410/button/reset_button.cpp +0 -9
- esphome/components/ld2450/button/reset_button.cpp +0 -9
- esphome/components/openthread/tlv.py +0 -65
- /esphome/{dashboard/enum.py → enum.py} +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/WHEEL +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
#ifdef USE_ESP32
|
|
2
|
+
|
|
3
|
+
#include "esp32_touch.h"
|
|
4
|
+
#include "esphome/core/log.h"
|
|
5
|
+
#include <cinttypes>
|
|
6
|
+
|
|
7
|
+
#include "soc/rtc.h"
|
|
8
|
+
|
|
9
|
+
namespace esphome {
|
|
10
|
+
namespace esp32_touch {
|
|
11
|
+
|
|
12
|
+
static const char *const TAG = "esp32_touch";
|
|
13
|
+
|
|
14
|
+
void ESP32TouchComponent::dump_config_base_() {
|
|
15
|
+
const char *lv_s = get_low_voltage_reference_str(this->low_voltage_reference_);
|
|
16
|
+
const char *hv_s = get_high_voltage_reference_str(this->high_voltage_reference_);
|
|
17
|
+
const char *atten_s = get_voltage_attenuation_str(this->voltage_attenuation_);
|
|
18
|
+
|
|
19
|
+
ESP_LOGCONFIG(TAG,
|
|
20
|
+
"Config for ESP32 Touch Hub:\n"
|
|
21
|
+
" Meas cycle: %.2fms\n"
|
|
22
|
+
" Sleep cycle: %.2fms\n"
|
|
23
|
+
" Low Voltage Reference: %s\n"
|
|
24
|
+
" High Voltage Reference: %s\n"
|
|
25
|
+
" Voltage Attenuation: %s\n"
|
|
26
|
+
" Release Timeout: %" PRIu32 "ms\n",
|
|
27
|
+
this->meas_cycle_ / (8000000.0f / 1000.0f), this->sleep_cycle_ / (150000.0f / 1000.0f), lv_s, hv_s,
|
|
28
|
+
atten_s, this->release_timeout_ms_);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
void ESP32TouchComponent::dump_config_sensors_() {
|
|
32
|
+
for (auto *child : this->children_) {
|
|
33
|
+
LOG_BINARY_SENSOR(" ", "Touch Pad", child);
|
|
34
|
+
ESP_LOGCONFIG(TAG,
|
|
35
|
+
" Pad: T%u\n"
|
|
36
|
+
" Threshold: %" PRIu32 "\n"
|
|
37
|
+
" Benchmark: %" PRIu32,
|
|
38
|
+
(unsigned) child->touch_pad_, child->threshold_, child->benchmark_);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
bool ESP32TouchComponent::create_touch_queue_() {
|
|
43
|
+
// Queue size calculation: children * 4 allows for burst scenarios where ISR
|
|
44
|
+
// fires multiple times before main loop processes.
|
|
45
|
+
size_t queue_size = this->children_.size() * 4;
|
|
46
|
+
if (queue_size < 8)
|
|
47
|
+
queue_size = 8;
|
|
48
|
+
|
|
49
|
+
#ifdef USE_ESP32_VARIANT_ESP32
|
|
50
|
+
this->touch_queue_ = xQueueCreate(queue_size, sizeof(TouchPadEventV1));
|
|
51
|
+
#else
|
|
52
|
+
this->touch_queue_ = xQueueCreate(queue_size, sizeof(TouchPadEventV2));
|
|
53
|
+
#endif
|
|
54
|
+
|
|
55
|
+
if (this->touch_queue_ == nullptr) {
|
|
56
|
+
ESP_LOGE(TAG, "Failed to create touch event queue of size %" PRIu32, (uint32_t) queue_size);
|
|
57
|
+
this->mark_failed();
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
void ESP32TouchComponent::cleanup_touch_queue_() {
|
|
64
|
+
if (this->touch_queue_) {
|
|
65
|
+
vQueueDelete(this->touch_queue_);
|
|
66
|
+
this->touch_queue_ = nullptr;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
void ESP32TouchComponent::configure_wakeup_pads_() {
|
|
71
|
+
bool is_wakeup_source = false;
|
|
72
|
+
|
|
73
|
+
// Check if any pad is configured for wakeup
|
|
74
|
+
for (auto *child : this->children_) {
|
|
75
|
+
if (child->get_wakeup_threshold() != 0) {
|
|
76
|
+
is_wakeup_source = true;
|
|
77
|
+
|
|
78
|
+
#ifdef USE_ESP32_VARIANT_ESP32
|
|
79
|
+
// ESP32 v1: No filter available when using as wake-up source.
|
|
80
|
+
touch_pad_config(child->get_touch_pad(), child->get_wakeup_threshold());
|
|
81
|
+
#else
|
|
82
|
+
// ESP32-S2/S3 v2: Set threshold for wakeup
|
|
83
|
+
touch_pad_set_thresh(child->get_touch_pad(), child->get_wakeup_threshold());
|
|
84
|
+
#endif
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!is_wakeup_source) {
|
|
89
|
+
// If no pad is configured for wakeup, deinitialize touch pad
|
|
90
|
+
touch_pad_deinit();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void ESP32TouchComponent::process_setup_mode_logging_(uint32_t now) {
|
|
95
|
+
if (this->setup_mode_ && now - this->setup_mode_last_log_print_ > SETUP_MODE_LOG_INTERVAL_MS) {
|
|
96
|
+
for (auto *child : this->children_) {
|
|
97
|
+
#ifdef USE_ESP32_VARIANT_ESP32
|
|
98
|
+
ESP_LOGD(TAG, "Touch Pad '%s' (T%" PRIu32 "): %" PRIu32, child->get_name().c_str(),
|
|
99
|
+
(uint32_t) child->get_touch_pad(), child->value_);
|
|
100
|
+
#else
|
|
101
|
+
// Read the value being used for touch detection
|
|
102
|
+
uint32_t value = this->read_touch_value(child->get_touch_pad());
|
|
103
|
+
ESP_LOGD(TAG, "Touch Pad '%s' (T%d): %d", child->get_name().c_str(), child->get_touch_pad(), value);
|
|
104
|
+
#endif
|
|
105
|
+
}
|
|
106
|
+
this->setup_mode_last_log_print_ = now;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
bool ESP32TouchComponent::should_check_for_releases_(uint32_t now) {
|
|
111
|
+
if (now - this->last_release_check_ < this->release_check_interval_ms_) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
this->last_release_check_ = now;
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
void ESP32TouchComponent::publish_initial_state_if_needed_(ESP32TouchBinarySensor *child, uint32_t now) {
|
|
119
|
+
if (!child->initial_state_published_) {
|
|
120
|
+
// Check if enough time has passed since startup
|
|
121
|
+
if (now > this->release_timeout_ms_) {
|
|
122
|
+
child->publish_initial_state(false);
|
|
123
|
+
child->initial_state_published_ = true;
|
|
124
|
+
ESP_LOGV(TAG, "Touch Pad '%s' state: OFF (initial)", child->get_name().c_str());
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
void ESP32TouchComponent::check_and_disable_loop_if_all_released_(size_t pads_off) {
|
|
130
|
+
// Disable the loop to save CPU cycles when all pads are off and not in setup mode.
|
|
131
|
+
if (pads_off == this->children_.size() && !this->setup_mode_) {
|
|
132
|
+
this->disable_loop();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
void ESP32TouchComponent::calculate_release_timeout_() {
|
|
137
|
+
// Calculate release timeout based on sleep cycle
|
|
138
|
+
// Design note: Hardware limitation - interrupts only fire reliably on touch (not release)
|
|
139
|
+
// We must use timeout-based detection for release events
|
|
140
|
+
// Formula: 3 sleep cycles converted to ms, with MINIMUM_RELEASE_TIME_MS minimum
|
|
141
|
+
// Per ESP-IDF docs: t_sleep = sleep_cycle / SOC_CLK_RC_SLOW_FREQ_APPROX
|
|
142
|
+
|
|
143
|
+
uint32_t rtc_freq = rtc_clk_slow_freq_get_hz();
|
|
144
|
+
|
|
145
|
+
// Calculate timeout as 3 sleep cycles
|
|
146
|
+
this->release_timeout_ms_ = (this->sleep_cycle_ * 1000 * 3) / rtc_freq;
|
|
147
|
+
|
|
148
|
+
if (this->release_timeout_ms_ < MINIMUM_RELEASE_TIME_MS) {
|
|
149
|
+
this->release_timeout_ms_ = MINIMUM_RELEASE_TIME_MS;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Check for releases at 1/4 the timeout interval
|
|
153
|
+
// Since hardware doesn't generate reliable release interrupts, we must poll
|
|
154
|
+
// for releases in the main loop. Checking at 1/4 the timeout interval provides
|
|
155
|
+
// a good balance between responsiveness and efficiency.
|
|
156
|
+
this->release_check_interval_ms_ = this->release_timeout_ms_ / 4;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
} // namespace esp32_touch
|
|
160
|
+
} // namespace esphome
|
|
161
|
+
|
|
162
|
+
#endif // USE_ESP32
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
#ifdef USE_ESP32_VARIANT_ESP32
|
|
2
|
+
|
|
3
|
+
#include "esp32_touch.h"
|
|
4
|
+
#include "esphome/core/application.h"
|
|
5
|
+
#include "esphome/core/log.h"
|
|
6
|
+
#include "esphome/core/hal.h"
|
|
7
|
+
|
|
8
|
+
#include <algorithm>
|
|
9
|
+
#include <cinttypes>
|
|
10
|
+
|
|
11
|
+
// Include HAL for ISR-safe touch reading
|
|
12
|
+
#include "hal/touch_sensor_ll.h"
|
|
13
|
+
|
|
14
|
+
namespace esphome {
|
|
15
|
+
namespace esp32_touch {
|
|
16
|
+
|
|
17
|
+
static const char *const TAG = "esp32_touch";
|
|
18
|
+
|
|
19
|
+
void ESP32TouchComponent::setup() {
|
|
20
|
+
// Create queue for touch events
|
|
21
|
+
// Queue size calculation: children * 4 allows for burst scenarios where ISR
|
|
22
|
+
// fires multiple times before main loop processes. This is important because
|
|
23
|
+
// ESP32 v1 scans all pads on each interrupt, potentially sending multiple events.
|
|
24
|
+
if (!this->create_touch_queue_()) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
touch_pad_init();
|
|
29
|
+
touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER);
|
|
30
|
+
|
|
31
|
+
// Set up IIR filter if enabled
|
|
32
|
+
if (this->iir_filter_enabled_()) {
|
|
33
|
+
touch_pad_filter_start(this->iir_filter_);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Configure measurement parameters
|
|
37
|
+
#if ESP_IDF_VERSION_MAJOR >= 5
|
|
38
|
+
touch_pad_set_measurement_clock_cycles(this->meas_cycle_);
|
|
39
|
+
touch_pad_set_measurement_interval(this->sleep_cycle_);
|
|
40
|
+
#else
|
|
41
|
+
touch_pad_set_meas_time(this->sleep_cycle_, this->meas_cycle_);
|
|
42
|
+
#endif
|
|
43
|
+
touch_pad_set_voltage(this->high_voltage_reference_, this->low_voltage_reference_, this->voltage_attenuation_);
|
|
44
|
+
|
|
45
|
+
// Configure each touch pad
|
|
46
|
+
for (auto *child : this->children_) {
|
|
47
|
+
touch_pad_config(child->get_touch_pad(), child->get_threshold());
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Register ISR handler
|
|
51
|
+
esp_err_t err = touch_pad_isr_register(touch_isr_handler, this);
|
|
52
|
+
if (err != ESP_OK) {
|
|
53
|
+
ESP_LOGE(TAG, "Failed to register touch ISR: %s", esp_err_to_name(err));
|
|
54
|
+
this->cleanup_touch_queue_();
|
|
55
|
+
this->mark_failed();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Calculate release timeout based on sleep cycle
|
|
60
|
+
this->calculate_release_timeout_();
|
|
61
|
+
|
|
62
|
+
// Enable touch pad interrupt
|
|
63
|
+
touch_pad_intr_enable();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
void ESP32TouchComponent::dump_config() {
|
|
67
|
+
this->dump_config_base_();
|
|
68
|
+
|
|
69
|
+
if (this->iir_filter_enabled_()) {
|
|
70
|
+
ESP_LOGCONFIG(TAG, " IIR Filter: %" PRIu32 "ms", this->iir_filter_);
|
|
71
|
+
} else {
|
|
72
|
+
ESP_LOGCONFIG(TAG, " IIR Filter DISABLED");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (this->setup_mode_) {
|
|
76
|
+
ESP_LOGCONFIG(TAG, " Setup Mode ENABLED");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
this->dump_config_sensors_();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
void ESP32TouchComponent::loop() {
|
|
83
|
+
const uint32_t now = App.get_loop_component_start_time();
|
|
84
|
+
|
|
85
|
+
// Print debug info for all pads in setup mode
|
|
86
|
+
this->process_setup_mode_logging_(now);
|
|
87
|
+
|
|
88
|
+
// Process any queued touch events from interrupts
|
|
89
|
+
// Note: Events are only sent by ISR for pads that were measured in that cycle (value != 0)
|
|
90
|
+
// This is more efficient than sending all pad states every interrupt
|
|
91
|
+
TouchPadEventV1 event;
|
|
92
|
+
while (xQueueReceive(this->touch_queue_, &event, 0) == pdTRUE) {
|
|
93
|
+
// Find the corresponding sensor - O(n) search is acceptable since events are infrequent
|
|
94
|
+
for (auto *child : this->children_) {
|
|
95
|
+
if (child->get_touch_pad() != event.pad) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Found matching pad - process it
|
|
100
|
+
child->value_ = event.value;
|
|
101
|
+
|
|
102
|
+
// The interrupt gives us the touch state directly
|
|
103
|
+
bool new_state = event.is_touched;
|
|
104
|
+
|
|
105
|
+
// Track when we last saw this pad as touched
|
|
106
|
+
if (new_state) {
|
|
107
|
+
child->last_touch_time_ = now;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Only publish if state changed - this filters out repeated events
|
|
111
|
+
if (new_state != child->last_state_) {
|
|
112
|
+
child->last_state_ = new_state;
|
|
113
|
+
child->publish_state(new_state);
|
|
114
|
+
// Original ESP32: ISR only fires when touched, release is detected by timeout
|
|
115
|
+
// Note: ESP32 v1 uses inverted logic - touched when value < threshold
|
|
116
|
+
ESP_LOGV(TAG, "Touch Pad '%s' state: ON (value: %" PRIu32 " < threshold: %" PRIu32 ")",
|
|
117
|
+
child->get_name().c_str(), event.value, child->get_threshold());
|
|
118
|
+
}
|
|
119
|
+
break; // Exit inner loop after processing matching pad
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Check for released pads periodically
|
|
124
|
+
if (!this->should_check_for_releases_(now)) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
size_t pads_off = 0;
|
|
129
|
+
for (auto *child : this->children_) {
|
|
130
|
+
// Handle initial state publication after startup
|
|
131
|
+
this->publish_initial_state_if_needed_(child, now);
|
|
132
|
+
|
|
133
|
+
if (child->last_state_) {
|
|
134
|
+
// Pad is currently in touched state - check for release timeout
|
|
135
|
+
// Using subtraction handles 32-bit rollover correctly
|
|
136
|
+
uint32_t time_diff = now - child->last_touch_time_;
|
|
137
|
+
|
|
138
|
+
// Check if we haven't seen this pad recently
|
|
139
|
+
if (time_diff > this->release_timeout_ms_) {
|
|
140
|
+
// Haven't seen this pad recently, assume it's released
|
|
141
|
+
child->last_state_ = false;
|
|
142
|
+
child->publish_state(false);
|
|
143
|
+
ESP_LOGV(TAG, "Touch Pad '%s' state: OFF (timeout)", child->get_name().c_str());
|
|
144
|
+
pads_off++;
|
|
145
|
+
}
|
|
146
|
+
} else {
|
|
147
|
+
// Pad is already off
|
|
148
|
+
pads_off++;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Disable the loop to save CPU cycles when all pads are off and not in setup mode.
|
|
153
|
+
// The loop will be re-enabled by the ISR when any touch pad is touched.
|
|
154
|
+
// v1 hardware limitations require us to check all pads are off because:
|
|
155
|
+
// - v1 only generates interrupts on touch events (not releases)
|
|
156
|
+
// - We must poll for release timeouts in the main loop
|
|
157
|
+
// - We can only safely disable when no pads need timeout monitoring
|
|
158
|
+
this->check_and_disable_loop_if_all_released_(pads_off);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
void ESP32TouchComponent::on_shutdown() {
|
|
162
|
+
touch_pad_intr_disable();
|
|
163
|
+
touch_pad_isr_deregister(touch_isr_handler, this);
|
|
164
|
+
this->cleanup_touch_queue_();
|
|
165
|
+
|
|
166
|
+
if (this->iir_filter_enabled_()) {
|
|
167
|
+
touch_pad_filter_stop();
|
|
168
|
+
touch_pad_filter_delete();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Configure wakeup pads if any are set
|
|
172
|
+
this->configure_wakeup_pads_();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
void IRAM_ATTR ESP32TouchComponent::touch_isr_handler(void *arg) {
|
|
176
|
+
ESP32TouchComponent *component = static_cast<ESP32TouchComponent *>(arg);
|
|
177
|
+
|
|
178
|
+
touch_pad_clear_status();
|
|
179
|
+
|
|
180
|
+
// INTERRUPT BEHAVIOR: On ESP32 v1 hardware, the interrupt fires when ANY configured
|
|
181
|
+
// touch pad detects a touch (value goes below threshold). The hardware does NOT
|
|
182
|
+
// generate interrupts on release - only on touch events.
|
|
183
|
+
// The interrupt will continue to fire periodically (based on sleep_cycle) as long
|
|
184
|
+
// as any pad remains touched. This allows us to detect both new touches and
|
|
185
|
+
// continued touches, but releases must be detected by timeout in the main loop.
|
|
186
|
+
|
|
187
|
+
// Process all configured pads to check their current state
|
|
188
|
+
// Note: ESP32 v1 doesn't tell us which specific pad triggered the interrupt,
|
|
189
|
+
// so we must scan all configured pads to find which ones were touched
|
|
190
|
+
for (auto *child : component->children_) {
|
|
191
|
+
touch_pad_t pad = child->get_touch_pad();
|
|
192
|
+
|
|
193
|
+
// Read current value using ISR-safe API
|
|
194
|
+
uint32_t value;
|
|
195
|
+
if (component->iir_filter_enabled_()) {
|
|
196
|
+
uint16_t temp_value = 0;
|
|
197
|
+
touch_pad_read_filtered(pad, &temp_value);
|
|
198
|
+
value = temp_value;
|
|
199
|
+
} else {
|
|
200
|
+
// Use low-level HAL function when filter is not enabled
|
|
201
|
+
value = touch_ll_read_raw_data(pad);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Skip pads with 0 value - they haven't been measured in this cycle
|
|
205
|
+
// This is important: not all pads are measured every interrupt cycle,
|
|
206
|
+
// only those that the hardware has updated
|
|
207
|
+
if (value == 0) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// IMPORTANT: ESP32 v1 touch detection logic - INVERTED compared to v2!
|
|
212
|
+
// ESP32 v1: Touch is detected when capacitance INCREASES, causing the measured value to DECREASE
|
|
213
|
+
// Therefore: touched = (value < threshold)
|
|
214
|
+
// This is opposite to ESP32-S2/S3 v2 where touched = (value > threshold)
|
|
215
|
+
bool is_touched = value < child->get_threshold();
|
|
216
|
+
|
|
217
|
+
// Always send the current state - the main loop will filter for changes
|
|
218
|
+
// We send both touched and untouched states because the ISR doesn't
|
|
219
|
+
// track previous state (to keep ISR fast and simple)
|
|
220
|
+
TouchPadEventV1 event;
|
|
221
|
+
event.pad = pad;
|
|
222
|
+
event.value = value;
|
|
223
|
+
event.is_touched = is_touched;
|
|
224
|
+
|
|
225
|
+
// Send to queue from ISR - non-blocking, drops if queue full
|
|
226
|
+
BaseType_t x_higher_priority_task_woken = pdFALSE;
|
|
227
|
+
xQueueSendFromISR(component->touch_queue_, &event, &x_higher_priority_task_woken);
|
|
228
|
+
component->enable_loop_soon_any_context();
|
|
229
|
+
if (x_higher_priority_task_woken) {
|
|
230
|
+
portYIELD_FROM_ISR();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
} // namespace esp32_touch
|
|
236
|
+
} // namespace esphome
|
|
237
|
+
|
|
238
|
+
#endif // USE_ESP32_VARIANT_ESP32
|