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.

Potentially problematic release.


This version of esphome might be problematic. Click here for more details.

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
@@ -1,77 +1,128 @@
1
- # Source https://github.com/letscontrolit/ESPEasy/pull/3845#issuecomment-1005864664
2
-
3
- # pylint: disable=E0602
4
- Import("env") # noqa
5
-
6
- import os
7
- import shutil
8
-
9
- if os.environ.get("ESPHOME_USE_SUBPROCESS") is None:
10
- try:
11
- import esptool
12
- except ImportError:
13
- env.Execute("$PYTHONEXE -m pip install esptool")
14
- else:
15
- import subprocess
16
- from SCons.Script import ARGUMENTS
17
-
18
- # Copy over the default sdkconfig.
19
- from os import path
20
-
21
- if path.exists("./sdkconfig.defaults"):
22
- os.makedirs(".temp", exist_ok=True)
23
- shutil.copy("./sdkconfig.defaults", "./.temp/sdkconfig-esp32-idf")
24
-
25
-
26
- def esp32_create_combined_bin(source, target, env):
27
- verbose = bool(int(ARGUMENTS.get("PIOVERBOSE", "0")))
28
- if verbose:
29
- print("Generating combined binary for serial flashing")
30
- app_offset = 0x10000
31
-
32
- new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin")
33
- sections = env.subst(env.get("FLASH_EXTRA_IMAGES"))
34
- firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin")
35
- chip = env.get("BOARD_MCU")
36
- flash_size = env.BoardConfig().get("upload.flash_size")
1
+ Import("env") # noqa: F821
2
+
3
+ import itertools # noqa: E402
4
+ import json # noqa: E402
5
+ import os # noqa: E402
6
+ import pathlib # noqa: E402
7
+ import shutil # noqa: E402
8
+
9
+
10
+ def merge_factory_bin(source, target, env):
11
+ """
12
+ Merges all flash sections into a single .factory.bin using esptool.
13
+ Attempts multiple methods to detect image layout: flasher_args.json, FLASH_EXTRA_IMAGES, fallback guesses.
14
+ """
15
+ firmware_name = os.path.basename(env.subst("$PROGNAME")) + ".bin"
16
+ build_dir = pathlib.Path(env.subst("$BUILD_DIR"))
17
+ firmware_path = build_dir / firmware_name
18
+ flash_size = env.BoardConfig().get("upload.flash_size", "4MB")
19
+ chip = env.BoardConfig().get("build.mcu", "esp32")
20
+
21
+ sections = []
22
+ flasher_args_path = build_dir / "flasher_args.json"
23
+
24
+ # 1. Try flasher_args.json
25
+ if flasher_args_path.exists():
26
+ try:
27
+ with flasher_args_path.open() as f:
28
+ flash_data = json.load(f)
29
+ for addr, fname in sorted(
30
+ flash_data["flash_files"].items(), key=lambda kv: int(kv[0], 16)
31
+ ):
32
+ file_path = pathlib.Path(fname)
33
+ if file_path.exists():
34
+ sections.append((addr, str(file_path)))
35
+ else:
36
+ print(f"Info: {file_path.name} not found - skipping")
37
+ except Exception as e:
38
+ print(f"Warning: Failed to parse flasher_args.json - {e}")
39
+
40
+ # 2. Try FLASH_EXTRA_IMAGES if flasher_args.json failed or was empty
41
+ if not sections:
42
+ flash_images = env.get("FLASH_EXTRA_IMAGES")
43
+ if flash_images:
44
+ print("Using FLASH_EXTRA_IMAGES from PlatformIO environment")
45
+ # flatten any nested lists
46
+ flat = list(
47
+ itertools.chain.from_iterable(
48
+ x if isinstance(x, (list, tuple)) else [x] for x in flash_images
49
+ )
50
+ )
51
+ entries = [env.subst(x) for x in flat]
52
+ for i in range(0, len(entries) - 1, 2):
53
+ addr, fname = entries[i], entries[i + 1]
54
+ if isinstance(fname, (list, tuple)):
55
+ print(
56
+ f"Warning: Skipping malformed FLASH_EXTRA_IMAGES entry: {fname}"
57
+ )
58
+ continue
59
+ file_path = pathlib.Path(str(fname))
60
+ if file_path.exists():
61
+ sections.append((addr, file_path))
62
+ else:
63
+ print(f"Info: {file_path.name} not found — skipping")
64
+ if sections:
65
+ # Append main firmware to sections
66
+ sections.append(("0x10000", firmware_path))
67
+
68
+ # 3. Final fallback: guess standard image locations
69
+ if not sections:
70
+ print("Fallback: guessing legacy image paths")
71
+ guesses = [
72
+ ("0x0", build_dir / "bootloader" / "bootloader.bin"),
73
+ ("0x8000", build_dir / "partition_table" / "partition-table.bin"),
74
+ ("0xe000", build_dir / "ota_data_initial.bin"),
75
+ ("0x10000", firmware_path),
76
+ ]
77
+ for addr, file_path in guesses:
78
+ if file_path.exists():
79
+ sections.append((addr, file_path))
80
+ else:
81
+ print(f"Info: {file_path.name} not found — skipping")
82
+
83
+ # If no valid sections found, skip merge
84
+ if not sections:
85
+ print("No valid flash sections found — skipping .factory.bin creation.")
86
+ return
87
+
88
+ output_path = firmware_path.with_suffix(".factory.bin")
89
+ python_exe = f'"{env.subst("$PYTHONEXE")}"'
37
90
  cmd = [
91
+ python_exe,
92
+ "-m",
93
+ "esptool",
38
94
  "--chip",
39
95
  chip,
40
- "merge_bin",
41
- "-o",
42
- new_file_name,
43
- "--flash_size",
96
+ "merge-bin",
97
+ "--flash-size",
44
98
  flash_size,
99
+ "--output",
100
+ str(output_path),
45
101
  ]
46
- if verbose:
47
- print(" Offset | File")
48
- for section in sections:
49
- sect_adr, sect_file = section.split(" ", 1)
50
- if verbose:
51
- print(f" - {sect_adr} | {sect_file}")
52
- cmd += [sect_adr, sect_file]
102
+ for addr, file_path in sections:
103
+ cmd += [addr, str(file_path)]
53
104
 
54
- cmd += [hex(app_offset), firmware_name]
105
+ print(f"Merging binaries into {output_path}")
106
+ result = env.Execute(
107
+ env.VerboseAction(" ".join(cmd), "Merging binaries with esptool")
108
+ )
55
109
 
56
- if verbose:
57
- print(f" - {hex(app_offset)} | {firmware_name}")
58
- print()
59
- print(f"Using esptool.py arguments: {' '.join(cmd)}")
60
- print()
61
-
62
- if os.environ.get("ESPHOME_USE_SUBPROCESS") is None:
63
- esptool.main(cmd)
110
+ if result == 0:
111
+ print(f"Successfully created {output_path}")
64
112
  else:
65
- subprocess.run(["esptool.py", *cmd])
113
+ print(f"Error: esptool merge-bin failed with code {result}")
66
114
 
67
115
 
68
116
  def esp32_copy_ota_bin(source, target, env):
117
+ """
118
+ Copy the main firmware to a .ota.bin file for compatibility with ESPHome OTA tools.
119
+ """
69
120
  firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin")
70
121
  new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin")
71
-
72
122
  shutil.copyfile(firmware_name, new_file_name)
123
+ print(f"Copied firmware to {new_file_name}")
73
124
 
74
125
 
75
- # pylint: disable=E0602
76
- env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin) # noqa
77
- env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_copy_ota_bin) # noqa
126
+ # Run merge first, then ota copy second
127
+ env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", merge_factory_bin) # noqa: F821
128
+ env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_copy_ota_bin) # noqa: F821
@@ -6,12 +6,13 @@ import esphome.codegen as cg
6
6
  from esphome.components.esp32 import add_idf_sdkconfig_option, const, get_esp32_variant
7
7
  import esphome.config_validation as cv
8
8
  from esphome.const import CONF_ENABLE_ON_BOOT, CONF_ESPHOME, CONF_ID, CONF_NAME
9
- from esphome.core import CORE
9
+ from esphome.core import CORE, TimePeriod
10
10
  from esphome.core.config import CONF_NAME_ADD_MAC_SUFFIX
11
11
  import esphome.final_validate as fv
12
12
 
13
13
  DEPENDENCIES = ["esp32"]
14
- CODEOWNERS = ["@jesserockz", "@Rapsssito"]
14
+ CODEOWNERS = ["@jesserockz", "@Rapsssito", "@bdraco"]
15
+ DOMAIN = "esp32_ble"
15
16
 
16
17
 
17
18
  class BTLoggers(Enum):
@@ -115,8 +116,11 @@ def register_bt_logger(*loggers: BTLoggers) -> None:
115
116
 
116
117
  CONF_BLE_ID = "ble_id"
117
118
  CONF_IO_CAPABILITY = "io_capability"
119
+ CONF_ADVERTISING = "advertising"
118
120
  CONF_ADVERTISING_CYCLE_TIME = "advertising_cycle_time"
119
121
  CONF_DISABLE_BT_LOGS = "disable_bt_logs"
122
+ CONF_CONNECTION_TIMEOUT = "connection_timeout"
123
+ CONF_MAX_NOTIFICATIONS = "max_notifications"
120
124
 
121
125
  NO_BLUETOOTH_VARIANTS = [const.VARIANT_ESP32S2]
122
126
 
@@ -161,12 +165,23 @@ CONFIG_SCHEMA = cv.Schema(
161
165
  IO_CAPABILITY, lower=True
162
166
  ),
163
167
  cv.Optional(CONF_ENABLE_ON_BOOT, default=True): cv.boolean,
168
+ cv.Optional(CONF_ADVERTISING, default=False): cv.boolean,
164
169
  cv.Optional(
165
170
  CONF_ADVERTISING_CYCLE_TIME, default="10s"
166
171
  ): cv.positive_time_period_milliseconds,
167
172
  cv.SplitDefault(CONF_DISABLE_BT_LOGS, esp32_idf=True): cv.All(
168
173
  cv.only_with_esp_idf, cv.boolean
169
174
  ),
175
+ cv.SplitDefault(CONF_CONNECTION_TIMEOUT, esp32_idf="20s"): cv.All(
176
+ cv.only_with_esp_idf,
177
+ cv.positive_time_period_seconds,
178
+ cv.Range(min=TimePeriod(seconds=10), max=TimePeriod(seconds=180)),
179
+ ),
180
+ cv.SplitDefault(CONF_MAX_NOTIFICATIONS, esp32_idf=12): cv.All(
181
+ cv.only_with_esp_idf,
182
+ cv.positive_int,
183
+ cv.Range(min=1, max=64),
184
+ ),
170
185
  }
171
186
  ).extend(cv.COMPONENT_SCHEMA)
172
187
 
@@ -255,8 +270,31 @@ async def to_code(config):
255
270
  if logger not in _required_loggers:
256
271
  add_idf_sdkconfig_option(f"{logger.value}_NONE", True)
257
272
 
273
+ # Set BLE connection establishment timeout to match aioesphomeapi/bleak-retry-connector
274
+ # Default is 20 seconds instead of ESP-IDF's 30 seconds. Because there is no way to
275
+ # cancel a BLE connection in progress, when aioesphomeapi times out at 20 seconds,
276
+ # the connection slot remains occupied for the remaining time, preventing new connection
277
+ # attempts and wasting valuable connection slots.
278
+ if CONF_CONNECTION_TIMEOUT in config:
279
+ timeout_seconds = int(config[CONF_CONNECTION_TIMEOUT].total_seconds)
280
+ add_idf_sdkconfig_option(
281
+ "CONFIG_BT_BLE_ESTAB_LINK_CONN_TOUT", timeout_seconds
282
+ )
283
+
284
+ # Set the maximum number of notification registrations
285
+ # This controls how many BLE characteristics can have notifications enabled
286
+ # across all connections for a single GATT client interface
287
+ # https://github.com/esphome/issues/issues/6808
288
+ if CONF_MAX_NOTIFICATIONS in config:
289
+ add_idf_sdkconfig_option(
290
+ "CONFIG_BT_GATTC_NOTIF_REG_MAX", config[CONF_MAX_NOTIFICATIONS]
291
+ )
292
+
258
293
  cg.add_define("USE_ESP32_BLE")
259
294
 
295
+ if config[CONF_ADVERTISING]:
296
+ cg.add_define("USE_ESP32_BLE_ADVERTISING")
297
+
260
298
 
261
299
  @automation.register_condition("ble.enabled", BLEEnabledCondition, cv.Schema({}))
262
300
  async def ble_enabled_to_code(config, condition_id, template_arg, args):
@@ -1,7 +1,7 @@
1
- #ifdef USE_ESP32
2
-
3
1
  #include "ble.h"
4
2
 
3
+ #ifdef USE_ESP32
4
+
5
5
  #include "esphome/core/application.h"
6
6
  #include "esphome/core/helpers.h"
7
7
  #include "esphome/core/log.h"
@@ -19,15 +19,12 @@
19
19
  #include <esp32-hal-bt.h>
20
20
  #endif
21
21
 
22
- namespace esphome {
23
- namespace esp32_ble {
22
+ namespace esphome::esp32_ble {
24
23
 
25
24
  static const char *const TAG = "esp32_ble";
26
25
 
27
26
  void ESP32BLE::setup() {
28
27
  global_ble = this;
29
- ESP_LOGCONFIG(TAG, "Running setup");
30
-
31
28
  if (!ble_pre_setup_()) {
32
29
  ESP_LOGE(TAG, "BLE could not be prepared for configuration");
33
30
  this->mark_failed();
@@ -56,6 +53,7 @@ void ESP32BLE::disable() {
56
53
 
57
54
  bool ESP32BLE::is_active() { return this->state_ == BLE_COMPONENT_STATE_ACTIVE; }
58
55
 
56
+ #ifdef USE_ESP32_BLE_ADVERTISING
59
57
  void ESP32BLE::advertising_start() {
60
58
  this->advertising_init_();
61
59
  if (!this->is_active())
@@ -91,6 +89,7 @@ void ESP32BLE::advertising_remove_service_uuid(ESPBTUUID uuid) {
91
89
  this->advertising_->remove_service_uuid(uuid);
92
90
  this->advertising_start();
93
91
  }
92
+ #endif
94
93
 
95
94
  bool ESP32BLE::ble_pre_setup_() {
96
95
  esp_err_t err = nvs_flash_init();
@@ -101,6 +100,7 @@ bool ESP32BLE::ble_pre_setup_() {
101
100
  return true;
102
101
  }
103
102
 
103
+ #ifdef USE_ESP32_BLE_ADVERTISING
104
104
  void ESP32BLE::advertising_init_() {
105
105
  if (this->advertising_ != nullptr)
106
106
  return;
@@ -110,6 +110,7 @@ void ESP32BLE::advertising_init_() {
110
110
  this->advertising_->set_min_preferred_interval(0x06);
111
111
  this->advertising_->set_appearance(this->appearance_);
112
112
  }
113
+ #endif
113
114
 
114
115
  bool ESP32BLE::ble_setup_() {
115
116
  esp_err_t err;
@@ -397,9 +398,11 @@ void ESP32BLE::loop() {
397
398
  this->ble_event_pool_.release(ble_event);
398
399
  ble_event = this->ble_events_.pop();
399
400
  }
401
+ #ifdef USE_ESP32_BLE_ADVERTISING
400
402
  if (this->advertising_ != nullptr) {
401
403
  this->advertising_->loop();
402
404
  }
405
+ #endif
403
406
 
404
407
  // Log dropped events periodically
405
408
  uint16_t dropped = this->ble_events_.get_and_reset_dropped_count();
@@ -471,6 +474,8 @@ void ESP32BLE::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_pa
471
474
  // Ignore these GAP events as they are not relevant for our use case
472
475
  case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:
473
476
  case ESP_GAP_BLE_SET_PKT_LENGTH_COMPLETE_EVT:
477
+ case ESP_GAP_BLE_PHY_UPDATE_COMPLETE_EVT: // BLE 5.0 PHY update complete
478
+ case ESP_GAP_BLE_CHANNEL_SELECT_ALGORITHM_EVT: // BLE 5.0 channel selection algorithm
474
479
  return;
475
480
 
476
481
  default:
@@ -538,7 +543,6 @@ uint64_t ble_addr_to_uint64(const esp_bd_addr_t address) {
538
543
 
539
544
  ESP32BLE *global_ble = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
540
545
 
541
- } // namespace esp32_ble
542
- } // namespace esphome
546
+ } // namespace esphome::esp32_ble
543
547
 
544
548
  #endif
@@ -1,14 +1,17 @@
1
1
  #pragma once
2
2
 
3
- #include "ble_advertising.h"
3
+ #include "esphome/core/defines.h" // Must be included before conditional includes
4
+
4
5
  #include "ble_uuid.h"
5
6
  #include "ble_scan_result.h"
7
+ #ifdef USE_ESP32_BLE_ADVERTISING
8
+ #include "ble_advertising.h"
9
+ #endif
6
10
 
7
11
  #include <functional>
8
12
 
9
13
  #include "esphome/core/automation.h"
10
14
  #include "esphome/core/component.h"
11
- #include "esphome/core/defines.h"
12
15
  #include "esphome/core/helpers.h"
13
16
 
14
17
  #include "ble_event.h"
@@ -21,24 +24,16 @@
21
24
  #include <esp_gattc_api.h>
22
25
  #include <esp_gatts_api.h>
23
26
 
24
- namespace esphome {
25
- namespace esp32_ble {
27
+ namespace esphome::esp32_ble {
26
28
 
27
- // Maximum number of BLE scan results to buffer
28
- // Sized to handle bursts of advertisements while allowing for processing delays
29
- // With 16 advertisements per batch and some safety margin:
30
- // - Without PSRAM: 24 entries (1.5× batch size)
31
- // - With PSRAM: 36 entries (2.25× batch size)
32
- // The reduced structure size (~80 bytes vs ~400 bytes) allows for larger buffers
29
+ // Maximum size of the BLE event queue
30
+ // Increased to absorb the ring buffer capacity from esp32_ble_tracker
33
31
  #ifdef USE_PSRAM
34
- static constexpr uint8_t SCAN_RESULT_BUFFER_SIZE = 36;
32
+ static constexpr uint8_t MAX_BLE_QUEUE_SIZE = 100; // 64 + 36 (ring buffer size with PSRAM)
35
33
  #else
36
- static constexpr uint8_t SCAN_RESULT_BUFFER_SIZE = 24;
34
+ static constexpr uint8_t MAX_BLE_QUEUE_SIZE = 88; // 64 + 24 (ring buffer size without PSRAM)
37
35
  #endif
38
36
 
39
- // Maximum size of the BLE event queue - must be power of 2 for lock-free queue
40
- static constexpr size_t MAX_BLE_QUEUE_SIZE = 64;
41
-
42
37
  uint64_t ble_addr_to_uint64(const esp_bd_addr_t address);
43
38
 
44
39
  // NOLINTNEXTLINE(modernize-use-using)
@@ -114,6 +109,7 @@ class ESP32BLE : public Component {
114
109
  float get_setup_priority() const override;
115
110
  void set_name(const std::string &name) { this->name_ = name; }
116
111
 
112
+ #ifdef USE_ESP32_BLE_ADVERTISING
117
113
  void advertising_start();
118
114
  void advertising_set_service_data(const std::vector<uint8_t> &data);
119
115
  void advertising_set_manufacturer_data(const std::vector<uint8_t> &data);
@@ -121,6 +117,7 @@ class ESP32BLE : public Component {
121
117
  void advertising_add_service_uuid(ESPBTUUID uuid);
122
118
  void advertising_remove_service_uuid(ESPBTUUID uuid);
123
119
  void advertising_register_raw_advertisement_callback(std::function<void(bool)> &&callback);
120
+ #endif
124
121
 
125
122
  void register_gap_event_handler(GAPEventHandler *handler) { this->gap_event_handlers_.push_back(handler); }
126
123
  void register_gap_scan_event_handler(GAPScanEventHandler *handler) {
@@ -141,7 +138,9 @@ class ESP32BLE : public Component {
141
138
  bool ble_setup_();
142
139
  bool ble_dismantle_();
143
140
  bool ble_pre_setup_();
141
+ #ifdef USE_ESP32_BLE_ADVERTISING
144
142
  void advertising_init_();
143
+ #endif
145
144
 
146
145
  private:
147
146
  template<typename... Args> friend void enqueue_ble_event(Args... args);
@@ -161,7 +160,9 @@ class ESP32BLE : public Component {
161
160
  optional<std::string> name_;
162
161
 
163
162
  // 4-byte aligned members
164
- BLEAdvertising *advertising_{}; // 4 bytes (pointer)
163
+ #ifdef USE_ESP32_BLE_ADVERTISING
164
+ BLEAdvertising *advertising_{}; // 4 bytes (pointer)
165
+ #endif
165
166
  esp_ble_io_cap_t io_cap_{ESP_IO_CAP_NONE}; // 4 bytes (enum)
166
167
  uint32_t advertising_cycle_time_{}; // 4 bytes
167
168
 
@@ -191,7 +192,6 @@ template<typename... Ts> class BLEDisableAction : public Action<Ts...> {
191
192
  void play(Ts... x) override { global_ble->disable(); }
192
193
  };
193
194
 
194
- } // namespace esp32_ble
195
- } // namespace esphome
195
+ } // namespace esphome::esp32_ble
196
196
 
197
197
  #endif
@@ -1,6 +1,7 @@
1
1
  #include "ble_advertising.h"
2
2
 
3
3
  #ifdef USE_ESP32
4
+ #ifdef USE_ESP32_BLE_ADVERTISING
4
5
 
5
6
  #include <cstdio>
6
7
  #include <cstring>
@@ -8,8 +9,7 @@
8
9
  #include "esphome/core/log.h"
9
10
  #include "esphome/core/application.h"
10
11
 
11
- namespace esphome {
12
- namespace esp32_ble {
12
+ namespace esphome::esp32_ble {
13
13
 
14
14
  static const char *const TAG = "esp32_ble.advertising";
15
15
 
@@ -160,7 +160,7 @@ void BLEAdvertising::register_raw_advertisement_callback(std::function<void(bool
160
160
  this->raw_advertisements_callbacks_.push_back(std::move(callback));
161
161
  }
162
162
 
163
- } // namespace esp32_ble
164
- } // namespace esphome
163
+ } // namespace esphome::esp32_ble
165
164
 
166
- #endif
165
+ #endif // USE_ESP32_BLE_ADVERTISING
166
+ #endif // USE_ESP32
@@ -1,17 +1,19 @@
1
1
  #pragma once
2
2
 
3
+ #include "esphome/core/defines.h"
4
+
3
5
  #include <array>
4
6
  #include <functional>
5
7
  #include <vector>
6
8
 
7
9
  #ifdef USE_ESP32
10
+ #ifdef USE_ESP32_BLE_ADVERTISING
8
11
 
9
12
  #include <esp_bt.h>
10
13
  #include <esp_gap_ble_api.h>
11
14
  #include <esp_gatts_api.h>
12
15
 
13
- namespace esphome {
14
- namespace esp32_ble {
16
+ namespace esphome::esp32_ble {
15
17
 
16
18
  using raw_adv_data_t = struct {
17
19
  uint8_t *data;
@@ -55,7 +57,7 @@ class BLEAdvertising {
55
57
  int8_t current_adv_index_{-1}; // -1 means standard scan response
56
58
  };
57
59
 
58
- } // namespace esp32_ble
59
- } // namespace esphome
60
+ } // namespace esphome::esp32_ble
60
61
 
61
- #endif
62
+ #endif // USE_ESP32_BLE_ADVERTISING
63
+ #endif // USE_ESP32
@@ -11,8 +11,7 @@
11
11
 
12
12
  #include "ble_scan_result.h"
13
13
 
14
- namespace esphome {
15
- namespace esp32_ble {
14
+ namespace esphome::esp32_ble {
16
15
 
17
16
  // Compile-time verification that ESP-IDF scan complete events only contain a status field
18
17
  // This ensures our reinterpret_cast in ble.cpp is safe
@@ -395,7 +394,6 @@ static_assert(sizeof(esp_ble_sec_t) <= 73, "esp_ble_sec_t is larger than BLEScan
395
394
 
396
395
  // BLEEvent total size: 84 bytes (80 byte union + 1 byte type + 3 bytes padding)
397
396
 
398
- } // namespace esp32_ble
399
- } // namespace esphome
397
+ } // namespace esphome::esp32_ble
400
398
 
401
399
  #endif
@@ -4,8 +4,7 @@
4
4
 
5
5
  #include <esp_gap_ble_api.h>
6
6
 
7
- namespace esphome {
8
- namespace esp32_ble {
7
+ namespace esphome::esp32_ble {
9
8
 
10
9
  // Structure for BLE scan results - only fields we actually use
11
10
  struct __attribute__((packed)) BLEScanResult {
@@ -18,7 +17,6 @@ struct __attribute__((packed)) BLEScanResult {
18
17
  uint8_t search_evt;
19
18
  }; // ~73 bytes vs ~400 bytes for full esp_ble_gap_cb_param_t
20
19
 
21
- } // namespace esp32_ble
22
- } // namespace esphome
20
+ } // namespace esphome::esp32_ble
23
21
 
24
22
  #endif
@@ -1,14 +1,14 @@
1
1
  #include "ble_uuid.h"
2
2
 
3
3
  #ifdef USE_ESP32
4
+ #ifdef USE_ESP32_BLE_UUID
4
5
 
5
6
  #include <cstring>
6
7
  #include <cstdio>
7
8
  #include <cinttypes>
8
9
  #include "esphome/core/log.h"
9
10
 
10
- namespace esphome {
11
- namespace esp32_ble {
11
+ namespace esphome::esp32_ble {
12
12
 
13
13
  static const char *const TAG = "esp32_ble";
14
14
 
@@ -189,7 +189,7 @@ std::string ESPBTUUID::to_string() const {
189
189
  return "";
190
190
  }
191
191
 
192
- } // namespace esp32_ble
193
- } // namespace esphome
192
+ } // namespace esphome::esp32_ble
194
193
 
195
- #endif
194
+ #endif // USE_ESP32_BLE_UUID
195
+ #endif // USE_ESP32
@@ -1,15 +1,16 @@
1
1
  #pragma once
2
2
 
3
+ #include "esphome/core/defines.h"
3
4
  #include "esphome/core/hal.h"
4
5
  #include "esphome/core/helpers.h"
5
6
 
6
7
  #ifdef USE_ESP32
8
+ #ifdef USE_ESP32_BLE_UUID
7
9
 
8
10
  #include <string>
9
11
  #include <esp_bt_defs.h>
10
12
 
11
- namespace esphome {
12
- namespace esp32_ble {
13
+ namespace esphome::esp32_ble {
13
14
 
14
15
  class ESPBTUUID {
15
16
  public:
@@ -41,7 +42,7 @@ class ESPBTUUID {
41
42
  esp_bt_uuid_t uuid_;
42
43
  };
43
44
 
44
- } // namespace esp32_ble
45
- } // namespace esphome
45
+ } // namespace esphome::esp32_ble
46
46
 
47
- #endif
47
+ #endif // USE_ESP32_BLE_UUID
48
+ #endif // USE_ESP32
@@ -65,6 +65,8 @@ FINAL_VALIDATE_SCHEMA = esp32_ble.validate_variant
65
65
 
66
66
 
67
67
  async def to_code(config):
68
+ cg.add_define("USE_ESP32_BLE_UUID")
69
+
68
70
  uuid = config[CONF_UUID].hex
69
71
  uuid_arr = [
70
72
  cg.RawExpression(f"0x{uuid[i : i + 2]}") for i in range(0, len(uuid), 2)
@@ -82,6 +84,8 @@ async def to_code(config):
82
84
  cg.add(var.set_measured_power(config[CONF_MEASURED_POWER]))
83
85
  cg.add(var.set_tx_power(config[CONF_TX_POWER]))
84
86
 
87
+ cg.add_define("USE_ESP32_BLE_ADVERTISING")
88
+
85
89
  if CORE.using_esp_idf:
86
90
  add_idf_sdkconfig_option("CONFIG_BT_ENABLED", True)
87
91
  add_idf_sdkconfig_option("CONFIG_BT_BLE_42_FEATURES_SUPPORTED", True)
@@ -2,7 +2,7 @@ import esphome.codegen as cg
2
2
  from esphome.components import esp32_ble_tracker
3
3
 
4
4
  AUTO_LOAD = ["esp32_ble_tracker"]
5
- CODEOWNERS = ["@jesserockz"]
5
+ CODEOWNERS = ["@jesserockz", "@bdraco"]
6
6
  DEPENDENCIES = ["esp32"]
7
7
 
8
8
  esp32_ble_client_ns = cg.esphome_ns.namespace("esp32_ble_client")
@@ -5,9 +5,9 @@
5
5
  #include "esphome/core/log.h"
6
6
 
7
7
  #ifdef USE_ESP32
8
+ #ifdef USE_ESP32_BLE_DEVICE
8
9
 
9
- namespace esphome {
10
- namespace esp32_ble_client {
10
+ namespace esphome::esp32_ble_client {
11
11
 
12
12
  static const char *const TAG = "esp32_ble_client";
13
13
 
@@ -93,7 +93,7 @@ esp_err_t BLECharacteristic::write_value(uint8_t *new_val, int16_t new_val_size)
93
93
  return write_value(new_val, new_val_size, ESP_GATT_WRITE_TYPE_NO_RSP);
94
94
  }
95
95
 
96
- } // namespace esp32_ble_client
97
- } // namespace esphome
96
+ } // namespace esphome::esp32_ble_client
98
97
 
98
+ #endif // USE_ESP32_BLE_DEVICE
99
99
  #endif // USE_ESP32