esphome 2025.5.2__py3-none-any.whl → 2025.6.0b2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (746) hide show
  1. esphome/__main__.py +20 -14
  2. esphome/components/a4988/a4988.cpp +1 -1
  3. esphome/components/absolute_humidity/absolute_humidity.cpp +6 -4
  4. esphome/components/ac_dimmer/ac_dimmer.cpp +4 -2
  5. esphome/components/adc/adc_sensor_esp32.cpp +5 -3
  6. esphome/components/adc/adc_sensor_esp8266.cpp +5 -3
  7. esphome/components/adc/adc_sensor_libretiny.cpp +5 -3
  8. esphome/components/adc/adc_sensor_rp2040.cpp +5 -3
  9. esphome/components/adc128s102/adc128s102.cpp +1 -1
  10. esphome/components/ade7880/ade7880.cpp +28 -17
  11. esphome/components/ade7953_base/ade7953_base.cpp +12 -9
  12. esphome/components/ade7953_i2c/ade7953_i2c.cpp +1 -1
  13. esphome/components/ade7953_spi/ade7953_spi.cpp +1 -1
  14. esphome/components/ads1115/ads1115.cpp +3 -5
  15. esphome/components/ads1118/ads1118.cpp +2 -1
  16. esphome/components/ags10/ags10.cpp +3 -2
  17. esphome/components/aht10/aht10.cpp +27 -29
  18. esphome/components/aic3204/aic3204.cpp +2 -2
  19. esphome/components/alarm_control_panel/__init__.py +1 -0
  20. esphome/components/am2315c/am2315c.cpp +2 -2
  21. esphome/components/am2320/am2320.cpp +2 -2
  22. esphome/components/am43/am43_base.h +1 -1
  23. esphome/components/am43/cover/am43_cover.cpp +4 -2
  24. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +4 -2
  25. esphome/components/apds9306/apds9306.cpp +8 -5
  26. esphome/components/apds9960/apds9960.cpp +2 -2
  27. esphome/components/api/__init__.py +5 -0
  28. esphome/components/api/api_connection.cpp +753 -379
  29. esphome/components/api/api_connection.h +341 -283
  30. esphome/components/api/api_frame_helper.cpp +349 -344
  31. esphome/components/api/api_frame_helper.h +121 -94
  32. esphome/components/api/api_pb2.cpp +3 -0
  33. esphome/components/api/api_pb2.h +702 -227
  34. esphome/components/api/api_pb2_service.cpp +12 -688
  35. esphome/components/api/api_pb2_service.h +53 -207
  36. esphome/components/api/api_server.cpp +71 -29
  37. esphome/components/api/api_server.h +9 -0
  38. esphome/components/api/client.py +5 -4
  39. esphome/components/api/homeassistant_service.h +1 -1
  40. esphome/components/api/list_entities.cpp +1 -1
  41. esphome/components/api/proto.cpp +1 -0
  42. esphome/components/api/proto.h +5 -4
  43. esphome/components/api/subscribe_state.cpp +8 -16
  44. esphome/components/as3935/as3935.cpp +3 -3
  45. esphome/components/as5600/as5600.cpp +9 -7
  46. esphome/components/as7341/as7341.cpp +7 -5
  47. esphome/components/at581x/at581x.cpp +13 -10
  48. esphome/components/atm90e26/atm90e26.cpp +2 -2
  49. esphome/components/atm90e32/atm90e32.cpp +3 -3
  50. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +5 -3
  51. esphome/components/bang_bang/bang_bang_climate.cpp +8 -5
  52. esphome/components/bedjet/bedjet_hub.cpp +6 -4
  53. esphome/components/beken_spi_led_strip/led_strip.cpp +11 -7
  54. esphome/components/bh1750/bh1750.cpp +2 -2
  55. esphome/components/binary_sensor/__init__.py +1 -0
  56. esphome/components/binary_sensor/automation.cpp +1 -2
  57. esphome/components/bl0906/bl0906.cpp +1 -1
  58. esphome/components/bl0942/bl0942.cpp +11 -8
  59. esphome/components/bl0942/sensor.py +1 -1
  60. esphome/components/ble_client/__init__.py +5 -1
  61. esphome/components/ble_client/output/ble_binary_output.cpp +6 -3
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +9 -6
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +8 -5
  64. esphome/components/bluetooth_proxy/__init__.py +5 -1
  65. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -5
  66. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +18 -16
  67. esphome/components/bluetooth_proxy/bluetooth_proxy.h +1 -1
  68. esphome/components/bme280_base/bme280_base.cpp +5 -6
  69. esphome/components/bme680/bme680.cpp +3 -3
  70. esphome/components/bme680/sensor.py +2 -2
  71. esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
  72. esphome/components/bme680_bsec/sensor.py +7 -3
  73. esphome/components/bme68x_bsec2/__init__.py +6 -5
  74. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
  75. esphome/components/bme68x_bsec2/sensor.py +4 -4
  76. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
  77. esphome/components/bmi160/bmi160.cpp +11 -11
  78. esphome/components/bmp085/bmp085.cpp +2 -2
  79. esphome/components/bmp280_base/bmp280_base.cpp +3 -3
  80. esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
  81. esphome/components/bmp581/bmp581.cpp +33 -27
  82. esphome/components/bp1658cj/bp1658cj.cpp +5 -3
  83. esphome/components/bp5758d/bp5758d.cpp +1 -1
  84. esphome/components/button/__init__.py +1 -0
  85. esphome/components/canbus/canbus.cpp +1 -1
  86. esphome/components/cap1188/cap1188.cpp +6 -4
  87. esphome/components/captive_portal/captive_portal.cpp +1 -1
  88. esphome/components/ccs811/ccs811.cpp +3 -2
  89. esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
  90. esphome/components/ch422g/ch422g.cpp +2 -2
  91. esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
  92. esphome/components/climate/__init__.py +1 -0
  93. esphome/components/climate/climate.cpp +12 -7
  94. esphome/components/climate/climate.h +1 -1
  95. esphome/components/climate_ir/climate_ir.cpp +7 -4
  96. esphome/components/cm1106/__init__.py +1 -0
  97. esphome/components/cm1106/cm1106.cpp +112 -0
  98. esphome/components/cm1106/cm1106.h +40 -0
  99. esphome/components/cm1106/sensor.py +72 -0
  100. esphome/components/const/__init__.py +1 -0
  101. esphome/components/cover/__init__.py +1 -0
  102. esphome/components/cs5460a/cs5460a.cpp +16 -11
  103. esphome/components/cse7761/cse7761.cpp +2 -2
  104. esphome/components/cse7766/cse7766.cpp +0 -5
  105. esphome/components/cse7766/cse7766.h +5 -1
  106. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
  107. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
  108. esphome/components/current_based/current_based_cover.cpp +4 -2
  109. esphome/components/dac7678/dac7678_output.cpp +4 -4
  110. esphome/components/dallas_temp/dallas_temp.cpp +2 -3
  111. esphome/components/daly_bms/daly_bms.cpp +2 -1
  112. esphome/components/dashboard_import/__init__.py +1 -2
  113. esphome/components/datetime/__init__.py +3 -1
  114. esphome/components/datetime/date_entity.cpp +5 -5
  115. esphome/components/datetime/datetime_base.h +0 -5
  116. esphome/components/datetime/datetime_entity.cpp +8 -8
  117. esphome/components/datetime/time_entity.cpp +4 -4
  118. esphome/components/debug/debug_component.cpp +1 -1
  119. esphome/components/debug/debug_component.h +1 -1
  120. esphome/components/debug/debug_esp32.cpp +4 -2
  121. esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
  122. esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
  123. esphome/components/demo/__init__.py +206 -0
  124. esphome/components/demo/demo_alarm_control_panel.h +65 -0
  125. esphome/components/demo/demo_button.h +15 -0
  126. esphome/components/demo/demo_date.h +34 -0
  127. esphome/components/demo/demo_datetime.h +40 -0
  128. esphome/components/demo/demo_lock.h +17 -0
  129. esphome/components/demo/demo_select.h +15 -0
  130. esphome/components/demo/demo_text.h +18 -0
  131. esphome/components/demo/demo_time.h +34 -0
  132. esphome/components/demo/demo_valve.h +54 -0
  133. esphome/components/dfrobot_sen0395/commands.cpp +3 -3
  134. esphome/components/dht/dht.cpp +29 -50
  135. esphome/components/dht12/dht12.cpp +2 -2
  136. esphome/components/display/display.h +5 -3
  137. esphome/components/dps310/dps310.cpp +7 -5
  138. esphome/components/ds1307/ds1307.cpp +2 -2
  139. esphome/components/dsmr/dsmr.cpp +5 -3
  140. esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
  141. esphome/components/duty_time/duty_time_sensor.cpp +5 -3
  142. esphome/components/ee895/ee895.cpp +3 -3
  143. esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
  144. esphome/components/emc2101/emc2101.cpp +11 -9
  145. esphome/components/ens160_base/ens160_base.cpp +2 -2
  146. esphome/components/ens210/ens210.cpp +2 -2
  147. esphome/components/es7210/es7210.cpp +6 -4
  148. esphome/components/es7243e/es7243e.cpp +1 -1
  149. esphome/components/es8156/es8156.cpp +1 -1
  150. esphome/components/es8311/es8311.cpp +8 -6
  151. esphome/components/es8388/__init__.py +0 -0
  152. esphome/components/es8388/audio_dac.py +26 -0
  153. esphome/components/es8388/es8388.cpp +289 -0
  154. esphome/components/es8388/es8388.h +81 -0
  155. esphome/components/es8388/es8388_const.h +83 -0
  156. esphome/components/es8388/select/__init__.py +47 -0
  157. esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
  158. esphome/components/es8388/select/adc_input_mic_select.h +15 -0
  159. esphome/components/es8388/select/dac_output_select.cpp +12 -0
  160. esphome/components/es8388/select/dac_output_select.h +15 -0
  161. esphome/components/esp32/__init__.py +118 -23
  162. esphome/components/esp32/boards.py +208 -125
  163. esphome/components/esp32/const.py +6 -0
  164. esphome/components/esp32/gpio.py +14 -1
  165. esphome/components/esp32/gpio_esp32_c5.py +45 -0
  166. esphome/components/esp32/gpio_esp32_p4.py +43 -0
  167. esphome/components/esp32/preferences.cpp +7 -7
  168. esphome/components/esp32_ble/__init__.py +115 -0
  169. esphome/components/esp32_ble/ble.cpp +101 -54
  170. esphome/components/esp32_ble/ble.h +24 -5
  171. esphome/components/esp32_ble/ble_event.h +172 -32
  172. esphome/components/esp32_ble/ble_scan_result.h +24 -0
  173. esphome/components/esp32_ble/ble_uuid.h +1 -1
  174. esphome/components/esp32_ble/queue.h +53 -27
  175. esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
  176. esphome/components/esp32_ble_server/__init__.py +4 -1
  177. esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
  178. esphome/components/esp32_ble_server/ble_server.h +0 -1
  179. esphome/components/esp32_ble_tracker/__init__.py +7 -2
  180. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +107 -75
  181. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +16 -16
  182. esphome/components/esp32_camera/esp32_camera.cpp +35 -27
  183. esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
  184. esphome/components/esp32_dac/esp32_dac.cpp +2 -2
  185. esphome/components/esp32_improv/__init__.py +5 -1
  186. esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
  187. esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
  188. esphome/components/esp32_rmt_led_strip/light.py +5 -1
  189. esphome/components/esp32_touch/esp32_touch.cpp +12 -8
  190. esphome/components/esp8266/preferences.cpp +6 -6
  191. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  192. esphome/components/esp_ldo/__init__.py +91 -0
  193. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  194. esphome/components/esp_ldo/esp_ldo.h +43 -0
  195. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  196. esphome/components/ethernet/ethernet_component.cpp +38 -26
  197. esphome/components/ethernet/ethernet_component.h +1 -1
  198. esphome/components/event/__init__.py +1 -0
  199. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  200. esphome/components/ezo/ezo.cpp +1 -1
  201. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  202. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  203. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  204. esphome/components/fan/__init__.py +1 -0
  205. esphome/components/fan/fan.cpp +30 -19
  206. esphome/components/fastled_base/fastled_light.cpp +7 -5
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  208. esphome/components/fs3000/fs3000.cpp +1 -1
  209. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  210. esphome/components/ft63x6/ft63x6.cpp +5 -3
  211. esphome/components/gcja5/gcja5.cpp +0 -12
  212. esphome/components/gcja5/gcja5.h +8 -3
  213. esphome/components/gdk101/gdk101.cpp +2 -2
  214. esphome/components/globals/globals_component.h +13 -10
  215. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  216. esphome/components/gp8403/gp8403.cpp +4 -2
  217. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  218. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  219. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  220. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  221. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  222. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  223. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  224. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  225. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  227. esphome/components/haier/haier_base.cpp +2 -2
  228. esphome/components/haier/hon_climate.cpp +13 -6
  229. esphome/components/havells_solar/havells_solar.cpp +5 -2
  230. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  231. esphome/components/hdc1080/hdc1080.cpp +2 -2
  232. esphome/components/he60r/he60r.cpp +4 -2
  233. esphome/components/hlw8012/hlw8012.cpp +6 -4
  234. esphome/components/hm3301/hm3301.cpp +2 -2
  235. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  236. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  237. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  238. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  239. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  240. esphome/components/hte501/hte501.cpp +3 -2
  241. esphome/components/http_request/__init__.py +2 -2
  242. esphome/components/http_request/http_request.cpp +7 -5
  243. esphome/components/http_request/http_request_idf.cpp +4 -2
  244. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  245. esphome/components/htu21d/htu21d.cpp +2 -2
  246. esphome/components/htu31d/htu31d.cpp +2 -2
  247. esphome/components/hx711/hx711.cpp +2 -2
  248. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  249. esphome/components/hyt271/hyt271.cpp +2 -2
  250. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  251. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  252. esphome/components/i2s_audio/__init__.py +2 -0
  253. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  254. esphome/components/i2s_audio/i2s_audio.h +1 -1
  255. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  256. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  257. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +13 -10
  258. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
  259. esphome/components/iaqcore/iaqcore.cpp +3 -3
  260. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  261. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  262. esphome/components/image/image.cpp +1 -0
  263. esphome/components/ina219/ina219.cpp +2 -2
  264. esphome/components/ina226/ina226.cpp +8 -5
  265. esphome/components/ina260/ina260.cpp +1 -1
  266. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  267. esphome/components/ina3221/ina3221.cpp +2 -2
  268. esphome/components/inkplate6/display.py +12 -2
  269. esphome/components/inkplate6/inkplate.cpp +13 -9
  270. esphome/components/inkplate6/inkplate.h +7 -6
  271. esphome/components/integration/integration_sensor.cpp +1 -1
  272. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  273. esphome/components/json/json_util.cpp +4 -5
  274. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  275. esphome/components/key_collector/key_collector.cpp +4 -2
  276. esphome/components/kmeteriso/kmeteriso.cpp +4 -4
  277. esphome/components/kuntze/kuntze.cpp +4 -2
  278. esphome/components/lc709203f/__init__.py +1 -0
  279. esphome/components/lc709203f/lc709203f.cpp +299 -0
  280. esphome/components/lc709203f/lc709203f.h +55 -0
  281. esphome/components/lc709203f/sensor.py +93 -0
  282. esphome/components/lcd_base/lcd_display.cpp +2 -2
  283. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  284. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  285. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  286. esphome/components/ld2410/ld2410.cpp +6 -7
  287. esphome/components/ld2420/ld2420.cpp +9 -7
  288. esphome/components/ld2450/ld2450.cpp +6 -4
  289. esphome/components/ld2450/sensor.py +2 -2
  290. esphome/components/ledc/ledc_output.cpp +32 -28
  291. esphome/components/libretiny/const.py +1 -1
  292. esphome/components/libretiny/preferences.cpp +6 -7
  293. esphome/components/light/__init__.py +2 -1
  294. esphome/components/light/esp_hsv_color.h +1 -1
  295. esphome/components/light/light_state.cpp +9 -5
  296. esphome/components/light/light_transformer.h +1 -1
  297. esphome/components/lightwaverf/LwTx.cpp +1 -1
  298. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  299. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  300. esphome/components/lock/__init__.py +1 -0
  301. esphome/components/lock/lock.h +1 -1
  302. esphome/components/logger/__init__.py +6 -0
  303. esphome/components/logger/logger.cpp +11 -20
  304. esphome/components/logger/logger.h +1 -2
  305. esphome/components/logger/logger_esp32.cpp +5 -5
  306. esphome/components/ltr390/ltr390.cpp +8 -5
  307. esphome/components/ltr501/ltr501.cpp +19 -14
  308. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  309. esphome/components/lvgl/__init__.py +2 -2
  310. esphome/components/lvgl/automation.py +5 -4
  311. esphome/components/lvgl/defines.py +0 -2
  312. esphome/components/lvgl/lv_validation.py +1 -3
  313. esphome/components/lvgl/lvcode.py +7 -8
  314. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  315. esphome/components/lvgl/schemas.py +22 -23
  316. esphome/components/lvgl/trigger.py +8 -3
  317. esphome/components/lvgl/widgets/__init__.py +2 -2
  318. esphome/components/lvgl/widgets/canvas.py +9 -3
  319. esphome/components/lvgl/widgets/line.py +2 -1
  320. esphome/components/lvgl/widgets/tabview.py +7 -0
  321. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  322. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  323. esphome/components/max17043/max17043.cpp +2 -2
  324. esphome/components/max31855/max31855.cpp +2 -1
  325. esphome/components/max31856/max31856.cpp +9 -11
  326. esphome/components/max31865/max31865.cpp +6 -4
  327. esphome/components/max44009/max44009.cpp +2 -2
  328. esphome/components/max6675/max6675.cpp +1 -1
  329. esphome/components/max6956/max6956.cpp +5 -3
  330. esphome/components/max7219/max7219.cpp +8 -6
  331. esphome/components/max7219digit/automation.h +52 -0
  332. esphome/components/max7219digit/display.py +93 -1
  333. esphome/components/max7219digit/max7219digit.cpp +16 -13
  334. esphome/components/max9611/max9611.cpp +9 -6
  335. esphome/components/mcp23008/mcp23008.cpp +1 -1
  336. esphome/components/mcp23016/mcp23016.cpp +1 -1
  337. esphome/components/mcp23017/mcp23017.cpp +1 -1
  338. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  339. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  340. esphome/components/mcp3008/mcp3008.cpp +1 -1
  341. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  342. esphome/components/mcp3204/mcp3204.cpp +1 -1
  343. esphome/components/mcp4461/mcp4461.cpp +2 -2
  344. esphome/components/mcp4725/mcp4725.cpp +2 -2
  345. esphome/components/mcp4728/mcp4728.cpp +2 -2
  346. esphome/components/mcp9600/mcp9600.cpp +1 -1
  347. esphome/components/mcp9808/mcp9808.cpp +4 -4
  348. esphome/components/mdns/mdns_component.cpp +8 -2
  349. esphome/components/mdns/mdns_component.h +3 -1
  350. esphome/components/mdns/mdns_esp32.cpp +2 -2
  351. esphome/components/media_player/__init__.py +1 -0
  352. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  353. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  354. esphome/components/micronova/micronova.h +2 -2
  355. esphome/components/mics_4514/mics_4514.cpp +2 -2
  356. esphome/components/midea/air_conditioner.cpp +7 -5
  357. esphome/components/midea_ir/midea_ir.cpp +1 -1
  358. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  359. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  360. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  361. esphome/components/mlx90614/mlx90614.cpp +4 -3
  362. esphome/components/mmc5603/mmc5603.cpp +2 -2
  363. esphome/components/mmc5983/mmc5983.cpp +1 -1
  364. esphome/components/modbus/modbus.cpp +7 -5
  365. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  366. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  367. esphome/components/modbus_controller/switch/__init__.py +6 -2
  368. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  369. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  370. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  371. esphome/components/mpr121/mpr121.cpp +2 -2
  372. esphome/components/mpu6050/mpu6050.cpp +6 -6
  373. esphome/components/mpu6886/mpu6886.cpp +6 -6
  374. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  375. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  376. esphome/components/mqtt/mqtt_client.cpp +31 -24
  377. esphome/components/mqtt/mqtt_component.cpp +3 -3
  378. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  379. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  380. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  381. esphome/components/ms5611/ms5611.cpp +2 -2
  382. esphome/components/ms8607/ms8607.cpp +2 -2
  383. esphome/components/msa3xx/msa3xx.cpp +16 -12
  384. esphome/components/my9231/my9231.cpp +7 -5
  385. esphome/components/nau7802/nau7802.cpp +6 -4
  386. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  387. esphome/components/network/ip_address.h +1 -1
  388. esphome/components/network/util.cpp +13 -0
  389. esphome/components/nextion/base_component.py +2 -0
  390. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +3 -4
  391. esphome/components/nextion/display.py +34 -22
  392. esphome/components/nextion/nextion.cpp +182 -143
  393. esphome/components/nextion/nextion.h +36 -0
  394. esphome/components/nextion/nextion_commands.cpp +3 -3
  395. esphome/components/nextion/nextion_upload_arduino.cpp +69 -69
  396. esphome/components/nextion/nextion_upload_idf.cpp +79 -80
  397. esphome/components/nextion/sensor/nextion_sensor.cpp +5 -5
  398. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  399. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +3 -3
  400. esphome/components/nfc/nci_message.h +1 -1
  401. esphome/components/nfc/ndef_record.h +1 -1
  402. esphome/components/nfc/ndef_record_text.h +1 -1
  403. esphome/components/nfc/ndef_record_uri.h +1 -1
  404. esphome/components/nfc/nfc.h +1 -1
  405. esphome/components/nfc/nfc_tag.h +1 -1
  406. esphome/components/noblex/noblex.cpp +1 -1
  407. esphome/components/npi19/npi19.cpp +5 -7
  408. esphome/components/number/__init__.py +11 -0
  409. esphome/components/number/number.cpp +1 -1
  410. esphome/components/number/number.h +0 -4
  411. esphome/components/online_image/__init__.py +13 -1
  412. esphome/components/online_image/online_image.cpp +26 -4
  413. esphome/components/online_image/online_image.h +21 -4
  414. esphome/components/opentherm/generate.py +3 -3
  415. esphome/components/opentherm/hub.cpp +11 -7
  416. esphome/components/opentherm/number/number.cpp +5 -3
  417. esphome/components/opentherm/opentherm.h +1 -1
  418. esphome/components/opentherm/schema.py +13 -13
  419. esphome/components/opentherm/validate.py +1 -1
  420. esphome/components/openthread/__init__.py +146 -0
  421. esphome/components/openthread/const.py +10 -0
  422. esphome/components/openthread/openthread.cpp +206 -0
  423. esphome/components/openthread/openthread.h +68 -0
  424. esphome/components/openthread/openthread_esp.cpp +164 -0
  425. esphome/components/openthread/tlv.py +58 -0
  426. esphome/components/openthread_info/__init__.py +0 -0
  427. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  428. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  429. esphome/components/openthread_info/text_sensor.py +105 -0
  430. esphome/components/output/float_output.cpp +1 -1
  431. esphome/components/output/switch/output_switch.cpp +1 -1
  432. esphome/components/packet_transport/packet_transport.cpp +6 -4
  433. esphome/components/pca6416a/pca6416a.cpp +2 -2
  434. esphome/components/pca9554/pca9554.cpp +6 -4
  435. esphome/components/pca9685/pca9685_output.cpp +12 -8
  436. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  437. esphome/components/pcf85063/pcf85063.cpp +2 -2
  438. esphome/components/pcf8563/pcf8563.cpp +2 -2
  439. esphome/components/pcf8574/pcf8574.cpp +2 -2
  440. esphome/components/pid/pid_climate.cpp +8 -5
  441. esphome/components/pid/pid_climate.h +1 -1
  442. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  443. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  444. esphome/components/pipsolar/pipsolar.cpp +3 -3
  445. esphome/components/pm1006/pm1006.cpp +3 -7
  446. esphome/components/pm1006/pm1006.h +4 -1
  447. esphome/components/pm2005/pm2005.cpp +12 -13
  448. esphome/components/pm2005/sensor.py +1 -1
  449. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  450. esphome/components/pmsx003/pmsx003.cpp +0 -4
  451. esphome/components/pmsx003/pmsx003.h +5 -2
  452. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  453. esphome/components/pmwcs3/pmwcs3.h +0 -1
  454. esphome/components/pn532/pn532.cpp +7 -7
  455. esphome/components/pn532/pn532.h +1 -1
  456. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  457. esphome/components/pn7150/pn7150.cpp +4 -4
  458. esphome/components/pn7160/pn7160.cpp +4 -4
  459. esphome/components/power_supply/power_supply.cpp +6 -4
  460. esphome/components/power_supply/power_supply.h +1 -1
  461. esphome/components/prometheus/__init__.py +0 -1
  462. esphome/components/psram/__init__.py +59 -35
  463. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  464. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  465. esphome/components/pylontech/pylontech.cpp +2 -2
  466. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  467. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  468. esphome/components/pzemac/pzemac.cpp +4 -2
  469. esphome/components/pzemdc/pzemdc.cpp +4 -2
  470. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  471. esphome/components/qmp6988/qmp6988.cpp +2 -2
  472. esphome/components/qmp6988/qmp6988.h +1 -1
  473. esphome/components/qr_code/qr_code.cpp +5 -3
  474. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  475. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  476. esphome/components/rc522/rc522.cpp +5 -5
  477. esphome/components/rdm6300/rdm6300.cpp +1 -0
  478. esphome/components/remote_receiver/__init__.py +10 -2
  479. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  480. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  481. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  482. esphome/components/remote_transmitter/__init__.py +10 -2
  483. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  484. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  485. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  486. esphome/components/resistance/resistance_sensor.cpp +6 -3
  487. esphome/components/restart/button/restart_button.cpp +1 -1
  488. esphome/components/restart/switch/restart_switch.cpp +1 -1
  489. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  490. esphome/components/rp2040/__init__.py +7 -0
  491. esphome/components/rp2040/core.cpp +8 -1
  492. esphome/components/rp2040/preferences.cpp +3 -3
  493. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  494. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  495. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  496. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  497. esphome/components/rtttl/rtttl.cpp +11 -9
  498. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  499. esphome/components/safe_mode/safe_mode.cpp +9 -8
  500. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  501. esphome/components/scd30/scd30.cpp +11 -8
  502. esphome/components/scd4x/scd4x.cpp +12 -8
  503. esphome/components/sdl/display.py +40 -0
  504. esphome/components/sdl/sdl_esphome.cpp +2 -2
  505. esphome/components/sdl/sdl_esphome.h +8 -0
  506. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  507. esphome/components/sdp3x/sdp3x.cpp +11 -11
  508. esphome/components/sds011/sds011.cpp +5 -6
  509. esphome/components/sds011/sds011.h +4 -1
  510. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  511. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  512. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  513. esphome/components/selec_meter/selec_meter.cpp +5 -2
  514. esphome/components/select/__init__.py +1 -0
  515. esphome/components/select/select.cpp +1 -1
  516. esphome/components/select/select.h +0 -4
  517. esphome/components/sen0321/sen0321.cpp +2 -2
  518. esphome/components/sen21231/sen21231.cpp +1 -1
  519. esphome/components/sen5x/sen5x.cpp +10 -7
  520. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  521. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  522. esphome/components/sensor/__init__.py +11 -1
  523. esphome/components/sensor/filter.h +1 -1
  524. esphome/components/sensor/sensor.cpp +8 -4
  525. esphome/components/sensor/sensor.h +12 -11
  526. esphome/components/servo/servo.cpp +12 -9
  527. esphome/components/servo/servo.h +1 -1
  528. esphome/components/sfa30/sfa30.cpp +1 -1
  529. esphome/components/sgp30/sgp30.cpp +10 -8
  530. esphome/components/sgp4x/sgp4x.cpp +49 -61
  531. esphome/components/sgp4x/sgp4x.h +0 -1
  532. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  533. esphome/components/sht3xd/sht3xd.cpp +1 -1
  534. esphome/components/sht4x/sht4x.cpp +2 -2
  535. esphome/components/shtcx/shtcx.cpp +13 -16
  536. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  537. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  538. esphome/components/sim800l/sim800l.cpp +2 -2
  539. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  540. esphome/components/sm16716/sm16716.cpp +1 -1
  541. esphome/components/sm2135/sm2135.cpp +1 -1
  542. esphome/components/sm2235/sm2235.cpp +5 -3
  543. esphome/components/sm2335/sm2335.cpp +5 -3
  544. esphome/components/sml/sml.cpp +1 -1
  545. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  546. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  547. esphome/components/sntp/sntp_component.cpp +1 -1
  548. esphome/components/socket/__init__.py +2 -0
  549. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  550. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  551. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  552. esphome/components/socket/socket.cpp +31 -0
  553. esphome/components/socket/socket.h +27 -1
  554. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  555. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  556. esphome/components/sound_level/sound_level.cpp +4 -2
  557. esphome/components/speaker/media_player/__init__.py +3 -0
  558. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  559. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  560. esphome/components/spi/__init__.py +10 -2
  561. esphome/components/spi/spi.cpp +4 -4
  562. esphome/components/spi_device/spi_device.cpp +1 -2
  563. esphome/components/sprinkler/sprinkler.cpp +9 -6
  564. esphome/components/sps30/sps30.cpp +16 -15
  565. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  566. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  567. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  568. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  569. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  570. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  571. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  572. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  573. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  574. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  575. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  576. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  577. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  578. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  579. esphome/components/st7567_base/st7567_base.cpp +3 -3
  580. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  581. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  582. esphome/components/st7701s/st7701s.cpp +4 -2
  583. esphome/components/st7735/st7735.cpp +3 -3
  584. esphome/components/st7789v/st7789v.cpp +10 -7
  585. esphome/components/st7920/st7920.cpp +6 -4
  586. esphome/components/statsd/statsd.cpp +9 -5
  587. esphome/components/status_led/light/status_led_light.cpp +3 -3
  588. esphome/components/status_led/light/status_led_light.h +1 -1
  589. esphome/components/status_led/status_led.cpp +1 -1
  590. esphome/components/stepper/stepper.h +5 -3
  591. esphome/components/sts3x/sts3x.cpp +2 -2
  592. esphome/components/switch/__init__.py +1 -0
  593. esphome/components/switch/switch.cpp +18 -12
  594. esphome/components/switch/switch.h +1 -1
  595. esphome/components/sx1509/__init__.py +53 -20
  596. esphome/components/sx1509/sx1509.cpp +29 -5
  597. esphome/components/sx1509/sx1509.h +9 -1
  598. esphome/components/t6615/t6615.cpp +1 -0
  599. esphome/components/tc74/tc74.cpp +1 -1
  600. esphome/components/tca9548a/tca9548a.cpp +1 -1
  601. esphome/components/tca9555/tca9555.cpp +2 -2
  602. esphome/components/tcs34725/tcs34725.cpp +4 -4
  603. esphome/components/tee501/tee501.cpp +3 -2
  604. esphome/components/tem3200/tem3200.cpp +5 -6
  605. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  606. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +43 -12
  607. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +4 -1
  608. esphome/components/template/cover/template_cover.cpp +1 -1
  609. esphome/components/template/select/template_select.cpp +6 -4
  610. esphome/components/template/text/template_text.cpp +2 -3
  611. esphome/components/template/valve/template_valve.cpp +5 -3
  612. esphome/components/text/__init__.py +10 -11
  613. esphome/components/text/text.cpp +1 -1
  614. esphome/components/text/text.h +0 -4
  615. esphome/components/text_sensor/__init__.py +1 -0
  616. esphome/components/text_sensor/text_sensor.cpp +8 -4
  617. esphome/components/text_sensor/text_sensor.h +6 -6
  618. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  619. esphome/components/time/__init__.py +1 -2
  620. esphome/components/time_based/time_based_cover.cpp +4 -2
  621. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  622. esphome/components/tm1621/tm1621.cpp +3 -3
  623. esphome/components/tm1637/tm1637.cpp +9 -7
  624. esphome/components/tm1638/tm1638.cpp +7 -5
  625. esphome/components/tm1651/tm1651.cpp +2 -2
  626. esphome/components/tmp102/tmp102.cpp +1 -3
  627. esphome/components/tmp102/tmp102.h +0 -3
  628. esphome/components/tmp1075/tmp1075.cpp +12 -9
  629. esphome/components/tmp117/tmp117.cpp +2 -2
  630. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  631. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  632. esphome/components/tsl2561/tsl2561.cpp +7 -5
  633. esphome/components/tsl2591/tsl2591.cpp +25 -27
  634. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  635. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  636. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  637. esphome/components/tuya/select/tuya_select.cpp +5 -3
  638. esphome/components/tx20/tx20.cpp +3 -3
  639. esphome/components/uart/__init__.py +4 -5
  640. esphome/components/uart/button/uart_button.cpp +1 -1
  641. esphome/components/uart/switch/uart_switch.cpp +2 -2
  642. esphome/components/uart/uart.cpp +2 -2
  643. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  644. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  645. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  646. esphome/components/uart/uart_component_host.cpp +11 -8
  647. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  648. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  649. esphome/components/udp/udp_component.cpp +9 -5
  650. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  651. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  652. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  653. esphome/components/update/__init__.py +1 -0
  654. esphome/components/update/update_entity.cpp +1 -1
  655. esphome/components/update/update_entity.h +0 -3
  656. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  657. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  658. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  659. esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp +1 -1
  660. esphome/components/usb_host/__init__.py +64 -0
  661. esphome/components/usb_host/usb_host.h +116 -0
  662. esphome/components/usb_host/usb_host_client.cpp +394 -0
  663. esphome/components/usb_host/usb_host_component.cpp +35 -0
  664. esphome/components/usb_uart/__init__.py +134 -0
  665. esphome/components/usb_uart/ch34x.cpp +80 -0
  666. esphome/components/usb_uart/cp210x.cpp +126 -0
  667. esphome/components/usb_uart/usb_uart.cpp +328 -0
  668. esphome/components/usb_uart/usb_uart.h +151 -0
  669. esphome/components/valve/__init__.py +1 -0
  670. esphome/components/veml3235/veml3235.cpp +13 -9
  671. esphome/components/veml7700/veml7700.cpp +10 -6
  672. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  673. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  674. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  675. esphome/components/web_server/server_index_v2.h +632 -630
  676. esphome/components/web_server/server_index_v3.h +411 -409
  677. esphome/components/web_server/web_server.cpp +5 -3
  678. esphome/components/web_server_base/web_server_base.cpp +1 -1
  679. esphome/components/web_server_idf/__init__.py +0 -2
  680. esphome/components/web_server_idf/utils.cpp +1 -1
  681. esphome/components/web_server_idf/web_server_idf.cpp +7 -3
  682. esphome/components/web_server_idf/web_server_idf.h +7 -0
  683. esphome/components/weikai/__init__.py +2 -0
  684. esphome/components/weikai/weikai.cpp +24 -22
  685. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  686. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  687. esphome/components/wiegand/wiegand.cpp +1 -1
  688. esphome/components/wifi/wifi_component.cpp +50 -37
  689. esphome/components/wifi/wifi_component.h +7 -4
  690. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  691. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  692. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  693. esphome/components/wireguard/wireguard.cpp +21 -21
  694. esphome/components/wl_134/text_sensor.py +1 -2
  695. esphome/components/wled/wled_light_effect.cpp +1 -1
  696. esphome/components/x9c/x9c.cpp +5 -3
  697. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  698. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  699. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  700. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  701. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  702. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  703. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  704. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  705. esphome/components/xl9535/xl9535.cpp +2 -2
  706. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  707. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  708. esphome/config.py +3 -2
  709. esphome/config_validation.py +46 -17
  710. esphome/const.py +10 -1
  711. esphome/core/__init__.py +37 -18
  712. esphome/core/application.cpp +197 -8
  713. esphome/core/application.h +116 -6
  714. esphome/core/component.cpp +36 -15
  715. esphome/core/component.h +43 -13
  716. esphome/core/config.py +12 -0
  717. esphome/core/defines.h +10 -2
  718. esphome/core/entity_base.cpp +4 -16
  719. esphome/core/entity_base.h +27 -13
  720. esphome/core/helpers.cpp +1 -1
  721. esphome/core/helpers.h +5 -5
  722. esphome/core/log.h +2 -0
  723. esphome/core/log_const_en.h +4 -0
  724. esphome/core/scheduler.cpp +2 -2
  725. esphome/coroutine.py +3 -4
  726. esphome/cpp_generator.py +32 -32
  727. esphome/dashboard/core.py +2 -2
  728. esphome/dashboard/web_server.py +2 -2
  729. esphome/git.py +4 -4
  730. esphome/helpers.py +5 -6
  731. esphome/loader.py +8 -7
  732. esphome/log.py +7 -1
  733. esphome/platformio_api.py +2 -3
  734. esphome/storage_json.py +13 -5
  735. esphome/types.py +12 -13
  736. esphome/util.py +1 -2
  737. esphome/wizard.py +0 -16
  738. esphome/writer.py +5 -3
  739. esphome/yaml_util.py +6 -1
  740. esphome/zeroconf.py +1 -1
  741. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/METADATA +12 -11
  742. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/RECORD +746 -692
  743. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/WHEEL +1 -1
  744. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/entry_points.txt +0 -0
  745. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/licenses/LICENSE +0 -0
  746. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/top_level.txt +0 -0
@@ -50,17 +50,15 @@ void ESP32BLETracker::setup() {
50
50
  ESP_LOGE(TAG, "BLE Tracker was marked failed by ESP32BLE");
51
51
  return;
52
52
  }
53
- ExternalRAMAllocator<esp_ble_gap_cb_param_t::ble_scan_result_evt_param> allocator(
54
- ExternalRAMAllocator<esp_ble_gap_cb_param_t::ble_scan_result_evt_param>::ALLOW_FAILURE);
55
- this->scan_result_buffer_ = allocator.allocate(ESP32BLETracker::SCAN_RESULT_BUFFER_SIZE);
53
+ RAMAllocator<BLEScanResult> allocator;
54
+ this->scan_ring_buffer_ = allocator.allocate(SCAN_RESULT_BUFFER_SIZE);
56
55
 
57
- if (this->scan_result_buffer_ == nullptr) {
58
- ESP_LOGE(TAG, "Could not allocate buffer for BLE Tracker!");
56
+ if (this->scan_ring_buffer_ == nullptr) {
57
+ ESP_LOGE(TAG, "Could not allocate ring buffer for BLE Tracker!");
59
58
  this->mark_failed();
60
59
  }
61
60
 
62
61
  global_esp32_ble_tracker = this;
63
- this->scan_result_lock_ = xSemaphoreCreateMutex();
64
62
 
65
63
  #ifdef USE_OTA
66
64
  ota::get_global_ota_callback()->add_on_state_callback(
@@ -120,27 +118,31 @@ void ESP32BLETracker::loop() {
120
118
  }
121
119
  bool promote_to_connecting = discovered && !searching && !connecting;
122
120
 
123
- if (this->scanner_state_ == ScannerState::RUNNING &&
124
- this->scan_result_index_ && // if it looks like we have a scan result we will take the lock
125
- xSemaphoreTake(this->scan_result_lock_, 0)) {
126
- uint32_t index = this->scan_result_index_;
127
- if (index >= ESP32BLETracker::SCAN_RESULT_BUFFER_SIZE) {
128
- ESP_LOGW(TAG, "Too many BLE events to process. Some devices may not show up.");
129
- }
121
+ // Process scan results from lock-free SPSC ring buffer
122
+ // Consumer side: This runs in the main loop thread
123
+ if (this->scanner_state_ == ScannerState::RUNNING) {
124
+ // Load our own index with relaxed ordering (we're the only writer)
125
+ size_t read_idx = this->ring_read_index_.load(std::memory_order_relaxed);
130
126
 
131
- if (this->raw_advertisements_) {
132
- for (auto *listener : this->listeners_) {
133
- listener->parse_devices(this->scan_result_buffer_, this->scan_result_index_);
134
- }
135
- for (auto *client : this->clients_) {
136
- client->parse_devices(this->scan_result_buffer_, this->scan_result_index_);
127
+ // Load producer's index with acquire to see their latest writes
128
+ size_t write_idx = this->ring_write_index_.load(std::memory_order_acquire);
129
+
130
+ while (read_idx != write_idx) {
131
+ // Process one result at a time directly from ring buffer
132
+ BLEScanResult &scan_result = this->scan_ring_buffer_[read_idx];
133
+
134
+ if (this->raw_advertisements_) {
135
+ for (auto *listener : this->listeners_) {
136
+ listener->parse_devices(&scan_result, 1);
137
+ }
138
+ for (auto *client : this->clients_) {
139
+ client->parse_devices(&scan_result, 1);
140
+ }
137
141
  }
138
- }
139
142
 
140
- if (this->parse_advertisements_) {
141
- for (size_t i = 0; i < index; i++) {
143
+ if (this->parse_advertisements_) {
142
144
  ESPBTDevice device;
143
- device.parse_scan_rst(this->scan_result_buffer_[i]);
145
+ device.parse_scan_rst(scan_result);
144
146
 
145
147
  bool found = false;
146
148
  for (auto *listener : this->listeners_) {
@@ -161,9 +163,19 @@ void ESP32BLETracker::loop() {
161
163
  this->print_bt_device_info(device);
162
164
  }
163
165
  }
166
+
167
+ // Move to next entry in ring buffer
168
+ read_idx = (read_idx + 1) % SCAN_RESULT_BUFFER_SIZE;
169
+
170
+ // Store with release to ensure reads complete before index update
171
+ this->ring_read_index_.store(read_idx, std::memory_order_release);
172
+ }
173
+
174
+ // Log dropped results periodically
175
+ size_t dropped = this->scan_results_dropped_.exchange(0, std::memory_order_relaxed);
176
+ if (dropped > 0) {
177
+ ESP_LOGW(TAG, "Dropped %zu BLE scan results due to buffer overflow", dropped);
164
178
  }
165
- this->scan_result_index_ = 0;
166
- xSemaphoreGive(this->scan_result_lock_);
167
179
  }
168
180
  if (this->scanner_state_ == ScannerState::STOPPED) {
169
181
  this->end_of_scan_(); // Change state to IDLE
@@ -172,7 +184,7 @@ void ESP32BLETracker::loop() {
172
184
  (this->scan_set_param_failed_ && this->scanner_state_ == ScannerState::RUNNING)) {
173
185
  this->stop_scan_();
174
186
  if (this->scan_start_fail_count_ == std::numeric_limits<uint8_t>::max()) {
175
- ESP_LOGE(TAG, "ESP-IDF BLE scan could not restart after %d attempts, rebooting to restore BLE stack...",
187
+ ESP_LOGE(TAG, "Scan could not restart after %d attempts, rebooting to restore stack (IDF)",
176
188
  std::numeric_limits<uint8_t>::max());
177
189
  App.reboot();
178
190
  }
@@ -219,10 +231,10 @@ void ESP32BLETracker::loop() {
219
231
  for (auto *client : this->clients_) {
220
232
  if (client->state() == ClientState::DISCOVERED) {
221
233
  if (this->scanner_state_ == ScannerState::RUNNING) {
222
- ESP_LOGD(TAG, "Stopping scan to make connection...");
234
+ ESP_LOGD(TAG, "Stopping scan to make connection");
223
235
  this->stop_scan_();
224
236
  } else if (this->scanner_state_ == ScannerState::IDLE) {
225
- ESP_LOGD(TAG, "Promoting client to connect...");
237
+ ESP_LOGD(TAG, "Promoting client to connect");
226
238
  // We only want to promote one client at a time.
227
239
  // once the scanner is fully stopped.
228
240
  #ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
@@ -306,7 +318,7 @@ void ESP32BLETracker::start_scan_(bool first) {
306
318
 
307
319
  // Start timeout before scan is started. Otherwise scan never starts if any error.
308
320
  this->set_timeout("scan", this->scan_duration_ * 2000, []() {
309
- ESP_LOGE(TAG, "ESP-IDF BLE scan never terminated, rebooting to restore BLE stack...");
321
+ ESP_LOGE(TAG, "Scan never terminated, rebooting to restore stack (IDF)");
310
322
  App.reboot();
311
323
  });
312
324
 
@@ -370,9 +382,6 @@ void ESP32BLETracker::recalculate_advertisement_parser_types() {
370
382
 
371
383
  void ESP32BLETracker::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) {
372
384
  switch (event) {
373
- case ESP_GAP_BLE_SCAN_RESULT_EVT:
374
- this->gap_scan_result_(param->scan_rst);
375
- break;
376
385
  case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT:
377
386
  this->gap_scan_set_param_complete_(param->scan_param_cmpl);
378
387
  break;
@@ -385,11 +394,57 @@ void ESP32BLETracker::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_ga
385
394
  default:
386
395
  break;
387
396
  }
397
+ // Forward all events to clients (scan results are handled separately via gap_scan_event_handler)
388
398
  for (auto *client : this->clients_) {
389
399
  client->gap_event_handler(event, param);
390
400
  }
391
401
  }
392
402
 
403
+ void ESP32BLETracker::gap_scan_event_handler(const BLEScanResult &scan_result) {
404
+ ESP_LOGV(TAG, "gap_scan_result - event %d", scan_result.search_evt);
405
+
406
+ if (scan_result.search_evt == ESP_GAP_SEARCH_INQ_RES_EVT) {
407
+ // Lock-free SPSC ring buffer write (Producer side)
408
+ // This runs in the ESP-IDF Bluetooth stack callback thread
409
+ // IMPORTANT: Only this thread writes to ring_write_index_
410
+
411
+ // Load our own index with relaxed ordering (we're the only writer)
412
+ size_t write_idx = this->ring_write_index_.load(std::memory_order_relaxed);
413
+ size_t next_write_idx = (write_idx + 1) % SCAN_RESULT_BUFFER_SIZE;
414
+
415
+ // Load consumer's index with acquire to see their latest updates
416
+ size_t read_idx = this->ring_read_index_.load(std::memory_order_acquire);
417
+
418
+ // Check if buffer is full
419
+ if (next_write_idx != read_idx) {
420
+ // Write to ring buffer
421
+ this->scan_ring_buffer_[write_idx] = scan_result;
422
+
423
+ // Store with release to ensure the write is visible before index update
424
+ this->ring_write_index_.store(next_write_idx, std::memory_order_release);
425
+ } else {
426
+ // Buffer full, track dropped results
427
+ this->scan_results_dropped_.fetch_add(1, std::memory_order_relaxed);
428
+ }
429
+ } else if (scan_result.search_evt == ESP_GAP_SEARCH_INQ_CMPL_EVT) {
430
+ // Scan finished on its own
431
+ if (this->scanner_state_ != ScannerState::RUNNING) {
432
+ if (this->scanner_state_ == ScannerState::STOPPING) {
433
+ ESP_LOGE(TAG, "Scan was not running when scan completed.");
434
+ } else if (this->scanner_state_ == ScannerState::STARTING) {
435
+ ESP_LOGE(TAG, "Scan was not started when scan completed.");
436
+ } else if (this->scanner_state_ == ScannerState::FAILED) {
437
+ ESP_LOGE(TAG, "Scan was in failed state when scan completed.");
438
+ } else if (this->scanner_state_ == ScannerState::IDLE) {
439
+ ESP_LOGE(TAG, "Scan was idle when scan completed.");
440
+ } else if (this->scanner_state_ == ScannerState::STOPPED) {
441
+ ESP_LOGE(TAG, "Scan was stopped when scan completed.");
442
+ }
443
+ }
444
+ this->set_scanner_state_(ScannerState::STOPPED);
445
+ }
446
+ }
447
+
393
448
  void ESP32BLETracker::gap_scan_set_param_complete_(const esp_ble_gap_cb_param_t::ble_scan_param_cmpl_evt_param &param) {
394
449
  ESP_LOGV(TAG, "gap_scan_set_param_complete - status %d", param.status);
395
450
  if (param.status == ESP_BT_STATUS_DONE) {
@@ -444,34 +499,6 @@ void ESP32BLETracker::gap_scan_stop_complete_(const esp_ble_gap_cb_param_t::ble_
444
499
  this->set_scanner_state_(ScannerState::STOPPED);
445
500
  }
446
501
 
447
- void ESP32BLETracker::gap_scan_result_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_param &param) {
448
- ESP_LOGV(TAG, "gap_scan_result - event %d", param.search_evt);
449
- if (param.search_evt == ESP_GAP_SEARCH_INQ_RES_EVT) {
450
- if (xSemaphoreTake(this->scan_result_lock_, 0)) {
451
- if (this->scan_result_index_ < ESP32BLETracker::SCAN_RESULT_BUFFER_SIZE) {
452
- this->scan_result_buffer_[this->scan_result_index_++] = param;
453
- }
454
- xSemaphoreGive(this->scan_result_lock_);
455
- }
456
- } else if (param.search_evt == ESP_GAP_SEARCH_INQ_CMPL_EVT) {
457
- // Scan finished on its own
458
- if (this->scanner_state_ != ScannerState::RUNNING) {
459
- if (this->scanner_state_ == ScannerState::STOPPING) {
460
- ESP_LOGE(TAG, "Scan was not running when scan completed.");
461
- } else if (this->scanner_state_ == ScannerState::STARTING) {
462
- ESP_LOGE(TAG, "Scan was not started when scan completed.");
463
- } else if (this->scanner_state_ == ScannerState::FAILED) {
464
- ESP_LOGE(TAG, "Scan was in failed state when scan completed.");
465
- } else if (this->scanner_state_ == ScannerState::IDLE) {
466
- ESP_LOGE(TAG, "Scan was idle when scan completed.");
467
- } else if (this->scanner_state_ == ScannerState::STOPPED) {
468
- ESP_LOGE(TAG, "Scan was stopped when scan completed.");
469
- }
470
- }
471
- this->set_scanner_state_(ScannerState::STOPPED);
472
- }
473
- }
474
-
475
502
  void ESP32BLETracker::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
476
503
  esp_ble_gattc_cb_param_t *param) {
477
504
  for (auto *client : this->clients_) {
@@ -494,13 +521,15 @@ optional<ESPBLEiBeacon> ESPBLEiBeacon::from_manufacturer_data(const ServiceData
494
521
  return ESPBLEiBeacon(data.data.data());
495
522
  }
496
523
 
497
- void ESPBTDevice::parse_scan_rst(const esp_ble_gap_cb_param_t::ble_scan_result_evt_param &param) {
498
- this->scan_result_ = param;
524
+ void ESPBTDevice::parse_scan_rst(const BLEScanResult &scan_result) {
499
525
  for (uint8_t i = 0; i < ESP_BD_ADDR_LEN; i++)
500
- this->address_[i] = param.bda[i];
501
- this->address_type_ = param.ble_addr_type;
502
- this->rssi_ = param.rssi;
503
- this->parse_adv_(param);
526
+ this->address_[i] = scan_result.bda[i];
527
+ this->address_type_ = static_cast<esp_ble_addr_type_t>(scan_result.ble_addr_type);
528
+ this->rssi_ = scan_result.rssi;
529
+
530
+ // Parse advertisement data directly
531
+ uint8_t total_len = scan_result.adv_data_len + scan_result.scan_rsp_len;
532
+ this->parse_adv_(scan_result.ble_adv, total_len);
504
533
 
505
534
  #ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
506
535
  ESP_LOGVV(TAG, "Parse Result:");
@@ -558,13 +587,13 @@ void ESPBTDevice::parse_scan_rst(const esp_ble_gap_cb_param_t::ble_scan_result_e
558
587
  ESP_LOGVV(TAG, " Data: %s", format_hex_pretty(data.data).c_str());
559
588
  }
560
589
 
561
- ESP_LOGVV(TAG, " Adv data: %s", format_hex_pretty(param.ble_adv, param.adv_data_len + param.scan_rsp_len).c_str());
590
+ ESP_LOGVV(TAG, " Adv data: %s",
591
+ format_hex_pretty(scan_result.ble_adv, scan_result.adv_data_len + scan_result.scan_rsp_len).c_str());
562
592
  #endif
563
593
  }
564
- void ESPBTDevice::parse_adv_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_param &param) {
594
+
595
+ void ESPBTDevice::parse_adv_(const uint8_t *payload, uint8_t len) {
565
596
  size_t offset = 0;
566
- const uint8_t *payload = param.ble_adv;
567
- uint8_t len = param.adv_data_len + param.scan_rsp_len;
568
597
 
569
598
  while (offset + 2 < len) {
570
599
  const uint8_t field_length = payload[offset++]; // First byte is length of adv record
@@ -731,11 +760,14 @@ uint64_t ESPBTDevice::address_uint64() const { return esp32_ble::ble_addr_to_uin
731
760
 
732
761
  void ESP32BLETracker::dump_config() {
733
762
  ESP_LOGCONFIG(TAG, "BLE Tracker:");
734
- ESP_LOGCONFIG(TAG, " Scan Duration: %" PRIu32 " s", this->scan_duration_);
735
- ESP_LOGCONFIG(TAG, " Scan Interval: %.1f ms", this->scan_interval_ * 0.625f);
736
- ESP_LOGCONFIG(TAG, " Scan Window: %.1f ms", this->scan_window_ * 0.625f);
737
- ESP_LOGCONFIG(TAG, " Scan Type: %s", this->scan_active_ ? "ACTIVE" : "PASSIVE");
738
- ESP_LOGCONFIG(TAG, " Continuous Scanning: %s", YESNO(this->scan_continuous_));
763
+ ESP_LOGCONFIG(TAG,
764
+ " Scan Duration: %" PRIu32 " s\n"
765
+ " Scan Interval: %.1f ms\n"
766
+ " Scan Window: %.1f ms\n"
767
+ " Scan Type: %s\n"
768
+ " Continuous Scanning: %s",
769
+ this->scan_duration_, this->scan_interval_ * 0.625f, this->scan_window_ * 0.625f,
770
+ this->scan_active_ ? "ACTIVE" : "PASSIVE", YESNO(this->scan_continuous_));
739
771
  switch (this->scanner_state_) {
740
772
  case ScannerState::IDLE:
741
773
  ESP_LOGCONFIG(TAG, " Scanner State: IDLE");
@@ -6,6 +6,7 @@
6
6
  #include "esphome/core/helpers.h"
7
7
 
8
8
  #include <array>
9
+ #include <atomic>
9
10
  #include <string>
10
11
  #include <vector>
11
12
 
@@ -62,7 +63,7 @@ class ESPBLEiBeacon {
62
63
 
63
64
  class ESPBTDevice {
64
65
  public:
65
- void parse_scan_rst(const esp_ble_gap_cb_param_t::ble_scan_result_evt_param &param);
66
+ void parse_scan_rst(const BLEScanResult &scan_result);
66
67
 
67
68
  std::string address_str() const;
68
69
 
@@ -84,8 +85,6 @@ class ESPBTDevice {
84
85
 
85
86
  const std::vector<ServiceData> &get_service_datas() const { return service_datas_; }
86
87
 
87
- const esp_ble_gap_cb_param_t::ble_scan_result_evt_param &get_scan_result() const { return scan_result_; }
88
-
89
88
  bool resolve_irk(const uint8_t *irk) const;
90
89
 
91
90
  optional<ESPBLEiBeacon> get_ibeacon() const {
@@ -98,7 +97,7 @@ class ESPBTDevice {
98
97
  }
99
98
 
100
99
  protected:
101
- void parse_adv_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_param &param);
100
+ void parse_adv_(const uint8_t *payload, uint8_t len);
102
101
 
103
102
  esp_bd_addr_t address_{
104
103
  0,
@@ -112,7 +111,6 @@ class ESPBTDevice {
112
111
  std::vector<ESPBTUUID> service_uuids_{};
113
112
  std::vector<ServiceData> manufacturer_datas_{};
114
113
  std::vector<ServiceData> service_datas_{};
115
- esp_ble_gap_cb_param_t::ble_scan_result_evt_param scan_result_{};
116
114
  };
117
115
 
118
116
  class ESP32BLETracker;
@@ -121,9 +119,7 @@ class ESPBTDeviceListener {
121
119
  public:
122
120
  virtual void on_scan_end() {}
123
121
  virtual bool parse_device(const ESPBTDevice &device) = 0;
124
- virtual bool parse_devices(esp_ble_gap_cb_param_t::ble_scan_result_evt_param *advertisements, size_t count) {
125
- return false;
126
- };
122
+ virtual bool parse_devices(const BLEScanResult *scan_results, size_t count) { return false; };
127
123
  virtual AdvertisementParserType get_advertisement_parser_type() {
128
124
  return AdvertisementParserType::PARSED_ADVERTISEMENTS;
129
125
  };
@@ -210,6 +206,7 @@ class ESPBTClient : public ESPBTDeviceListener {
210
206
 
211
207
  class ESP32BLETracker : public Component,
212
208
  public GAPEventHandler,
209
+ public GAPScanEventHandler,
213
210
  public GATTcEventHandler,
214
211
  public BLEStatusEventHandler,
215
212
  public Parented<ESP32BLE> {
@@ -240,6 +237,7 @@ class ESP32BLETracker : public Component,
240
237
  void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
241
238
  esp_ble_gattc_cb_param_t *param) override;
242
239
  void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) override;
240
+ void gap_scan_event_handler(const BLEScanResult &scan_result) override;
243
241
  void ble_before_disabled_event_handler() override;
244
242
 
245
243
  void add_scanner_state_callback(std::function<void(ScannerState)> &&callback) {
@@ -285,14 +283,16 @@ class ESP32BLETracker : public Component,
285
283
  bool ble_was_disabled_{true};
286
284
  bool raw_advertisements_{false};
287
285
  bool parse_advertisements_{false};
288
- SemaphoreHandle_t scan_result_lock_;
289
- size_t scan_result_index_{0};
290
- #ifdef USE_PSRAM
291
- const static u_int8_t SCAN_RESULT_BUFFER_SIZE = 32;
292
- #else
293
- const static u_int8_t SCAN_RESULT_BUFFER_SIZE = 20;
294
- #endif // USE_PSRAM
295
- esp_ble_gap_cb_param_t::ble_scan_result_evt_param *scan_result_buffer_;
286
+
287
+ // Lock-free Single-Producer Single-Consumer (SPSC) ring buffer for scan results
288
+ // Producer: ESP-IDF Bluetooth stack callback (gap_scan_event_handler)
289
+ // Consumer: ESPHome main loop (loop() method)
290
+ // This design ensures zero blocking in the BT callback and prevents scan result loss
291
+ BLEScanResult *scan_ring_buffer_;
292
+ std::atomic<size_t> ring_write_index_{0}; // Written only by BT callback (producer)
293
+ std::atomic<size_t> ring_read_index_{0}; // Written only by main loop (consumer)
294
+ std::atomic<size_t> scan_results_dropped_{0}; // Tracks buffer overflow events
295
+
296
296
  esp_bt_status_t scan_start_failed_{ESP_BT_STATUS_SUCCESS};
297
297
  esp_bt_status_t scan_set_param_failed_{ESP_BT_STATUS_SUCCESS};
298
298
  int connecting_{0};
@@ -46,17 +46,20 @@ void ESP32Camera::setup() {
46
46
 
47
47
  void ESP32Camera::dump_config() {
48
48
  auto conf = this->config_;
49
- ESP_LOGCONFIG(TAG, "ESP32 Camera:");
50
- ESP_LOGCONFIG(TAG, " Name: %s", this->name_.c_str());
51
- ESP_LOGCONFIG(TAG, " Internal: %s", YESNO(this->internal_));
52
- ESP_LOGCONFIG(TAG, " Data Pins: D0:%d D1:%d D2:%d D3:%d D4:%d D5:%d D6:%d D7:%d", conf.pin_d0, conf.pin_d1,
53
- conf.pin_d2, conf.pin_d3, conf.pin_d4, conf.pin_d5, conf.pin_d6, conf.pin_d7);
54
- ESP_LOGCONFIG(TAG, " VSYNC Pin: %d", conf.pin_vsync);
55
- ESP_LOGCONFIG(TAG, " HREF Pin: %d", conf.pin_href);
56
- ESP_LOGCONFIG(TAG, " Pixel Clock Pin: %d", conf.pin_pclk);
57
- ESP_LOGCONFIG(TAG, " External Clock: Pin:%d Frequency:%u", conf.pin_xclk, conf.xclk_freq_hz);
58
- ESP_LOGCONFIG(TAG, " I2C Pins: SDA:%d SCL:%d", conf.pin_sccb_sda, conf.pin_sccb_scl);
59
- ESP_LOGCONFIG(TAG, " Reset Pin: %d", conf.pin_reset);
49
+ ESP_LOGCONFIG(TAG,
50
+ "ESP32 Camera:\n"
51
+ " Name: %s\n"
52
+ " Internal: %s\n"
53
+ " Data Pins: D0:%d D1:%d D2:%d D3:%d D4:%d D5:%d D6:%d D7:%d\n"
54
+ " VSYNC Pin: %d\n"
55
+ " HREF Pin: %d\n"
56
+ " Pixel Clock Pin: %d\n"
57
+ " External Clock: Pin:%d Frequency:%u\n"
58
+ " I2C Pins: SDA:%d SCL:%d\n"
59
+ " Reset Pin: %d",
60
+ this->name_.c_str(), YESNO(this->is_internal()), conf.pin_d0, conf.pin_d1, conf.pin_d2, conf.pin_d3,
61
+ conf.pin_d4, conf.pin_d5, conf.pin_d6, conf.pin_d7, conf.pin_vsync, conf.pin_href, conf.pin_pclk,
62
+ conf.pin_xclk, conf.xclk_freq_hz, conf.pin_sccb_sda, conf.pin_sccb_scl, conf.pin_reset);
60
63
  switch (this->config_.frame_size) {
61
64
  case FRAMESIZE_QQVGA:
62
65
  ESP_LOGCONFIG(TAG, " Resolution: 160x120 (QQVGA)");
@@ -123,24 +126,29 @@ void ESP32Camera::dump_config() {
123
126
 
124
127
  sensor_t *s = esp_camera_sensor_get();
125
128
  auto st = s->status;
126
- ESP_LOGCONFIG(TAG, " JPEG Quality: %u", st.quality);
127
- ESP_LOGCONFIG(TAG, " Framebuffer Count: %u", conf.fb_count);
128
- ESP_LOGCONFIG(TAG, " Contrast: %d", st.contrast);
129
- ESP_LOGCONFIG(TAG, " Brightness: %d", st.brightness);
130
- ESP_LOGCONFIG(TAG, " Saturation: %d", st.saturation);
131
- ESP_LOGCONFIG(TAG, " Vertical Flip: %s", ONOFF(st.vflip));
132
- ESP_LOGCONFIG(TAG, " Horizontal Mirror: %s", ONOFF(st.hmirror));
133
- ESP_LOGCONFIG(TAG, " Special Effect: %u", st.special_effect);
134
- ESP_LOGCONFIG(TAG, " White Balance Mode: %u", st.wb_mode);
129
+ ESP_LOGCONFIG(TAG,
130
+ " JPEG Quality: %u\n"
131
+ " Framebuffer Count: %u\n"
132
+ " Contrast: %d\n"
133
+ " Brightness: %d\n"
134
+ " Saturation: %d\n"
135
+ " Vertical Flip: %s\n"
136
+ " Horizontal Mirror: %s\n"
137
+ " Special Effect: %u\n"
138
+ " White Balance Mode: %u",
139
+ st.quality, conf.fb_count, st.contrast, st.brightness, st.saturation, ONOFF(st.vflip),
140
+ ONOFF(st.hmirror), st.special_effect, st.wb_mode);
135
141
  // ESP_LOGCONFIG(TAG, " Auto White Balance: %u", st.awb);
136
142
  // ESP_LOGCONFIG(TAG, " Auto White Balance Gain: %u", st.awb_gain);
137
- ESP_LOGCONFIG(TAG, " Auto Exposure Control: %u", st.aec);
138
- ESP_LOGCONFIG(TAG, " Auto Exposure Control 2: %u", st.aec2);
139
- ESP_LOGCONFIG(TAG, " Auto Exposure Level: %d", st.ae_level);
140
- ESP_LOGCONFIG(TAG, " Auto Exposure Value: %u", st.aec_value);
141
- ESP_LOGCONFIG(TAG, " AGC: %u", st.agc);
142
- ESP_LOGCONFIG(TAG, " AGC Gain: %u", st.agc_gain);
143
- ESP_LOGCONFIG(TAG, " Gain Ceiling: %u", st.gainceiling);
143
+ ESP_LOGCONFIG(TAG,
144
+ " Auto Exposure Control: %u\n"
145
+ " Auto Exposure Control 2: %u\n"
146
+ " Auto Exposure Level: %d\n"
147
+ " Auto Exposure Value: %u\n"
148
+ " AGC: %u\n"
149
+ " AGC Gain: %u\n"
150
+ " Gain Ceiling: %u",
151
+ st.aec, st.aec2, st.ae_level, st.aec_value, st.agc, st.agc_gain, st.gainceiling);
144
152
  // ESP_LOGCONFIG(TAG, " BPC: %u", st.bpc);
145
153
  // ESP_LOGCONFIG(TAG, " WPC: %u", st.wpc);
146
154
  // ESP_LOGCONFIG(TAG, " RAW_GMA: %u", st.raw_gma);
@@ -85,8 +85,10 @@ void CameraWebServer::on_shutdown() {
85
85
  }
86
86
 
87
87
  void CameraWebServer::dump_config() {
88
- ESP_LOGCONFIG(TAG, "ESP32 Camera Web Server:");
89
- ESP_LOGCONFIG(TAG, " Port: %d", this->port_);
88
+ ESP_LOGCONFIG(TAG,
89
+ "ESP32 Camera Web Server:\n"
90
+ " Port: %d",
91
+ this->port_);
90
92
  if (this->mode_ == STREAM) {
91
93
  ESP_LOGCONFIG(TAG, " Mode: stream");
92
94
  } else {
@@ -1,6 +1,6 @@
1
1
  #include "esp32_dac.h"
2
- #include "esphome/core/log.h"
3
2
  #include "esphome/core/helpers.h"
3
+ #include "esphome/core/log.h"
4
4
 
5
5
  #ifdef USE_ESP32
6
6
 
@@ -20,7 +20,7 @@ static constexpr uint8_t DAC0_PIN = 25;
20
20
  static const char *const TAG = "esp32_dac";
21
21
 
22
22
  void ESP32DAC::setup() {
23
- ESP_LOGCONFIG(TAG, "Setting up ESP32 DAC Output...");
23
+ ESP_LOGCONFIG(TAG, "Running setup");
24
24
  this->pin_->setup();
25
25
  this->turn_off();
26
26
 
@@ -1,6 +1,7 @@
1
1
  from esphome import automation
2
2
  import esphome.codegen as cg
3
- from esphome.components import binary_sensor, output
3
+ from esphome.components import binary_sensor, esp32_ble, output
4
+ from esphome.components.esp32_ble import BTLoggers
4
5
  import esphome.config_validation as cv
5
6
  from esphome.const import CONF_ID, CONF_ON_STATE, CONF_TRIGGER_ID
6
7
 
@@ -94,6 +95,9 @@ CONFIG_SCHEMA = cv.Schema(
94
95
 
95
96
 
96
97
  async def to_code(config):
98
+ # Register the loggers this component needs
99
+ esp32_ble.register_bt_logger(BTLoggers.GATT, BTLoggers.SMP)
100
+
97
101
  var = cg.new_Pvariable(config[CONF_ID])
98
102
  await cg.register_component(var, config)
99
103
 
@@ -324,10 +324,10 @@ void ESP32ImprovComponent::process_incoming_data_() {
324
324
  this->incoming_data_.clear();
325
325
  }
326
326
  } else if (this->incoming_data_.size() - 2 > length) {
327
- ESP_LOGV(TAG, "Too much data received or data malformed; resetting buffer...");
327
+ ESP_LOGV(TAG, "Too much data received or data malformed; resetting buffer");
328
328
  this->incoming_data_.clear();
329
329
  } else {
330
- ESP_LOGV(TAG, "Waiting for split data packets...");
330
+ ESP_LOGV(TAG, "Waiting for split data packets");
331
331
  }
332
332
  }
333
333
 
@@ -22,7 +22,7 @@ static const uint8_t RMT_CLK_DIV = 2;
22
22
  #endif
23
23
 
24
24
  void ESP32RMTLEDStripLightOutput::setup() {
25
- ESP_LOGCONFIG(TAG, "Setting up ESP32 LED Strip...");
25
+ ESP_LOGCONFIG(TAG, "Running setup");
26
26
 
27
27
  size_t buffer_size = this->get_buffer_size_();
28
28
 
@@ -143,7 +143,7 @@ void ESP32RMTLEDStripLightOutput::write_state(light::LightState *state) {
143
143
  this->last_refresh_ = now;
144
144
  this->mark_shown_();
145
145
 
146
- ESP_LOGVV(TAG, "Writing RGB values to bus...");
146
+ ESP_LOGVV(TAG, "Writing RGB values to bus");
147
147
 
148
148
  #if ESP_IDF_VERSION_MAJOR >= 5
149
149
  esp_err_t error = rmt_tx_wait_all_done(this->channel_, 1000);
@@ -247,8 +247,10 @@ light::ESPColorView ESP32RMTLEDStripLightOutput::get_view_internal(int32_t index
247
247
  }
248
248
 
249
249
  void ESP32RMTLEDStripLightOutput::dump_config() {
250
- ESP_LOGCONFIG(TAG, "ESP32 RMT LED Strip:");
251
- ESP_LOGCONFIG(TAG, " Pin: %u", this->pin_);
250
+ ESP_LOGCONFIG(TAG,
251
+ "ESP32 RMT LED Strip:\n"
252
+ " Pin: %u",
253
+ this->pin_);
252
254
  #if ESP_IDF_VERSION_MAJOR >= 5
253
255
  ESP_LOGCONFIG(TAG, " RMT Symbols: %" PRIu32, this->rmt_symbols_);
254
256
  #else
@@ -278,9 +280,11 @@ void ESP32RMTLEDStripLightOutput::dump_config() {
278
280
  rgb_order = "UNKNOWN";
279
281
  break;
280
282
  }
281
- ESP_LOGCONFIG(TAG, " RGB Order: %s", rgb_order);
282
- ESP_LOGCONFIG(TAG, " Max refresh rate: %" PRIu32, *this->max_refresh_rate_);
283
- ESP_LOGCONFIG(TAG, " Number of LEDs: %u", this->num_leds_);
283
+ ESP_LOGCONFIG(TAG,
284
+ " RGB Order: %s\n"
285
+ " Max refresh rate: %" PRIu32 "\n"
286
+ " Number of LEDs: %u",
287
+ rgb_order, *this->max_refresh_rate_, this->num_leds_);
284
288
  }
285
289
 
286
290
  float ESP32RMTLEDStripLightOutput::get_setup_priority() const { return setup_priority::HARDWARE; }
@@ -131,7 +131,9 @@ CONFIG_SCHEMA = cv.All(
131
131
  esp32_idf=192,
132
132
  esp32_s2_idf=192,
133
133
  esp32_s3_idf=192,
134
+ esp32_p4_idf=192,
134
135
  esp32_c3_idf=96,
136
+ esp32_c5_idf=96,
135
137
  esp32_c6_idf=96,
136
138
  esp32_h2_idf=96,
137
139
  ): cv.All(only_with_new_rmt_driver, cv.int_range(min=2)),
@@ -140,7 +142,9 @@ CONFIG_SCHEMA = cv.All(
140
142
  cv.Optional(CONF_IS_RGBW, default=False): cv.boolean,
141
143
  cv.Optional(CONF_IS_WRGB, default=False): cv.boolean,
142
144
  cv.Optional(CONF_USE_DMA): cv.All(
143
- esp32.only_on_variant(supported=[esp32.const.VARIANT_ESP32S3]),
145
+ esp32.only_on_variant(
146
+ supported=[esp32.const.VARIANT_ESP32S3, esp32.const.VARIANT_ESP32P4]
147
+ ),
144
148
  cv.only_with_esp_idf,
145
149
  cv.boolean,
146
150
  ),
@@ -13,7 +13,7 @@ namespace esp32_touch {
13
13
  static const char *const TAG = "esp32_touch";
14
14
 
15
15
  void ESP32TouchComponent::setup() {
16
- ESP_LOGCONFIG(TAG, "Setting up ESP32 Touch Hub...");
16
+ ESP_LOGCONFIG(TAG, "Running setup");
17
17
  touch_pad_init();
18
18
  // set up and enable/start filtering based on ESP32 variant
19
19
  #if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
@@ -75,9 +75,11 @@ void ESP32TouchComponent::setup() {
75
75
  }
76
76
 
77
77
  void ESP32TouchComponent::dump_config() {
78
- ESP_LOGCONFIG(TAG, "Config for ESP32 Touch Hub:");
79
- ESP_LOGCONFIG(TAG, " Meas cycle: %.2fms", this->meas_cycle_ / (8000000.0f / 1000.0f));
80
- ESP_LOGCONFIG(TAG, " Sleep cycle: %.2fms", this->sleep_cycle_ / (150000.0f / 1000.0f));
78
+ ESP_LOGCONFIG(TAG,
79
+ "Config for ESP32 Touch Hub:\n"
80
+ " Meas cycle: %.2fms\n"
81
+ " Sleep cycle: %.2fms",
82
+ this->meas_cycle_ / (8000000.0f / 1000.0f), this->sleep_cycle_ / (150000.0f / 1000.0f));
81
83
 
82
84
  const char *lv_s;
83
85
  switch (this->low_voltage_reference_) {
@@ -171,10 +173,12 @@ void ESP32TouchComponent::dump_config() {
171
173
  filter_mode_s = "UNKNOWN";
172
174
  break;
173
175
  }
174
- ESP_LOGCONFIG(TAG, " Filter mode: %s", filter_mode_s);
175
- ESP_LOGCONFIG(TAG, " Debounce count: %" PRIu32, this->debounce_count_);
176
- ESP_LOGCONFIG(TAG, " Noise threshold coefficient: %" PRIu32, this->noise_threshold_);
177
- ESP_LOGCONFIG(TAG, " Jitter filter step size: %" PRIu32, this->jitter_step_);
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_);
178
182
  const char *smooth_level_s;
179
183
  switch (this->smooth_level_) {
180
184
  case TOUCH_PAD_SMOOTH_OFF: