esphome 2025.6.3__py3-none-any.whl → 2025.7.0b2__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 +57 -21
- esphome/components/api/api_connection.cpp +344 -539
- esphome/components/api/api_connection.h +224 -141
- esphome/components/api/api_frame_helper.cpp +91 -127
- esphome/components/api/api_frame_helper.h +64 -54
- esphome/components/api/api_pb2.cpp +1837 -9044
- esphome/components/api/api_pb2.h +532 -685
- esphome/components/api/api_pb2_dump.cpp +4432 -0
- esphome/components/api/api_pb2_service.cpp +184 -425
- esphome/components/api/api_pb2_service.h +13 -6
- esphome/components/api/api_server.cpp +131 -167
- esphome/components/api/api_server.h +38 -10
- esphome/components/api/client.py +8 -2
- esphome/components/api/custom_api_device.h +8 -0
- esphome/components/api/list_entities.cpp +37 -104
- esphome/components/api/list_entities.h +33 -23
- esphome/components/api/proto.h +532 -26
- esphome/components/api/subscribe_state.cpp +23 -29
- esphome/components/api/subscribe_state.h +26 -19
- esphome/components/api/user_services.h +2 -0
- 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/debug/debug_esp32.cpp +2 -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 +103 -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 +112 -98
- 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 +240 -0
- esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
- esphome/components/esp8266/__init__.py +2 -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 +3 -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.h +1 -0
- 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 +421 -268
- 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 +5 -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 +132 -47
- 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 +34 -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 +2 -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 +0 -4
- 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/usb_host/usb_host_client.cpp +10 -10
- esphome/components/usb_uart/cp210x.cpp +1 -1
- esphome/components/usb_uart/usb_uart.cpp +41 -44
- esphome/components/usb_uart/usb_uart.h +4 -3
- 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 +305 -427
- 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 +11 -9
- esphome/core/component_iterator.h +12 -10
- 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 +168 -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 +275 -103
- esphome/core/scheduler.h +154 -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 +17 -4
- esphome/writer.py +21 -3
- esphome/yaml_util.py +0 -2
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/METADATA +10 -9
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/RECORD +597 -538
- esphome/components/api/api_pb2_size.h +0 -361
- 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.3.dist-info → esphome-2025.7.0b2.dist-info}/WHEEL +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/top_level.txt +0 -0
|
@@ -21,6 +21,43 @@ static const uint32_t RMT_CLK_FREQ = 80000000;
|
|
|
21
21
|
static const uint8_t RMT_CLK_DIV = 2;
|
|
22
22
|
#endif
|
|
23
23
|
|
|
24
|
+
static const size_t RMT_SYMBOLS_PER_BYTE = 8;
|
|
25
|
+
|
|
26
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
|
27
|
+
static size_t IRAM_ATTR HOT encoder_callback(const void *data, size_t size, size_t symbols_written, size_t symbols_free,
|
|
28
|
+
rmt_symbol_word_t *symbols, bool *done, void *arg) {
|
|
29
|
+
auto *params = static_cast<LedParams *>(arg);
|
|
30
|
+
const auto *bytes = static_cast<const uint8_t *>(data);
|
|
31
|
+
size_t index = symbols_written / RMT_SYMBOLS_PER_BYTE;
|
|
32
|
+
|
|
33
|
+
// convert byte to symbols
|
|
34
|
+
if (index < size) {
|
|
35
|
+
if (symbols_free < RMT_SYMBOLS_PER_BYTE) {
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
for (int32_t i = 0; i < RMT_SYMBOLS_PER_BYTE; i++) {
|
|
39
|
+
if (bytes[index] & (1 << (7 - i))) {
|
|
40
|
+
symbols[i] = params->bit1;
|
|
41
|
+
} else {
|
|
42
|
+
symbols[i] = params->bit0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if ((index + 1) >= size && params->reset.duration0 == 0 && params->reset.duration1 == 0) {
|
|
46
|
+
*done = true;
|
|
47
|
+
}
|
|
48
|
+
return RMT_SYMBOLS_PER_BYTE;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// send reset
|
|
52
|
+
if (symbols_free < 1) {
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
symbols[0] = params->reset;
|
|
56
|
+
*done = true;
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
#endif
|
|
60
|
+
|
|
24
61
|
void ESP32RMTLEDStripLightOutput::setup() {
|
|
25
62
|
ESP_LOGCONFIG(TAG, "Running setup");
|
|
26
63
|
|
|
@@ -42,11 +79,15 @@ void ESP32RMTLEDStripLightOutput::setup() {
|
|
|
42
79
|
return;
|
|
43
80
|
}
|
|
44
81
|
|
|
45
|
-
#if
|
|
82
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
|
83
|
+
// copy of the led buffer
|
|
84
|
+
this->rmt_buf_ = allocator.allocate(buffer_size);
|
|
85
|
+
#else
|
|
46
86
|
RAMAllocator<rmt_symbol_word_t> rmt_allocator(this->use_psram_ ? 0 : RAMAllocator<rmt_symbol_word_t>::ALLOC_INTERNAL);
|
|
47
87
|
|
|
48
88
|
// 8 bits per byte, 1 rmt_symbol_word_t per bit + 1 rmt_symbol_word_t for reset
|
|
49
89
|
this->rmt_buf_ = rmt_allocator.allocate(buffer_size * 8 + 1);
|
|
90
|
+
#endif
|
|
50
91
|
|
|
51
92
|
rmt_tx_channel_config_t channel;
|
|
52
93
|
memset(&channel, 0, sizeof(channel));
|
|
@@ -66,6 +107,18 @@ void ESP32RMTLEDStripLightOutput::setup() {
|
|
|
66
107
|
return;
|
|
67
108
|
}
|
|
68
109
|
|
|
110
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
|
111
|
+
rmt_simple_encoder_config_t encoder;
|
|
112
|
+
memset(&encoder, 0, sizeof(encoder));
|
|
113
|
+
encoder.callback = encoder_callback;
|
|
114
|
+
encoder.arg = &this->params_;
|
|
115
|
+
encoder.min_chunk_size = 8;
|
|
116
|
+
if (rmt_new_simple_encoder(&encoder, &this->encoder_) != ESP_OK) {
|
|
117
|
+
ESP_LOGE(TAG, "Encoder creation failed");
|
|
118
|
+
this->mark_failed();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
#else
|
|
69
122
|
rmt_copy_encoder_config_t encoder;
|
|
70
123
|
memset(&encoder, 0, sizeof(encoder));
|
|
71
124
|
if (rmt_new_copy_encoder(&encoder, &this->encoder_) != ESP_OK) {
|
|
@@ -73,42 +126,13 @@ void ESP32RMTLEDStripLightOutput::setup() {
|
|
|
73
126
|
this->mark_failed();
|
|
74
127
|
return;
|
|
75
128
|
}
|
|
129
|
+
#endif
|
|
76
130
|
|
|
77
131
|
if (rmt_enable(this->channel_) != ESP_OK) {
|
|
78
132
|
ESP_LOGE(TAG, "Enabling channel failed");
|
|
79
133
|
this->mark_failed();
|
|
80
134
|
return;
|
|
81
135
|
}
|
|
82
|
-
#else
|
|
83
|
-
RAMAllocator<rmt_item32_t> rmt_allocator(this->use_psram_ ? 0 : RAMAllocator<rmt_item32_t>::ALLOC_INTERNAL);
|
|
84
|
-
|
|
85
|
-
// 8 bits per byte, 1 rmt_item32_t per bit + 1 rmt_item32_t for reset
|
|
86
|
-
this->rmt_buf_ = rmt_allocator.allocate(buffer_size * 8 + 1);
|
|
87
|
-
|
|
88
|
-
rmt_config_t config;
|
|
89
|
-
memset(&config, 0, sizeof(config));
|
|
90
|
-
config.channel = this->channel_;
|
|
91
|
-
config.rmt_mode = RMT_MODE_TX;
|
|
92
|
-
config.gpio_num = gpio_num_t(this->pin_);
|
|
93
|
-
config.mem_block_num = 1;
|
|
94
|
-
config.clk_div = RMT_CLK_DIV;
|
|
95
|
-
config.tx_config.loop_en = false;
|
|
96
|
-
config.tx_config.carrier_level = RMT_CARRIER_LEVEL_LOW;
|
|
97
|
-
config.tx_config.carrier_en = false;
|
|
98
|
-
config.tx_config.idle_level = RMT_IDLE_LEVEL_LOW;
|
|
99
|
-
config.tx_config.idle_output_en = true;
|
|
100
|
-
|
|
101
|
-
if (rmt_config(&config) != ESP_OK) {
|
|
102
|
-
ESP_LOGE(TAG, "Cannot initialize RMT!");
|
|
103
|
-
this->mark_failed();
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
if (rmt_driver_install(config.channel, 0, 0) != ESP_OK) {
|
|
107
|
-
ESP_LOGE(TAG, "Cannot install RMT driver!");
|
|
108
|
-
this->mark_failed();
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
#endif
|
|
112
136
|
}
|
|
113
137
|
|
|
114
138
|
void ESP32RMTLEDStripLightOutput::set_led_params(uint32_t bit0_high, uint32_t bit0_low, uint32_t bit1_high,
|
|
@@ -116,20 +140,20 @@ void ESP32RMTLEDStripLightOutput::set_led_params(uint32_t bit0_high, uint32_t bi
|
|
|
116
140
|
float ratio = (float) RMT_CLK_FREQ / RMT_CLK_DIV / 1e09f;
|
|
117
141
|
|
|
118
142
|
// 0-bit
|
|
119
|
-
this->
|
|
120
|
-
this->
|
|
121
|
-
this->
|
|
122
|
-
this->
|
|
143
|
+
this->params_.bit0.duration0 = (uint32_t) (ratio * bit0_high);
|
|
144
|
+
this->params_.bit0.level0 = 1;
|
|
145
|
+
this->params_.bit0.duration1 = (uint32_t) (ratio * bit0_low);
|
|
146
|
+
this->params_.bit0.level1 = 0;
|
|
123
147
|
// 1-bit
|
|
124
|
-
this->
|
|
125
|
-
this->
|
|
126
|
-
this->
|
|
127
|
-
this->
|
|
148
|
+
this->params_.bit1.duration0 = (uint32_t) (ratio * bit1_high);
|
|
149
|
+
this->params_.bit1.level0 = 1;
|
|
150
|
+
this->params_.bit1.duration1 = (uint32_t) (ratio * bit1_low);
|
|
151
|
+
this->params_.bit1.level1 = 0;
|
|
128
152
|
// reset
|
|
129
|
-
this->
|
|
130
|
-
this->
|
|
131
|
-
this->
|
|
132
|
-
this->
|
|
153
|
+
this->params_.reset.duration0 = (uint32_t) (ratio * reset_time_high);
|
|
154
|
+
this->params_.reset.level0 = 1;
|
|
155
|
+
this->params_.reset.duration1 = (uint32_t) (ratio * reset_time_low);
|
|
156
|
+
this->params_.reset.level1 = 0;
|
|
133
157
|
}
|
|
134
158
|
|
|
135
159
|
void ESP32RMTLEDStripLightOutput::write_state(light::LightState *state) {
|
|
@@ -145,11 +169,7 @@ void ESP32RMTLEDStripLightOutput::write_state(light::LightState *state) {
|
|
|
145
169
|
|
|
146
170
|
ESP_LOGVV(TAG, "Writing RGB values to bus");
|
|
147
171
|
|
|
148
|
-
#if ESP_IDF_VERSION_MAJOR >= 5
|
|
149
172
|
esp_err_t error = rmt_tx_wait_all_done(this->channel_, 1000);
|
|
150
|
-
#else
|
|
151
|
-
esp_err_t error = rmt_wait_tx_done(this->channel_, pdMS_TO_TICKS(1000));
|
|
152
|
-
#endif
|
|
153
173
|
if (error != ESP_OK) {
|
|
154
174
|
ESP_LOGE(TAG, "RMT TX timeout");
|
|
155
175
|
this->status_set_warning();
|
|
@@ -157,20 +177,19 @@ void ESP32RMTLEDStripLightOutput::write_state(light::LightState *state) {
|
|
|
157
177
|
}
|
|
158
178
|
delayMicroseconds(50);
|
|
159
179
|
|
|
180
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
|
181
|
+
memcpy(this->rmt_buf_, this->buf_, this->get_buffer_size_());
|
|
182
|
+
#else
|
|
160
183
|
size_t buffer_size = this->get_buffer_size_();
|
|
161
184
|
|
|
162
185
|
size_t size = 0;
|
|
163
186
|
size_t len = 0;
|
|
164
187
|
uint8_t *psrc = this->buf_;
|
|
165
|
-
#if ESP_IDF_VERSION_MAJOR >= 5
|
|
166
188
|
rmt_symbol_word_t *pdest = this->rmt_buf_;
|
|
167
|
-
#else
|
|
168
|
-
rmt_item32_t *pdest = this->rmt_buf_;
|
|
169
|
-
#endif
|
|
170
189
|
while (size < buffer_size) {
|
|
171
190
|
uint8_t b = *psrc;
|
|
172
191
|
for (int i = 0; i < 8; i++) {
|
|
173
|
-
pdest->val = b & (1 << (7 - i)) ? this->
|
|
192
|
+
pdest->val = b & (1 << (7 - i)) ? this->params_.bit1.val : this->params_.bit0.val;
|
|
174
193
|
pdest++;
|
|
175
194
|
len++;
|
|
176
195
|
}
|
|
@@ -178,20 +197,19 @@ void ESP32RMTLEDStripLightOutput::write_state(light::LightState *state) {
|
|
|
178
197
|
psrc++;
|
|
179
198
|
}
|
|
180
199
|
|
|
181
|
-
if (this->
|
|
182
|
-
pdest->val = this->
|
|
200
|
+
if (this->params_.reset.duration0 > 0 || this->params_.reset.duration1 > 0) {
|
|
201
|
+
pdest->val = this->params_.reset.val;
|
|
183
202
|
pdest++;
|
|
184
203
|
len++;
|
|
185
204
|
}
|
|
205
|
+
#endif
|
|
186
206
|
|
|
187
|
-
#if ESP_IDF_VERSION_MAJOR >= 5
|
|
188
207
|
rmt_transmit_config_t config;
|
|
189
208
|
memset(&config, 0, sizeof(config));
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
error = rmt_transmit(this->channel_, this->encoder_, this->rmt_buf_, len * sizeof(rmt_symbol_word_t), &config);
|
|
209
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
|
210
|
+
error = rmt_transmit(this->channel_, this->encoder_, this->rmt_buf_, this->get_buffer_size_(), &config);
|
|
193
211
|
#else
|
|
194
|
-
error =
|
|
212
|
+
error = rmt_transmit(this->channel_, this->encoder_, this->rmt_buf_, len * sizeof(rmt_symbol_word_t), &config);
|
|
195
213
|
#endif
|
|
196
214
|
if (error != ESP_OK) {
|
|
197
215
|
ESP_LOGE(TAG, "RMT TX error");
|
|
@@ -251,11 +269,7 @@ void ESP32RMTLEDStripLightOutput::dump_config() {
|
|
|
251
269
|
"ESP32 RMT LED Strip:\n"
|
|
252
270
|
" Pin: %u",
|
|
253
271
|
this->pin_);
|
|
254
|
-
#if ESP_IDF_VERSION_MAJOR >= 5
|
|
255
272
|
ESP_LOGCONFIG(TAG, " RMT Symbols: %" PRIu32, this->rmt_symbols_);
|
|
256
|
-
#else
|
|
257
|
-
ESP_LOGCONFIG(TAG, " Channel: %u", this->channel_);
|
|
258
|
-
#endif
|
|
259
273
|
const char *rgb_order;
|
|
260
274
|
switch (this->rgb_order_) {
|
|
261
275
|
case ORDER_RGB:
|
|
@@ -11,12 +11,7 @@
|
|
|
11
11
|
#include <driver/gpio.h>
|
|
12
12
|
#include <esp_err.h>
|
|
13
13
|
#include <esp_idf_version.h>
|
|
14
|
-
|
|
15
|
-
#if ESP_IDF_VERSION_MAJOR >= 5
|
|
16
14
|
#include <driver/rmt_tx.h>
|
|
17
|
-
#else
|
|
18
|
-
#include <driver/rmt.h>
|
|
19
|
-
#endif
|
|
20
15
|
|
|
21
16
|
namespace esphome {
|
|
22
17
|
namespace esp32_rmt_led_strip {
|
|
@@ -30,6 +25,12 @@ enum RGBOrder : uint8_t {
|
|
|
30
25
|
ORDER_BRG,
|
|
31
26
|
};
|
|
32
27
|
|
|
28
|
+
struct LedParams {
|
|
29
|
+
rmt_symbol_word_t bit0;
|
|
30
|
+
rmt_symbol_word_t bit1;
|
|
31
|
+
rmt_symbol_word_t reset;
|
|
32
|
+
};
|
|
33
|
+
|
|
33
34
|
class ESP32RMTLEDStripLightOutput : public light::AddressableLight {
|
|
34
35
|
public:
|
|
35
36
|
void setup() override;
|
|
@@ -61,11 +62,7 @@ class ESP32RMTLEDStripLightOutput : public light::AddressableLight {
|
|
|
61
62
|
uint32_t reset_time_high, uint32_t reset_time_low);
|
|
62
63
|
|
|
63
64
|
void set_rgb_order(RGBOrder rgb_order) { this->rgb_order_ = rgb_order; }
|
|
64
|
-
#if ESP_IDF_VERSION_MAJOR >= 5
|
|
65
65
|
void set_rmt_symbols(uint32_t rmt_symbols) { this->rmt_symbols_ = rmt_symbols; }
|
|
66
|
-
#else
|
|
67
|
-
void set_rmt_channel(rmt_channel_t channel) { this->channel_ = channel; }
|
|
68
|
-
#endif
|
|
69
66
|
|
|
70
67
|
void clear_effect_data() override {
|
|
71
68
|
for (int i = 0; i < this->size(); i++)
|
|
@@ -81,18 +78,15 @@ class ESP32RMTLEDStripLightOutput : public light::AddressableLight {
|
|
|
81
78
|
|
|
82
79
|
uint8_t *buf_{nullptr};
|
|
83
80
|
uint8_t *effect_data_{nullptr};
|
|
84
|
-
|
|
81
|
+
LedParams params_;
|
|
85
82
|
rmt_channel_handle_t channel_{nullptr};
|
|
86
83
|
rmt_encoder_handle_t encoder_{nullptr};
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
uint32_t rmt_symbols_{48};
|
|
84
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
|
85
|
+
uint8_t *rmt_buf_{nullptr};
|
|
90
86
|
#else
|
|
91
|
-
|
|
92
|
-
rmt_item32_t bit0_, bit1_, reset_;
|
|
93
|
-
rmt_channel_t channel_{RMT_CHANNEL_0};
|
|
87
|
+
rmt_symbol_word_t *rmt_buf_{nullptr};
|
|
94
88
|
#endif
|
|
95
|
-
|
|
89
|
+
uint32_t rmt_symbols_{48};
|
|
96
90
|
uint8_t pin_;
|
|
97
91
|
uint16_t num_leds_;
|
|
98
92
|
bool is_rgbw_{false};
|
|
@@ -3,7 +3,7 @@ import logging
|
|
|
3
3
|
|
|
4
4
|
from esphome import pins
|
|
5
5
|
import esphome.codegen as cg
|
|
6
|
-
from esphome.components import esp32,
|
|
6
|
+
from esphome.components import esp32, light
|
|
7
7
|
import esphome.config_validation as cv
|
|
8
8
|
from esphome.const import (
|
|
9
9
|
CONF_CHIPSET,
|
|
@@ -13,11 +13,9 @@ from esphome.const import (
|
|
|
13
13
|
CONF_OUTPUT_ID,
|
|
14
14
|
CONF_PIN,
|
|
15
15
|
CONF_RGB_ORDER,
|
|
16
|
-
CONF_RMT_CHANNEL,
|
|
17
16
|
CONF_RMT_SYMBOLS,
|
|
18
17
|
CONF_USE_DMA,
|
|
19
18
|
)
|
|
20
|
-
from esphome.core import CORE
|
|
21
19
|
|
|
22
20
|
_LOGGER = logging.getLogger(__name__)
|
|
23
21
|
|
|
@@ -69,53 +67,6 @@ CONF_RESET_HIGH = "reset_high"
|
|
|
69
67
|
CONF_RESET_LOW = "reset_low"
|
|
70
68
|
|
|
71
69
|
|
|
72
|
-
class OptionalForIDF5(cv.SplitDefault):
|
|
73
|
-
@property
|
|
74
|
-
def default(self):
|
|
75
|
-
if not esp32_rmt.use_new_rmt_driver():
|
|
76
|
-
return cv.UNDEFINED
|
|
77
|
-
return super().default
|
|
78
|
-
|
|
79
|
-
@default.setter
|
|
80
|
-
def default(self, value):
|
|
81
|
-
# Ignore default set from vol.Optional
|
|
82
|
-
pass
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def only_with_new_rmt_driver(obj):
|
|
86
|
-
if not esp32_rmt.use_new_rmt_driver():
|
|
87
|
-
raise cv.Invalid(
|
|
88
|
-
"This feature is only available for the IDF framework version 5."
|
|
89
|
-
)
|
|
90
|
-
return obj
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def not_with_new_rmt_driver(obj):
|
|
94
|
-
if esp32_rmt.use_new_rmt_driver():
|
|
95
|
-
raise cv.Invalid(
|
|
96
|
-
"This feature is not available for the IDF framework version 5."
|
|
97
|
-
)
|
|
98
|
-
return obj
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
def final_validation(config):
|
|
102
|
-
if not esp32_rmt.use_new_rmt_driver():
|
|
103
|
-
if CONF_RMT_CHANNEL not in config:
|
|
104
|
-
if CORE.using_esp_idf:
|
|
105
|
-
raise cv.Invalid(
|
|
106
|
-
"rmt_channel is a required option for IDF version < 5."
|
|
107
|
-
)
|
|
108
|
-
raise cv.Invalid(
|
|
109
|
-
"rmt_channel is a required option for the Arduino framework."
|
|
110
|
-
)
|
|
111
|
-
_LOGGER.warning(
|
|
112
|
-
"RMT_LED_STRIP support for IDF version < 5 is deprecated and will be removed soon."
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
FINAL_VALIDATE_SCHEMA = final_validation
|
|
117
|
-
|
|
118
|
-
|
|
119
70
|
CONFIG_SCHEMA = cv.All(
|
|
120
71
|
light.ADDRESSABLE_LIGHT_SCHEMA.extend(
|
|
121
72
|
{
|
|
@@ -123,20 +74,17 @@ CONFIG_SCHEMA = cv.All(
|
|
|
123
74
|
cv.Required(CONF_PIN): pins.internal_gpio_output_pin_number,
|
|
124
75
|
cv.Required(CONF_NUM_LEDS): cv.positive_not_null_int,
|
|
125
76
|
cv.Required(CONF_RGB_ORDER): cv.enum(RGB_ORDERS, upper=True),
|
|
126
|
-
cv.
|
|
127
|
-
not_with_new_rmt_driver, esp32_rmt.validate_rmt_channel(tx=True)
|
|
128
|
-
),
|
|
129
|
-
OptionalForIDF5(
|
|
77
|
+
cv.SplitDefault(
|
|
130
78
|
CONF_RMT_SYMBOLS,
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
): cv.
|
|
79
|
+
esp32=192,
|
|
80
|
+
esp32_s2=192,
|
|
81
|
+
esp32_s3=192,
|
|
82
|
+
esp32_p4=192,
|
|
83
|
+
esp32_c3=96,
|
|
84
|
+
esp32_c5=96,
|
|
85
|
+
esp32_c6=96,
|
|
86
|
+
esp32_h2=96,
|
|
87
|
+
): cv.int_range(min=2),
|
|
140
88
|
cv.Optional(CONF_MAX_REFRESH_RATE): cv.positive_time_period_microseconds,
|
|
141
89
|
cv.Optional(CONF_CHIPSET): cv.one_of(*CHIPSETS, upper=True),
|
|
142
90
|
cv.Optional(CONF_IS_RGBW, default=False): cv.boolean,
|
|
@@ -145,7 +93,6 @@ CONFIG_SCHEMA = cv.All(
|
|
|
145
93
|
esp32.only_on_variant(
|
|
146
94
|
supported=[esp32.const.VARIANT_ESP32S3, esp32.const.VARIANT_ESP32P4]
|
|
147
95
|
),
|
|
148
|
-
cv.only_with_esp_idf,
|
|
149
96
|
cv.boolean,
|
|
150
97
|
),
|
|
151
98
|
cv.Optional(CONF_USE_PSRAM, default=True): cv.boolean,
|
|
@@ -218,15 +165,6 @@ async def to_code(config):
|
|
|
218
165
|
cg.add(var.set_is_rgbw(config[CONF_IS_RGBW]))
|
|
219
166
|
cg.add(var.set_is_wrgb(config[CONF_IS_WRGB]))
|
|
220
167
|
cg.add(var.set_use_psram(config[CONF_USE_PSRAM]))
|
|
221
|
-
|
|
222
|
-
if
|
|
223
|
-
cg.add(var.
|
|
224
|
-
if CONF_USE_DMA in config:
|
|
225
|
-
cg.add(var.set_use_dma(config[CONF_USE_DMA]))
|
|
226
|
-
else:
|
|
227
|
-
rmt_channel_t = cg.global_ns.enum("rmt_channel_t")
|
|
228
|
-
cg.add(
|
|
229
|
-
var.set_rmt_channel(
|
|
230
|
-
getattr(rmt_channel_t, f"RMT_CHANNEL_{config[CONF_RMT_CHANNEL]}")
|
|
231
|
-
)
|
|
232
|
-
)
|
|
168
|
+
cg.add(var.set_rmt_symbols(config[CONF_RMT_SYMBOLS]))
|
|
169
|
+
if CONF_USE_DMA in config:
|
|
170
|
+
cg.add(var.set_use_dma(config[CONF_USE_DMA]))
|
|
@@ -9,10 +9,26 @@
|
|
|
9
9
|
#include <vector>
|
|
10
10
|
|
|
11
11
|
#include <driver/touch_sensor.h>
|
|
12
|
+
#include <freertos/FreeRTOS.h>
|
|
13
|
+
#include <freertos/queue.h>
|
|
12
14
|
|
|
13
15
|
namespace esphome {
|
|
14
16
|
namespace esp32_touch {
|
|
15
17
|
|
|
18
|
+
// IMPORTANT: Touch detection logic differs between ESP32 variants:
|
|
19
|
+
// - ESP32 v1 (original): Touch detected when value < threshold (capacitance increase causes value decrease)
|
|
20
|
+
// - ESP32-S2/S3 v2: Touch detected when value > threshold (capacitance increase causes value increase)
|
|
21
|
+
// This inversion is due to different hardware implementations between chip generations.
|
|
22
|
+
//
|
|
23
|
+
// INTERRUPT BEHAVIOR:
|
|
24
|
+
// - ESP32 v1: Interrupts fire when ANY pad is touched and continue while touched.
|
|
25
|
+
// Releases are detected by timeout since hardware doesn't generate release interrupts.
|
|
26
|
+
// - ESP32-S2/S3 v2: Hardware supports both touch and release interrupts, but release
|
|
27
|
+
// interrupts are unreliable and sometimes don't fire. We now only use touch interrupts
|
|
28
|
+
// and detect releases via timeout, similar to v1.
|
|
29
|
+
|
|
30
|
+
static const uint32_t SETUP_MODE_LOG_INTERVAL_MS = 250;
|
|
31
|
+
|
|
16
32
|
class ESP32TouchBinarySensor;
|
|
17
33
|
|
|
18
34
|
class ESP32TouchComponent : public Component {
|
|
@@ -31,6 +47,14 @@ class ESP32TouchComponent : public Component {
|
|
|
31
47
|
void set_voltage_attenuation(touch_volt_atten_t voltage_attenuation) {
|
|
32
48
|
this->voltage_attenuation_ = voltage_attenuation;
|
|
33
49
|
}
|
|
50
|
+
|
|
51
|
+
void setup() override;
|
|
52
|
+
void dump_config() override;
|
|
53
|
+
void loop() override;
|
|
54
|
+
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
55
|
+
|
|
56
|
+
void on_shutdown() override;
|
|
57
|
+
|
|
34
58
|
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
|
35
59
|
void set_filter_mode(touch_filter_mode_t filter_mode) { this->filter_mode_ = filter_mode; }
|
|
36
60
|
void set_debounce_count(uint32_t debounce_count) { this->debounce_count_ = debounce_count; }
|
|
@@ -47,64 +71,172 @@ class ESP32TouchComponent : public Component {
|
|
|
47
71
|
void set_iir_filter(uint32_t iir_filter) { this->iir_filter_ = iir_filter; }
|
|
48
72
|
#endif
|
|
49
73
|
|
|
50
|
-
uint32_t component_touch_pad_read(touch_pad_t tp);
|
|
51
|
-
|
|
52
|
-
void setup() override;
|
|
53
|
-
void dump_config() override;
|
|
54
|
-
void loop() override;
|
|
55
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
56
|
-
|
|
57
|
-
void on_shutdown() override;
|
|
58
|
-
|
|
59
74
|
protected:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
bool waterproof_configured_() const {
|
|
68
|
-
return (this->waterproof_guard_ring_pad_ != TOUCH_PAD_MAX) &&
|
|
69
|
-
(this->waterproof_shield_driver_ != TOUCH_PAD_SHIELD_DRV_MAX);
|
|
70
|
-
}
|
|
71
|
-
#else
|
|
72
|
-
bool iir_filter_enabled_() const { return this->iir_filter_ > 0; }
|
|
73
|
-
#endif
|
|
75
|
+
// Common helper methods
|
|
76
|
+
void dump_config_base_();
|
|
77
|
+
void dump_config_sensors_();
|
|
78
|
+
bool create_touch_queue_();
|
|
79
|
+
void cleanup_touch_queue_();
|
|
80
|
+
void configure_wakeup_pads_();
|
|
74
81
|
|
|
82
|
+
// Helper methods for loop() logic
|
|
83
|
+
void process_setup_mode_logging_(uint32_t now);
|
|
84
|
+
bool should_check_for_releases_(uint32_t now);
|
|
85
|
+
void publish_initial_state_if_needed_(ESP32TouchBinarySensor *child, uint32_t now);
|
|
86
|
+
void check_and_disable_loop_if_all_released_(size_t pads_off);
|
|
87
|
+
void calculate_release_timeout_();
|
|
88
|
+
|
|
89
|
+
// Common members
|
|
75
90
|
std::vector<ESP32TouchBinarySensor *> children_;
|
|
76
91
|
bool setup_mode_{false};
|
|
77
92
|
uint32_t setup_mode_last_log_print_{0};
|
|
78
|
-
|
|
93
|
+
uint32_t last_release_check_{0};
|
|
94
|
+
uint32_t release_timeout_ms_{1500};
|
|
95
|
+
uint32_t release_check_interval_ms_{50};
|
|
96
|
+
|
|
97
|
+
// Common configuration parameters
|
|
79
98
|
uint16_t sleep_cycle_{4095};
|
|
80
99
|
uint16_t meas_cycle_{65535};
|
|
81
100
|
touch_low_volt_t low_voltage_reference_{TOUCH_LVOLT_0V5};
|
|
82
101
|
touch_high_volt_t high_voltage_reference_{TOUCH_HVOLT_2V7};
|
|
83
102
|
touch_volt_atten_t voltage_attenuation_{TOUCH_HVOLT_ATTEN_0V};
|
|
84
|
-
|
|
103
|
+
|
|
104
|
+
// Common constants
|
|
105
|
+
static constexpr uint32_t MINIMUM_RELEASE_TIME_MS = 100;
|
|
106
|
+
|
|
107
|
+
// ==================== PLATFORM SPECIFIC ====================
|
|
108
|
+
|
|
109
|
+
#ifdef USE_ESP32_VARIANT_ESP32
|
|
110
|
+
// ESP32 v1 specific
|
|
111
|
+
|
|
112
|
+
static void touch_isr_handler(void *arg);
|
|
113
|
+
QueueHandle_t touch_queue_{nullptr};
|
|
114
|
+
|
|
115
|
+
private:
|
|
116
|
+
// Touch event structure for ESP32 v1
|
|
117
|
+
// Contains touch pad info, value, and touch state for queue communication
|
|
118
|
+
struct TouchPadEventV1 {
|
|
119
|
+
touch_pad_t pad;
|
|
120
|
+
uint32_t value;
|
|
121
|
+
bool is_touched;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
protected:
|
|
125
|
+
uint32_t iir_filter_{0};
|
|
126
|
+
|
|
127
|
+
bool iir_filter_enabled_() const { return this->iir_filter_ > 0; }
|
|
128
|
+
|
|
129
|
+
#elif defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
|
|
130
|
+
// ESP32-S2/S3 v2 specific
|
|
131
|
+
static void touch_isr_handler(void *arg);
|
|
132
|
+
QueueHandle_t touch_queue_{nullptr};
|
|
133
|
+
|
|
134
|
+
private:
|
|
135
|
+
// Touch event structure for ESP32 v2 (S2/S3)
|
|
136
|
+
// Contains touch pad and interrupt mask for queue communication
|
|
137
|
+
struct TouchPadEventV2 {
|
|
138
|
+
touch_pad_t pad;
|
|
139
|
+
uint32_t intr_mask;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
protected:
|
|
143
|
+
// Filter configuration
|
|
85
144
|
touch_filter_mode_t filter_mode_{TOUCH_PAD_FILTER_MAX};
|
|
86
145
|
uint32_t debounce_count_{0};
|
|
87
146
|
uint32_t noise_threshold_{0};
|
|
88
147
|
uint32_t jitter_step_{0};
|
|
89
148
|
touch_smooth_mode_t smooth_level_{TOUCH_PAD_SMOOTH_MAX};
|
|
149
|
+
|
|
150
|
+
// Denoise configuration
|
|
90
151
|
touch_pad_denoise_grade_t grade_{TOUCH_PAD_DENOISE_MAX};
|
|
91
152
|
touch_pad_denoise_cap_t cap_level_{TOUCH_PAD_DENOISE_CAP_MAX};
|
|
153
|
+
|
|
154
|
+
// Waterproof configuration
|
|
92
155
|
touch_pad_t waterproof_guard_ring_pad_{TOUCH_PAD_MAX};
|
|
93
156
|
touch_pad_shield_driver_t waterproof_shield_driver_{TOUCH_PAD_SHIELD_DRV_MAX};
|
|
94
|
-
|
|
95
|
-
|
|
157
|
+
|
|
158
|
+
bool filter_configured_() const {
|
|
159
|
+
return (this->filter_mode_ != TOUCH_PAD_FILTER_MAX) && (this->smooth_level_ != TOUCH_PAD_SMOOTH_MAX);
|
|
160
|
+
}
|
|
161
|
+
bool denoise_configured_() const {
|
|
162
|
+
return (this->grade_ != TOUCH_PAD_DENOISE_MAX) && (this->cap_level_ != TOUCH_PAD_DENOISE_CAP_MAX);
|
|
163
|
+
}
|
|
164
|
+
bool waterproof_configured_() const {
|
|
165
|
+
return (this->waterproof_guard_ring_pad_ != TOUCH_PAD_MAX) &&
|
|
166
|
+
(this->waterproof_shield_driver_ != TOUCH_PAD_SHIELD_DRV_MAX);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Helper method to read touch values - non-blocking operation
|
|
170
|
+
// Returns the current touch pad value using either filtered or raw reading
|
|
171
|
+
// based on the filter configuration
|
|
172
|
+
uint32_t read_touch_value(touch_pad_t pad) const;
|
|
173
|
+
|
|
174
|
+
// Helper to update touch state with a known state
|
|
175
|
+
void update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched);
|
|
176
|
+
|
|
177
|
+
// Helper to read touch value and update state for a given child
|
|
178
|
+
bool check_and_update_touch_state_(ESP32TouchBinarySensor *child);
|
|
96
179
|
#endif
|
|
180
|
+
|
|
181
|
+
// Helper functions for dump_config - common to both implementations
|
|
182
|
+
static const char *get_low_voltage_reference_str(touch_low_volt_t ref) {
|
|
183
|
+
switch (ref) {
|
|
184
|
+
case TOUCH_LVOLT_0V5:
|
|
185
|
+
return "0.5V";
|
|
186
|
+
case TOUCH_LVOLT_0V6:
|
|
187
|
+
return "0.6V";
|
|
188
|
+
case TOUCH_LVOLT_0V7:
|
|
189
|
+
return "0.7V";
|
|
190
|
+
case TOUCH_LVOLT_0V8:
|
|
191
|
+
return "0.8V";
|
|
192
|
+
default:
|
|
193
|
+
return "UNKNOWN";
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
static const char *get_high_voltage_reference_str(touch_high_volt_t ref) {
|
|
198
|
+
switch (ref) {
|
|
199
|
+
case TOUCH_HVOLT_2V4:
|
|
200
|
+
return "2.4V";
|
|
201
|
+
case TOUCH_HVOLT_2V5:
|
|
202
|
+
return "2.5V";
|
|
203
|
+
case TOUCH_HVOLT_2V6:
|
|
204
|
+
return "2.6V";
|
|
205
|
+
case TOUCH_HVOLT_2V7:
|
|
206
|
+
return "2.7V";
|
|
207
|
+
default:
|
|
208
|
+
return "UNKNOWN";
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
static const char *get_voltage_attenuation_str(touch_volt_atten_t atten) {
|
|
213
|
+
switch (atten) {
|
|
214
|
+
case TOUCH_HVOLT_ATTEN_1V5:
|
|
215
|
+
return "1.5V";
|
|
216
|
+
case TOUCH_HVOLT_ATTEN_1V:
|
|
217
|
+
return "1V";
|
|
218
|
+
case TOUCH_HVOLT_ATTEN_0V5:
|
|
219
|
+
return "0.5V";
|
|
220
|
+
case TOUCH_HVOLT_ATTEN_0V:
|
|
221
|
+
return "0V";
|
|
222
|
+
default:
|
|
223
|
+
return "UNKNOWN";
|
|
224
|
+
}
|
|
225
|
+
}
|
|
97
226
|
};
|
|
98
227
|
|
|
99
228
|
/// Simple helper class to expose a touch pad value as a binary sensor.
|
|
100
229
|
class ESP32TouchBinarySensor : public binary_sensor::BinarySensor {
|
|
101
230
|
public:
|
|
102
|
-
ESP32TouchBinarySensor(touch_pad_t touch_pad, uint32_t threshold, uint32_t wakeup_threshold)
|
|
231
|
+
ESP32TouchBinarySensor(touch_pad_t touch_pad, uint32_t threshold, uint32_t wakeup_threshold)
|
|
232
|
+
: touch_pad_(touch_pad), threshold_(threshold), wakeup_threshold_(wakeup_threshold) {}
|
|
103
233
|
|
|
104
234
|
touch_pad_t get_touch_pad() const { return this->touch_pad_; }
|
|
105
235
|
uint32_t get_threshold() const { return this->threshold_; }
|
|
106
236
|
void set_threshold(uint32_t threshold) { this->threshold_ = threshold; }
|
|
237
|
+
#ifdef USE_ESP32_VARIANT_ESP32
|
|
107
238
|
uint32_t get_value() const { return this->value_; }
|
|
239
|
+
#endif
|
|
108
240
|
uint32_t get_wakeup_threshold() const { return this->wakeup_threshold_; }
|
|
109
241
|
|
|
110
242
|
protected:
|
|
@@ -112,8 +244,22 @@ class ESP32TouchBinarySensor : public binary_sensor::BinarySensor {
|
|
|
112
244
|
|
|
113
245
|
touch_pad_t touch_pad_{TOUCH_PAD_MAX};
|
|
114
246
|
uint32_t threshold_{0};
|
|
247
|
+
uint32_t benchmark_{};
|
|
248
|
+
#ifdef USE_ESP32_VARIANT_ESP32
|
|
115
249
|
uint32_t value_{0};
|
|
250
|
+
#endif
|
|
251
|
+
bool last_state_{false};
|
|
116
252
|
const uint32_t wakeup_threshold_{0};
|
|
253
|
+
|
|
254
|
+
// Track last touch time for timeout-based release detection
|
|
255
|
+
// Design note: last_touch_time_ does not require synchronization primitives because:
|
|
256
|
+
// 1. ESP32 guarantees atomic 32-bit aligned reads/writes
|
|
257
|
+
// 2. ISR only writes timestamps, main loop only reads
|
|
258
|
+
// 3. Timing tolerance allows for occasional stale reads (50ms check interval)
|
|
259
|
+
// 4. Queue operations provide implicit memory barriers
|
|
260
|
+
// Using atomic/critical sections would add overhead without meaningful benefit
|
|
261
|
+
uint32_t last_touch_time_{};
|
|
262
|
+
bool initial_state_published_{};
|
|
117
263
|
};
|
|
118
264
|
|
|
119
265
|
} // namespace esp32_touch
|