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.
Files changed (606) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +57 -21
  22. esphome/components/api/api_connection.cpp +344 -539
  23. esphome/components/api/api_connection.h +224 -141
  24. esphome/components/api/api_frame_helper.cpp +91 -127
  25. esphome/components/api/api_frame_helper.h +64 -54
  26. esphome/components/api/api_pb2.cpp +1837 -9044
  27. esphome/components/api/api_pb2.h +532 -685
  28. esphome/components/api/api_pb2_dump.cpp +4432 -0
  29. esphome/components/api/api_pb2_service.cpp +184 -425
  30. esphome/components/api/api_pb2_service.h +13 -6
  31. esphome/components/api/api_server.cpp +131 -167
  32. esphome/components/api/api_server.h +38 -10
  33. esphome/components/api/client.py +8 -2
  34. esphome/components/api/custom_api_device.h +8 -0
  35. esphome/components/api/list_entities.cpp +37 -104
  36. esphome/components/api/list_entities.h +33 -23
  37. esphome/components/api/proto.h +532 -26
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/api/user_services.h +2 -0
  41. esphome/components/as5600/as5600.h +0 -1
  42. esphome/components/async_tcp/__init__.py +14 -5
  43. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  44. esphome/components/atm90e32/atm90e32.cpp +2 -1
  45. esphome/components/audio/audio_decoder.cpp +1 -1
  46. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  47. esphome/components/b_parasite/b_parasite.h +0 -1
  48. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  49. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  50. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  51. esphome/components/bh1750/bh1750.cpp +5 -5
  52. esphome/components/binary_sensor/__init__.py +82 -5
  53. esphome/components/binary_sensor/automation.h +19 -1
  54. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  55. esphome/components/binary_sensor/binary_sensor.h +11 -25
  56. esphome/components/binary_sensor/filter.cpp +29 -24
  57. esphome/components/binary_sensor/filter.h +20 -10
  58. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  60. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  61. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  62. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  63. esphome/components/ble_client/switch/ble_switch.h +0 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  65. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  66. esphome/components/ble_presence/ble_presence_device.h +0 -1
  67. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  68. esphome/components/ble_scanner/ble_scanner.h +0 -1
  69. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  71. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  72. esphome/components/bme680/sensor.py +1 -1
  73. esphome/components/bmp581/bmp581.h +0 -2
  74. esphome/components/button/__init__.py +5 -2
  75. esphome/components/camera/__init__.py +1 -0
  76. esphome/components/camera/camera.cpp +22 -0
  77. esphome/components/camera/camera.h +80 -0
  78. esphome/components/canbus/__init__.py +1 -0
  79. esphome/components/cap1188/cap1188.h +0 -1
  80. esphome/components/captive_portal/__init__.py +12 -2
  81. esphome/components/captive_portal/captive_portal.cpp +12 -2
  82. esphome/components/captive_portal/captive_portal.h +5 -2
  83. esphome/components/ccs811/ccs811.h +0 -2
  84. esphome/components/climate/__init__.py +5 -2
  85. esphome/components/cm1106/sensor.py +2 -2
  86. esphome/components/const/__init__.py +2 -0
  87. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  88. esphome/components/copy/button/copy_button.h +0 -1
  89. esphome/components/copy/cover/copy_cover.h +0 -1
  90. esphome/components/copy/fan/copy_fan.h +0 -1
  91. esphome/components/copy/lock/copy_lock.h +0 -1
  92. esphome/components/copy/number/copy_number.h +0 -1
  93. esphome/components/copy/select/copy_select.h +0 -1
  94. esphome/components/copy/sensor/copy_sensor.h +0 -1
  95. esphome/components/copy/switch/copy_switch.h +0 -1
  96. esphome/components/copy/text/copy_text.h +0 -1
  97. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  98. esphome/components/cover/__init__.py +5 -2
  99. esphome/components/cs5460a/cs5460a.h +0 -1
  100. esphome/components/datetime/__init__.py +4 -2
  101. esphome/components/debug/__init__.py +20 -0
  102. esphome/components/debug/debug_esp32.cpp +2 -0
  103. esphome/components/deep_sleep/__init__.py +43 -9
  104. esphome/components/demo/__init__.py +2 -2
  105. esphome/components/display/display.cpp +4 -3
  106. esphome/components/display/display.h +0 -2
  107. esphome/components/display/display_buffer.cpp +1 -1
  108. esphome/components/ds2484/__init__.py +1 -0
  109. esphome/components/ds2484/ds2484.cpp +209 -0
  110. esphome/components/ds2484/ds2484.h +43 -0
  111. esphome/components/ds2484/one_wire.py +37 -0
  112. esphome/components/duty_time/duty_time_sensor.h +0 -1
  113. esphome/components/ens160_base/ens160_base.h +0 -1
  114. esphome/components/es7210/es7210.h +0 -1
  115. esphome/components/es7243e/es7243e.h +0 -1
  116. esphome/components/es8156/es8156.h +0 -1
  117. esphome/components/es8311/es8311.h +0 -1
  118. esphome/components/es8388/es8388.h +0 -1
  119. esphome/components/esp32/__init__.py +103 -135
  120. esphome/components/esp32/core.cpp +0 -4
  121. esphome/components/esp32/gpio.h +1 -1
  122. esphome/components/esp32/helpers.cpp +69 -0
  123. esphome/components/esp32_ble/ble.cpp +5 -6
  124. esphome/components/esp32_ble/ble.h +29 -14
  125. esphome/components/esp32_ble/ble_event.h +6 -6
  126. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  127. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  128. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  129. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  130. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  131. esphome/components/esp32_camera/__init__.py +112 -98
  132. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  133. esphome/components/esp32_camera/esp32_camera.h +35 -30
  134. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  135. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  136. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  137. esphome/components/esp32_hall/sensor.py +2 -21
  138. esphome/components/esp32_hosted/__init__.py +101 -0
  139. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  140. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  141. esphome/components/esp32_rmt/__init__.py +0 -58
  142. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  143. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  144. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  145. esphome/components/esp32_touch/esp32_touch.h +174 -28
  146. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  147. esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
  148. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  149. esphome/components/esp8266/__init__.py +2 -0
  150. esphome/components/esp8266/gpio.cpp +10 -10
  151. esphome/components/esp8266/helpers.cpp +31 -0
  152. esphome/components/esphome/ota/__init__.py +1 -0
  153. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  154. esphome/components/ethernet/__init__.py +42 -23
  155. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  156. esphome/components/ethernet/ethernet_component.cpp +69 -29
  157. esphome/components/ethernet/ethernet_component.h +18 -10
  158. esphome/components/event/__init__.py +5 -2
  159. esphome/components/ezo/ezo.h +0 -1
  160. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  161. esphome/components/fan/__init__.py +5 -2
  162. esphome/components/feedback/feedback_cover.h +0 -1
  163. esphome/components/font/__init__.py +92 -82
  164. esphome/components/font/font.cpp +9 -2
  165. esphome/components/font/font.h +20 -5
  166. esphome/components/fs3000/fs3000.h +0 -1
  167. esphome/components/gcja5/gcja5.h +0 -1
  168. esphome/components/gl_r01_i2c/__init__.py +0 -0
  169. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  170. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  171. esphome/components/gl_r01_i2c/sensor.py +36 -0
  172. esphome/components/gp8403/gp8403.h +0 -1
  173. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  174. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  175. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  176. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  177. esphome/components/he60r/he60r.h +0 -1
  178. esphome/components/heatpumpir/climate.py +2 -1
  179. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  180. esphome/components/heatpumpir/heatpumpir.h +1 -0
  181. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  182. esphome/components/host/__init__.py +3 -1
  183. esphome/components/host/helpers.cpp +57 -0
  184. esphome/components/http_request/__init__.py +19 -1
  185. esphome/components/http_request/http_request.h +1 -1
  186. esphome/components/http_request/http_request_arduino.h +1 -0
  187. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  188. esphome/components/http_request/update/http_request_update.cpp +28 -9
  189. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  190. esphome/components/hydreon_rgxx/sensor.py +1 -1
  191. esphome/components/i2c/__init__.py +23 -11
  192. esphome/components/i2c/i2c_bus.h +8 -1
  193. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  194. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  195. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  196. esphome/components/i2c_device/i2c_device.h +0 -1
  197. esphome/components/i2s_audio/__init__.py +2 -10
  198. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  199. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  200. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  201. esphome/components/iaqcore/iaqcore.h +0 -2
  202. esphome/components/image/__init__.py +123 -24
  203. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  204. esphome/components/ina219/ina219.cpp +7 -0
  205. esphome/components/ina219/ina219.h +1 -0
  206. esphome/components/ina260/ina260.h +0 -2
  207. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  208. esphome/components/inkplate6/display.py +15 -0
  209. esphome/components/inkplate6/inkplate.cpp +2 -2
  210. esphome/components/integration/integration_sensor.h +0 -1
  211. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  212. esphome/components/internal_temperature/sensor.py +0 -26
  213. esphome/components/interval/interval.h +0 -2
  214. esphome/components/ld2410/button/__init__.py +3 -3
  215. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  216. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  217. esphome/components/ld2410/ld2410.cpp +421 -268
  218. esphome/components/ld2410/ld2410.h +44 -146
  219. esphome/components/ld2410/number/__init__.py +2 -2
  220. esphome/components/ld2410/sensor.py +1 -1
  221. esphome/components/ld2410/switch/__init__.py +1 -1
  222. esphome/components/ld2420/ld2420.cpp +196 -100
  223. esphome/components/ld2420/ld2420.h +46 -118
  224. esphome/components/ld2420/number/__init__.py +2 -2
  225. esphome/components/ld2420/sensor/__init__.py +6 -2
  226. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  227. esphome/components/ld2450/button/__init__.py +3 -3
  228. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  229. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  230. esphome/components/ld2450/ld2450.cpp +384 -232
  231. esphome/components/ld2450/ld2450.h +60 -69
  232. esphome/components/ld2450/switch/__init__.py +1 -1
  233. esphome/components/ledc/ledc_output.cpp +1 -63
  234. esphome/components/libretiny/__init__.py +5 -3
  235. esphome/components/libretiny/const.py +5 -0
  236. esphome/components/libretiny/generate_components.py +1 -0
  237. esphome/components/libretiny/helpers.cpp +35 -0
  238. esphome/components/libretiny/lt_component.cpp +5 -3
  239. esphome/components/light/__init__.py +4 -2
  240. esphome/components/light/addressable_light.h +3 -3
  241. esphome/components/light/light_call.cpp +180 -243
  242. esphome/components/light/light_call.h +72 -20
  243. esphome/components/light/light_color_values.h +14 -14
  244. esphome/components/light/light_state.h +15 -13
  245. esphome/components/light/transformers.h +2 -2
  246. esphome/components/ln882x/__init__.py +52 -0
  247. esphome/components/ln882x/boards.py +285 -0
  248. esphome/components/lock/__init__.py +5 -2
  249. esphome/components/logger/__init__.py +40 -3
  250. esphome/components/logger/logger.cpp +47 -12
  251. esphome/components/logger/logger.h +80 -49
  252. esphome/components/logger/logger_esp32.cpp +3 -3
  253. esphome/components/lps22/__init__.py +0 -0
  254. esphome/components/lps22/lps22.cpp +75 -0
  255. esphome/components/lps22/lps22.h +27 -0
  256. esphome/components/lps22/sensor.py +58 -0
  257. esphome/components/ltr390/ltr390.h +0 -1
  258. esphome/components/ltr501/ltr501.h +0 -1
  259. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  260. esphome/components/lvgl/__init__.py +1 -1
  261. esphome/components/lvgl/schemas.py +66 -6
  262. esphome/components/lvgl/styles.py +24 -16
  263. esphome/components/lvgl/widgets/__init__.py +12 -2
  264. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  265. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  266. esphome/components/max9611/max9611.h +0 -1
  267. esphome/components/mcp23016/__init__.py +1 -1
  268. esphome/components/mcp23xxx_base/__init__.py +1 -1
  269. esphome/components/mcp4461/__init__.py +1 -1
  270. esphome/components/mcp4461/output/__init__.py +3 -2
  271. esphome/components/mcp9600/mcp9600.h +0 -2
  272. esphome/components/md5/md5.cpp +3 -3
  273. esphome/components/md5/md5.h +1 -6
  274. esphome/components/mdns/__init__.py +22 -11
  275. esphome/components/media_player/__init__.py +4 -3
  276. esphome/components/micro_wake_word/__init__.py +1 -5
  277. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  278. esphome/components/microphone/microphone.cpp +7 -9
  279. esphome/components/microphone/microphone.h +0 -2
  280. esphome/components/mipi_spi/display.py +1 -0
  281. esphome/components/mmc5603/mmc5603.cpp +1 -1
  282. esphome/components/modbus/modbus.cpp +33 -15
  283. esphome/components/modbus/modbus.h +9 -0
  284. esphome/components/modbus_controller/__init__.py +42 -10
  285. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  286. esphome/components/modbus_controller/modbus_controller.h +61 -7
  287. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  288. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  289. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  290. esphome/components/mqtt/__init__.py +16 -0
  291. esphome/components/mqtt/mqtt_backend.h +2 -1
  292. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  293. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  294. esphome/components/mqtt/mqtt_client.cpp +15 -9
  295. esphome/components/mqtt/mqtt_client.h +8 -3
  296. esphome/components/ms8607/ms8607.h +0 -1
  297. esphome/components/neopixelbus/light.py +4 -1
  298. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  299. esphome/components/network/__init__.py +4 -1
  300. esphome/components/network/ip_address.h +1 -0
  301. esphome/components/nextion/__init__.py +16 -0
  302. esphome/components/nextion/base_component.py +1 -0
  303. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  304. esphome/components/nextion/display.py +14 -4
  305. esphome/components/nextion/nextion.cpp +166 -101
  306. esphome/components/nextion/nextion.h +84 -53
  307. esphome/components/nextion/nextion_commands.cpp +11 -10
  308. esphome/components/nextion/nextion_component.cpp +28 -28
  309. esphome/components/nextion/nextion_component.h +53 -18
  310. esphome/components/nextion/nextion_component_base.h +3 -0
  311. esphome/components/nextion/nextion_upload.cpp +36 -0
  312. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  313. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  314. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  315. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  316. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  317. esphome/components/nfc/nfc.cpp +3 -22
  318. esphome/components/nfc/nfc.h +3 -3
  319. esphome/components/number/__init__.py +5 -2
  320. esphome/components/online_image/__init__.py +5 -0
  321. esphome/components/online_image/online_image.cpp +6 -2
  322. esphome/components/online_image/online_image.h +4 -1
  323. esphome/components/opentherm/opentherm.cpp +7 -12
  324. esphome/components/openthread/__init__.py +47 -40
  325. esphome/components/openthread/const.py +1 -0
  326. esphome/components/openthread/openthread_esp.cpp +27 -5
  327. esphome/components/opt3001/__init__.py +0 -0
  328. esphome/components/opt3001/opt3001.cpp +122 -0
  329. esphome/components/opt3001/opt3001.h +27 -0
  330. esphome/components/opt3001/sensor.py +35 -0
  331. esphome/components/ota/__init__.py +17 -0
  332. esphome/components/ota/ota_backend.h +27 -1
  333. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  334. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  336. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  338. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  339. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  340. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  341. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  342. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  343. esphome/components/packages/__init__.py +5 -2
  344. esphome/components/packet_transport/binary_sensor.py +61 -4
  345. esphome/components/packet_transport/packet_transport.cpp +34 -1
  346. esphome/components/packet_transport/packet_transport.h +11 -5
  347. esphome/components/pcf8574/__init__.py +1 -1
  348. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  349. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  350. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  351. esphome/components/pmsa003i/pmsa003i.h +0 -1
  352. esphome/components/pmsx003/pmsx003.h +0 -1
  353. esphome/components/pn7150/pn7150.cpp +7 -7
  354. esphome/components/pn7150/pn7150.h +0 -1
  355. esphome/components/pn7160/pn7160.cpp +7 -7
  356. esphome/components/pn7160/pn7160.h +0 -1
  357. esphome/components/preferences/syncer.h +2 -0
  358. esphome/components/prometheus/prometheus_handler.h +1 -1
  359. esphome/components/psram/psram.cpp +0 -20
  360. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  361. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  362. esphome/components/pulse_width/pulse_width.h +0 -1
  363. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  364. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  365. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  366. esphome/components/qr_code/__init__.py +13 -10
  367. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  368. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  369. esphome/components/rc522/rc522.h +0 -1
  370. esphome/components/rdm6300/rdm6300.h +0 -2
  371. esphome/components/remote_base/__init__.py +7 -5
  372. esphome/components/remote_base/remote_base.cpp +24 -21
  373. esphome/components/remote_base/remote_base.h +3 -26
  374. esphome/components/remote_receiver/__init__.py +40 -46
  375. esphome/components/remote_receiver/remote_receiver.h +4 -18
  376. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  377. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  378. esphome/components/remote_transmitter/__init__.py +42 -43
  379. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  380. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  381. esphome/components/resistance/resistance_sensor.h +0 -1
  382. esphome/components/rp2040/__init__.py +2 -0
  383. esphome/components/rp2040/helpers.cpp +55 -0
  384. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  385. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  386. esphome/components/rtttl/__init__.py +4 -4
  387. esphome/components/rtttl/rtttl.cpp +10 -1
  388. esphome/components/ruuvitag/ruuvitag.h +0 -1
  389. esphome/components/safe_mode/safe_mode.cpp +2 -0
  390. esphome/components/safe_mode/safe_mode.h +4 -1
  391. esphome/components/scd30/scd30.h +0 -1
  392. esphome/components/scd30/sensor.py +2 -2
  393. esphome/components/scd4x/scd4x.cpp +61 -54
  394. esphome/components/scd4x/scd4x.h +17 -15
  395. esphome/components/scd4x/sensor.py +4 -4
  396. esphome/components/script/script.h +0 -2
  397. esphome/components/sdp3x/sensor.py +1 -1
  398. esphome/components/select/__init__.py +5 -2
  399. esphome/components/sen5x/sen5x.h +0 -1
  400. esphome/components/senseair/senseair.h +0 -1
  401. esphome/components/sensor/__init__.py +4 -2
  402. esphome/components/sensor/filter.cpp +1 -1
  403. esphome/components/sensor/sensor.cpp +12 -6
  404. esphome/components/sensor/sensor.h +13 -5
  405. esphome/components/servo/servo.h +0 -1
  406. esphome/components/sfa30/sfa30.h +0 -1
  407. esphome/components/sgp30/sgp30.h +0 -1
  408. esphome/components/sgp4x/sgp4x.h +0 -1
  409. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  410. esphome/components/sht4x/sht4x.h +0 -1
  411. esphome/components/sm300d2/sm300d2.h +0 -2
  412. esphome/components/smt100/sensor.py +8 -4
  413. esphome/components/smt100/smt100.cpp +5 -5
  414. esphome/components/smt100/smt100.h +3 -3
  415. esphome/components/sn74hc595/__init__.py +1 -1
  416. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  417. esphome/components/sntp/sntp_component.cpp +9 -3
  418. esphome/components/sntp/time.py +2 -0
  419. esphome/components/socket/__init__.py +17 -0
  420. esphome/components/spi/__init__.py +27 -6
  421. esphome/components/spi/spi.cpp +3 -2
  422. esphome/components/spi/spi.h +9 -3
  423. esphome/components/spi/spi_arduino.cpp +3 -5
  424. esphome/components/spi/spi_esp_idf.cpp +40 -21
  425. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  426. esphome/components/sps30/sps30.h +0 -1
  427. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  428. esphome/components/st7701s/st7701s.cpp +0 -4
  429. esphome/components/status/status_binary_sensor.h +0 -2
  430. esphome/components/substitutions/__init__.py +76 -19
  431. esphome/components/substitutions/jinja.py +99 -0
  432. esphome/components/sun/sun.cpp +3 -4
  433. esphome/components/switch/__init__.py +5 -2
  434. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  435. esphome/components/sx126x/__init__.py +317 -0
  436. esphome/components/sx126x/automation.h +62 -0
  437. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  438. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  439. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  440. esphome/components/sx126x/sx126x.cpp +523 -0
  441. esphome/components/sx126x/sx126x.h +140 -0
  442. esphome/components/sx126x/sx126x_reg.h +163 -0
  443. esphome/components/sx127x/__init__.py +325 -0
  444. esphome/components/sx127x/automation.h +62 -0
  445. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  446. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  447. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  448. esphome/components/sx127x/sx127x.cpp +498 -0
  449. esphome/components/sx127x/sx127x.h +128 -0
  450. esphome/components/sx127x/sx127x_reg.h +295 -0
  451. esphome/components/syslog/esphome_syslog.cpp +5 -3
  452. esphome/components/syslog/esphome_syslog.h +1 -1
  453. esphome/components/tca9555/__init__.py +1 -1
  454. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  455. esphome/components/text/__init__.py +5 -2
  456. esphome/components/text_sensor/__init__.py +5 -2
  457. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  458. esphome/components/thermostat/thermostat_climate.h +43 -39
  459. esphome/components/time/__init__.py +16 -2
  460. esphome/components/time/real_time_clock.cpp +4 -0
  461. esphome/components/time/real_time_clock.h +5 -1
  462. esphome/components/tlc5971/tlc5971.cpp +4 -1
  463. esphome/components/tmp1075/tmp1075.h +0 -2
  464. esphome/components/tof10120/tof10120_sensor.h +0 -1
  465. esphome/components/tormatic/tormatic_cover.h +0 -1
  466. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  467. esphome/components/tsl2591/tsl2591.cpp +1 -1
  468. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  469. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  470. esphome/components/tx20/tx20.cpp +2 -2
  471. esphome/components/uart/__init__.py +18 -0
  472. esphome/components/uart/uart_component_esp_idf.cpp +0 -4
  473. esphome/components/update/__init__.py +5 -2
  474. esphome/components/update/update_entity.h +8 -0
  475. esphome/components/usb_host/__init__.py +5 -2
  476. esphome/components/usb_host/usb_host_client.cpp +10 -10
  477. esphome/components/usb_uart/cp210x.cpp +1 -1
  478. esphome/components/usb_uart/usb_uart.cpp +41 -44
  479. esphome/components/usb_uart/usb_uart.h +4 -3
  480. esphome/components/valve/__init__.py +5 -2
  481. esphome/components/vbus/vbus.h +0 -1
  482. esphome/components/veml3235/veml3235.h +0 -1
  483. esphome/components/veml7700/veml7700.h +0 -1
  484. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  485. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  486. esphome/components/watchdog/watchdog.cpp +0 -4
  487. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  488. esphome/components/web_server/__init__.py +34 -19
  489. esphome/components/web_server/ota/__init__.py +32 -0
  490. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  491. esphome/components/web_server/ota/ota_web_server.h +26 -0
  492. esphome/components/web_server/web_server.cpp +305 -427
  493. esphome/components/web_server/web_server.h +33 -23
  494. esphome/components/web_server/web_server_v1.cpp +4 -5
  495. esphome/components/web_server_base/__init__.py +5 -2
  496. esphome/components/web_server_base/web_server_base.cpp +2 -94
  497. esphome/components/web_server_base/web_server_base.h +5 -25
  498. esphome/components/web_server_idf/multipart.cpp +254 -0
  499. esphome/components/web_server_idf/multipart.h +86 -0
  500. esphome/components/web_server_idf/utils.cpp +32 -0
  501. esphome/components/web_server_idf/utils.h +10 -0
  502. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  503. esphome/components/web_server_idf/web_server_idf.h +11 -10
  504. esphome/components/wiegand/wiegand.cpp +2 -2
  505. esphome/components/wifi/__init__.py +18 -0
  506. esphome/components/wifi/wifi_component.cpp +17 -22
  507. esphome/components/wifi/wifi_component.h +27 -23
  508. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  509. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  510. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  511. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  512. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  513. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  514. esphome/components/wireguard/__init__.py +2 -11
  515. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  516. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  517. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  518. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  519. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  520. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  521. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  522. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  523. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  524. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  525. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  526. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  527. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  528. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  529. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  530. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  531. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  532. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  533. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  534. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  535. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  536. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  537. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  538. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  539. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  540. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  541. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  542. esphome/components/zyaura/zyaura.h +0 -1
  543. esphome/config.py +88 -22
  544. esphome/config_helpers.py +74 -1
  545. esphome/config_validation.py +12 -1
  546. esphome/const.py +65 -10
  547. esphome/core/__init__.py +18 -2
  548. esphome/core/application.cpp +163 -10
  549. esphome/core/application.h +145 -165
  550. esphome/core/area.h +19 -0
  551. esphome/core/automation.h +58 -9
  552. esphome/core/color.cpp +3 -5
  553. esphome/core/color.h +16 -16
  554. esphome/core/component.cpp +151 -18
  555. esphome/core/component.h +98 -4
  556. esphome/core/component_iterator.cpp +11 -9
  557. esphome/core/component_iterator.h +12 -10
  558. esphome/core/config.py +155 -6
  559. esphome/core/controller.cpp +4 -2
  560. esphome/core/controller.h +1 -1
  561. esphome/core/datatypes.h +2 -2
  562. esphome/core/defines.h +17 -2
  563. esphome/core/device.h +20 -0
  564. esphome/core/entity_base.cpp +20 -15
  565. esphome/core/entity_base.h +76 -0
  566. esphome/core/entity_helpers.py +168 -1
  567. esphome/core/event_pool.h +81 -0
  568. esphome/core/helpers.cpp +75 -230
  569. esphome/core/helpers.h +164 -104
  570. esphome/core/lock_free_queue.h +151 -0
  571. esphome/core/log.cpp +2 -2
  572. esphome/core/log.h +2 -0
  573. esphome/core/optional.h +5 -0
  574. esphome/core/ring_buffer.cpp +2 -2
  575. esphome/core/scheduler.cpp +275 -103
  576. esphome/core/scheduler.h +154 -17
  577. esphome/core/time.cpp +5 -5
  578. esphome/core/time.h +5 -5
  579. esphome/cpp_generator.py +17 -0
  580. esphome/cpp_helpers.py +0 -22
  581. esphome/cpp_types.py +3 -1
  582. esphome/dashboard/entries.py +1 -1
  583. esphome/dashboard/util/text.py +5 -21
  584. esphome/dashboard/web_server.py +9 -1
  585. esphome/helpers.py +47 -0
  586. esphome/loader.py +15 -1
  587. esphome/pins.py +14 -8
  588. esphome/wizard.py +17 -4
  589. esphome/writer.py +21 -3
  590. esphome/yaml_util.py +0 -2
  591. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/METADATA +10 -9
  592. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/RECORD +597 -538
  593. esphome/components/api/api_pb2_size.h +0 -361
  594. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  595. esphome/components/esp32_ble/queue.h +0 -85
  596. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  597. esphome/components/esp32_hall/esp32_hall.h +0 -23
  598. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  599. esphome/components/ld2410/button/reset_button.cpp +0 -9
  600. esphome/components/ld2450/button/reset_button.cpp +0 -9
  601. esphome/components/openthread/tlv.py +0 -65
  602. /esphome/{dashboard/enum.py → enum.py} +0 -0
  603. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/WHEEL +0 -0
  604. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/entry_points.txt +0 -0
  605. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/licenses/LICENSE +0 -0
  606. {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 ESP_IDF_VERSION_MAJOR >= 5
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->bit0_.duration0 = (uint32_t) (ratio * bit0_high);
120
- this->bit0_.level0 = 1;
121
- this->bit0_.duration1 = (uint32_t) (ratio * bit0_low);
122
- this->bit0_.level1 = 0;
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->bit1_.duration0 = (uint32_t) (ratio * bit1_high);
125
- this->bit1_.level0 = 1;
126
- this->bit1_.duration1 = (uint32_t) (ratio * bit1_low);
127
- this->bit1_.level1 = 0;
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->reset_.duration0 = (uint32_t) (ratio * reset_time_high);
130
- this->reset_.level0 = 1;
131
- this->reset_.duration1 = (uint32_t) (ratio * reset_time_low);
132
- this->reset_.level1 = 0;
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->bit1_.val : this->bit0_.val;
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->reset_.duration0 > 0 || this->reset_.duration1 > 0) {
182
- pdest->val = this->reset_.val;
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
- config.loop_count = 0;
191
- config.flags.eot_level = 0;
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 = rmt_write_items(this->channel_, this->rmt_buf_, len, false);
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
- #if ESP_IDF_VERSION_MAJOR >= 5
81
+ LedParams params_;
85
82
  rmt_channel_handle_t channel_{nullptr};
86
83
  rmt_encoder_handle_t encoder_{nullptr};
87
- rmt_symbol_word_t *rmt_buf_{nullptr};
88
- rmt_symbol_word_t bit0_, bit1_, reset_;
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
- rmt_item32_t *rmt_buf_{nullptr};
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, esp32_rmt, light
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.Optional(CONF_RMT_CHANNEL): cv.All(
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
- esp32_idf=192,
132
- esp32_s2_idf=192,
133
- esp32_s3_idf=192,
134
- esp32_p4_idf=192,
135
- esp32_c3_idf=96,
136
- esp32_c5_idf=96,
137
- esp32_c6_idf=96,
138
- esp32_h2_idf=96,
139
- ): cv.All(only_with_new_rmt_driver, cv.int_range(min=2)),
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 esp32_rmt.use_new_rmt_driver():
223
- cg.add(var.set_rmt_symbols(config[CONF_RMT_SYMBOLS]))
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
- #if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
61
- bool filter_configured_() const {
62
- return (this->filter_mode_ != TOUCH_PAD_FILTER_MAX) && (this->smooth_level_ != TOUCH_PAD_SMOOTH_MAX);
63
- }
64
- bool denoise_configured_() const {
65
- return (this->grade_ != TOUCH_PAD_DENOISE_MAX) && (this->cap_level_ != TOUCH_PAD_DENOISE_CAP_MAX);
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
- // common parameters
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
- #if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
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
- #else
95
- uint32_t iir_filter_{0};
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