esphome 2025.7.4__py3-none-any.whl → 2025.8.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 (754) hide show
  1. esphome/__main__.py +189 -82
  2. esphome/automation.py +2 -4
  3. esphome/build_gen/__init__.py +0 -0
  4. esphome/build_gen/platformio.py +102 -0
  5. esphome/components/a4988/a4988.cpp +0 -1
  6. esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
  7. esphome/components/absolute_humidity/sensor.py +2 -2
  8. esphome/components/adc/__init__.py +123 -85
  9. esphome/components/adc/adc_sensor.h +98 -35
  10. esphome/components/adc/adc_sensor_common.cpp +10 -4
  11. esphome/components/adc/adc_sensor_esp32.cpp +291 -123
  12. esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
  13. esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
  14. esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
  15. esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
  16. esphome/components/adc/sensor.py +61 -27
  17. esphome/components/adc128s102/adc128s102.cpp +1 -4
  18. esphome/components/ade7880/sensor.py +75 -49
  19. esphome/components/ads1115/ads1115.cpp +0 -1
  20. esphome/components/ads1118/ads1118.cpp +0 -1
  21. esphome/components/ags10/ags10.cpp +0 -4
  22. esphome/components/aht10/aht10.cpp +0 -4
  23. esphome/components/aic3204/aic3204.cpp +0 -2
  24. esphome/components/airthings_wave_plus/__init__.py +1 -1
  25. esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
  26. esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
  27. esphome/components/airthings_wave_plus/sensor.py +55 -28
  28. esphome/components/alarm_control_panel/__init__.py +4 -9
  29. esphome/components/am2315c/am2315c.cpp +0 -2
  30. esphome/components/am2320/am2320.cpp +0 -1
  31. esphome/components/animation/__init__.py +14 -11
  32. esphome/components/apds9306/apds9306.cpp +0 -4
  33. esphome/components/apds9960/apds9960.cpp +0 -1
  34. esphome/components/api/__init__.py +29 -4
  35. esphome/components/api/api_connection.cpp +378 -401
  36. esphome/components/api/api_connection.h +112 -56
  37. esphome/components/api/api_frame_helper.cpp +69 -896
  38. esphome/components/api/api_frame_helper.h +31 -126
  39. esphome/components/api/api_frame_helper_noise.cpp +583 -0
  40. esphome/components/api/api_frame_helper_noise.h +68 -0
  41. esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
  42. esphome/components/api/api_frame_helper_plaintext.h +53 -0
  43. esphome/components/api/api_noise_context.h +2 -4
  44. esphome/components/api/api_pb2.cpp +1601 -1808
  45. esphome/components/api/api_pb2.h +367 -323
  46. esphome/components/api/api_pb2_dump.cpp +1137 -3466
  47. esphome/components/api/api_pb2_includes.h +34 -0
  48. esphome/components/api/api_pb2_service.cpp +94 -105
  49. esphome/components/api/api_pb2_service.h +27 -16
  50. esphome/components/api/api_server.cpp +18 -17
  51. esphome/components/api/api_server.h +8 -5
  52. esphome/components/api/client.py +16 -8
  53. esphome/components/api/custom_api_device.h +68 -14
  54. esphome/components/api/homeassistant_service.h +24 -19
  55. esphome/components/api/list_entities.cpp +3 -5
  56. esphome/components/api/list_entities.h +2 -4
  57. esphome/components/api/proto.cpp +3 -5
  58. esphome/components/api/proto.h +239 -274
  59. esphome/components/api/subscribe_state.cpp +2 -4
  60. esphome/components/api/subscribe_state.h +2 -4
  61. esphome/components/api/user_services.cpp +2 -4
  62. esphome/components/api/user_services.h +8 -8
  63. esphome/components/as3935/as3935.cpp +0 -2
  64. esphome/components/as3935_spi/as3935_spi.cpp +0 -2
  65. esphome/components/as5600/__init__.py +1 -1
  66. esphome/components/as5600/as5600.cpp +0 -2
  67. esphome/components/as5600/sensor/__init__.py +0 -1
  68. esphome/components/as7341/as7341.cpp +0 -1
  69. esphome/components/async_tcp/__init__.py +1 -1
  70. esphome/components/at581x/at581x.cpp +1 -1
  71. esphome/components/atm90e26/atm90e26.cpp +0 -1
  72. esphome/components/atm90e32/atm90e32.cpp +488 -118
  73. esphome/components/atm90e32/atm90e32.h +44 -5
  74. esphome/components/audio/audio.h +2 -2
  75. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
  76. esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
  77. esphome/components/bh1750/bh1750.cpp +0 -1
  78. esphome/components/binary_sensor/__init__.py +14 -12
  79. esphome/components/ble_client/__init__.py +4 -7
  80. esphome/components/bluetooth_proxy/__init__.py +40 -3
  81. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +387 -82
  82. esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
  83. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
  84. esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
  85. esphome/components/bme280_base/bme280_base.cpp +15 -16
  86. esphome/components/bme680/bme680.cpp +2 -3
  87. esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
  88. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
  89. esphome/components/bmi160/bmi160.cpp +0 -1
  90. esphome/components/bmp085/bmp085.cpp +0 -1
  91. esphome/components/bmp280_base/bmp280_base.cpp +13 -14
  92. esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
  93. esphome/components/bmp581/bmp581.cpp +0 -2
  94. esphome/components/bp1658cj/bp1658cj.cpp +0 -1
  95. esphome/components/bp5758d/bp5758d.cpp +0 -1
  96. esphome/components/button/__init__.py +0 -1
  97. esphome/components/canbus/__init__.py +2 -3
  98. esphome/components/canbus/canbus.cpp +0 -1
  99. esphome/components/cap1188/cap1188.cpp +0 -2
  100. esphome/components/captive_portal/__init__.py +1 -1
  101. esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
  102. esphome/components/ch422g/ch422g.cpp +0 -1
  103. esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
  104. esphome/components/climate/__init__.py +0 -1
  105. esphome/components/climate/climate_traits.h +24 -0
  106. esphome/components/cm1106/cm1106.cpp +0 -1
  107. esphome/components/const/__init__.py +6 -0
  108. esphome/components/cover/__init__.py +0 -1
  109. esphome/components/cover/cover.cpp +9 -13
  110. esphome/components/cs5460a/cs5460a.cpp +0 -2
  111. esphome/components/cse7761/cse7761.cpp +0 -1
  112. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
  113. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
  114. esphome/components/dac7678/dac7678_output.cpp +0 -2
  115. esphome/components/dallas_temp/dallas_temp.cpp +0 -1
  116. esphome/components/datetime/__init__.py +0 -2
  117. esphome/components/debug/__init__.py +15 -1
  118. esphome/components/debug/debug_zephyr.cpp +281 -0
  119. esphome/components/debug/sensor.py +2 -1
  120. esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
  121. esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
  122. esphome/components/dfrobot_sen0395/__init__.py +1 -2
  123. esphome/components/dht/dht.cpp +0 -1
  124. esphome/components/dht12/dht12.cpp +0 -1
  125. esphome/components/display/__init__.py +16 -3
  126. esphome/components/display_menu_base/__init__.py +1 -1
  127. esphome/components/dps310/dps310.cpp +0 -2
  128. esphome/components/ds1307/ds1307.cpp +0 -1
  129. esphome/components/ds2484/ds2484.cpp +0 -1
  130. esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
  131. esphome/components/ee895/ee895.cpp +0 -1
  132. esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
  133. esphome/components/emc2101/emc2101.cpp +0 -2
  134. esphome/components/ens160_base/ens160_base.cpp +0 -2
  135. esphome/components/ens210/ens210.cpp +0 -1
  136. esphome/components/es7210/es7210.cpp +0 -2
  137. esphome/components/es7243e/es7243e.cpp +0 -2
  138. esphome/components/es8156/es8156.cpp +0 -2
  139. esphome/components/es8311/es8311.cpp +0 -2
  140. esphome/components/es8388/es8388.cpp +0 -2
  141. esphome/components/esp32/__init__.py +199 -58
  142. esphome/components/esp32/boards.py +17 -0
  143. esphome/components/esp32/gpio.cpp +0 -1
  144. esphome/components/esp32/gpio.py +1 -2
  145. esphome/components/esp32/gpio_esp32_h2.py +2 -7
  146. esphome/components/esp32/gpio_esp32_p4.py +2 -7
  147. esphome/components/esp32/post_build.py.script +112 -61
  148. esphome/components/esp32_ble/__init__.py +40 -2
  149. esphome/components/esp32_ble/ble.cpp +12 -8
  150. esphome/components/esp32_ble/ble.h +18 -18
  151. esphome/components/esp32_ble/ble_advertising.cpp +5 -5
  152. esphome/components/esp32_ble/ble_advertising.h +7 -5
  153. esphome/components/esp32_ble/ble_event.h +2 -4
  154. esphome/components/esp32_ble/ble_scan_result.h +2 -4
  155. esphome/components/esp32_ble/ble_uuid.cpp +5 -5
  156. esphome/components/esp32_ble/ble_uuid.h +6 -5
  157. esphome/components/esp32_ble_beacon/__init__.py +4 -0
  158. esphome/components/esp32_ble_client/__init__.py +1 -1
  159. esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
  160. esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
  161. esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
  162. esphome/components/esp32_ble_client/ble_client_base.h +17 -6
  163. esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
  164. esphome/components/esp32_ble_client/ble_service.cpp +4 -4
  165. esphome/components/esp32_ble_client/ble_service.h +6 -4
  166. esphome/components/esp32_ble_server/__init__.py +15 -12
  167. esphome/components/esp32_ble_tracker/__init__.py +79 -11
  168. esphome/components/esp32_ble_tracker/automation.h +4 -4
  169. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
  170. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
  171. esphome/components/esp32_camera/__init__.py +13 -1
  172. esphome/components/esp32_camera/esp32_camera.cpp +7 -2
  173. esphome/components/esp32_camera/esp32_camera.h +1 -0
  174. esphome/components/esp32_dac/esp32_dac.cpp +3 -19
  175. esphome/components/esp32_dac/esp32_dac.h +4 -8
  176. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
  177. esphome/components/esp32_rmt_led_strip/light.py +1 -1
  178. esphome/components/esp32_touch/__init__.py +2 -3
  179. esphome/components/esp32_touch/esp32_touch.h +9 -6
  180. esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
  181. esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
  182. esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
  183. esphome/components/esp8266/__init__.py +3 -1
  184. esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
  185. esphome/components/esphome/ota/__init__.py +1 -2
  186. esphome/components/esphome/ota/ota_esphome.cpp +150 -77
  187. esphome/components/esphome/ota/ota_esphome.h +8 -1
  188. esphome/components/espnow/__init__.py +309 -0
  189. esphome/components/espnow/automation.h +175 -0
  190. esphome/components/espnow/espnow_component.cpp +468 -0
  191. esphome/components/espnow/espnow_component.h +183 -0
  192. esphome/components/espnow/espnow_err.h +19 -0
  193. esphome/components/espnow/espnow_packet.h +166 -0
  194. esphome/components/ethernet/__init__.py +7 -1
  195. esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
  196. esphome/components/ethernet/ethernet_component.cpp +0 -1
  197. esphome/components/ethernet/ethernet_component.h +4 -0
  198. esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
  199. esphome/components/event/__init__.py +0 -1
  200. esphome/components/factory_reset/__init__.py +92 -0
  201. esphome/components/factory_reset/factory_reset.cpp +76 -0
  202. esphome/components/factory_reset/factory_reset.h +43 -0
  203. esphome/components/fan/__init__.py +0 -1
  204. esphome/components/fan/fan_traits.h +16 -0
  205. esphome/components/fastled_base/fastled_light.cpp +0 -1
  206. esphome/components/fastled_spi/light.py +1 -3
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
  208. esphome/components/font/__init__.py +9 -1
  209. esphome/components/fs3000/fs3000.cpp +0 -2
  210. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  211. esphome/components/ft63x6/ft63x6.cpp +0 -1
  212. esphome/components/gdk101/gdk101.cpp +0 -1
  213. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  214. esphome/components/gl_r01_i2c/sensor.py +1 -1
  215. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  216. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  217. esphome/components/gpio_expander/cached_gpio.h +24 -15
  218. esphome/components/gps/__init__.py +6 -2
  219. esphome/components/gps/gps.cpp +50 -49
  220. esphome/components/gps/gps.h +4 -8
  221. esphome/components/gps/time/gps_time.cpp +3 -9
  222. esphome/components/gps/time/gps_time.h +4 -7
  223. esphome/components/graph/__init__.py +1 -1
  224. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  225. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  227. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  228. esphome/components/haier/climate.py +5 -10
  229. esphome/components/haier/haier_base.cpp +0 -1
  230. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  231. esphome/components/hdc1080/hdc1080.cpp +0 -2
  232. esphome/components/heatpumpir/climate.py +2 -2
  233. esphome/components/hlw8012/hlw8012.cpp +0 -1
  234. esphome/components/hm3301/hm3301.cpp +0 -1
  235. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  236. esphome/components/homeassistant/__init__.py +1 -0
  237. esphome/components/homeassistant/number/__init__.py +1 -0
  238. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  239. esphome/components/homeassistant/switch/__init__.py +1 -0
  240. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  241. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  242. esphome/components/host/__init__.py +2 -0
  243. esphome/components/hte501/hte501.cpp +0 -1
  244. esphome/components/http_request/__init__.py +2 -3
  245. esphome/components/http_request/http_request_idf.cpp +2 -2
  246. esphome/components/htu21d/htu21d.cpp +0 -2
  247. esphome/components/htu31d/htu31d.cpp +0 -2
  248. esphome/components/hx711/hx711.cpp +0 -1
  249. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  250. esphome/components/hydreon_rgxx/sensor.py +4 -5
  251. esphome/components/i2c/i2c_bus.h +1 -1
  252. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  253. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  254. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  255. esphome/components/i2s_audio/__init__.py +6 -5
  256. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  257. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  258. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +46 -19
  260. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -3
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  262. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  263. esphome/components/ili9xxx/display.py +4 -3
  264. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  265. esphome/components/image/__init__.py +123 -92
  266. esphome/components/improv_serial/__init__.py +7 -8
  267. esphome/components/ina219/ina219.cpp +0 -1
  268. esphome/components/ina226/ina226.cpp +0 -2
  269. esphome/components/ina260/ina260.cpp +0 -2
  270. esphome/components/ina2xx_base/__init__.py +2 -5
  271. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  272. esphome/components/ina3221/ina3221.cpp +0 -1
  273. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  274. esphome/components/interval/interval.h +5 -9
  275. esphome/components/json/__init__.py +1 -1
  276. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  277. esphome/components/lc709203f/lc709203f.cpp +0 -2
  278. esphome/components/lcd_gpio/display.py +1 -3
  279. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  280. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  281. esphome/components/ld2410/__init__.py +4 -6
  282. esphome/components/ld2410/binary_sensor.py +4 -0
  283. esphome/components/ld2410/ld2410.cpp +56 -100
  284. esphome/components/ld2410/ld2410.h +17 -15
  285. esphome/components/ld2410/sensor.py +24 -10
  286. esphome/components/ld2412/__init__.py +46 -0
  287. esphome/components/ld2412/binary_sensor.py +70 -0
  288. esphome/components/ld2412/button/__init__.py +74 -0
  289. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  290. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  291. esphome/components/ld2412/button/query_button.cpp +9 -0
  292. esphome/components/ld2412/button/query_button.h +18 -0
  293. esphome/components/ld2412/button/restart_button.cpp +9 -0
  294. esphome/components/ld2412/button/restart_button.h +18 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  296. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  297. esphome/components/ld2412/ld2412.cpp +861 -0
  298. esphome/components/ld2412/ld2412.h +141 -0
  299. esphome/components/ld2412/number/__init__.py +126 -0
  300. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  301. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  302. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  303. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  305. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  306. esphome/components/ld2412/select/__init__.py +82 -0
  307. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  308. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  309. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  310. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  311. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  312. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  313. esphome/components/ld2412/sensor.py +124 -0
  314. esphome/components/ld2412/switch/__init__.py +45 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  316. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  318. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  319. esphome/components/ld2412/text_sensor.py +34 -0
  320. esphome/components/ld2420/ld2420.cpp +0 -1
  321. esphome/components/ld2450/__init__.py +3 -4
  322. esphome/components/ld2450/binary_sensor.py +3 -0
  323. esphome/components/ld2450/ld2450.cpp +77 -165
  324. esphome/components/ld2450/ld2450.h +26 -54
  325. esphome/components/ld2450/sensor.py +120 -6
  326. esphome/components/ld2450/text_sensor.py +5 -4
  327. esphome/components/ld24xx/__init__.py +1 -0
  328. esphome/components/ld24xx/ld24xx.h +65 -0
  329. esphome/components/ledc/ledc_output.cpp +0 -1
  330. esphome/components/libretiny/__init__.py +2 -0
  331. esphome/components/light/__init__.py +0 -1
  332. esphome/components/light/effects.py +70 -45
  333. esphome/components/light/light_call.cpp +101 -66
  334. esphome/components/light/light_color_values.h +16 -11
  335. esphome/components/light/light_json_schema.cpp +46 -44
  336. esphome/components/light/light_state.cpp +8 -11
  337. esphome/components/light/light_traits.h +17 -0
  338. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  339. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  340. esphome/components/lock/__init__.py +0 -1
  341. esphome/components/logger/__init__.py +31 -9
  342. esphome/components/logger/logger.cpp +12 -7
  343. esphome/components/logger/logger.h +25 -14
  344. esphome/components/logger/logger_esp32.cpp +2 -7
  345. esphome/components/logger/logger_esp8266.cpp +2 -4
  346. esphome/components/logger/logger_host.cpp +2 -4
  347. esphome/components/logger/logger_libretiny.cpp +2 -4
  348. esphome/components/logger/logger_rp2040.cpp +2 -4
  349. esphome/components/logger/logger_zephyr.cpp +86 -0
  350. esphome/components/logger/select/logger_level_select.cpp +2 -4
  351. esphome/components/logger/select/logger_level_select.h +2 -4
  352. esphome/components/logger/task_log_buffer.cpp +2 -4
  353. esphome/components/logger/task_log_buffer.h +2 -4
  354. esphome/components/lps22/sensor.py +5 -5
  355. esphome/components/ltr390/ltr390.cpp +0 -2
  356. esphome/components/ltr501/ltr501.cpp +0 -1
  357. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  358. esphome/components/lvgl/__init__.py +14 -13
  359. esphome/components/lvgl/automation.py +2 -4
  360. esphome/components/lvgl/defines.py +0 -2
  361. esphome/components/lvgl/helpers.py +1 -1
  362. esphome/components/lvgl/lv_validation.py +7 -4
  363. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  364. esphome/components/lvgl/styles.py +2 -2
  365. esphome/components/lvgl/types.py +1 -1
  366. esphome/components/lvgl/widgets/__init__.py +2 -2
  367. esphome/components/lvgl/widgets/arc.py +14 -11
  368. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  369. esphome/components/lvgl/widgets/qrcode.py +7 -7
  370. esphome/components/lvgl/widgets/spinner.py +6 -6
  371. esphome/components/lvgl/widgets/switch.py +2 -2
  372. esphome/components/lvgl/widgets/tabview.py +3 -3
  373. esphome/components/lvgl/widgets/tileview.py +15 -7
  374. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  375. esphome/components/matrix_keypad/__init__.py +4 -3
  376. esphome/components/max17043/max17043.cpp +0 -2
  377. esphome/components/max31855/max31855.cpp +1 -4
  378. esphome/components/max31856/max31856.cpp +0 -4
  379. esphome/components/max31865/max31865.cpp +0 -1
  380. esphome/components/max44009/max44009.cpp +0 -1
  381. esphome/components/max6675/max6675.cpp +1 -4
  382. esphome/components/max6956/max6956.cpp +0 -1
  383. esphome/components/max7219/max7219.cpp +0 -1
  384. esphome/components/max7219digit/display.py +1 -1
  385. esphome/components/max7219digit/max7219digit.cpp +0 -1
  386. esphome/components/max9611/max9611.cpp +0 -1
  387. esphome/components/mcp23008/__init__.py +1 -1
  388. esphome/components/mcp23008/mcp23008.cpp +0 -1
  389. esphome/components/mcp23016/mcp23016.cpp +0 -1
  390. esphome/components/mcp23017/__init__.py +1 -1
  391. esphome/components/mcp23017/mcp23017.cpp +0 -1
  392. esphome/components/mcp23s08/__init__.py +1 -1
  393. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  394. esphome/components/mcp23s17/__init__.py +1 -1
  395. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  396. esphome/components/mcp23x08_base/__init__.py +2 -0
  397. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  398. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  399. esphome/components/mcp23x17_base/__init__.py +2 -0
  400. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  401. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  402. esphome/components/mcp23xxx_base/__init__.py +11 -5
  403. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  404. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  405. esphome/components/mcp3008/mcp3008.cpp +1 -4
  406. esphome/components/mcp3204/mcp3204.cpp +1 -4
  407. esphome/components/mcp4461/mcp4461.cpp +0 -1
  408. esphome/components/mcp4725/mcp4725.cpp +0 -1
  409. esphome/components/mcp4728/mcp4728.cpp +0 -1
  410. esphome/components/mcp9600/mcp9600.cpp +0 -2
  411. esphome/components/mcp9808/mcp9808.cpp +0 -2
  412. esphome/components/mdns/__init__.py +3 -0
  413. esphome/components/mdns/mdns_component.cpp +2 -0
  414. esphome/components/mdns/mdns_component.h +4 -0
  415. esphome/components/media_player/__init__.py +40 -0
  416. esphome/components/media_player/automation.h +16 -0
  417. esphome/components/media_player/media_player.cpp +13 -0
  418. esphome/components/media_player/media_player.h +50 -3
  419. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  420. esphome/components/mics_4514/mics_4514.cpp +1 -6
  421. esphome/components/midea/ir_transmitter.h +4 -4
  422. esphome/components/mipi/__init__.py +416 -0
  423. esphome/components/mipi_dsi/__init__.py +5 -0
  424. esphome/components/mipi_dsi/display.py +233 -0
  425. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  426. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  427. esphome/components/mipi_dsi/models/__init__.py +0 -0
  428. esphome/components/mipi_dsi/models/guition.py +38 -0
  429. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  430. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  431. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  432. esphome/components/mipi_spi/__init__.py +0 -9
  433. esphome/components/mipi_spi/display.py +220 -256
  434. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  435. esphome/components/mipi_spi/mipi_spi.h +556 -108
  436. esphome/components/mipi_spi/models/__init__.py +0 -65
  437. esphome/components/mipi_spi/models/adafruit.py +30 -0
  438. esphome/components/mipi_spi/models/amoled.py +41 -5
  439. esphome/components/mipi_spi/models/ili.py +5 -5
  440. esphome/components/mipi_spi/models/jc.py +1 -3
  441. esphome/components/mipi_spi/models/lilygo.py +1 -1
  442. esphome/components/mipi_spi/models/waveshare.py +16 -1
  443. esphome/components/mixer/speaker/__init__.py +4 -5
  444. esphome/components/mlx90393/sensor.py +7 -5
  445. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  446. esphome/components/mlx90614/mlx90614.cpp +0 -1
  447. esphome/components/mmc5603/mmc5603.cpp +0 -1
  448. esphome/components/mmc5983/mmc5983.cpp +0 -2
  449. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  450. esphome/components/mpr121/__init__.py +7 -6
  451. esphome/components/mpr121/mpr121.cpp +0 -1
  452. esphome/components/mpu6050/mpu6050.cpp +0 -1
  453. esphome/components/mpu6886/mpu6886.cpp +0 -1
  454. esphome/components/mqtt/__init__.py +1 -2
  455. esphome/components/mqtt/mqtt_button.cpp +1 -1
  456. esphome/components/mqtt/mqtt_client.cpp +0 -1
  457. esphome/components/mqtt/mqtt_component.cpp +8 -14
  458. esphome/components/mqtt/mqtt_component.h +0 -7
  459. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_sensor.h +0 -1
  461. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  462. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  463. esphome/components/ms5611/ms5611.cpp +0 -1
  464. esphome/components/ms8607/ms8607.cpp +0 -1
  465. esphome/components/msa3xx/msa3xx.cpp +0 -2
  466. esphome/components/my9231/my9231.cpp +0 -2
  467. esphome/components/nau7802/nau7802.cpp +0 -1
  468. esphome/components/neopixelbus/light.py +3 -0
  469. esphome/components/network/util.cpp +29 -0
  470. esphome/components/nextion/nextion.cpp +0 -1
  471. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  472. esphome/components/npi19/npi19.cpp +0 -2
  473. esphome/components/nrf52/__init__.py +223 -0
  474. esphome/components/nrf52/boards.py +34 -0
  475. esphome/components/nrf52/const.py +18 -0
  476. esphome/components/nrf52/gpio.py +79 -0
  477. esphome/components/number/__init__.py +2 -1
  478. esphome/components/one_wire/__init__.py +1 -2
  479. esphome/components/one_wire/one_wire.cpp +0 -2
  480. esphome/components/one_wire/one_wire.h +0 -2
  481. esphome/components/opentherm/hub.cpp +0 -1
  482. esphome/components/opentherm/number/__init__.py +2 -2
  483. esphome/components/openthread/__init__.py +2 -3
  484. esphome/components/openthread/openthread.cpp +30 -13
  485. esphome/components/openthread/openthread.h +3 -0
  486. esphome/components/openthread/openthread_esp.cpp +3 -1
  487. esphome/components/opt3001/sensor.py +2 -6
  488. esphome/components/output/__init__.py +38 -0
  489. esphome/components/output/automation.h +24 -0
  490. esphome/components/output/switch/output_switch.cpp +0 -2
  491. esphome/components/packages/__init__.py +1 -2
  492. esphome/components/packet_transport/__init__.py +4 -3
  493. esphome/components/pca6416a/pca6416a.cpp +0 -1
  494. esphome/components/pca9554/pca9554.cpp +0 -1
  495. esphome/components/pca9685/pca9685_output.cpp +0 -2
  496. esphome/components/pcf85063/pcf85063.cpp +0 -1
  497. esphome/components/pcf8563/pcf8563.cpp +0 -1
  498. esphome/components/pcf8574/pcf8574.cpp +0 -1
  499. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  500. esphome/components/pipsolar/sensor/__init__.py +1 -1
  501. esphome/components/pm2005/pm2005.cpp +0 -1
  502. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  503. esphome/components/pmwcs3/sensor.py +1 -2
  504. esphome/components/pn532/pn532.cpp +0 -2
  505. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  506. esphome/components/power_supply/power_supply.cpp +7 -10
  507. esphome/components/power_supply/power_supply.h +1 -1
  508. esphome/components/psram/__init__.py +2 -1
  509. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  510. esphome/components/pulse_counter/sensor.py +9 -6
  511. esphome/components/pylontech/pylontech.cpp +0 -1
  512. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  513. esphome/components/qmp6988/qmp6988.cpp +0 -2
  514. esphome/components/qspi_dbi/display.py +2 -3
  515. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  516. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  517. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  518. esphome/components/rc522/rc522.cpp +9 -31
  519. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  520. esphome/components/remote_base/__init__.py +5 -6
  521. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  522. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  523. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  524. esphome/components/remote_transmitter/__init__.py +26 -0
  525. esphome/components/remote_transmitter/automation.h +18 -0
  526. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  527. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  528. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  529. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  530. esphome/components/resampler/speaker/__init__.py +4 -5
  531. esphome/components/rf_bridge/__init__.py +4 -8
  532. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  533. esphome/components/rp2040/__init__.py +3 -1
  534. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  535. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  536. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  537. esphome/components/rpi_dpi_rgb/display.py +13 -15
  538. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  539. esphome/components/runtime_stats/__init__.py +34 -0
  540. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  541. esphome/components/runtime_stats/runtime_stats.h +132 -0
  542. esphome/components/scd30/scd30.cpp +0 -2
  543. esphome/components/scd30/sensor.py +1 -2
  544. esphome/components/scd4x/scd4x.cpp +0 -1
  545. esphome/components/scd4x/sensor.py +1 -3
  546. esphome/components/sdl/display.py +3 -1
  547. esphome/components/sdl/sdl_esphome.cpp +0 -2
  548. esphome/components/sdp3x/sdp3x.cpp +0 -2
  549. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  550. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  551. esphome/components/select/__init__.py +2 -3
  552. esphome/components/select/select_traits.cpp +1 -1
  553. esphome/components/select/select_traits.h +1 -1
  554. esphome/components/sen0321/sen0321.cpp +0 -1
  555. esphome/components/sen5x/sen5x.cpp +0 -2
  556. esphome/components/sensor/__init__.py +36 -4
  557. esphome/components/sensor/filter.cpp +49 -10
  558. esphome/components/sensor/filter.h +22 -7
  559. esphome/components/sensor/sensor.cpp +0 -1
  560. esphome/components/sensor/sensor.h +0 -9
  561. esphome/components/sfa30/sfa30.cpp +0 -4
  562. esphome/components/sgp30/sgp30.cpp +0 -2
  563. esphome/components/sgp4x/sensor.py +1 -1
  564. esphome/components/sgp4x/sgp4x.cpp +0 -2
  565. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  566. esphome/components/sht3xd/sht3xd.cpp +0 -2
  567. esphome/components/sht4x/sht4x.cpp +0 -2
  568. esphome/components/shtcx/shtcx.cpp +0 -1
  569. esphome/components/sim800l/__init__.py +2 -4
  570. esphome/components/sm16716/sm16716.cpp +0 -1
  571. esphome/components/sm2135/sm2135.cpp +0 -1
  572. esphome/components/sm2235/sm2235.cpp +0 -1
  573. esphome/components/sm2335/sm2335.cpp +0 -1
  574. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  575. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  576. esphome/components/sntp/sntp_component.cpp +0 -1
  577. esphome/components/sound_level/sensor.py +1 -1
  578. esphome/components/speaker/media_player/__init__.py +21 -33
  579. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  580. esphome/components/spi/__init__.py +29 -13
  581. esphome/components/spi/spi.cpp +0 -2
  582. esphome/components/spi_device/spi_device.cpp +1 -4
  583. esphome/components/sprinkler/__init__.py +4 -4
  584. esphome/components/sps30/sps30.cpp +0 -1
  585. esphome/components/ssd1306_base/__init__.py +11 -11
  586. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  587. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  588. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  589. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  590. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  591. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  592. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  593. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  594. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  595. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  596. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  597. esphome/components/st7701s/display.py +10 -14
  598. esphome/components/st7701s/st7701s.cpp +0 -3
  599. esphome/components/st7735/st7735.cpp +0 -1
  600. esphome/components/st7789v/st7789v.cpp +0 -1
  601. esphome/components/st7920/st7920.cpp +0 -1
  602. esphome/components/status_led/light/status_led_light.cpp +0 -2
  603. esphome/components/status_led/status_led.cpp +0 -1
  604. esphome/components/stepper/__init__.py +2 -4
  605. esphome/components/sts3x/sts3x.cpp +0 -1
  606. esphome/components/substitutions/__init__.py +10 -16
  607. esphome/components/substitutions/jinja.py +24 -1
  608. esphome/components/sun/__init__.py +2 -3
  609. esphome/components/switch/__init__.py +31 -1
  610. esphome/components/switch/automation.h +24 -0
  611. esphome/components/switch/switch.cpp +8 -0
  612. esphome/components/switch/switch.h +8 -0
  613. esphome/components/sx126x/sx126x.cpp +0 -2
  614. esphome/components/sx127x/sx127x.cpp +0 -2
  615. esphome/components/sx1509/__init__.py +7 -5
  616. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  617. esphome/components/sx1509/sx1509.cpp +0 -2
  618. esphome/components/syslog/esphome_syslog.cpp +1 -1
  619. esphome/components/tc74/tc74.cpp +0 -1
  620. esphome/components/tca9548a/tca9548a.cpp +0 -1
  621. esphome/components/tca9555/tca9555.cpp +0 -1
  622. esphome/components/tcs34725/tcs34725.cpp +0 -1
  623. esphome/components/tee501/tee501.cpp +0 -1
  624. esphome/components/tem3200/tem3200.cpp +0 -2
  625. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  626. esphome/components/template/cover/template_cover.cpp +0 -1
  627. esphome/components/template/select/template_select.cpp +0 -1
  628. esphome/components/template/text/template_text.cpp +0 -2
  629. esphome/components/template/valve/template_valve.cpp +0 -1
  630. esphome/components/text/__init__.py +0 -1
  631. esphome/components/text/text_traits.h +2 -0
  632. esphome/components/text_sensor/__init__.py +2 -1
  633. esphome/components/text_sensor/text_sensor.cpp +0 -2
  634. esphome/components/text_sensor/text_sensor.h +0 -8
  635. esphome/components/thermostat/climate.py +4 -4
  636. esphome/components/time/__init__.py +7 -4
  637. esphome/components/time/real_time_clock.cpp +16 -3
  638. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  639. esphome/components/tlc5947/tlc5947.cpp +0 -2
  640. esphome/components/tlc5971/tlc5971.cpp +0 -2
  641. esphome/components/tm1621/tm1621.cpp +0 -2
  642. esphome/components/tm1637/tm1637.cpp +0 -2
  643. esphome/components/tm1638/tm1638.cpp +0 -2
  644. esphome/components/tm1651/__init__.py +45 -48
  645. esphome/components/tm1651/tm1651.cpp +213 -47
  646. esphome/components/tm1651/tm1651.h +37 -32
  647. esphome/components/tmp117/tmp117.cpp +0 -2
  648. esphome/components/tsl2561/tsl2561.cpp +0 -1
  649. esphome/components/tsl2591/tsl2591.cpp +0 -1
  650. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  651. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  652. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  653. esphome/components/tuya/climate/__init__.py +9 -10
  654. esphome/components/tuya/number/__init__.py +8 -6
  655. esphome/components/tx20/tx20.cpp +0 -1
  656. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  657. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  658. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  659. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  660. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  661. esphome/components/udp/__init__.py +1 -1
  662. esphome/components/ufire_ec/sensor.py +1 -2
  663. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  664. esphome/components/ufire_ise/sensor.py +1 -2
  665. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  666. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  667. esphome/components/update/__init__.py +0 -1
  668. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  669. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  670. esphome/components/usb_host/usb_host_client.cpp +0 -1
  671. esphome/components/usb_host/usb_host_component.cpp +0 -1
  672. esphome/components/valve/__init__.py +0 -1
  673. esphome/components/veml3235/veml3235.cpp +0 -3
  674. esphome/components/veml7700/veml7700.cpp +0 -2
  675. esphome/components/version/version_text_sensor.cpp +0 -1
  676. esphome/components/version/version_text_sensor.h +0 -1
  677. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  678. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  679. esphome/components/web_server/__init__.py +13 -0
  680. esphome/components/web_server/web_server.cpp +187 -352
  681. esphome/components/web_server/web_server.h +61 -1
  682. esphome/components/web_server_base/__init__.py +1 -1
  683. esphome/components/web_server_base/web_server_base.cpp +2 -0
  684. esphome/components/web_server_base/web_server_base.h +6 -0
  685. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  686. esphome/components/web_server_idf/web_server_idf.h +2 -0
  687. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  688. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  689. esphome/components/wifi/__init__.py +8 -43
  690. esphome/components/wifi/wifi_component.cpp +100 -36
  691. esphome/components/wifi/wifi_component.h +5 -1
  692. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  693. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  694. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  695. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  696. esphome/components/wireguard/wireguard.cpp +0 -2
  697. esphome/components/x9c/x9c.cpp +0 -2
  698. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  699. esphome/components/xl9535/xl9535.cpp +0 -2
  700. esphome/components/zephyr/__init__.py +252 -0
  701. esphome/components/zephyr/const.py +16 -0
  702. esphome/components/zephyr/core.cpp +90 -0
  703. esphome/components/zephyr/gpio.cpp +120 -0
  704. esphome/components/zephyr/gpio.h +38 -0
  705. esphome/components/zephyr/pre_build.py.script +4 -0
  706. esphome/components/zephyr/preferences.cpp +156 -0
  707. esphome/components/zephyr/preferences.h +13 -0
  708. esphome/config.py +38 -16
  709. esphome/config_helpers.py +1 -2
  710. esphome/config_validation.py +8 -15
  711. esphome/const.py +26 -1
  712. esphome/core/__init__.py +88 -51
  713. esphome/core/application.cpp +75 -21
  714. esphome/core/application.h +106 -171
  715. esphome/core/color.h +10 -0
  716. esphome/core/component.cpp +41 -25
  717. esphome/core/component.h +9 -6
  718. esphome/core/component_iterator.cpp +61 -261
  719. esphome/core/component_iterator.h +15 -0
  720. esphome/core/config.py +26 -11
  721. esphome/core/defines.h +40 -2
  722. esphome/core/entity_base.h +18 -0
  723. esphome/core/entity_helpers.py +41 -6
  724. esphome/core/helpers.cpp +8 -15
  725. esphome/core/helpers.h +60 -6
  726. esphome/core/lock_free_queue.h +1 -1
  727. esphome/core/scheduler.cpp +277 -74
  728. esphome/core/scheduler.h +89 -27
  729. esphome/cpp_generator.py +2 -6
  730. esphome/cpp_helpers.py +1 -1
  731. esphome/dashboard/dashboard.py +2 -3
  732. esphome/dashboard/dns.py +2 -8
  733. esphome/dashboard/web_server.py +34 -19
  734. esphome/espota2.py +1 -4
  735. esphome/git.py +3 -1
  736. esphome/helpers.py +23 -4
  737. esphome/log.py +3 -1
  738. esphome/mqtt.py +3 -5
  739. esphome/platformio_api.py +7 -4
  740. esphome/types.py +12 -0
  741. esphome/util.py +20 -8
  742. esphome/voluptuous_schema.py +4 -3
  743. esphome/vscode.py +1 -2
  744. esphome/wizard.py +1 -4
  745. esphome/writer.py +5 -107
  746. esphome/yaml_util.py +7 -5
  747. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/METADATA +12 -13
  748. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/RECORD +753 -673
  749. esphome/components/mipi_spi/models/commands.py +0 -82
  750. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  751. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/WHEEL +0 -0
  752. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/entry_points.txt +0 -0
  753. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/licenses/LICENSE +0 -0
  754. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/top_level.txt +0 -0
@@ -6,7 +6,6 @@
6
6
  #include "esphome/core/helpers.h"
7
7
 
8
8
  #include <array>
9
- #include <atomic>
10
9
  #include <string>
11
10
  #include <vector>
12
11
 
@@ -21,9 +20,9 @@
21
20
 
22
21
  #include "esphome/components/esp32_ble/ble.h"
23
22
  #include "esphome/components/esp32_ble/ble_uuid.h"
23
+ #include "esphome/components/esp32_ble/ble_scan_result.h"
24
24
 
25
- namespace esphome {
26
- namespace esp32_ble_tracker {
25
+ namespace esphome::esp32_ble_tracker {
27
26
 
28
27
  using namespace esp32_ble;
29
28
 
@@ -34,11 +33,14 @@ enum AdvertisementParserType {
34
33
  RAW_ADVERTISEMENTS,
35
34
  };
36
35
 
36
+ #ifdef USE_ESP32_BLE_UUID
37
37
  struct ServiceData {
38
38
  ESPBTUUID uuid;
39
39
  adv_data_t data;
40
40
  };
41
+ #endif
41
42
 
43
+ #ifdef USE_ESP32_BLE_DEVICE
42
44
  class ESPBLEiBeacon {
43
45
  public:
44
46
  ESPBLEiBeacon() { memset(&this->beacon_data_, 0, sizeof(this->beacon_data_)); }
@@ -116,13 +118,16 @@ class ESPBTDevice {
116
118
  std::vector<ServiceData> service_datas_{};
117
119
  const BLEScanResult *scan_result_{nullptr};
118
120
  };
121
+ #endif // USE_ESP32_BLE_DEVICE
119
122
 
120
123
  class ESP32BLETracker;
121
124
 
122
125
  class ESPBTDeviceListener {
123
126
  public:
124
127
  virtual void on_scan_end() {}
128
+ #ifdef USE_ESP32_BLE_DEVICE
125
129
  virtual bool parse_device(const ESPBTDevice &device) = 0;
130
+ #endif
126
131
  virtual bool parse_devices(const BLEScanResult *scan_results, size_t count) { return false; };
127
132
  virtual AdvertisementParserType get_advertisement_parser_type() {
128
133
  return AdvertisementParserType::PARSED_ADVERTISEMENTS;
@@ -133,6 +138,20 @@ class ESPBTDeviceListener {
133
138
  ESP32BLETracker *parent_{nullptr};
134
139
  };
135
140
 
141
+ struct ClientStateCounts {
142
+ uint8_t connecting = 0;
143
+ uint8_t discovered = 0;
144
+ uint8_t searching = 0;
145
+ uint8_t disconnecting = 0;
146
+
147
+ bool operator==(const ClientStateCounts &other) const {
148
+ return connecting == other.connecting && discovered == other.discovered && searching == other.searching &&
149
+ disconnecting == other.disconnecting;
150
+ }
151
+
152
+ bool operator!=(const ClientStateCounts &other) const { return !(*this == other); }
153
+ };
154
+
136
155
  enum class ClientState : uint8_t {
137
156
  // Connection is allocated
138
157
  INIT,
@@ -155,20 +174,21 @@ enum class ClientState : uint8_t {
155
174
  };
156
175
 
157
176
  enum class ScannerState {
158
- // Scanner is idle, init state, set from the main loop when processing STOPPED
177
+ // Scanner is idle, init state
159
178
  IDLE,
160
- // Scanner is starting, set from the main loop only
179
+ // Scanner is starting
161
180
  STARTING,
162
- // Scanner is running, set from the ESP callback only
181
+ // Scanner is running
163
182
  RUNNING,
164
- // Scanner failed to start, set from the ESP callback only
183
+ // Scanner failed to start
165
184
  FAILED,
166
- // Scanner is stopping, set from the main loop only
185
+ // Scanner is stopping
167
186
  STOPPING,
168
- // Scanner is stopped, set from the ESP callback only
169
- STOPPED,
170
187
  };
171
188
 
189
+ // Helper function to convert ClientState to string
190
+ const char *client_state_to_string(ClientState state);
191
+
172
192
  enum class ConnectionType : uint8_t {
173
193
  // The default connection type, we hold all the services in ram
174
194
  // for the duration of the connection.
@@ -237,7 +257,9 @@ class ESP32BLETracker : public Component,
237
257
  void register_client(ESPBTClient *client);
238
258
  void recalculate_advertisement_parser_types();
239
259
 
260
+ #ifdef USE_ESP32_BLE_DEVICE
240
261
  void print_bt_device_info(const ESPBTDevice &device);
262
+ #endif
241
263
 
242
264
  void start_scan();
243
265
  void stop_scan();
@@ -257,8 +279,6 @@ class ESP32BLETracker : public Component,
257
279
  void stop_scan_();
258
280
  /// Start a single scan by setting up the parameters and doing some esp-idf calls.
259
281
  void start_scan_(bool first);
260
- /// Called when a scan ends
261
- void end_of_scan_();
262
282
  /// Called when a `ESP_GAP_BLE_SCAN_RESULT_EVT` event is received.
263
283
  void gap_scan_result_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_param &param);
264
284
  /// Called when a `ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT` event is received.
@@ -269,53 +289,99 @@ class ESP32BLETracker : public Component,
269
289
  void gap_scan_stop_complete_(const esp_ble_gap_cb_param_t::ble_scan_stop_cmpl_evt_param &param);
270
290
  /// Called to set the scanner state. Will also call callbacks to let listeners know when state is changed.
271
291
  void set_scanner_state_(ScannerState state);
292
+ /// Common cleanup logic when transitioning scanner to IDLE state
293
+ void cleanup_scan_state_(bool is_stop_complete);
294
+ /// Process a single scan result immediately
295
+ /// Returns true if a discovered client needs promotion to READY_TO_CONNECT
296
+ bool process_scan_result_(const BLEScanResult &scan_result);
297
+ #ifdef USE_ESP32_BLE_DEVICE
298
+ /// Check if any clients are in connecting or ready to connect state
299
+ bool has_connecting_clients_() const;
300
+ #endif
301
+ /// Handle scanner failure states
302
+ void handle_scanner_failure_();
303
+ /// Try to promote discovered clients to ready to connect
304
+ void try_promote_discovered_clients_();
305
+ /// Convert scanner state enum to string for logging
306
+ const char *scanner_state_to_string_(ScannerState state) const;
307
+ /// Log an unexpected scanner state
308
+ void log_unexpected_state_(const char *operation, ScannerState expected_state) const;
309
+ #ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
310
+ /// Update BLE coexistence preference
311
+ void update_coex_preference_(bool force_ble);
312
+ #endif
313
+ /// Count clients in each state
314
+ ClientStateCounts count_client_states_() const {
315
+ ClientStateCounts counts;
316
+ for (auto *client : this->clients_) {
317
+ switch (client->state()) {
318
+ case ClientState::DISCONNECTING:
319
+ counts.disconnecting++;
320
+ break;
321
+ case ClientState::DISCOVERED:
322
+ counts.discovered++;
323
+ break;
324
+ case ClientState::SEARCHING:
325
+ counts.searching++;
326
+ break;
327
+ case ClientState::CONNECTING:
328
+ case ClientState::READY_TO_CONNECT:
329
+ counts.connecting++;
330
+ break;
331
+ default:
332
+ break;
333
+ }
334
+ }
335
+ return counts;
336
+ }
272
337
 
273
- uint8_t app_id_{0};
274
-
275
- /// Vector of addresses that have already been printed in print_bt_device_info
276
- std::vector<uint64_t> already_discovered_;
338
+ // Group 1: Large objects (12+ bytes) - vectors and callback manager
277
339
  std::vector<ESPBTDeviceListener *> listeners_;
278
- /// Client parameters.
279
340
  std::vector<ESPBTClient *> clients_;
341
+ CallbackManager<void(ScannerState)> scanner_state_callbacks_;
342
+ #ifdef USE_ESP32_BLE_DEVICE
343
+ /// Vector of addresses that have already been printed in print_bt_device_info
344
+ std::vector<uint64_t> already_discovered_;
345
+ #endif
346
+
347
+ // Group 2: Structs (aligned to 4 bytes)
280
348
  /// A structure holding the ESP BLE scan parameters.
281
349
  esp_ble_scan_params_t scan_params_;
350
+ ClientStateCounts client_state_counts_;
351
+
352
+ // Group 3: 4-byte types
282
353
  /// The interval in seconds to perform scans.
283
354
  uint32_t scan_duration_;
284
355
  uint32_t scan_interval_;
285
356
  uint32_t scan_window_;
357
+ esp_bt_status_t scan_start_failed_{ESP_BT_STATUS_SUCCESS};
358
+ esp_bt_status_t scan_set_param_failed_{ESP_BT_STATUS_SUCCESS};
359
+
360
+ // Group 4: 1-byte types (enums, uint8_t, bool)
361
+ uint8_t app_id_{0};
286
362
  uint8_t scan_start_fail_count_{0};
363
+ ScannerState scanner_state_{ScannerState::IDLE};
287
364
  bool scan_continuous_;
288
365
  bool scan_active_;
289
- ScannerState scanner_state_{ScannerState::IDLE};
290
- CallbackManager<void(ScannerState)> scanner_state_callbacks_;
291
366
  bool ble_was_disabled_{true};
292
367
  bool raw_advertisements_{false};
293
368
  bool parse_advertisements_{false};
294
-
295
- // Lock-free Single-Producer Single-Consumer (SPSC) ring buffer for scan results
296
- // Producer: ESP-IDF Bluetooth stack callback (gap_scan_event_handler)
297
- // Consumer: ESPHome main loop (loop() method)
298
- // This design ensures zero blocking in the BT callback and prevents scan result loss
299
- BLEScanResult *scan_ring_buffer_;
300
- std::atomic<uint8_t> ring_write_index_{0}; // Written only by BT callback (producer)
301
- std::atomic<uint8_t> ring_read_index_{0}; // Written only by main loop (consumer)
302
- std::atomic<uint16_t> scan_results_dropped_{0}; // Tracks buffer overflow events
303
-
304
- esp_bt_status_t scan_start_failed_{ESP_BT_STATUS_SUCCESS};
305
- esp_bt_status_t scan_set_param_failed_{ESP_BT_STATUS_SUCCESS};
306
- int connecting_{0};
307
- int discovered_{0};
308
- int searching_{0};
309
- int disconnecting_{0};
310
369
  #ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
311
370
  bool coex_prefer_ble_{false};
312
371
  #endif
372
+ // Scan timeout state machine
373
+ enum class ScanTimeoutState : uint8_t {
374
+ INACTIVE, // No timeout monitoring
375
+ MONITORING, // Actively monitoring for timeout
376
+ EXCEEDED_WAIT, // Timeout exceeded, waiting one loop before reboot
377
+ };
378
+ uint32_t scan_start_time_{0};
379
+ ScanTimeoutState scan_timeout_state_{ScanTimeoutState::INACTIVE};
313
380
  };
314
381
 
315
382
  // NOLINTNEXTLINE
316
383
  extern ESP32BLETracker *global_esp32_ble_tracker;
317
384
 
318
- } // namespace esp32_ble_tracker
319
- } // namespace esphome
385
+ } // namespace esphome::esp32_ble_tracker
320
386
 
321
387
  #endif
@@ -119,6 +119,12 @@ ENUM_SPECIAL_EFFECT = {
119
119
  "SEPIA": ESP32SpecialEffect.ESP32_SPECIAL_EFFECT_SEPIA,
120
120
  }
121
121
 
122
+ camera_fb_location_t = cg.global_ns.enum("camera_fb_location_t")
123
+ ENUM_FB_LOCATION = {
124
+ "PSRAM": cg.global_ns.CAMERA_FB_IN_PSRAM,
125
+ "DRAM": cg.global_ns.CAMERA_FB_IN_DRAM,
126
+ }
127
+
122
128
  # pin assignment
123
129
  CONF_HREF_PIN = "href_pin"
124
130
  CONF_PIXEL_CLOCK_PIN = "pixel_clock_pin"
@@ -149,6 +155,7 @@ CONF_MAX_FRAMERATE = "max_framerate"
149
155
  CONF_IDLE_FRAMERATE = "idle_framerate"
150
156
  # frame buffer
151
157
  CONF_FRAME_BUFFER_COUNT = "frame_buffer_count"
158
+ CONF_FRAME_BUFFER_LOCATION = "frame_buffer_location"
152
159
 
153
160
  # stream trigger
154
161
  CONF_ON_STREAM_START = "on_stream_start"
@@ -230,6 +237,9 @@ CONFIG_SCHEMA = cv.All(
230
237
  cv.framerate, cv.Range(min=0, max=1)
231
238
  ),
232
239
  cv.Optional(CONF_FRAME_BUFFER_COUNT, default=1): cv.int_range(min=1, max=2),
240
+ cv.Optional(CONF_FRAME_BUFFER_LOCATION, default="PSRAM"): cv.enum(
241
+ ENUM_FB_LOCATION, upper=True
242
+ ),
233
243
  cv.Optional(CONF_ON_STREAM_START): automation.validate_automation(
234
244
  {
235
245
  cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
@@ -301,6 +311,7 @@ SETTERS = {
301
311
  CONF_WB_MODE: "set_wb_mode",
302
312
  # test pattern
303
313
  CONF_TEST_PATTERN: "set_test_pattern",
314
+ CONF_FRAME_BUFFER_LOCATION: "set_frame_buffer_location",
304
315
  }
305
316
 
306
317
 
@@ -328,12 +339,13 @@ async def to_code(config):
328
339
  else:
329
340
  cg.add(var.set_idle_update_interval(1000 / config[CONF_IDLE_FRAMERATE]))
330
341
  cg.add(var.set_frame_buffer_count(config[CONF_FRAME_BUFFER_COUNT]))
342
+ cg.add(var.set_frame_buffer_location(config[CONF_FRAME_BUFFER_LOCATION]))
331
343
  cg.add(var.set_frame_size(config[CONF_RESOLUTION]))
332
344
 
333
345
  cg.add_define("USE_CAMERA")
334
346
 
335
347
  if CORE.using_esp_idf:
336
- add_idf_component(name="espressif/esp32-camera", ref="2.0.15")
348
+ add_idf_component(name="espressif/esp32-camera", ref="2.1.1")
337
349
 
338
350
  for conf in config.get(CONF_ON_STREAM_START, []):
339
351
  trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
@@ -133,6 +133,7 @@ void ESP32Camera::dump_config() {
133
133
  ESP_LOGCONFIG(TAG,
134
134
  " JPEG Quality: %u\n"
135
135
  " Framebuffer Count: %u\n"
136
+ " Framebuffer Location: %s\n"
136
137
  " Contrast: %d\n"
137
138
  " Brightness: %d\n"
138
139
  " Saturation: %d\n"
@@ -140,8 +141,9 @@ void ESP32Camera::dump_config() {
140
141
  " Horizontal Mirror: %s\n"
141
142
  " Special Effect: %u\n"
142
143
  " White Balance Mode: %u",
143
- st.quality, conf.fb_count, st.contrast, st.brightness, st.saturation, ONOFF(st.vflip),
144
- ONOFF(st.hmirror), st.special_effect, st.wb_mode);
144
+ st.quality, conf.fb_count, this->config_.fb_location == CAMERA_FB_IN_PSRAM ? "PSRAM" : "DRAM",
145
+ st.contrast, st.brightness, st.saturation, ONOFF(st.vflip), ONOFF(st.hmirror), st.special_effect,
146
+ st.wb_mode);
145
147
  // ESP_LOGCONFIG(TAG, " Auto White Balance: %u", st.awb);
146
148
  // ESP_LOGCONFIG(TAG, " Auto White Balance Gain: %u", st.awb_gain);
147
149
  ESP_LOGCONFIG(TAG,
@@ -350,6 +352,9 @@ void ESP32Camera::set_frame_buffer_count(uint8_t fb_count) {
350
352
  this->config_.fb_count = fb_count;
351
353
  this->set_frame_buffer_mode(fb_count > 1 ? CAMERA_GRAB_LATEST : CAMERA_GRAB_WHEN_EMPTY);
352
354
  }
355
+ void ESP32Camera::set_frame_buffer_location(camera_fb_location_t fb_location) {
356
+ this->config_.fb_location = fb_location;
357
+ }
353
358
 
354
359
  /* ---------------- public API (specific) ---------------- */
355
360
  void ESP32Camera::add_image_callback(std::function<void(std::shared_ptr<camera::CameraImage>)> &&callback) {
@@ -152,6 +152,7 @@ class ESP32Camera : public camera::Camera {
152
152
  /* -- frame buffer */
153
153
  void set_frame_buffer_mode(camera_grab_mode_t mode);
154
154
  void set_frame_buffer_count(uint8_t fb_count);
155
+ void set_frame_buffer_location(camera_fb_location_t fb_location);
155
156
 
156
157
  /* public API (derivated) */
157
158
  void setup() override;
@@ -2,11 +2,7 @@
2
2
  #include "esphome/core/helpers.h"
3
3
  #include "esphome/core/log.h"
4
4
 
5
- #ifdef USE_ESP32
6
-
7
- #ifdef USE_ARDUINO
8
- #include <esp32-hal-dac.h>
9
- #endif
5
+ #if defined(USE_ESP32_VARIANT_ESP32) || defined(USE_ESP32_VARIANT_ESP32S2)
10
6
 
11
7
  namespace esphome {
12
8
  namespace esp32_dac {
@@ -20,22 +16,15 @@ static constexpr uint8_t DAC0_PIN = 25;
20
16
  static const char *const TAG = "esp32_dac";
21
17
 
22
18
  void ESP32DAC::setup() {
23
- ESP_LOGCONFIG(TAG, "Running setup");
24
19
  this->pin_->setup();
25
20
  this->turn_off();
26
21
 
27
- #ifdef USE_ESP_IDF
28
22
  const dac_channel_t channel = this->pin_->get_pin() == DAC0_PIN ? DAC_CHAN_0 : DAC_CHAN_1;
29
23
  const dac_oneshot_config_t oneshot_cfg{channel};
30
24
  dac_oneshot_new_channel(&oneshot_cfg, &this->dac_handle_);
31
- #endif
32
25
  }
33
26
 
34
- void ESP32DAC::on_safe_shutdown() {
35
- #ifdef USE_ESP_IDF
36
- dac_oneshot_del_channel(this->dac_handle_);
37
- #endif
38
- }
27
+ void ESP32DAC::on_safe_shutdown() { dac_oneshot_del_channel(this->dac_handle_); }
39
28
 
40
29
  void ESP32DAC::dump_config() {
41
30
  ESP_LOGCONFIG(TAG, "ESP32 DAC:");
@@ -49,15 +38,10 @@ void ESP32DAC::write_state(float state) {
49
38
 
50
39
  state = state * 255;
51
40
 
52
- #ifdef USE_ESP_IDF
53
41
  dac_oneshot_output_voltage(this->dac_handle_, state);
54
- #endif
55
- #ifdef USE_ARDUINO
56
- dacWrite(this->pin_->get_pin(), state);
57
- #endif
58
42
  }
59
43
 
60
44
  } // namespace esp32_dac
61
45
  } // namespace esphome
62
46
 
63
- #endif
47
+ #endif // USE_ESP32_VARIANT_ESP32 || USE_ESP32_VARIANT_ESP32S2
@@ -1,15 +1,13 @@
1
1
  #pragma once
2
2
 
3
+ #include "esphome/components/output/float_output.h"
4
+ #include "esphome/core/automation.h"
3
5
  #include "esphome/core/component.h"
4
6
  #include "esphome/core/hal.h"
5
- #include "esphome/core/automation.h"
6
- #include "esphome/components/output/float_output.h"
7
7
 
8
- #ifdef USE_ESP32
8
+ #if defined(USE_ESP32_VARIANT_ESP32) || defined(USE_ESP32_VARIANT_ESP32S2)
9
9
 
10
- #ifdef USE_ESP_IDF
11
10
  #include <driver/dac_oneshot.h>
12
- #endif
13
11
 
14
12
  namespace esphome {
15
13
  namespace esp32_dac {
@@ -29,12 +27,10 @@ class ESP32DAC : public output::FloatOutput, public Component {
29
27
  void write_state(float state) override;
30
28
 
31
29
  InternalGPIOPin *pin_;
32
- #ifdef USE_ESP_IDF
33
30
  dac_oneshot_handle_t dac_handle_;
34
- #endif
35
31
  };
36
32
 
37
33
  } // namespace esp32_dac
38
34
  } // namespace esphome
39
35
 
40
- #endif
36
+ #endif // USE_ESP32_VARIANT_ESP32 || USE_ESP32_VARIANT_ESP32S2
@@ -42,9 +42,6 @@ static size_t IRAM_ATTR HOT encoder_callback(const void *data, size_t size, size
42
42
  symbols[i] = params->bit0;
43
43
  }
44
44
  }
45
- if ((index + 1) >= size && params->reset.duration0 == 0 && params->reset.duration1 == 0) {
46
- *done = true;
47
- }
48
45
  return RMT_SYMBOLS_PER_BYTE;
49
46
  }
50
47
 
@@ -59,8 +56,6 @@ static size_t IRAM_ATTR HOT encoder_callback(const void *data, size_t size, size
59
56
  #endif
60
57
 
61
58
  void ESP32RMTLEDStripLightOutput::setup() {
62
- ESP_LOGCONFIG(TAG, "Running setup");
63
-
64
59
  size_t buffer_size = this->get_buffer_size_();
65
60
 
66
61
  RAMAllocator<uint8_t> allocator(this->use_psram_ ? 0 : RAMAllocator<uint8_t>::ALLOC_INTERNAL);
@@ -112,7 +107,7 @@ void ESP32RMTLEDStripLightOutput::setup() {
112
107
  memset(&encoder, 0, sizeof(encoder));
113
108
  encoder.callback = encoder_callback;
114
109
  encoder.arg = &this->params_;
115
- encoder.min_chunk_size = 8;
110
+ encoder.min_chunk_size = RMT_SYMBOLS_PER_BYTE;
116
111
  if (rmt_new_simple_encoder(&encoder, &this->encoder_) != ESP_OK) {
117
112
  ESP_LOGE(TAG, "Encoder creation failed");
118
113
  this->mark_failed();
@@ -4,6 +4,7 @@ import logging
4
4
  from esphome import pins
5
5
  import esphome.codegen as cg
6
6
  from esphome.components import esp32, light
7
+ from esphome.components.const import CONF_USE_PSRAM
7
8
  import esphome.config_validation as cv
8
9
  from esphome.const import (
9
10
  CONF_CHIPSET,
@@ -57,7 +58,6 @@ CHIPSETS = {
57
58
  "SM16703": LEDStripTimings(300, 900, 900, 300, 0, 0),
58
59
  }
59
60
 
60
- CONF_USE_PSRAM = "use_psram"
61
61
  CONF_IS_WRGB = "is_wrgb"
62
62
  CONF_BIT0_HIGH = "bit0_high"
63
63
  CONF_BIT0_LOW = "bit0_low"
@@ -294,9 +294,8 @@ async def to_code(config):
294
294
  )
295
295
  )
296
296
 
297
- if get_esp32_variant() == VARIANT_ESP32:
298
- if CONF_IIR_FILTER in config:
299
- cg.add(touch.set_iir_filter(config[CONF_IIR_FILTER]))
297
+ if get_esp32_variant() == VARIANT_ESP32 and CONF_IIR_FILTER in config:
298
+ cg.add(touch.set_iir_filter(config[CONF_IIR_FILTER]))
300
299
 
301
300
  if get_esp32_variant() == VARIANT_ESP32S2 or get_esp32_variant() == VARIANT_ESP32S3:
302
301
  if CONF_FILTER_MODE in config:
@@ -171,8 +171,8 @@ class ESP32TouchComponent : public Component {
171
171
  // based on the filter configuration
172
172
  uint32_t read_touch_value(touch_pad_t pad) const;
173
173
 
174
- // Helper to update touch state with a known state
175
- void update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched);
174
+ // Helper to update touch state with a known state and value
175
+ void update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched, uint32_t value);
176
176
 
177
177
  // Helper to read touch value and update state for a given child
178
178
  bool check_and_update_touch_state_(ESP32TouchBinarySensor *child);
@@ -234,9 +234,13 @@ class ESP32TouchBinarySensor : public binary_sensor::BinarySensor {
234
234
  touch_pad_t get_touch_pad() const { return this->touch_pad_; }
235
235
  uint32_t get_threshold() const { return this->threshold_; }
236
236
  void set_threshold(uint32_t threshold) { this->threshold_ = threshold; }
237
- #ifdef USE_ESP32_VARIANT_ESP32
237
+
238
+ /// Get the raw touch measurement value.
239
+ /// @note Although this method may appear unused within the component, it is a public API
240
+ /// used by lambdas in user configurations for custom touch value processing.
241
+ /// @return The current raw touch sensor reading
238
242
  uint32_t get_value() const { return this->value_; }
239
- #endif
243
+
240
244
  uint32_t get_wakeup_threshold() const { return this->wakeup_threshold_; }
241
245
 
242
246
  protected:
@@ -245,9 +249,8 @@ class ESP32TouchBinarySensor : public binary_sensor::BinarySensor {
245
249
  touch_pad_t touch_pad_{TOUCH_PAD_MAX};
246
250
  uint32_t threshold_{0};
247
251
  uint32_t benchmark_{};
248
- #ifdef USE_ESP32_VARIANT_ESP32
252
+ /// Stores the last raw touch measurement value.
249
253
  uint32_t value_{0};
250
- #endif
251
254
  bool last_state_{false};
252
255
  const uint32_t wakeup_threshold_{0};
253
256
 
@@ -100,6 +100,8 @@ void ESP32TouchComponent::process_setup_mode_logging_(uint32_t now) {
100
100
  #else
101
101
  // Read the value being used for touch detection
102
102
  uint32_t value = this->read_touch_value(child->get_touch_pad());
103
+ // Store the value for get_value() access in lambdas
104
+ child->value_ = value;
103
105
  ESP_LOGD(TAG, "Touch Pad '%s' (T%d): %d", child->get_name().c_str(), child->get_touch_pad(), value);
104
106
  #endif
105
107
  }
@@ -201,15 +201,13 @@ void IRAM_ATTR ESP32TouchComponent::touch_isr_handler(void *arg) {
201
201
  touch_pad_t pad = child->get_touch_pad();
202
202
 
203
203
  // Read current value using ISR-safe API
204
- uint32_t value;
205
- if (component->iir_filter_enabled_()) {
206
- uint16_t temp_value = 0;
207
- touch_pad_read_filtered(pad, &temp_value);
208
- value = temp_value;
209
- } else {
210
- // Use low-level HAL function when filter is not enabled
211
- value = touch_ll_read_raw_data(pad);
212
- }
204
+ // IMPORTANT: ESP-IDF v5.4 regression - touch_pad_read_filtered() is no longer ISR-safe
205
+ // In ESP-IDF v5.3 and earlier it was ISR-safe, but ESP-IDF v5.4 added mutex protection that causes:
206
+ // "assert failed: xQueueSemaphoreTake queue.c:1718"
207
+ // We must use raw values even when filter is enabled as a workaround.
208
+ // Users should adjust thresholds to compensate for the lack of IIR filtering.
209
+ // See: https://github.com/espressif/esp-idf/issues/17045
210
+ uint32_t value = touch_ll_read_raw_data(pad);
213
211
 
214
212
  // Skip pads that aren’t in the trigger mask
215
213
  if (((mask >> pad) & 1) == 0) {
@@ -10,8 +10,11 @@ namespace esp32_touch {
10
10
 
11
11
  static const char *const TAG = "esp32_touch";
12
12
 
13
- // Helper to update touch state with a known state
14
- void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched) {
13
+ // Helper to update touch state with a known state and value
14
+ void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched, uint32_t value) {
15
+ // Store the value for get_value() access in lambdas
16
+ child->value_ = value;
17
+
15
18
  // Always update timer when touched
16
19
  if (is_touched) {
17
20
  child->last_touch_time_ = App.get_loop_component_start_time();
@@ -21,9 +24,8 @@ void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, boo
21
24
  child->last_state_ = is_touched;
22
25
  child->publish_state(is_touched);
23
26
  if (is_touched) {
24
- // ESP32-S2/S3 v2: touched when value > threshold
25
27
  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_);
28
+ value, child->threshold_ + child->benchmark_);
27
29
  } else {
28
30
  ESP_LOGV(TAG, "Touch Pad '%s' state: OFF", child->get_name().c_str());
29
31
  }
@@ -41,7 +43,7 @@ bool ESP32TouchComponent::check_and_update_touch_state_(ESP32TouchBinarySensor *
41
43
  child->get_name().c_str(), child->touch_pad_, value, child->threshold_, child->benchmark_);
42
44
  bool is_touched = value > child->benchmark_ + child->threshold_;
43
45
 
44
- this->update_touch_state_(child, is_touched);
46
+ this->update_touch_state_(child, is_touched, value);
45
47
  return is_touched;
46
48
  }
47
49
 
@@ -296,7 +298,9 @@ void ESP32TouchComponent::loop() {
296
298
  this->check_and_update_touch_state_(child);
297
299
  } else if (event.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE) {
298
300
  // We only get ACTIVE interrupts now, releases are detected by timeout
299
- this->update_touch_state_(child, true); // Always touched for ACTIVE interrupts
301
+ // Read the current value
302
+ uint32_t value = this->read_touch_value(child->touch_pad_);
303
+ this->update_touch_state_(child, true, value); // Always touched for ACTIVE interrupts
300
304
  }
301
305
  break;
302
306
  }
@@ -15,6 +15,7 @@ from esphome.const import (
15
15
  KEY_TARGET_FRAMEWORK,
16
16
  KEY_TARGET_PLATFORM,
17
17
  PLATFORM_ESP8266,
18
+ ThreadModel,
18
19
  )
19
20
  from esphome.core import CORE, coroutine_with_priority
20
21
  from esphome.helpers import copy_file_if_changed
@@ -187,6 +188,7 @@ async def to_code(config):
187
188
  cg.set_cpp_standard("gnu++20")
188
189
  cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
189
190
  cg.add_define("ESPHOME_VARIANT", "ESP8266")
191
+ cg.add_define(ThreadModel.SINGLE)
190
192
 
191
193
  cg.add_platformio_option("extra_scripts", ["post:post_build.py"])
192
194
 
@@ -243,7 +245,7 @@ async def to_code(config):
243
245
  if ver <= cv.Version(2, 3, 0):
244
246
  # No ld script support
245
247
  ld_script = None
246
- if ver <= cv.Version(2, 4, 2):
248
+ elif ver <= cv.Version(2, 4, 2):
247
249
  # Old ld script path
248
250
  ld_script = ld_scripts[0]
249
251
  else:
@@ -14,7 +14,6 @@ namespace esp8266_pwm {
14
14
  static const char *const TAG = "esp8266_pwm";
15
15
 
16
16
  void ESP8266PWM::setup() {
17
- ESP_LOGCONFIG(TAG, "Running setup");
18
17
  this->pin_->setup();
19
18
  this->turn_off();
20
19
  }
@@ -73,8 +73,7 @@ def ota_esphome_final_validate(config):
73
73
  else:
74
74
  new_ota_conf.append(ota_conf)
75
75
 
76
- for port_conf in merged_ota_esphome_configs_by_port.values():
77
- new_ota_conf.append(port_conf)
76
+ new_ota_conf.extend(merged_ota_esphome_configs_by_port.values())
78
77
 
79
78
  full_conf[CONF_OTA] = new_ota_conf
80
79
  fv.full_config.set(full_conf)