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,397 @@
|
|
|
1
|
+
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
|
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
|
+
namespace esphome {
|
|
9
|
+
namespace esp32_touch {
|
|
10
|
+
|
|
11
|
+
static const char *const TAG = "esp32_touch";
|
|
12
|
+
|
|
13
|
+
// Helper to update touch state with a known state
|
|
14
|
+
void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched) {
|
|
15
|
+
// Always update timer when touched
|
|
16
|
+
if (is_touched) {
|
|
17
|
+
child->last_touch_time_ = App.get_loop_component_start_time();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (child->last_state_ != is_touched) {
|
|
21
|
+
child->last_state_ = is_touched;
|
|
22
|
+
child->publish_state(is_touched);
|
|
23
|
+
if (is_touched) {
|
|
24
|
+
// ESP32-S2/S3 v2: touched when value > threshold
|
|
25
|
+
ESP_LOGV(TAG, "Touch Pad '%s' state: ON (value: %" PRIu32 " > threshold: %" PRIu32 ")", child->get_name().c_str(),
|
|
26
|
+
this->read_touch_value(child->touch_pad_), child->threshold_ + child->benchmark_);
|
|
27
|
+
} else {
|
|
28
|
+
ESP_LOGV(TAG, "Touch Pad '%s' state: OFF", child->get_name().c_str());
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Helper to read touch value and update state for a given child (used for timeout events)
|
|
34
|
+
bool ESP32TouchComponent::check_and_update_touch_state_(ESP32TouchBinarySensor *child) {
|
|
35
|
+
// Read current touch value
|
|
36
|
+
uint32_t value = this->read_touch_value(child->touch_pad_);
|
|
37
|
+
|
|
38
|
+
// ESP32-S2/S3 v2: Touch is detected when value > threshold + benchmark
|
|
39
|
+
ESP_LOGV(TAG,
|
|
40
|
+
"Checking touch state for '%s' (T%d): value = %" PRIu32 ", threshold = %" PRIu32 ", benchmark = %" PRIu32,
|
|
41
|
+
child->get_name().c_str(), child->touch_pad_, value, child->threshold_, child->benchmark_);
|
|
42
|
+
bool is_touched = value > child->benchmark_ + child->threshold_;
|
|
43
|
+
|
|
44
|
+
this->update_touch_state_(child, is_touched);
|
|
45
|
+
return is_touched;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
void ESP32TouchComponent::setup() {
|
|
49
|
+
// Create queue for touch events first
|
|
50
|
+
if (!this->create_touch_queue_()) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Initialize touch pad peripheral
|
|
55
|
+
esp_err_t init_err = touch_pad_init();
|
|
56
|
+
if (init_err != ESP_OK) {
|
|
57
|
+
ESP_LOGE(TAG, "Failed to initialize touch pad: %s", esp_err_to_name(init_err));
|
|
58
|
+
this->mark_failed();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Configure each touch pad first
|
|
63
|
+
for (auto *child : this->children_) {
|
|
64
|
+
esp_err_t config_err = touch_pad_config(child->touch_pad_);
|
|
65
|
+
if (config_err != ESP_OK) {
|
|
66
|
+
ESP_LOGE(TAG, "Failed to configure touch pad %d: %s", child->touch_pad_, esp_err_to_name(config_err));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Set up filtering if configured
|
|
71
|
+
if (this->filter_configured_()) {
|
|
72
|
+
touch_filter_config_t filter_info = {
|
|
73
|
+
.mode = this->filter_mode_,
|
|
74
|
+
.debounce_cnt = this->debounce_count_,
|
|
75
|
+
.noise_thr = this->noise_threshold_,
|
|
76
|
+
.jitter_step = this->jitter_step_,
|
|
77
|
+
.smh_lvl = this->smooth_level_,
|
|
78
|
+
};
|
|
79
|
+
touch_pad_filter_set_config(&filter_info);
|
|
80
|
+
touch_pad_filter_enable();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (this->denoise_configured_()) {
|
|
84
|
+
touch_pad_denoise_t denoise = {
|
|
85
|
+
.grade = this->grade_,
|
|
86
|
+
.cap_level = this->cap_level_,
|
|
87
|
+
};
|
|
88
|
+
touch_pad_denoise_set_config(&denoise);
|
|
89
|
+
touch_pad_denoise_enable();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (this->waterproof_configured_()) {
|
|
93
|
+
touch_pad_waterproof_t waterproof = {
|
|
94
|
+
.guard_ring_pad = this->waterproof_guard_ring_pad_,
|
|
95
|
+
.shield_driver = this->waterproof_shield_driver_,
|
|
96
|
+
};
|
|
97
|
+
touch_pad_waterproof_set_config(&waterproof);
|
|
98
|
+
touch_pad_waterproof_enable();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Configure measurement parameters
|
|
102
|
+
touch_pad_set_voltage(this->high_voltage_reference_, this->low_voltage_reference_, this->voltage_attenuation_);
|
|
103
|
+
touch_pad_set_charge_discharge_times(this->meas_cycle_);
|
|
104
|
+
touch_pad_set_measurement_interval(this->sleep_cycle_);
|
|
105
|
+
|
|
106
|
+
// Configure timeout if needed
|
|
107
|
+
touch_pad_timeout_set(true, TOUCH_PAD_THRESHOLD_MAX);
|
|
108
|
+
|
|
109
|
+
// Register ISR handler with interrupt mask
|
|
110
|
+
esp_err_t err =
|
|
111
|
+
touch_pad_isr_register(touch_isr_handler, this, static_cast<touch_pad_intr_mask_t>(TOUCH_PAD_INTR_MASK_ALL));
|
|
112
|
+
if (err != ESP_OK) {
|
|
113
|
+
ESP_LOGE(TAG, "Failed to register touch ISR: %s", esp_err_to_name(err));
|
|
114
|
+
this->cleanup_touch_queue_();
|
|
115
|
+
this->mark_failed();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Set thresholds for each pad BEFORE starting FSM
|
|
120
|
+
for (auto *child : this->children_) {
|
|
121
|
+
if (child->threshold_ != 0) {
|
|
122
|
+
touch_pad_set_thresh(child->touch_pad_, child->threshold_);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Enable interrupts - only ACTIVE and TIMEOUT
|
|
127
|
+
// NOTE: We intentionally don't enable INACTIVE interrupts because they are unreliable
|
|
128
|
+
// on ESP32-S2/S3 hardware and sometimes don't fire. Instead, we use timeout-based
|
|
129
|
+
// release detection with the ability to verify the actual state.
|
|
130
|
+
touch_pad_intr_enable(static_cast<touch_pad_intr_mask_t>(TOUCH_PAD_INTR_MASK_ACTIVE | TOUCH_PAD_INTR_MASK_TIMEOUT));
|
|
131
|
+
|
|
132
|
+
// Set FSM mode before starting
|
|
133
|
+
touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER);
|
|
134
|
+
|
|
135
|
+
// Start FSM
|
|
136
|
+
touch_pad_fsm_start();
|
|
137
|
+
|
|
138
|
+
// Calculate release timeout based on sleep cycle
|
|
139
|
+
this->calculate_release_timeout_();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
void ESP32TouchComponent::dump_config() {
|
|
143
|
+
this->dump_config_base_();
|
|
144
|
+
|
|
145
|
+
if (this->filter_configured_()) {
|
|
146
|
+
const char *filter_mode_s;
|
|
147
|
+
switch (this->filter_mode_) {
|
|
148
|
+
case TOUCH_PAD_FILTER_IIR_4:
|
|
149
|
+
filter_mode_s = "IIR_4";
|
|
150
|
+
break;
|
|
151
|
+
case TOUCH_PAD_FILTER_IIR_8:
|
|
152
|
+
filter_mode_s = "IIR_8";
|
|
153
|
+
break;
|
|
154
|
+
case TOUCH_PAD_FILTER_IIR_16:
|
|
155
|
+
filter_mode_s = "IIR_16";
|
|
156
|
+
break;
|
|
157
|
+
case TOUCH_PAD_FILTER_IIR_32:
|
|
158
|
+
filter_mode_s = "IIR_32";
|
|
159
|
+
break;
|
|
160
|
+
case TOUCH_PAD_FILTER_IIR_64:
|
|
161
|
+
filter_mode_s = "IIR_64";
|
|
162
|
+
break;
|
|
163
|
+
case TOUCH_PAD_FILTER_IIR_128:
|
|
164
|
+
filter_mode_s = "IIR_128";
|
|
165
|
+
break;
|
|
166
|
+
case TOUCH_PAD_FILTER_IIR_256:
|
|
167
|
+
filter_mode_s = "IIR_256";
|
|
168
|
+
break;
|
|
169
|
+
case TOUCH_PAD_FILTER_JITTER:
|
|
170
|
+
filter_mode_s = "JITTER";
|
|
171
|
+
break;
|
|
172
|
+
default:
|
|
173
|
+
filter_mode_s = "UNKNOWN";
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
ESP_LOGCONFIG(TAG,
|
|
177
|
+
" Filter mode: %s\n"
|
|
178
|
+
" Debounce count: %" PRIu32 "\n"
|
|
179
|
+
" Noise threshold coefficient: %" PRIu32 "\n"
|
|
180
|
+
" Jitter filter step size: %" PRIu32,
|
|
181
|
+
filter_mode_s, this->debounce_count_, this->noise_threshold_, this->jitter_step_);
|
|
182
|
+
const char *smooth_level_s;
|
|
183
|
+
switch (this->smooth_level_) {
|
|
184
|
+
case TOUCH_PAD_SMOOTH_OFF:
|
|
185
|
+
smooth_level_s = "OFF";
|
|
186
|
+
break;
|
|
187
|
+
case TOUCH_PAD_SMOOTH_IIR_2:
|
|
188
|
+
smooth_level_s = "IIR_2";
|
|
189
|
+
break;
|
|
190
|
+
case TOUCH_PAD_SMOOTH_IIR_4:
|
|
191
|
+
smooth_level_s = "IIR_4";
|
|
192
|
+
break;
|
|
193
|
+
case TOUCH_PAD_SMOOTH_IIR_8:
|
|
194
|
+
smooth_level_s = "IIR_8";
|
|
195
|
+
break;
|
|
196
|
+
default:
|
|
197
|
+
smooth_level_s = "UNKNOWN";
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
ESP_LOGCONFIG(TAG, " Smooth level: %s", smooth_level_s);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (this->denoise_configured_()) {
|
|
204
|
+
const char *grade_s;
|
|
205
|
+
switch (this->grade_) {
|
|
206
|
+
case TOUCH_PAD_DENOISE_BIT12:
|
|
207
|
+
grade_s = "BIT12";
|
|
208
|
+
break;
|
|
209
|
+
case TOUCH_PAD_DENOISE_BIT10:
|
|
210
|
+
grade_s = "BIT10";
|
|
211
|
+
break;
|
|
212
|
+
case TOUCH_PAD_DENOISE_BIT8:
|
|
213
|
+
grade_s = "BIT8";
|
|
214
|
+
break;
|
|
215
|
+
case TOUCH_PAD_DENOISE_BIT4:
|
|
216
|
+
grade_s = "BIT4";
|
|
217
|
+
break;
|
|
218
|
+
default:
|
|
219
|
+
grade_s = "UNKNOWN";
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
ESP_LOGCONFIG(TAG, " Denoise grade: %s", grade_s);
|
|
223
|
+
|
|
224
|
+
const char *cap_level_s;
|
|
225
|
+
switch (this->cap_level_) {
|
|
226
|
+
case TOUCH_PAD_DENOISE_CAP_L0:
|
|
227
|
+
cap_level_s = "L0";
|
|
228
|
+
break;
|
|
229
|
+
case TOUCH_PAD_DENOISE_CAP_L1:
|
|
230
|
+
cap_level_s = "L1";
|
|
231
|
+
break;
|
|
232
|
+
case TOUCH_PAD_DENOISE_CAP_L2:
|
|
233
|
+
cap_level_s = "L2";
|
|
234
|
+
break;
|
|
235
|
+
case TOUCH_PAD_DENOISE_CAP_L3:
|
|
236
|
+
cap_level_s = "L3";
|
|
237
|
+
break;
|
|
238
|
+
case TOUCH_PAD_DENOISE_CAP_L4:
|
|
239
|
+
cap_level_s = "L4";
|
|
240
|
+
break;
|
|
241
|
+
case TOUCH_PAD_DENOISE_CAP_L5:
|
|
242
|
+
cap_level_s = "L5";
|
|
243
|
+
break;
|
|
244
|
+
case TOUCH_PAD_DENOISE_CAP_L6:
|
|
245
|
+
cap_level_s = "L6";
|
|
246
|
+
break;
|
|
247
|
+
case TOUCH_PAD_DENOISE_CAP_L7:
|
|
248
|
+
cap_level_s = "L7";
|
|
249
|
+
break;
|
|
250
|
+
default:
|
|
251
|
+
cap_level_s = "UNKNOWN";
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
ESP_LOGCONFIG(TAG, " Denoise capacitance level: %s", cap_level_s);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (this->setup_mode_) {
|
|
258
|
+
ESP_LOGCONFIG(TAG, " Setup Mode ENABLED");
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
this->dump_config_sensors_();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
void ESP32TouchComponent::loop() {
|
|
265
|
+
const uint32_t now = App.get_loop_component_start_time();
|
|
266
|
+
|
|
267
|
+
// V2 TOUCH HANDLING:
|
|
268
|
+
// Due to unreliable INACTIVE interrupts on ESP32-S2/S3, we use a hybrid approach:
|
|
269
|
+
// 1. Process ACTIVE interrupts when pads are touched
|
|
270
|
+
// 2. Use timeout-based release detection (like v1)
|
|
271
|
+
// 3. But smarter than v1: verify actual state before releasing on timeout
|
|
272
|
+
// This prevents false releases if we missed interrupts
|
|
273
|
+
|
|
274
|
+
// In setup mode, periodically log all pad values
|
|
275
|
+
this->process_setup_mode_logging_(now);
|
|
276
|
+
|
|
277
|
+
// Process any queued touch events from interrupts
|
|
278
|
+
TouchPadEventV2 event;
|
|
279
|
+
while (xQueueReceive(this->touch_queue_, &event, 0) == pdTRUE) {
|
|
280
|
+
ESP_LOGD(TAG, "Event received, mask = 0x%" PRIx32 ", pad = %d", event.intr_mask, event.pad);
|
|
281
|
+
// Handle timeout events
|
|
282
|
+
if (event.intr_mask & TOUCH_PAD_INTR_MASK_TIMEOUT) {
|
|
283
|
+
// Resume measurement after timeout
|
|
284
|
+
touch_pad_timeout_resume();
|
|
285
|
+
// For timeout events, always check the current state
|
|
286
|
+
} else if (!(event.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE)) {
|
|
287
|
+
// Skip if not an active/timeout event
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Find the child for the pad that triggered the interrupt
|
|
292
|
+
for (auto *child : this->children_) {
|
|
293
|
+
if (child->touch_pad_ == event.pad) {
|
|
294
|
+
if (event.intr_mask & TOUCH_PAD_INTR_MASK_TIMEOUT) {
|
|
295
|
+
// For timeout events, we need to read the value to determine state
|
|
296
|
+
this->check_and_update_touch_state_(child);
|
|
297
|
+
} else if (event.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE) {
|
|
298
|
+
// We only get ACTIVE interrupts now, releases are detected by timeout
|
|
299
|
+
this->update_touch_state_(child, true); // Always touched for ACTIVE interrupts
|
|
300
|
+
}
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Check for released pads periodically (like v1)
|
|
307
|
+
if (!this->should_check_for_releases_(now)) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
size_t pads_off = 0;
|
|
312
|
+
for (auto *child : this->children_) {
|
|
313
|
+
if (child->benchmark_ == 0)
|
|
314
|
+
touch_pad_read_benchmark(child->touch_pad_, &child->benchmark_);
|
|
315
|
+
// Handle initial state publication after startup
|
|
316
|
+
this->publish_initial_state_if_needed_(child, now);
|
|
317
|
+
|
|
318
|
+
if (child->last_state_) {
|
|
319
|
+
// Pad is currently in touched state - check for release timeout
|
|
320
|
+
// Using subtraction handles 32-bit rollover correctly
|
|
321
|
+
uint32_t time_diff = now - child->last_touch_time_;
|
|
322
|
+
|
|
323
|
+
// Check if we haven't seen this pad recently
|
|
324
|
+
if (time_diff > this->release_timeout_ms_) {
|
|
325
|
+
// Haven't seen this pad recently - verify actual state
|
|
326
|
+
// Unlike v1, v2 hardware allows us to read the current state anytime
|
|
327
|
+
// This makes v2 smarter: we can verify if it's actually released before
|
|
328
|
+
// declaring a timeout, preventing false releases if interrupts were missed
|
|
329
|
+
bool still_touched = this->check_and_update_touch_state_(child);
|
|
330
|
+
|
|
331
|
+
if (still_touched) {
|
|
332
|
+
// Still touched! Timer was reset in update_touch_state_
|
|
333
|
+
ESP_LOGVV(TAG, "Touch Pad '%s' still touched after %" PRIu32 "ms timeout, resetting timer",
|
|
334
|
+
child->get_name().c_str(), this->release_timeout_ms_);
|
|
335
|
+
} else {
|
|
336
|
+
// Actually released - already handled by check_and_update_touch_state_
|
|
337
|
+
pads_off++;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
} else {
|
|
341
|
+
// Pad is already off
|
|
342
|
+
pads_off++;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Disable the loop when all pads are off and not in setup mode (like v1)
|
|
347
|
+
// We need to keep checking for timeouts, so only disable when all pads are confirmed off
|
|
348
|
+
this->check_and_disable_loop_if_all_released_(pads_off);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
void ESP32TouchComponent::on_shutdown() {
|
|
352
|
+
// Disable interrupts
|
|
353
|
+
touch_pad_intr_disable(static_cast<touch_pad_intr_mask_t>(TOUCH_PAD_INTR_MASK_ACTIVE | TOUCH_PAD_INTR_MASK_TIMEOUT));
|
|
354
|
+
touch_pad_isr_deregister(touch_isr_handler, this);
|
|
355
|
+
this->cleanup_touch_queue_();
|
|
356
|
+
|
|
357
|
+
// Configure wakeup pads if any are set
|
|
358
|
+
this->configure_wakeup_pads_();
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
void IRAM_ATTR ESP32TouchComponent::touch_isr_handler(void *arg) {
|
|
362
|
+
ESP32TouchComponent *component = static_cast<ESP32TouchComponent *>(arg);
|
|
363
|
+
BaseType_t x_higher_priority_task_woken = pdFALSE;
|
|
364
|
+
|
|
365
|
+
// Read interrupt status
|
|
366
|
+
TouchPadEventV2 event;
|
|
367
|
+
event.intr_mask = touch_pad_read_intr_status_mask();
|
|
368
|
+
event.pad = touch_pad_get_current_meas_channel();
|
|
369
|
+
|
|
370
|
+
// Send event to queue for processing in main loop
|
|
371
|
+
xQueueSendFromISR(component->touch_queue_, &event, &x_higher_priority_task_woken);
|
|
372
|
+
component->enable_loop_soon_any_context();
|
|
373
|
+
|
|
374
|
+
if (x_higher_priority_task_woken) {
|
|
375
|
+
portYIELD_FROM_ISR();
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
uint32_t ESP32TouchComponent::read_touch_value(touch_pad_t pad) const {
|
|
380
|
+
// Unlike ESP32 v1, touch reads on ESP32-S2/S3 v2 are non-blocking operations.
|
|
381
|
+
// The hardware continuously samples in the background and we can read the
|
|
382
|
+
// latest value at any time without waiting.
|
|
383
|
+
uint32_t value = 0;
|
|
384
|
+
if (this->filter_configured_()) {
|
|
385
|
+
// Read filtered/smoothed value when filter is enabled
|
|
386
|
+
touch_pad_filter_read_smooth(pad, &value);
|
|
387
|
+
} else {
|
|
388
|
+
// Read raw value when filter is not configured
|
|
389
|
+
touch_pad_read_raw_data(pad, &value);
|
|
390
|
+
}
|
|
391
|
+
return value;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
} // namespace esp32_touch
|
|
395
|
+
} // namespace esphome
|
|
396
|
+
|
|
397
|
+
#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
|
|
@@ -183,6 +183,7 @@ async def to_code(config):
|
|
|
183
183
|
|
|
184
184
|
cg.add_platformio_option("board", config[CONF_BOARD])
|
|
185
185
|
cg.add_build_flag("-DUSE_ESP8266")
|
|
186
|
+
cg.set_cpp_standard("gnu++20")
|
|
186
187
|
cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
|
|
187
188
|
cg.add_define("ESPHOME_VARIANT", "ESP8266")
|
|
188
189
|
|
|
@@ -129,9 +129,9 @@ void IRAM_ATTR ISRInternalGPIOPin::digital_write(bool value) {
|
|
|
129
129
|
}
|
|
130
130
|
} else {
|
|
131
131
|
if (value != arg->inverted) {
|
|
132
|
-
*arg->out_set_reg
|
|
132
|
+
*arg->out_set_reg = *arg->out_set_reg | 1;
|
|
133
133
|
} else {
|
|
134
|
-
*arg->out_set_reg
|
|
134
|
+
*arg->out_set_reg = *arg->out_set_reg & ~1;
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
}
|
|
@@ -147,7 +147,7 @@ void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
|
|
|
147
147
|
if (flags & gpio::FLAG_OUTPUT) {
|
|
148
148
|
*arg->mode_set_reg = arg->mask;
|
|
149
149
|
if (flags & gpio::FLAG_OPEN_DRAIN) {
|
|
150
|
-
*arg->control_reg
|
|
150
|
+
*arg->control_reg = *arg->control_reg | (1 << GPCD);
|
|
151
151
|
} else {
|
|
152
152
|
*arg->control_reg &= ~(1 << GPCD);
|
|
153
153
|
}
|
|
@@ -155,21 +155,21 @@ void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
|
|
|
155
155
|
*arg->mode_clr_reg = arg->mask;
|
|
156
156
|
}
|
|
157
157
|
if (flags & gpio::FLAG_PULLUP) {
|
|
158
|
-
*arg->func_reg
|
|
159
|
-
*arg->control_reg
|
|
158
|
+
*arg->func_reg = *arg->func_reg | (1 << GPFPU);
|
|
159
|
+
*arg->control_reg = *arg->control_reg | (1 << GPCD);
|
|
160
160
|
} else {
|
|
161
|
-
*arg->func_reg
|
|
161
|
+
*arg->func_reg = *arg->func_reg & ~(1 << GPFPU);
|
|
162
162
|
}
|
|
163
163
|
} else {
|
|
164
164
|
if (flags & gpio::FLAG_OUTPUT) {
|
|
165
|
-
*arg->mode_set_reg
|
|
165
|
+
*arg->mode_set_reg = *arg->mode_set_reg | 1;
|
|
166
166
|
} else {
|
|
167
|
-
*arg->mode_set_reg
|
|
167
|
+
*arg->mode_set_reg = *arg->mode_set_reg & ~1;
|
|
168
168
|
}
|
|
169
169
|
if (flags & gpio::FLAG_PULLDOWN) {
|
|
170
|
-
*arg->func_reg
|
|
170
|
+
*arg->func_reg = *arg->func_reg | (1 << GP16FPD);
|
|
171
171
|
} else {
|
|
172
|
-
*arg->func_reg
|
|
172
|
+
*arg->func_reg = *arg->func_reg & ~(1 << GP16FPD);
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#include "esphome/core/helpers.h"
|
|
2
|
+
|
|
3
|
+
#ifdef USE_ESP8266
|
|
4
|
+
|
|
5
|
+
#include <osapi.h>
|
|
6
|
+
#include <user_interface.h>
|
|
7
|
+
// for xt_rsil()/xt_wsr_ps()
|
|
8
|
+
#include <Arduino.h>
|
|
9
|
+
|
|
10
|
+
namespace esphome {
|
|
11
|
+
|
|
12
|
+
uint32_t random_uint32() { return os_random(); }
|
|
13
|
+
bool random_bytes(uint8_t *data, size_t len) { return os_get_random(data, len) == 0; }
|
|
14
|
+
|
|
15
|
+
// ESP8266 doesn't have mutexes, but that shouldn't be an issue as it's single-core and non-preemptive OS.
|
|
16
|
+
Mutex::Mutex() {}
|
|
17
|
+
Mutex::~Mutex() {}
|
|
18
|
+
void Mutex::lock() {}
|
|
19
|
+
bool Mutex::try_lock() { return true; }
|
|
20
|
+
void Mutex::unlock() {}
|
|
21
|
+
|
|
22
|
+
IRAM_ATTR InterruptLock::InterruptLock() { state_ = xt_rsil(15); }
|
|
23
|
+
IRAM_ATTR InterruptLock::~InterruptLock() { xt_wsr_ps(state_); }
|
|
24
|
+
|
|
25
|
+
void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
|
|
26
|
+
wifi_get_macaddr(STATION_IF, mac);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
} // namespace esphome
|
|
30
|
+
|
|
31
|
+
#endif // USE_ESP8266
|
|
@@ -26,19 +26,19 @@ void ESPHomeOTAComponent::setup() {
|
|
|
26
26
|
ota::register_ota_platform(this);
|
|
27
27
|
#endif
|
|
28
28
|
|
|
29
|
-
server_ = socket::socket_ip_loop_monitored(SOCK_STREAM, 0); // monitored for incoming connections
|
|
30
|
-
if (server_ == nullptr) {
|
|
29
|
+
this->server_ = socket::socket_ip_loop_monitored(SOCK_STREAM, 0); // monitored for incoming connections
|
|
30
|
+
if (this->server_ == nullptr) {
|
|
31
31
|
ESP_LOGW(TAG, "Could not create socket");
|
|
32
32
|
this->mark_failed();
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
int enable = 1;
|
|
36
|
-
int err = server_->setsockopt(SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
|
|
36
|
+
int err = this->server_->setsockopt(SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
|
|
37
37
|
if (err != 0) {
|
|
38
38
|
ESP_LOGW(TAG, "Socket unable to set reuseaddr: errno %d", err);
|
|
39
39
|
// we can still continue
|
|
40
40
|
}
|
|
41
|
-
err = server_->setblocking(false);
|
|
41
|
+
err = this->server_->setblocking(false);
|
|
42
42
|
if (err != 0) {
|
|
43
43
|
ESP_LOGW(TAG, "Socket unable to set nonblocking mode: errno %d", err);
|
|
44
44
|
this->mark_failed();
|
|
@@ -54,14 +54,14 @@ void ESPHomeOTAComponent::setup() {
|
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
err = server_->bind((struct sockaddr *) &server, sizeof(server));
|
|
57
|
+
err = this->server_->bind((struct sockaddr *) &server, sizeof(server));
|
|
58
58
|
if (err != 0) {
|
|
59
59
|
ESP_LOGW(TAG, "Socket unable to bind: errno %d", errno);
|
|
60
60
|
this->mark_failed();
|
|
61
61
|
return;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
err = server_->listen(4);
|
|
64
|
+
err = this->server_->listen(4);
|
|
65
65
|
if (err != 0) {
|
|
66
66
|
ESP_LOGW(TAG, "Socket unable to listen: errno %d", errno);
|
|
67
67
|
this->mark_failed();
|
|
@@ -82,7 +82,14 @@ void ESPHomeOTAComponent::dump_config() {
|
|
|
82
82
|
#endif
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
void ESPHomeOTAComponent::loop() {
|
|
85
|
+
void ESPHomeOTAComponent::loop() {
|
|
86
|
+
// Skip handle_() call if no client connected and no incoming connections
|
|
87
|
+
// This optimization reduces idle loop overhead when OTA is not active
|
|
88
|
+
// Note: No need to check server_ for null as the component is marked failed in setup() if server_ creation fails
|
|
89
|
+
if (this->client_ != nullptr || this->server_->ready()) {
|
|
90
|
+
this->handle_();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
86
93
|
|
|
87
94
|
static const uint8_t FEATURE_SUPPORTS_COMPRESSION = 0x01;
|
|
88
95
|
|
|
@@ -101,23 +108,21 @@ void ESPHomeOTAComponent::handle_() {
|
|
|
101
108
|
size_t size_acknowledged = 0;
|
|
102
109
|
#endif
|
|
103
110
|
|
|
104
|
-
if (client_ == nullptr) {
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
+
if (this->client_ == nullptr) {
|
|
112
|
+
// We already checked server_->ready() in loop(), so we can accept directly
|
|
113
|
+
struct sockaddr_storage source_addr;
|
|
114
|
+
socklen_t addr_len = sizeof(source_addr);
|
|
115
|
+
this->client_ = this->server_->accept((struct sockaddr *) &source_addr, &addr_len);
|
|
116
|
+
if (this->client_ == nullptr)
|
|
117
|
+
return;
|
|
111
118
|
}
|
|
112
|
-
if (client_ == nullptr)
|
|
113
|
-
return;
|
|
114
119
|
|
|
115
120
|
int enable = 1;
|
|
116
|
-
int err = client_->setsockopt(IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(int));
|
|
121
|
+
int err = this->client_->setsockopt(IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(int));
|
|
117
122
|
if (err != 0) {
|
|
118
123
|
ESP_LOGW(TAG, "Socket could not enable TCP nodelay, errno %d", errno);
|
|
119
|
-
client_->close();
|
|
120
|
-
client_ = nullptr;
|
|
124
|
+
this->client_->close();
|
|
125
|
+
this->client_ = nullptr;
|
|
121
126
|
return;
|
|
122
127
|
}
|
|
123
128
|
|