esphome 2025.6.2__py3-none-any.whl → 2025.7.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) 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 +42 -20
  22. esphome/components/api/api_connection.cpp +318 -391
  23. esphome/components/api/api_connection.h +206 -126
  24. esphome/components/api/api_frame_helper.cpp +89 -124
  25. esphome/components/api/api_frame_helper.h +57 -45
  26. esphome/components/api/api_pb2.cpp +414 -4350
  27. esphome/components/api/api_pb2.h +287 -198
  28. esphome/components/api/api_pb2_dump.cpp +4333 -0
  29. esphome/components/api/api_pb2_service.cpp +180 -425
  30. esphome/components/api/api_pb2_service.h +7 -6
  31. esphome/components/api/api_pb2_size.h +2 -4
  32. esphome/components/api/api_server.cpp +138 -167
  33. esphome/components/api/api_server.h +66 -12
  34. esphome/components/api/client.py +10 -4
  35. esphome/components/api/list_entities.cpp +36 -105
  36. esphome/components/api/list_entities.h +31 -23
  37. esphome/components/api/proto.h +26 -3
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/as5600/as5600.h +0 -1
  41. esphome/components/async_tcp/__init__.py +14 -5
  42. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  43. esphome/components/atm90e32/atm90e32.cpp +2 -1
  44. esphome/components/audio/audio_decoder.cpp +1 -1
  45. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  46. esphome/components/b_parasite/b_parasite.h +0 -1
  47. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  48. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  49. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  50. esphome/components/bh1750/bh1750.cpp +5 -5
  51. esphome/components/binary_sensor/__init__.py +82 -5
  52. esphome/components/binary_sensor/automation.h +19 -1
  53. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  54. esphome/components/binary_sensor/binary_sensor.h +11 -25
  55. esphome/components/binary_sensor/filter.cpp +29 -24
  56. esphome/components/binary_sensor/filter.h +20 -10
  57. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  58. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  60. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  62. esphome/components/ble_client/switch/ble_switch.h +0 -1
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  65. esphome/components/ble_presence/ble_presence_device.h +0 -1
  66. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  67. esphome/components/ble_scanner/ble_scanner.h +0 -1
  68. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  69. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  71. esphome/components/bme680/sensor.py +1 -1
  72. esphome/components/bmp581/bmp581.h +0 -2
  73. esphome/components/button/__init__.py +5 -2
  74. esphome/components/camera/__init__.py +1 -0
  75. esphome/components/camera/camera.cpp +22 -0
  76. esphome/components/camera/camera.h +80 -0
  77. esphome/components/canbus/__init__.py +1 -0
  78. esphome/components/cap1188/cap1188.h +0 -1
  79. esphome/components/captive_portal/__init__.py +12 -2
  80. esphome/components/captive_portal/captive_portal.cpp +12 -2
  81. esphome/components/captive_portal/captive_portal.h +5 -2
  82. esphome/components/ccs811/ccs811.h +0 -2
  83. esphome/components/climate/__init__.py +5 -2
  84. esphome/components/cm1106/sensor.py +2 -2
  85. esphome/components/const/__init__.py +2 -0
  86. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  87. esphome/components/copy/button/copy_button.h +0 -1
  88. esphome/components/copy/cover/copy_cover.h +0 -1
  89. esphome/components/copy/fan/copy_fan.h +0 -1
  90. esphome/components/copy/lock/copy_lock.h +0 -1
  91. esphome/components/copy/number/copy_number.h +0 -1
  92. esphome/components/copy/select/copy_select.h +0 -1
  93. esphome/components/copy/sensor/copy_sensor.h +0 -1
  94. esphome/components/copy/switch/copy_switch.h +0 -1
  95. esphome/components/copy/text/copy_text.h +0 -1
  96. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  97. esphome/components/cover/__init__.py +5 -2
  98. esphome/components/cs5460a/cs5460a.h +0 -1
  99. esphome/components/datetime/__init__.py +4 -2
  100. esphome/components/debug/__init__.py +20 -0
  101. esphome/components/deep_sleep/__init__.py +43 -9
  102. esphome/components/demo/__init__.py +2 -2
  103. esphome/components/display/display.cpp +4 -3
  104. esphome/components/display/display.h +0 -2
  105. esphome/components/display/display_buffer.cpp +1 -1
  106. esphome/components/ds2484/__init__.py +1 -0
  107. esphome/components/ds2484/ds2484.cpp +209 -0
  108. esphome/components/ds2484/ds2484.h +43 -0
  109. esphome/components/ds2484/one_wire.py +37 -0
  110. esphome/components/duty_time/duty_time_sensor.h +0 -1
  111. esphome/components/ens160_base/ens160_base.h +0 -1
  112. esphome/components/es7210/es7210.h +0 -1
  113. esphome/components/es7243e/es7243e.h +0 -1
  114. esphome/components/es8156/es8156.h +0 -1
  115. esphome/components/es8311/es8311.h +0 -1
  116. esphome/components/es8388/es8388.h +0 -1
  117. esphome/components/esp32/__init__.py +102 -135
  118. esphome/components/esp32/core.cpp +0 -4
  119. esphome/components/esp32/gpio.h +1 -1
  120. esphome/components/esp32/helpers.cpp +69 -0
  121. esphome/components/esp32_ble/ble.cpp +5 -6
  122. esphome/components/esp32_ble/ble.h +29 -14
  123. esphome/components/esp32_ble/ble_event.h +6 -6
  124. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  125. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  126. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  127. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  128. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  129. esphome/components/esp32_camera/__init__.py +111 -97
  130. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  131. esphome/components/esp32_camera/esp32_camera.h +35 -30
  132. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  133. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  134. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  135. esphome/components/esp32_hall/sensor.py +2 -21
  136. esphome/components/esp32_hosted/__init__.py +101 -0
  137. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  138. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  139. esphome/components/esp32_rmt/__init__.py +0 -58
  140. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  141. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  142. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  143. esphome/components/esp32_touch/esp32_touch.h +174 -28
  144. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  145. esphome/components/esp32_touch/esp32_touch_v1.cpp +238 -0
  146. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  147. esphome/components/esp8266/__init__.py +1 -0
  148. esphome/components/esp8266/gpio.cpp +10 -10
  149. esphome/components/esp8266/helpers.cpp +31 -0
  150. esphome/components/esphome/ota/__init__.py +1 -0
  151. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  152. esphome/components/ethernet/__init__.py +42 -23
  153. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  154. esphome/components/ethernet/ethernet_component.cpp +69 -29
  155. esphome/components/ethernet/ethernet_component.h +18 -10
  156. esphome/components/event/__init__.py +5 -2
  157. esphome/components/ezo/ezo.h +0 -1
  158. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  159. esphome/components/fan/__init__.py +5 -2
  160. esphome/components/feedback/feedback_cover.h +0 -1
  161. esphome/components/font/__init__.py +92 -82
  162. esphome/components/font/font.cpp +9 -2
  163. esphome/components/font/font.h +20 -5
  164. esphome/components/fs3000/fs3000.h +0 -1
  165. esphome/components/gcja5/gcja5.h +0 -1
  166. esphome/components/gl_r01_i2c/__init__.py +0 -0
  167. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  168. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  169. esphome/components/gl_r01_i2c/sensor.py +36 -0
  170. esphome/components/gp8403/gp8403.h +0 -1
  171. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  172. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  173. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  174. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  175. esphome/components/he60r/he60r.h +0 -1
  176. esphome/components/heatpumpir/climate.py +2 -1
  177. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  178. esphome/components/heatpumpir/heatpumpir.h +1 -0
  179. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  180. esphome/components/host/__init__.py +2 -1
  181. esphome/components/host/helpers.cpp +57 -0
  182. esphome/components/http_request/__init__.py +19 -1
  183. esphome/components/http_request/http_request.h +1 -1
  184. esphome/components/http_request/http_request_arduino.cpp +0 -1
  185. esphome/components/http_request/http_request_arduino.h +1 -0
  186. esphome/components/http_request/http_request_idf.cpp +0 -1
  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 +430 -261
  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 +4 -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 +126 -45
  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 +31 -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 +1 -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 +1 -5
  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/valve/__init__.py +5 -2
  477. esphome/components/vbus/vbus.h +0 -1
  478. esphome/components/veml3235/veml3235.h +0 -1
  479. esphome/components/veml7700/veml7700.h +0 -1
  480. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  481. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  482. esphome/components/watchdog/watchdog.cpp +0 -4
  483. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  484. esphome/components/web_server/__init__.py +34 -19
  485. esphome/components/web_server/ota/__init__.py +32 -0
  486. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  487. esphome/components/web_server/ota/ota_web_server.h +26 -0
  488. esphome/components/web_server/web_server.cpp +311 -430
  489. esphome/components/web_server/web_server.h +33 -23
  490. esphome/components/web_server/web_server_v1.cpp +4 -5
  491. esphome/components/web_server_base/__init__.py +5 -2
  492. esphome/components/web_server_base/web_server_base.cpp +2 -94
  493. esphome/components/web_server_base/web_server_base.h +5 -25
  494. esphome/components/web_server_idf/multipart.cpp +254 -0
  495. esphome/components/web_server_idf/multipart.h +86 -0
  496. esphome/components/web_server_idf/utils.cpp +32 -0
  497. esphome/components/web_server_idf/utils.h +10 -0
  498. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  499. esphome/components/web_server_idf/web_server_idf.h +11 -10
  500. esphome/components/wiegand/wiegand.cpp +2 -2
  501. esphome/components/wifi/__init__.py +18 -0
  502. esphome/components/wifi/wifi_component.cpp +17 -22
  503. esphome/components/wifi/wifi_component.h +27 -23
  504. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  505. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  506. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  507. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  508. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  509. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  510. esphome/components/wireguard/__init__.py +2 -11
  511. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  512. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  513. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  514. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  515. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  516. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  517. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  518. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  519. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  520. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  521. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  522. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  523. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  524. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  525. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  526. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  527. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  528. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  529. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  530. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  531. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  532. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  533. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  534. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  535. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  536. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  537. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  538. esphome/components/zyaura/zyaura.h +0 -1
  539. esphome/config.py +88 -22
  540. esphome/config_helpers.py +74 -1
  541. esphome/config_validation.py +12 -1
  542. esphome/const.py +65 -10
  543. esphome/core/__init__.py +18 -2
  544. esphome/core/application.cpp +163 -10
  545. esphome/core/application.h +145 -165
  546. esphome/core/area.h +19 -0
  547. esphome/core/automation.h +58 -9
  548. esphome/core/color.cpp +3 -5
  549. esphome/core/color.h +16 -16
  550. esphome/core/component.cpp +151 -18
  551. esphome/core/component.h +98 -4
  552. esphome/core/component_iterator.cpp +7 -7
  553. esphome/core/component_iterator.h +9 -7
  554. esphome/core/config.py +155 -6
  555. esphome/core/controller.cpp +4 -2
  556. esphome/core/controller.h +1 -1
  557. esphome/core/datatypes.h +2 -2
  558. esphome/core/defines.h +17 -2
  559. esphome/core/device.h +20 -0
  560. esphome/core/entity_base.cpp +20 -15
  561. esphome/core/entity_base.h +76 -0
  562. esphome/core/entity_helpers.py +162 -1
  563. esphome/core/event_pool.h +81 -0
  564. esphome/core/helpers.cpp +75 -230
  565. esphome/core/helpers.h +164 -104
  566. esphome/core/lock_free_queue.h +151 -0
  567. esphome/core/log.cpp +2 -2
  568. esphome/core/log.h +2 -0
  569. esphome/core/optional.h +5 -0
  570. esphome/core/ring_buffer.cpp +2 -2
  571. esphome/core/scheduler.cpp +278 -103
  572. esphome/core/scheduler.h +157 -17
  573. esphome/core/time.cpp +5 -5
  574. esphome/core/time.h +5 -5
  575. esphome/cpp_generator.py +17 -0
  576. esphome/cpp_helpers.py +0 -22
  577. esphome/cpp_types.py +3 -1
  578. esphome/dashboard/entries.py +1 -1
  579. esphome/dashboard/util/text.py +5 -21
  580. esphome/dashboard/web_server.py +9 -1
  581. esphome/helpers.py +47 -0
  582. esphome/loader.py +15 -1
  583. esphome/pins.py +14 -8
  584. esphome/wizard.py +16 -3
  585. esphome/writer.py +21 -3
  586. esphome/yaml_util.py +0 -2
  587. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
  588. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +593 -533
  589. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  590. esphome/components/esp32_ble/queue.h +0 -85
  591. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  592. esphome/components/esp32_hall/esp32_hall.h +0 -23
  593. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  594. esphome/components/ld2410/button/reset_button.cpp +0 -9
  595. esphome/components/ld2450/button/reset_button.cpp +0 -9
  596. esphome/components/openthread/tlv.py +0 -65
  597. /esphome/{dashboard/enum.py → enum.py} +0 -0
  598. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/WHEEL +0 -0
  599. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  600. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
  601. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,397 @@
1
+ #if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
2
+
3
+ #include "esp32_touch.h"
4
+ #include "esphome/core/application.h"
5
+ #include "esphome/core/log.h"
6
+ #include "esphome/core/hal.h"
7
+
8
+ namespace esphome {
9
+ namespace esp32_touch {
10
+
11
+ static const char *const TAG = "esp32_touch";
12
+
13
+ // Helper to update touch state with a known state
14
+ void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched) {
15
+ // Always update timer when touched
16
+ if (is_touched) {
17
+ child->last_touch_time_ = App.get_loop_component_start_time();
18
+ }
19
+
20
+ if (child->last_state_ != is_touched) {
21
+ child->last_state_ = is_touched;
22
+ child->publish_state(is_touched);
23
+ if (is_touched) {
24
+ // ESP32-S2/S3 v2: touched when value > threshold
25
+ ESP_LOGV(TAG, "Touch Pad '%s' state: ON (value: %" PRIu32 " > threshold: %" PRIu32 ")", child->get_name().c_str(),
26
+ this->read_touch_value(child->touch_pad_), child->threshold_ + child->benchmark_);
27
+ } else {
28
+ ESP_LOGV(TAG, "Touch Pad '%s' state: OFF", child->get_name().c_str());
29
+ }
30
+ }
31
+ }
32
+
33
+ // Helper to read touch value and update state for a given child (used for timeout events)
34
+ bool ESP32TouchComponent::check_and_update_touch_state_(ESP32TouchBinarySensor *child) {
35
+ // Read current touch value
36
+ uint32_t value = this->read_touch_value(child->touch_pad_);
37
+
38
+ // ESP32-S2/S3 v2: Touch is detected when value > threshold + benchmark
39
+ ESP_LOGV(TAG,
40
+ "Checking touch state for '%s' (T%d): value = %" PRIu32 ", threshold = %" PRIu32 ", benchmark = %" PRIu32,
41
+ child->get_name().c_str(), child->touch_pad_, value, child->threshold_, child->benchmark_);
42
+ bool is_touched = value > child->benchmark_ + child->threshold_;
43
+
44
+ this->update_touch_state_(child, is_touched);
45
+ return is_touched;
46
+ }
47
+
48
+ void ESP32TouchComponent::setup() {
49
+ // Create queue for touch events first
50
+ if (!this->create_touch_queue_()) {
51
+ return;
52
+ }
53
+
54
+ // Initialize touch pad peripheral
55
+ esp_err_t init_err = touch_pad_init();
56
+ if (init_err != ESP_OK) {
57
+ ESP_LOGE(TAG, "Failed to initialize touch pad: %s", esp_err_to_name(init_err));
58
+ this->mark_failed();
59
+ return;
60
+ }
61
+
62
+ // Configure each touch pad first
63
+ for (auto *child : this->children_) {
64
+ esp_err_t config_err = touch_pad_config(child->touch_pad_);
65
+ if (config_err != ESP_OK) {
66
+ ESP_LOGE(TAG, "Failed to configure touch pad %d: %s", child->touch_pad_, esp_err_to_name(config_err));
67
+ }
68
+ }
69
+
70
+ // Set up filtering if configured
71
+ if (this->filter_configured_()) {
72
+ touch_filter_config_t filter_info = {
73
+ .mode = this->filter_mode_,
74
+ .debounce_cnt = this->debounce_count_,
75
+ .noise_thr = this->noise_threshold_,
76
+ .jitter_step = this->jitter_step_,
77
+ .smh_lvl = this->smooth_level_,
78
+ };
79
+ touch_pad_filter_set_config(&filter_info);
80
+ touch_pad_filter_enable();
81
+ }
82
+
83
+ if (this->denoise_configured_()) {
84
+ touch_pad_denoise_t denoise = {
85
+ .grade = this->grade_,
86
+ .cap_level = this->cap_level_,
87
+ };
88
+ touch_pad_denoise_set_config(&denoise);
89
+ touch_pad_denoise_enable();
90
+ }
91
+
92
+ if (this->waterproof_configured_()) {
93
+ touch_pad_waterproof_t waterproof = {
94
+ .guard_ring_pad = this->waterproof_guard_ring_pad_,
95
+ .shield_driver = this->waterproof_shield_driver_,
96
+ };
97
+ touch_pad_waterproof_set_config(&waterproof);
98
+ touch_pad_waterproof_enable();
99
+ }
100
+
101
+ // Configure measurement parameters
102
+ touch_pad_set_voltage(this->high_voltage_reference_, this->low_voltage_reference_, this->voltage_attenuation_);
103
+ touch_pad_set_charge_discharge_times(this->meas_cycle_);
104
+ touch_pad_set_measurement_interval(this->sleep_cycle_);
105
+
106
+ // Configure timeout if needed
107
+ touch_pad_timeout_set(true, TOUCH_PAD_THRESHOLD_MAX);
108
+
109
+ // Register ISR handler with interrupt mask
110
+ esp_err_t err =
111
+ touch_pad_isr_register(touch_isr_handler, this, static_cast<touch_pad_intr_mask_t>(TOUCH_PAD_INTR_MASK_ALL));
112
+ if (err != ESP_OK) {
113
+ ESP_LOGE(TAG, "Failed to register touch ISR: %s", esp_err_to_name(err));
114
+ this->cleanup_touch_queue_();
115
+ this->mark_failed();
116
+ return;
117
+ }
118
+
119
+ // Set thresholds for each pad BEFORE starting FSM
120
+ for (auto *child : this->children_) {
121
+ if (child->threshold_ != 0) {
122
+ touch_pad_set_thresh(child->touch_pad_, child->threshold_);
123
+ }
124
+ }
125
+
126
+ // Enable interrupts - only ACTIVE and TIMEOUT
127
+ // NOTE: We intentionally don't enable INACTIVE interrupts because they are unreliable
128
+ // on ESP32-S2/S3 hardware and sometimes don't fire. Instead, we use timeout-based
129
+ // release detection with the ability to verify the actual state.
130
+ touch_pad_intr_enable(static_cast<touch_pad_intr_mask_t>(TOUCH_PAD_INTR_MASK_ACTIVE | TOUCH_PAD_INTR_MASK_TIMEOUT));
131
+
132
+ // Set FSM mode before starting
133
+ touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER);
134
+
135
+ // Start FSM
136
+ touch_pad_fsm_start();
137
+
138
+ // Calculate release timeout based on sleep cycle
139
+ this->calculate_release_timeout_();
140
+ }
141
+
142
+ void ESP32TouchComponent::dump_config() {
143
+ this->dump_config_base_();
144
+
145
+ if (this->filter_configured_()) {
146
+ const char *filter_mode_s;
147
+ switch (this->filter_mode_) {
148
+ case TOUCH_PAD_FILTER_IIR_4:
149
+ filter_mode_s = "IIR_4";
150
+ break;
151
+ case TOUCH_PAD_FILTER_IIR_8:
152
+ filter_mode_s = "IIR_8";
153
+ break;
154
+ case TOUCH_PAD_FILTER_IIR_16:
155
+ filter_mode_s = "IIR_16";
156
+ break;
157
+ case TOUCH_PAD_FILTER_IIR_32:
158
+ filter_mode_s = "IIR_32";
159
+ break;
160
+ case TOUCH_PAD_FILTER_IIR_64:
161
+ filter_mode_s = "IIR_64";
162
+ break;
163
+ case TOUCH_PAD_FILTER_IIR_128:
164
+ filter_mode_s = "IIR_128";
165
+ break;
166
+ case TOUCH_PAD_FILTER_IIR_256:
167
+ filter_mode_s = "IIR_256";
168
+ break;
169
+ case TOUCH_PAD_FILTER_JITTER:
170
+ filter_mode_s = "JITTER";
171
+ break;
172
+ default:
173
+ filter_mode_s = "UNKNOWN";
174
+ break;
175
+ }
176
+ ESP_LOGCONFIG(TAG,
177
+ " Filter mode: %s\n"
178
+ " Debounce count: %" PRIu32 "\n"
179
+ " Noise threshold coefficient: %" PRIu32 "\n"
180
+ " Jitter filter step size: %" PRIu32,
181
+ filter_mode_s, this->debounce_count_, this->noise_threshold_, this->jitter_step_);
182
+ const char *smooth_level_s;
183
+ switch (this->smooth_level_) {
184
+ case TOUCH_PAD_SMOOTH_OFF:
185
+ smooth_level_s = "OFF";
186
+ break;
187
+ case TOUCH_PAD_SMOOTH_IIR_2:
188
+ smooth_level_s = "IIR_2";
189
+ break;
190
+ case TOUCH_PAD_SMOOTH_IIR_4:
191
+ smooth_level_s = "IIR_4";
192
+ break;
193
+ case TOUCH_PAD_SMOOTH_IIR_8:
194
+ smooth_level_s = "IIR_8";
195
+ break;
196
+ default:
197
+ smooth_level_s = "UNKNOWN";
198
+ break;
199
+ }
200
+ ESP_LOGCONFIG(TAG, " Smooth level: %s", smooth_level_s);
201
+ }
202
+
203
+ if (this->denoise_configured_()) {
204
+ const char *grade_s;
205
+ switch (this->grade_) {
206
+ case TOUCH_PAD_DENOISE_BIT12:
207
+ grade_s = "BIT12";
208
+ break;
209
+ case TOUCH_PAD_DENOISE_BIT10:
210
+ grade_s = "BIT10";
211
+ break;
212
+ case TOUCH_PAD_DENOISE_BIT8:
213
+ grade_s = "BIT8";
214
+ break;
215
+ case TOUCH_PAD_DENOISE_BIT4:
216
+ grade_s = "BIT4";
217
+ break;
218
+ default:
219
+ grade_s = "UNKNOWN";
220
+ break;
221
+ }
222
+ ESP_LOGCONFIG(TAG, " Denoise grade: %s", grade_s);
223
+
224
+ const char *cap_level_s;
225
+ switch (this->cap_level_) {
226
+ case TOUCH_PAD_DENOISE_CAP_L0:
227
+ cap_level_s = "L0";
228
+ break;
229
+ case TOUCH_PAD_DENOISE_CAP_L1:
230
+ cap_level_s = "L1";
231
+ break;
232
+ case TOUCH_PAD_DENOISE_CAP_L2:
233
+ cap_level_s = "L2";
234
+ break;
235
+ case TOUCH_PAD_DENOISE_CAP_L3:
236
+ cap_level_s = "L3";
237
+ break;
238
+ case TOUCH_PAD_DENOISE_CAP_L4:
239
+ cap_level_s = "L4";
240
+ break;
241
+ case TOUCH_PAD_DENOISE_CAP_L5:
242
+ cap_level_s = "L5";
243
+ break;
244
+ case TOUCH_PAD_DENOISE_CAP_L6:
245
+ cap_level_s = "L6";
246
+ break;
247
+ case TOUCH_PAD_DENOISE_CAP_L7:
248
+ cap_level_s = "L7";
249
+ break;
250
+ default:
251
+ cap_level_s = "UNKNOWN";
252
+ break;
253
+ }
254
+ ESP_LOGCONFIG(TAG, " Denoise capacitance level: %s", cap_level_s);
255
+ }
256
+
257
+ if (this->setup_mode_) {
258
+ ESP_LOGCONFIG(TAG, " Setup Mode ENABLED");
259
+ }
260
+
261
+ this->dump_config_sensors_();
262
+ }
263
+
264
+ void ESP32TouchComponent::loop() {
265
+ const uint32_t now = App.get_loop_component_start_time();
266
+
267
+ // V2 TOUCH HANDLING:
268
+ // Due to unreliable INACTIVE interrupts on ESP32-S2/S3, we use a hybrid approach:
269
+ // 1. Process ACTIVE interrupts when pads are touched
270
+ // 2. Use timeout-based release detection (like v1)
271
+ // 3. But smarter than v1: verify actual state before releasing on timeout
272
+ // This prevents false releases if we missed interrupts
273
+
274
+ // In setup mode, periodically log all pad values
275
+ this->process_setup_mode_logging_(now);
276
+
277
+ // Process any queued touch events from interrupts
278
+ TouchPadEventV2 event;
279
+ while (xQueueReceive(this->touch_queue_, &event, 0) == pdTRUE) {
280
+ ESP_LOGD(TAG, "Event received, mask = 0x%" PRIx32 ", pad = %d", event.intr_mask, event.pad);
281
+ // Handle timeout events
282
+ if (event.intr_mask & TOUCH_PAD_INTR_MASK_TIMEOUT) {
283
+ // Resume measurement after timeout
284
+ touch_pad_timeout_resume();
285
+ // For timeout events, always check the current state
286
+ } else if (!(event.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE)) {
287
+ // Skip if not an active/timeout event
288
+ continue;
289
+ }
290
+
291
+ // Find the child for the pad that triggered the interrupt
292
+ for (auto *child : this->children_) {
293
+ if (child->touch_pad_ == event.pad) {
294
+ if (event.intr_mask & TOUCH_PAD_INTR_MASK_TIMEOUT) {
295
+ // For timeout events, we need to read the value to determine state
296
+ this->check_and_update_touch_state_(child);
297
+ } else if (event.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE) {
298
+ // We only get ACTIVE interrupts now, releases are detected by timeout
299
+ this->update_touch_state_(child, true); // Always touched for ACTIVE interrupts
300
+ }
301
+ break;
302
+ }
303
+ }
304
+ }
305
+
306
+ // Check for released pads periodically (like v1)
307
+ if (!this->should_check_for_releases_(now)) {
308
+ return;
309
+ }
310
+
311
+ size_t pads_off = 0;
312
+ for (auto *child : this->children_) {
313
+ if (child->benchmark_ == 0)
314
+ touch_pad_read_benchmark(child->touch_pad_, &child->benchmark_);
315
+ // Handle initial state publication after startup
316
+ this->publish_initial_state_if_needed_(child, now);
317
+
318
+ if (child->last_state_) {
319
+ // Pad is currently in touched state - check for release timeout
320
+ // Using subtraction handles 32-bit rollover correctly
321
+ uint32_t time_diff = now - child->last_touch_time_;
322
+
323
+ // Check if we haven't seen this pad recently
324
+ if (time_diff > this->release_timeout_ms_) {
325
+ // Haven't seen this pad recently - verify actual state
326
+ // Unlike v1, v2 hardware allows us to read the current state anytime
327
+ // This makes v2 smarter: we can verify if it's actually released before
328
+ // declaring a timeout, preventing false releases if interrupts were missed
329
+ bool still_touched = this->check_and_update_touch_state_(child);
330
+
331
+ if (still_touched) {
332
+ // Still touched! Timer was reset in update_touch_state_
333
+ ESP_LOGVV(TAG, "Touch Pad '%s' still touched after %" PRIu32 "ms timeout, resetting timer",
334
+ child->get_name().c_str(), this->release_timeout_ms_);
335
+ } else {
336
+ // Actually released - already handled by check_and_update_touch_state_
337
+ pads_off++;
338
+ }
339
+ }
340
+ } else {
341
+ // Pad is already off
342
+ pads_off++;
343
+ }
344
+ }
345
+
346
+ // Disable the loop when all pads are off and not in setup mode (like v1)
347
+ // We need to keep checking for timeouts, so only disable when all pads are confirmed off
348
+ this->check_and_disable_loop_if_all_released_(pads_off);
349
+ }
350
+
351
+ void ESP32TouchComponent::on_shutdown() {
352
+ // Disable interrupts
353
+ touch_pad_intr_disable(static_cast<touch_pad_intr_mask_t>(TOUCH_PAD_INTR_MASK_ACTIVE | TOUCH_PAD_INTR_MASK_TIMEOUT));
354
+ touch_pad_isr_deregister(touch_isr_handler, this);
355
+ this->cleanup_touch_queue_();
356
+
357
+ // Configure wakeup pads if any are set
358
+ this->configure_wakeup_pads_();
359
+ }
360
+
361
+ void IRAM_ATTR ESP32TouchComponent::touch_isr_handler(void *arg) {
362
+ ESP32TouchComponent *component = static_cast<ESP32TouchComponent *>(arg);
363
+ BaseType_t x_higher_priority_task_woken = pdFALSE;
364
+
365
+ // Read interrupt status
366
+ TouchPadEventV2 event;
367
+ event.intr_mask = touch_pad_read_intr_status_mask();
368
+ event.pad = touch_pad_get_current_meas_channel();
369
+
370
+ // Send event to queue for processing in main loop
371
+ xQueueSendFromISR(component->touch_queue_, &event, &x_higher_priority_task_woken);
372
+ component->enable_loop_soon_any_context();
373
+
374
+ if (x_higher_priority_task_woken) {
375
+ portYIELD_FROM_ISR();
376
+ }
377
+ }
378
+
379
+ uint32_t ESP32TouchComponent::read_touch_value(touch_pad_t pad) const {
380
+ // Unlike ESP32 v1, touch reads on ESP32-S2/S3 v2 are non-blocking operations.
381
+ // The hardware continuously samples in the background and we can read the
382
+ // latest value at any time without waiting.
383
+ uint32_t value = 0;
384
+ if (this->filter_configured_()) {
385
+ // Read filtered/smoothed value when filter is enabled
386
+ touch_pad_filter_read_smooth(pad, &value);
387
+ } else {
388
+ // Read raw value when filter is not configured
389
+ touch_pad_read_raw_data(pad, &value);
390
+ }
391
+ return value;
392
+ }
393
+
394
+ } // namespace esp32_touch
395
+ } // namespace esphome
396
+
397
+ #endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
@@ -183,6 +183,7 @@ async def to_code(config):
183
183
 
184
184
  cg.add_platformio_option("board", config[CONF_BOARD])
185
185
  cg.add_build_flag("-DUSE_ESP8266")
186
+ cg.set_cpp_standard("gnu++20")
186
187
  cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
187
188
  cg.add_define("ESPHOME_VARIANT", "ESP8266")
188
189
 
@@ -129,9 +129,9 @@ void IRAM_ATTR ISRInternalGPIOPin::digital_write(bool value) {
129
129
  }
130
130
  } else {
131
131
  if (value != arg->inverted) {
132
- *arg->out_set_reg |= 1;
132
+ *arg->out_set_reg = *arg->out_set_reg | 1;
133
133
  } else {
134
- *arg->out_set_reg &= ~1;
134
+ *arg->out_set_reg = *arg->out_set_reg & ~1;
135
135
  }
136
136
  }
137
137
  }
@@ -147,7 +147,7 @@ void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
147
147
  if (flags & gpio::FLAG_OUTPUT) {
148
148
  *arg->mode_set_reg = arg->mask;
149
149
  if (flags & gpio::FLAG_OPEN_DRAIN) {
150
- *arg->control_reg |= 1 << GPCD;
150
+ *arg->control_reg = *arg->control_reg | (1 << GPCD);
151
151
  } else {
152
152
  *arg->control_reg &= ~(1 << GPCD);
153
153
  }
@@ -155,21 +155,21 @@ void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
155
155
  *arg->mode_clr_reg = arg->mask;
156
156
  }
157
157
  if (flags & gpio::FLAG_PULLUP) {
158
- *arg->func_reg |= 1 << GPFPU;
159
- *arg->control_reg |= 1 << GPCD;
158
+ *arg->func_reg = *arg->func_reg | (1 << GPFPU);
159
+ *arg->control_reg = *arg->control_reg | (1 << GPCD);
160
160
  } else {
161
- *arg->func_reg &= ~(1 << GPFPU);
161
+ *arg->func_reg = *arg->func_reg & ~(1 << GPFPU);
162
162
  }
163
163
  } else {
164
164
  if (flags & gpio::FLAG_OUTPUT) {
165
- *arg->mode_set_reg |= 1;
165
+ *arg->mode_set_reg = *arg->mode_set_reg | 1;
166
166
  } else {
167
- *arg->mode_set_reg &= ~1;
167
+ *arg->mode_set_reg = *arg->mode_set_reg & ~1;
168
168
  }
169
169
  if (flags & gpio::FLAG_PULLDOWN) {
170
- *arg->func_reg |= 1 << GP16FPD;
170
+ *arg->func_reg = *arg->func_reg | (1 << GP16FPD);
171
171
  } else {
172
- *arg->func_reg &= ~(1 << GP16FPD);
172
+ *arg->func_reg = *arg->func_reg & ~(1 << GP16FPD);
173
173
  }
174
174
  }
175
175
  }
@@ -0,0 +1,31 @@
1
+ #include "esphome/core/helpers.h"
2
+
3
+ #ifdef USE_ESP8266
4
+
5
+ #include <osapi.h>
6
+ #include <user_interface.h>
7
+ // for xt_rsil()/xt_wsr_ps()
8
+ #include <Arduino.h>
9
+
10
+ namespace esphome {
11
+
12
+ uint32_t random_uint32() { return os_random(); }
13
+ bool random_bytes(uint8_t *data, size_t len) { return os_get_random(data, len) == 0; }
14
+
15
+ // ESP8266 doesn't have mutexes, but that shouldn't be an issue as it's single-core and non-preemptive OS.
16
+ Mutex::Mutex() {}
17
+ Mutex::~Mutex() {}
18
+ void Mutex::lock() {}
19
+ bool Mutex::try_lock() { return true; }
20
+ void Mutex::unlock() {}
21
+
22
+ IRAM_ATTR InterruptLock::InterruptLock() { state_ = xt_rsil(15); }
23
+ IRAM_ATTR InterruptLock::~InterruptLock() { xt_wsr_ps(state_); }
24
+
25
+ void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
26
+ wifi_get_macaddr(STATION_IF, mac);
27
+ }
28
+
29
+ } // namespace esphome
30
+
31
+ #endif // USE_ESP8266
@@ -100,6 +100,7 @@ CONFIG_SCHEMA = (
100
100
  esp32=3232,
101
101
  rp2040=2040,
102
102
  bk72xx=8892,
103
+ ln882x=8820,
103
104
  rtl87xx=8892,
104
105
  ): cv.port,
105
106
  cv.Optional(CONF_PASSWORD): cv.string,
@@ -26,19 +26,19 @@ void ESPHomeOTAComponent::setup() {
26
26
  ota::register_ota_platform(this);
27
27
  #endif
28
28
 
29
- server_ = socket::socket_ip_loop_monitored(SOCK_STREAM, 0); // monitored for incoming connections
30
- if (server_ == nullptr) {
29
+ this->server_ = socket::socket_ip_loop_monitored(SOCK_STREAM, 0); // monitored for incoming connections
30
+ if (this->server_ == nullptr) {
31
31
  ESP_LOGW(TAG, "Could not create socket");
32
32
  this->mark_failed();
33
33
  return;
34
34
  }
35
35
  int enable = 1;
36
- int err = server_->setsockopt(SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
36
+ int err = this->server_->setsockopt(SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
37
37
  if (err != 0) {
38
38
  ESP_LOGW(TAG, "Socket unable to set reuseaddr: errno %d", err);
39
39
  // we can still continue
40
40
  }
41
- err = server_->setblocking(false);
41
+ err = this->server_->setblocking(false);
42
42
  if (err != 0) {
43
43
  ESP_LOGW(TAG, "Socket unable to set nonblocking mode: errno %d", err);
44
44
  this->mark_failed();
@@ -54,14 +54,14 @@ void ESPHomeOTAComponent::setup() {
54
54
  return;
55
55
  }
56
56
 
57
- err = server_->bind((struct sockaddr *) &server, sizeof(server));
57
+ err = this->server_->bind((struct sockaddr *) &server, sizeof(server));
58
58
  if (err != 0) {
59
59
  ESP_LOGW(TAG, "Socket unable to bind: errno %d", errno);
60
60
  this->mark_failed();
61
61
  return;
62
62
  }
63
63
 
64
- err = server_->listen(4);
64
+ err = this->server_->listen(4);
65
65
  if (err != 0) {
66
66
  ESP_LOGW(TAG, "Socket unable to listen: errno %d", errno);
67
67
  this->mark_failed();
@@ -82,7 +82,14 @@ void ESPHomeOTAComponent::dump_config() {
82
82
  #endif
83
83
  }
84
84
 
85
- void ESPHomeOTAComponent::loop() { this->handle_(); }
85
+ void ESPHomeOTAComponent::loop() {
86
+ // Skip handle_() call if no client connected and no incoming connections
87
+ // This optimization reduces idle loop overhead when OTA is not active
88
+ // Note: No need to check server_ for null as the component is marked failed in setup() if server_ creation fails
89
+ if (this->client_ != nullptr || this->server_->ready()) {
90
+ this->handle_();
91
+ }
92
+ }
86
93
 
87
94
  static const uint8_t FEATURE_SUPPORTS_COMPRESSION = 0x01;
88
95
 
@@ -101,23 +108,21 @@ void ESPHomeOTAComponent::handle_() {
101
108
  size_t size_acknowledged = 0;
102
109
  #endif
103
110
 
104
- if (client_ == nullptr) {
105
- // Check if the server socket is ready before accepting
106
- if (this->server_->ready()) {
107
- struct sockaddr_storage source_addr;
108
- socklen_t addr_len = sizeof(source_addr);
109
- client_ = server_->accept((struct sockaddr *) &source_addr, &addr_len);
110
- }
111
+ if (this->client_ == nullptr) {
112
+ // We already checked server_->ready() in loop(), so we can accept directly
113
+ struct sockaddr_storage source_addr;
114
+ socklen_t addr_len = sizeof(source_addr);
115
+ this->client_ = this->server_->accept((struct sockaddr *) &source_addr, &addr_len);
116
+ if (this->client_ == nullptr)
117
+ return;
111
118
  }
112
- if (client_ == nullptr)
113
- return;
114
119
 
115
120
  int enable = 1;
116
- int err = client_->setsockopt(IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(int));
121
+ int err = this->client_->setsockopt(IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(int));
117
122
  if (err != 0) {
118
123
  ESP_LOGW(TAG, "Socket could not enable TCP nodelay, errno %d", errno);
119
- client_->close();
120
- client_ = nullptr;
124
+ this->client_->close();
125
+ this->client_ = nullptr;
121
126
  return;
122
127
  }
123
128