esphome 2025.7.5__py3-none-any.whl → 2025.8.0__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 (756) hide show
  1. esphome/__main__.py +190 -83
  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 +102 -52
  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 +475 -116
  73. esphome/components/atm90e32/atm90e32.h +43 -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 +392 -81
  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 +203 -60
  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 +41 -2
  149. esphome/components/esp32_ble/ble.cpp +14 -10
  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 +139 -73
  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/fs3000/fs3000.cpp +0 -2
  209. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  210. esphome/components/ft63x6/ft63x6.cpp +0 -1
  211. esphome/components/gdk101/gdk101.cpp +0 -1
  212. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  213. esphome/components/gl_r01_i2c/sensor.py +1 -1
  214. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  215. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  216. esphome/components/gpio_expander/cached_gpio.h +24 -15
  217. esphome/components/gps/__init__.py +6 -2
  218. esphome/components/gps/gps.cpp +50 -49
  219. esphome/components/gps/gps.h +4 -8
  220. esphome/components/gps/time/gps_time.cpp +3 -9
  221. esphome/components/gps/time/gps_time.h +4 -7
  222. esphome/components/graph/__init__.py +1 -1
  223. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  224. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  225. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  227. esphome/components/haier/climate.py +5 -10
  228. esphome/components/haier/haier_base.cpp +0 -1
  229. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  230. esphome/components/hdc1080/hdc1080.cpp +0 -2
  231. esphome/components/heatpumpir/climate.py +2 -2
  232. esphome/components/hlw8012/hlw8012.cpp +0 -1
  233. esphome/components/hm3301/hm3301.cpp +0 -1
  234. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  235. esphome/components/homeassistant/__init__.py +1 -0
  236. esphome/components/homeassistant/number/__init__.py +1 -0
  237. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  238. esphome/components/homeassistant/switch/__init__.py +1 -0
  239. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  240. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  241. esphome/components/host/__init__.py +2 -0
  242. esphome/components/hte501/hte501.cpp +0 -1
  243. esphome/components/http_request/__init__.py +2 -3
  244. esphome/components/http_request/http_request_idf.cpp +2 -2
  245. esphome/components/htu21d/htu21d.cpp +0 -2
  246. esphome/components/htu31d/htu31d.cpp +0 -2
  247. esphome/components/hx711/hx711.cpp +0 -1
  248. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  249. esphome/components/hydreon_rgxx/sensor.py +4 -5
  250. esphome/components/i2c/i2c_bus.h +1 -1
  251. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  252. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  253. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  254. esphome/components/i2s_audio/__init__.py +6 -5
  255. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  256. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  257. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  258. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +0 -1
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +2 -2
  260. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  262. esphome/components/ili9xxx/display.py +4 -3
  263. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  264. esphome/components/image/__init__.py +123 -92
  265. esphome/components/improv_serial/__init__.py +7 -8
  266. esphome/components/ina219/ina219.cpp +0 -1
  267. esphome/components/ina226/ina226.cpp +0 -2
  268. esphome/components/ina260/ina260.cpp +0 -2
  269. esphome/components/ina2xx_base/__init__.py +2 -5
  270. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  271. esphome/components/ina3221/ina3221.cpp +0 -1
  272. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  273. esphome/components/interval/interval.h +5 -9
  274. esphome/components/json/__init__.py +1 -1
  275. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  276. esphome/components/lc709203f/lc709203f.cpp +0 -2
  277. esphome/components/lcd_gpio/display.py +1 -3
  278. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  279. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  280. esphome/components/ld2410/__init__.py +4 -6
  281. esphome/components/ld2410/binary_sensor.py +4 -0
  282. esphome/components/ld2410/ld2410.cpp +56 -100
  283. esphome/components/ld2410/ld2410.h +17 -15
  284. esphome/components/ld2410/sensor.py +24 -10
  285. esphome/components/ld2412/__init__.py +46 -0
  286. esphome/components/ld2412/binary_sensor.py +70 -0
  287. esphome/components/ld2412/button/__init__.py +74 -0
  288. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  289. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  290. esphome/components/ld2412/button/query_button.cpp +9 -0
  291. esphome/components/ld2412/button/query_button.h +18 -0
  292. esphome/components/ld2412/button/restart_button.cpp +9 -0
  293. esphome/components/ld2412/button/restart_button.h +18 -0
  294. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  296. esphome/components/ld2412/ld2412.cpp +861 -0
  297. esphome/components/ld2412/ld2412.h +141 -0
  298. esphome/components/ld2412/number/__init__.py +126 -0
  299. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  300. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  301. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  302. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  303. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  305. esphome/components/ld2412/select/__init__.py +82 -0
  306. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  307. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  308. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  309. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  310. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  311. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  312. esphome/components/ld2412/sensor.py +124 -0
  313. esphome/components/ld2412/switch/__init__.py +45 -0
  314. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  316. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  318. esphome/components/ld2412/text_sensor.py +34 -0
  319. esphome/components/ld2420/ld2420.cpp +0 -1
  320. esphome/components/ld2450/__init__.py +3 -4
  321. esphome/components/ld2450/binary_sensor.py +3 -0
  322. esphome/components/ld2450/ld2450.cpp +77 -165
  323. esphome/components/ld2450/ld2450.h +26 -54
  324. esphome/components/ld2450/sensor.py +120 -6
  325. esphome/components/ld2450/text_sensor.py +5 -4
  326. esphome/components/ld24xx/__init__.py +1 -0
  327. esphome/components/ld24xx/ld24xx.h +65 -0
  328. esphome/components/ledc/ledc_output.cpp +0 -1
  329. esphome/components/libretiny/__init__.py +2 -0
  330. esphome/components/light/__init__.py +0 -1
  331. esphome/components/light/effects.py +70 -45
  332. esphome/components/light/light_call.cpp +101 -66
  333. esphome/components/light/light_color_values.h +16 -11
  334. esphome/components/light/light_json_schema.cpp +46 -44
  335. esphome/components/light/light_state.cpp +8 -11
  336. esphome/components/light/light_traits.h +17 -0
  337. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  338. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  339. esphome/components/lock/__init__.py +0 -1
  340. esphome/components/logger/__init__.py +31 -9
  341. esphome/components/logger/logger.cpp +12 -7
  342. esphome/components/logger/logger.h +25 -14
  343. esphome/components/logger/logger_esp32.cpp +2 -7
  344. esphome/components/logger/logger_esp8266.cpp +2 -4
  345. esphome/components/logger/logger_host.cpp +2 -4
  346. esphome/components/logger/logger_libretiny.cpp +2 -4
  347. esphome/components/logger/logger_rp2040.cpp +2 -4
  348. esphome/components/logger/logger_zephyr.cpp +86 -0
  349. esphome/components/logger/select/logger_level_select.cpp +2 -4
  350. esphome/components/logger/select/logger_level_select.h +2 -4
  351. esphome/components/logger/task_log_buffer.cpp +2 -4
  352. esphome/components/logger/task_log_buffer.h +2 -4
  353. esphome/components/lps22/sensor.py +5 -5
  354. esphome/components/ltr390/ltr390.cpp +0 -2
  355. esphome/components/ltr501/ltr501.cpp +0 -1
  356. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  357. esphome/components/lvgl/__init__.py +14 -13
  358. esphome/components/lvgl/automation.py +2 -4
  359. esphome/components/lvgl/defines.py +0 -2
  360. esphome/components/lvgl/helpers.py +1 -1
  361. esphome/components/lvgl/lv_validation.py +7 -4
  362. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  363. esphome/components/lvgl/styles.py +2 -2
  364. esphome/components/lvgl/types.py +1 -1
  365. esphome/components/lvgl/widgets/__init__.py +2 -2
  366. esphome/components/lvgl/widgets/arc.py +14 -11
  367. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  368. esphome/components/lvgl/widgets/qrcode.py +7 -7
  369. esphome/components/lvgl/widgets/spinner.py +6 -6
  370. esphome/components/lvgl/widgets/switch.py +2 -2
  371. esphome/components/lvgl/widgets/tabview.py +3 -3
  372. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  373. esphome/components/matrix_keypad/__init__.py +4 -3
  374. esphome/components/max17043/max17043.cpp +0 -2
  375. esphome/components/max31855/max31855.cpp +1 -4
  376. esphome/components/max31856/max31856.cpp +0 -4
  377. esphome/components/max31865/max31865.cpp +0 -1
  378. esphome/components/max44009/max44009.cpp +0 -1
  379. esphome/components/max6675/max6675.cpp +1 -4
  380. esphome/components/max6956/max6956.cpp +0 -1
  381. esphome/components/max7219/max7219.cpp +0 -1
  382. esphome/components/max7219digit/display.py +1 -1
  383. esphome/components/max7219digit/max7219digit.cpp +0 -1
  384. esphome/components/max9611/max9611.cpp +0 -1
  385. esphome/components/mcp23008/__init__.py +1 -1
  386. esphome/components/mcp23008/mcp23008.cpp +0 -1
  387. esphome/components/mcp23016/mcp23016.cpp +0 -1
  388. esphome/components/mcp23017/__init__.py +1 -1
  389. esphome/components/mcp23017/mcp23017.cpp +0 -1
  390. esphome/components/mcp23s08/__init__.py +1 -1
  391. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  392. esphome/components/mcp23s17/__init__.py +1 -1
  393. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  394. esphome/components/mcp23x08_base/__init__.py +2 -0
  395. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  396. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  397. esphome/components/mcp23x17_base/__init__.py +2 -0
  398. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  399. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  400. esphome/components/mcp23xxx_base/__init__.py +11 -5
  401. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  402. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  403. esphome/components/mcp3008/mcp3008.cpp +1 -4
  404. esphome/components/mcp3204/mcp3204.cpp +1 -4
  405. esphome/components/mcp4461/mcp4461.cpp +0 -1
  406. esphome/components/mcp4725/mcp4725.cpp +0 -1
  407. esphome/components/mcp4728/mcp4728.cpp +0 -1
  408. esphome/components/mcp9600/mcp9600.cpp +0 -2
  409. esphome/components/mcp9808/mcp9808.cpp +0 -2
  410. esphome/components/mdns/__init__.py +3 -0
  411. esphome/components/mdns/mdns_component.cpp +2 -0
  412. esphome/components/mdns/mdns_component.h +4 -0
  413. esphome/components/media_player/__init__.py +40 -0
  414. esphome/components/media_player/automation.h +16 -0
  415. esphome/components/media_player/media_player.cpp +13 -0
  416. esphome/components/media_player/media_player.h +50 -3
  417. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  418. esphome/components/mics_4514/mics_4514.cpp +1 -6
  419. esphome/components/midea/ir_transmitter.h +4 -4
  420. esphome/components/mipi/__init__.py +416 -0
  421. esphome/components/mipi_dsi/__init__.py +5 -0
  422. esphome/components/mipi_dsi/display.py +233 -0
  423. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  424. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  425. esphome/components/mipi_dsi/models/__init__.py +0 -0
  426. esphome/components/mipi_dsi/models/guition.py +38 -0
  427. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  428. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  429. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  430. esphome/components/mipi_spi/__init__.py +0 -9
  431. esphome/components/mipi_spi/display.py +220 -256
  432. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  433. esphome/components/mipi_spi/mipi_spi.h +556 -108
  434. esphome/components/mipi_spi/models/__init__.py +0 -65
  435. esphome/components/mipi_spi/models/adafruit.py +30 -0
  436. esphome/components/mipi_spi/models/amoled.py +41 -5
  437. esphome/components/mipi_spi/models/ili.py +5 -5
  438. esphome/components/mipi_spi/models/jc.py +1 -3
  439. esphome/components/mipi_spi/models/lilygo.py +1 -1
  440. esphome/components/mipi_spi/models/waveshare.py +16 -1
  441. esphome/components/mixer/speaker/__init__.py +4 -5
  442. esphome/components/mlx90393/sensor.py +7 -5
  443. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  444. esphome/components/mlx90614/mlx90614.cpp +0 -1
  445. esphome/components/mmc5603/mmc5603.cpp +0 -1
  446. esphome/components/mmc5983/mmc5983.cpp +0 -2
  447. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  448. esphome/components/mpr121/__init__.py +7 -6
  449. esphome/components/mpr121/mpr121.cpp +0 -1
  450. esphome/components/mpu6050/mpu6050.cpp +0 -1
  451. esphome/components/mpu6886/mpu6886.cpp +0 -1
  452. esphome/components/mqtt/__init__.py +1 -2
  453. esphome/components/mqtt/mqtt_button.cpp +1 -1
  454. esphome/components/mqtt/mqtt_client.cpp +0 -1
  455. esphome/components/mqtt/mqtt_component.cpp +8 -14
  456. esphome/components/mqtt/mqtt_component.h +0 -7
  457. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  458. esphome/components/mqtt/mqtt_sensor.h +0 -1
  459. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  461. esphome/components/ms5611/ms5611.cpp +0 -1
  462. esphome/components/ms8607/ms8607.cpp +0 -1
  463. esphome/components/msa3xx/msa3xx.cpp +0 -2
  464. esphome/components/my9231/my9231.cpp +0 -2
  465. esphome/components/nau7802/nau7802.cpp +0 -1
  466. esphome/components/neopixelbus/light.py +3 -0
  467. esphome/components/network/util.cpp +29 -0
  468. esphome/components/nextion/nextion.cpp +2 -2
  469. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  470. esphome/components/npi19/npi19.cpp +0 -2
  471. esphome/components/nrf52/__init__.py +223 -0
  472. esphome/components/nrf52/boards.py +34 -0
  473. esphome/components/nrf52/const.py +18 -0
  474. esphome/components/nrf52/gpio.py +79 -0
  475. esphome/components/number/__init__.py +2 -1
  476. esphome/components/one_wire/__init__.py +1 -2
  477. esphome/components/one_wire/one_wire.cpp +0 -2
  478. esphome/components/one_wire/one_wire.h +0 -2
  479. esphome/components/opentherm/hub.cpp +0 -1
  480. esphome/components/opentherm/number/__init__.py +2 -2
  481. esphome/components/openthread/__init__.py +2 -3
  482. esphome/components/openthread/openthread.cpp +30 -13
  483. esphome/components/openthread/openthread.h +3 -0
  484. esphome/components/openthread/openthread_esp.cpp +3 -1
  485. esphome/components/opt3001/sensor.py +2 -6
  486. esphome/components/output/__init__.py +38 -0
  487. esphome/components/output/automation.h +24 -0
  488. esphome/components/output/switch/output_switch.cpp +0 -2
  489. esphome/components/packages/__init__.py +1 -2
  490. esphome/components/packet_transport/__init__.py +4 -3
  491. esphome/components/pca6416a/pca6416a.cpp +0 -1
  492. esphome/components/pca9554/pca9554.cpp +0 -1
  493. esphome/components/pca9685/pca9685_output.cpp +0 -2
  494. esphome/components/pcf85063/pcf85063.cpp +0 -1
  495. esphome/components/pcf8563/pcf8563.cpp +0 -1
  496. esphome/components/pcf8574/pcf8574.cpp +0 -1
  497. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  498. esphome/components/pipsolar/pipsolar.cpp +54 -42
  499. esphome/components/pipsolar/pipsolar.h +5 -4
  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 +6 -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/senseair/senseair.cpp +7 -3
  557. esphome/components/senseair/senseair.h +11 -0
  558. esphome/components/sensor/__init__.py +36 -4
  559. esphome/components/sensor/filter.cpp +49 -10
  560. esphome/components/sensor/filter.h +22 -7
  561. esphome/components/sensor/sensor.cpp +0 -1
  562. esphome/components/sensor/sensor.h +0 -9
  563. esphome/components/sfa30/sfa30.cpp +0 -4
  564. esphome/components/sgp30/sgp30.cpp +0 -2
  565. esphome/components/sgp4x/sensor.py +1 -1
  566. esphome/components/sgp4x/sgp4x.cpp +0 -2
  567. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  568. esphome/components/sht3xd/sht3xd.cpp +0 -2
  569. esphome/components/sht4x/sht4x.cpp +0 -2
  570. esphome/components/shtcx/shtcx.cpp +0 -1
  571. esphome/components/sim800l/__init__.py +2 -4
  572. esphome/components/sm16716/sm16716.cpp +0 -1
  573. esphome/components/sm2135/sm2135.cpp +0 -1
  574. esphome/components/sm2235/sm2235.cpp +0 -1
  575. esphome/components/sm2335/sm2335.cpp +0 -1
  576. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  577. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  578. esphome/components/sntp/sntp_component.cpp +0 -1
  579. esphome/components/sound_level/sensor.py +1 -1
  580. esphome/components/speaker/media_player/__init__.py +21 -33
  581. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  582. esphome/components/spi/__init__.py +29 -13
  583. esphome/components/spi/spi.cpp +0 -2
  584. esphome/components/spi_device/spi_device.cpp +1 -4
  585. esphome/components/sprinkler/__init__.py +4 -4
  586. esphome/components/sps30/sps30.cpp +0 -1
  587. esphome/components/ssd1306_base/__init__.py +11 -11
  588. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  589. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  590. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  591. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  592. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  593. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  594. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  595. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  596. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  597. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  598. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  599. esphome/components/st7701s/display.py +10 -14
  600. esphome/components/st7701s/st7701s.cpp +0 -3
  601. esphome/components/st7735/st7735.cpp +0 -1
  602. esphome/components/st7789v/st7789v.cpp +0 -1
  603. esphome/components/st7920/st7920.cpp +0 -1
  604. esphome/components/status_led/light/status_led_light.cpp +0 -2
  605. esphome/components/status_led/status_led.cpp +0 -1
  606. esphome/components/stepper/__init__.py +2 -4
  607. esphome/components/sts3x/sts3x.cpp +0 -1
  608. esphome/components/substitutions/__init__.py +10 -16
  609. esphome/components/substitutions/jinja.py +24 -1
  610. esphome/components/sun/__init__.py +2 -3
  611. esphome/components/switch/__init__.py +31 -1
  612. esphome/components/switch/automation.h +24 -0
  613. esphome/components/switch/switch.cpp +8 -0
  614. esphome/components/switch/switch.h +8 -0
  615. esphome/components/sx126x/sx126x.cpp +0 -2
  616. esphome/components/sx127x/sx127x.cpp +0 -2
  617. esphome/components/sx1509/__init__.py +7 -5
  618. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  619. esphome/components/sx1509/sx1509.cpp +0 -2
  620. esphome/components/syslog/esphome_syslog.cpp +1 -1
  621. esphome/components/tc74/tc74.cpp +0 -1
  622. esphome/components/tca9548a/tca9548a.cpp +0 -1
  623. esphome/components/tca9555/tca9555.cpp +0 -1
  624. esphome/components/tcs34725/tcs34725.cpp +0 -1
  625. esphome/components/tee501/tee501.cpp +0 -1
  626. esphome/components/tem3200/tem3200.cpp +0 -2
  627. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  628. esphome/components/template/cover/template_cover.cpp +0 -1
  629. esphome/components/template/select/template_select.cpp +0 -1
  630. esphome/components/template/text/template_text.cpp +0 -2
  631. esphome/components/template/valve/template_valve.cpp +0 -1
  632. esphome/components/text/__init__.py +0 -1
  633. esphome/components/text/text_traits.h +2 -0
  634. esphome/components/text_sensor/__init__.py +2 -1
  635. esphome/components/text_sensor/text_sensor.cpp +0 -2
  636. esphome/components/text_sensor/text_sensor.h +0 -8
  637. esphome/components/thermostat/climate.py +4 -4
  638. esphome/components/time/__init__.py +7 -4
  639. esphome/components/time/real_time_clock.cpp +16 -3
  640. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  641. esphome/components/tlc5947/tlc5947.cpp +0 -2
  642. esphome/components/tlc5971/tlc5971.cpp +0 -2
  643. esphome/components/tm1621/tm1621.cpp +0 -2
  644. esphome/components/tm1637/tm1637.cpp +0 -2
  645. esphome/components/tm1638/tm1638.cpp +0 -2
  646. esphome/components/tm1651/__init__.py +45 -48
  647. esphome/components/tm1651/tm1651.cpp +213 -47
  648. esphome/components/tm1651/tm1651.h +37 -32
  649. esphome/components/tmp117/tmp117.cpp +0 -2
  650. esphome/components/tsl2561/tsl2561.cpp +0 -1
  651. esphome/components/tsl2591/tsl2591.cpp +0 -1
  652. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  653. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  654. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  655. esphome/components/tuya/climate/__init__.py +9 -10
  656. esphome/components/tuya/number/__init__.py +8 -6
  657. esphome/components/tx20/tx20.cpp +0 -1
  658. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  659. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  660. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  661. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  662. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  663. esphome/components/udp/__init__.py +1 -1
  664. esphome/components/ufire_ec/sensor.py +1 -2
  665. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  666. esphome/components/ufire_ise/sensor.py +1 -2
  667. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  668. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  669. esphome/components/update/__init__.py +0 -1
  670. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  671. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  672. esphome/components/usb_host/usb_host_client.cpp +0 -1
  673. esphome/components/usb_host/usb_host_component.cpp +0 -1
  674. esphome/components/valve/__init__.py +0 -1
  675. esphome/components/veml3235/veml3235.cpp +0 -3
  676. esphome/components/veml7700/veml7700.cpp +0 -2
  677. esphome/components/version/version_text_sensor.cpp +0 -1
  678. esphome/components/version/version_text_sensor.h +0 -1
  679. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  680. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  681. esphome/components/web_server/__init__.py +13 -0
  682. esphome/components/web_server/web_server.cpp +188 -353
  683. esphome/components/web_server/web_server.h +61 -1
  684. esphome/components/web_server_base/__init__.py +1 -1
  685. esphome/components/web_server_base/web_server_base.cpp +2 -0
  686. esphome/components/web_server_base/web_server_base.h +6 -0
  687. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  688. esphome/components/web_server_idf/web_server_idf.h +2 -0
  689. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  690. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  691. esphome/components/wifi/__init__.py +17 -43
  692. esphome/components/wifi/wifi_component.cpp +100 -36
  693. esphome/components/wifi/wifi_component.h +5 -1
  694. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  695. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  696. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  697. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  698. esphome/components/wireguard/wireguard.cpp +0 -2
  699. esphome/components/x9c/x9c.cpp +0 -2
  700. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  701. esphome/components/xl9535/xl9535.cpp +0 -2
  702. esphome/components/zephyr/__init__.py +252 -0
  703. esphome/components/zephyr/const.py +16 -0
  704. esphome/components/zephyr/core.cpp +90 -0
  705. esphome/components/zephyr/gpio.cpp +120 -0
  706. esphome/components/zephyr/gpio.h +38 -0
  707. esphome/components/zephyr/pre_build.py.script +4 -0
  708. esphome/components/zephyr/preferences.cpp +156 -0
  709. esphome/components/zephyr/preferences.h +13 -0
  710. esphome/config.py +38 -16
  711. esphome/config_helpers.py +1 -2
  712. esphome/config_validation.py +12 -16
  713. esphome/const.py +26 -1
  714. esphome/core/__init__.py +92 -51
  715. esphome/core/application.cpp +75 -21
  716. esphome/core/application.h +106 -171
  717. esphome/core/color.h +10 -0
  718. esphome/core/component.cpp +41 -25
  719. esphome/core/component.h +9 -6
  720. esphome/core/component_iterator.cpp +61 -261
  721. esphome/core/component_iterator.h +15 -0
  722. esphome/core/config.py +26 -11
  723. esphome/core/defines.h +40 -2
  724. esphome/core/entity_base.h +18 -0
  725. esphome/core/entity_helpers.py +45 -10
  726. esphome/core/helpers.cpp +8 -15
  727. esphome/core/helpers.h +60 -6
  728. esphome/core/lock_free_queue.h +1 -1
  729. esphome/core/scheduler.cpp +311 -77
  730. esphome/core/scheduler.h +141 -28
  731. esphome/cpp_generator.py +2 -6
  732. esphome/cpp_helpers.py +1 -1
  733. esphome/dashboard/dashboard.py +2 -3
  734. esphome/dashboard/dns.py +2 -8
  735. esphome/dashboard/web_server.py +34 -19
  736. esphome/espota2.py +1 -4
  737. esphome/git.py +3 -1
  738. esphome/helpers.py +23 -4
  739. esphome/log.py +3 -1
  740. esphome/mqtt.py +3 -5
  741. esphome/platformio_api.py +7 -4
  742. esphome/types.py +12 -0
  743. esphome/util.py +20 -8
  744. esphome/voluptuous_schema.py +4 -3
  745. esphome/vscode.py +1 -2
  746. esphome/wizard.py +1 -4
  747. esphome/writer.py +16 -108
  748. esphome/yaml_util.py +7 -5
  749. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
  750. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/RECORD +755 -675
  751. esphome/components/mipi_spi/models/commands.py +0 -82
  752. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  753. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
  754. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
  755. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
  756. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
@@ -5,10 +5,27 @@
5
5
 
6
6
  #ifdef USE_ESP32
7
7
 
8
- namespace esphome {
9
- namespace esp32_ble_client {
8
+ #include <esp_gap_ble_api.h>
9
+ #include <esp_gatt_defs.h>
10
+
11
+ namespace esphome::esp32_ble_client {
10
12
 
11
13
  static const char *const TAG = "esp32_ble_client";
14
+
15
+ // Intermediate connection parameters for standard operation
16
+ // ESP-IDF defaults (12.5-15ms) are too slow for stable connections through WiFi-based BLE proxies,
17
+ // causing disconnections. These medium parameters balance responsiveness with bandwidth usage.
18
+ static const uint16_t MEDIUM_MIN_CONN_INTERVAL = 0x07; // 7 * 1.25ms = 8.75ms
19
+ static const uint16_t MEDIUM_MAX_CONN_INTERVAL = 0x09; // 9 * 1.25ms = 11.25ms
20
+ // The timeout value was increased from 6s to 8s to address stability issues observed
21
+ // in certain BLE devices when operating through WiFi-based BLE proxies. The longer
22
+ // timeout reduces the likelihood of disconnections during periods of high latency.
23
+ static const uint16_t MEDIUM_CONN_TIMEOUT = 800; // 800 * 10ms = 8s
24
+
25
+ // Fastest connection parameters for devices with short discovery timeouts
26
+ static const uint16_t FAST_MIN_CONN_INTERVAL = 0x06; // 6 * 1.25ms = 7.5ms (BLE minimum)
27
+ static const uint16_t FAST_MAX_CONN_INTERVAL = 0x06; // 6 * 1.25ms = 7.5ms
28
+ static const uint16_t FAST_CONN_TIMEOUT = 1000; // 1000 * 10ms = 10s
12
29
  static const esp_bt_uuid_t NOTIFY_DESC_UUID = {
13
30
  .len = ESP_UUID_LEN_16,
14
31
  .uuid =
@@ -27,8 +44,10 @@ void BLEClientBase::set_state(espbt::ClientState st) {
27
44
  ESPBTClient::set_state(st);
28
45
 
29
46
  if (st == espbt::ClientState::READY_TO_CONNECT) {
30
- // Enable loop when we need to connect
47
+ // Enable loop for state processing
31
48
  this->enable_loop();
49
+ // Connect immediately instead of waiting for next loop
50
+ this->connect();
32
51
  }
33
52
  }
34
53
 
@@ -45,11 +64,6 @@ void BLEClientBase::loop() {
45
64
  }
46
65
  this->set_state(espbt::ClientState::IDLE);
47
66
  }
48
- // READY_TO_CONNECT means we have discovered the device
49
- // and the scanner has been stopped by the tracker.
50
- else if (this->state_ == espbt::ClientState::READY_TO_CONNECT) {
51
- this->connect();
52
- }
53
67
  // If its idle, we can disable the loop as set_state
54
68
  // will enable it again when we need to connect.
55
69
  else if (this->state_ == espbt::ClientState::IDLE) {
@@ -64,40 +78,7 @@ void BLEClientBase::dump_config() {
64
78
  " Address: %s\n"
65
79
  " Auto-Connect: %s",
66
80
  this->address_str().c_str(), TRUEFALSE(this->auto_connect_));
67
- std::string state_name;
68
- switch (this->state()) {
69
- case espbt::ClientState::INIT:
70
- state_name = "INIT";
71
- break;
72
- case espbt::ClientState::DISCONNECTING:
73
- state_name = "DISCONNECTING";
74
- break;
75
- case espbt::ClientState::IDLE:
76
- state_name = "IDLE";
77
- break;
78
- case espbt::ClientState::SEARCHING:
79
- state_name = "SEARCHING";
80
- break;
81
- case espbt::ClientState::DISCOVERED:
82
- state_name = "DISCOVERED";
83
- break;
84
- case espbt::ClientState::READY_TO_CONNECT:
85
- state_name = "READY_TO_CONNECT";
86
- break;
87
- case espbt::ClientState::CONNECTING:
88
- state_name = "CONNECTING";
89
- break;
90
- case espbt::ClientState::CONNECTED:
91
- state_name = "CONNECTED";
92
- break;
93
- case espbt::ClientState::ESTABLISHED:
94
- state_name = "ESTABLISHED";
95
- break;
96
- default:
97
- state_name = "UNKNOWN_STATE";
98
- break;
99
- }
100
- ESP_LOGCONFIG(TAG, " State: %s", state_name.c_str());
81
+ ESP_LOGCONFIG(TAG, " State: %s", espbt::client_state_to_string(this->state()));
101
82
  if (this->status_ == ESP_GATT_NO_RESOURCES) {
102
83
  ESP_LOGE(TAG, " Failed due to no resources. Try to reduce number of BLE clients in config.");
103
84
  } else if (this->status_ != ESP_GATT_OK) {
@@ -105,6 +86,7 @@ void BLEClientBase::dump_config() {
105
86
  }
106
87
  }
107
88
 
89
+ #ifdef USE_ESP32_BLE_DEVICE
108
90
  bool BLEClientBase::parse_device(const espbt::ESPBTDevice &device) {
109
91
  if (!this->auto_connect_)
110
92
  return false;
@@ -122,15 +104,46 @@ bool BLEClientBase::parse_device(const espbt::ESPBTDevice &device) {
122
104
  this->remote_addr_type_ = device.get_address_type();
123
105
  return true;
124
106
  }
107
+ #endif
125
108
 
126
109
  void BLEClientBase::connect() {
127
- ESP_LOGI(TAG, "[%d] [%s] 0x%02x Attempting BLE connection", this->connection_index_, this->address_str_.c_str(),
110
+ ESP_LOGI(TAG, "[%d] [%s] 0x%02x Connecting", this->connection_index_, this->address_str_.c_str(),
128
111
  this->remote_addr_type_);
129
112
  this->paired_ = false;
113
+
114
+ // Set preferred connection parameters before connecting
115
+ // Use FAST for all V3 connections (better latency and reliability)
116
+ // Use MEDIUM for V1/legacy connections (balanced performance)
117
+ uint16_t min_interval, max_interval, timeout;
118
+ const char *param_type;
119
+
120
+ if (this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE ||
121
+ this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE) {
122
+ min_interval = FAST_MIN_CONN_INTERVAL;
123
+ max_interval = FAST_MAX_CONN_INTERVAL;
124
+ timeout = FAST_CONN_TIMEOUT;
125
+ param_type = "fast";
126
+ } else {
127
+ min_interval = MEDIUM_MIN_CONN_INTERVAL;
128
+ max_interval = MEDIUM_MAX_CONN_INTERVAL;
129
+ timeout = MEDIUM_CONN_TIMEOUT;
130
+ param_type = "medium";
131
+ }
132
+
133
+ auto param_ret = esp_ble_gap_set_prefer_conn_params(this->remote_bda_, min_interval, max_interval,
134
+ 0, // latency: 0
135
+ timeout);
136
+ if (param_ret != ESP_OK) {
137
+ ESP_LOGW(TAG, "[%d] [%s] esp_ble_gap_set_prefer_conn_params failed: %d", this->connection_index_,
138
+ this->address_str_.c_str(), param_ret);
139
+ } else {
140
+ this->log_connection_params_(param_type);
141
+ }
142
+
143
+ // Now open the connection
130
144
  auto ret = esp_ble_gattc_open(this->gattc_if_, this->remote_bda_, this->remote_addr_type_, true);
131
145
  if (ret) {
132
- ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_open error, status=%d", this->connection_index_, this->address_str_.c_str(),
133
- ret);
146
+ this->log_gattc_warning_("esp_ble_gattc_open", ret);
134
147
  this->set_state(espbt::ClientState::IDLE);
135
148
  } else {
136
149
  this->set_state(espbt::ClientState::CONNECTING);
@@ -140,14 +153,9 @@ void BLEClientBase::connect() {
140
153
  esp_err_t BLEClientBase::pair() { return esp_ble_set_encryption(this->remote_bda_, ESP_BLE_SEC_ENCRYPT); }
141
154
 
142
155
  void BLEClientBase::disconnect() {
143
- if (this->state_ == espbt::ClientState::IDLE) {
144
- ESP_LOGI(TAG, "[%d] [%s] Disconnect requested, but already idle.", this->connection_index_,
145
- this->address_str_.c_str());
146
- return;
147
- }
148
- if (this->state_ == espbt::ClientState::DISCONNECTING) {
149
- ESP_LOGI(TAG, "[%d] [%s] Disconnect requested, but already disconnecting.", this->connection_index_,
150
- this->address_str_.c_str());
156
+ if (this->state_ == espbt::ClientState::IDLE || this->state_ == espbt::ClientState::DISCONNECTING) {
157
+ ESP_LOGI(TAG, "[%d] [%s] Disconnect requested, but already %s", this->connection_index_, this->address_str_.c_str(),
158
+ espbt::client_state_to_string(this->state_));
151
159
  return;
152
160
  }
153
161
  if (this->state_ == espbt::ClientState::CONNECTING || this->conn_id_ == UNSET_CONN_ID) {
@@ -182,8 +190,7 @@ void BLEClientBase::unconditional_disconnect() {
182
190
  // In the future we might consider App.reboot() here since
183
191
  // the BLE stack is in an indeterminate state.
184
192
  //
185
- ESP_LOGE(TAG, "[%d] [%s] esp_ble_gattc_close error, err=%d", this->connection_index_, this->address_str_.c_str(),
186
- err);
193
+ this->log_gattc_warning_("esp_ble_gattc_close", err);
187
194
  }
188
195
 
189
196
  if (this->state_ == espbt::ClientState::SEARCHING || this->state_ == espbt::ClientState::READY_TO_CONNECT ||
@@ -196,9 +203,11 @@ void BLEClientBase::unconditional_disconnect() {
196
203
  }
197
204
 
198
205
  void BLEClientBase::release_services() {
206
+ #ifdef USE_ESP32_BLE_DEVICE
199
207
  for (auto &svc : this->services_)
200
208
  delete svc; // NOLINT(cppcoreguidelines-owning-memory)
201
209
  this->services_.clear();
210
+ #endif
202
211
  #ifndef CONFIG_BT_GATTC_CACHE_NVS_FLASH
203
212
  esp_ble_gattc_cache_clean(this->remote_bda_);
204
213
  #endif
@@ -208,6 +217,36 @@ void BLEClientBase::log_event_(const char *name) {
208
217
  ESP_LOGD(TAG, "[%d] [%s] %s", this->connection_index_, this->address_str_.c_str(), name);
209
218
  }
210
219
 
220
+ void BLEClientBase::log_gattc_event_(const char *name) {
221
+ ESP_LOGD(TAG, "[%d] [%s] ESP_GATTC_%s_EVT", this->connection_index_, this->address_str_.c_str(), name);
222
+ }
223
+
224
+ void BLEClientBase::log_gattc_warning_(const char *operation, esp_gatt_status_t status) {
225
+ ESP_LOGW(TAG, "[%d] [%s] %s error, status=%d", this->connection_index_, this->address_str_.c_str(), operation,
226
+ status);
227
+ }
228
+
229
+ void BLEClientBase::log_gattc_warning_(const char *operation, esp_err_t err) {
230
+ ESP_LOGW(TAG, "[%d] [%s] %s error, status=%d", this->connection_index_, this->address_str_.c_str(), operation, err);
231
+ }
232
+
233
+ void BLEClientBase::log_connection_params_(const char *param_type) {
234
+ ESP_LOGD(TAG, "[%d] [%s] %s conn params", this->connection_index_, this->address_str_.c_str(), param_type);
235
+ }
236
+
237
+ void BLEClientBase::restore_medium_conn_params_() {
238
+ // Restore to medium connection parameters after initial connection phase
239
+ // This balances performance with bandwidth usage for normal operation
240
+ esp_ble_conn_update_params_t conn_params = {{0}};
241
+ memcpy(conn_params.bda, this->remote_bda_, sizeof(esp_bd_addr_t));
242
+ conn_params.min_int = MEDIUM_MIN_CONN_INTERVAL;
243
+ conn_params.max_int = MEDIUM_MAX_CONN_INTERVAL;
244
+ conn_params.latency = 0;
245
+ conn_params.timeout = MEDIUM_CONN_TIMEOUT;
246
+ this->log_connection_params_("medium");
247
+ esp_ble_gap_update_conn_params(&conn_params);
248
+ }
249
+
211
250
  bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t esp_gattc_if,
212
251
  esp_ble_gattc_cb_param_t *param) {
213
252
  if (event == ESP_GATTC_REG_EVT && this->app_id != param->reg.app_id)
@@ -235,30 +274,18 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
235
274
  case ESP_GATTC_OPEN_EVT: {
236
275
  if (!this->check_addr(param->open.remote_bda))
237
276
  return false;
238
- this->log_event_("ESP_GATTC_OPEN_EVT");
239
- this->conn_id_ = param->open.conn_id;
277
+ this->log_gattc_event_("OPEN");
278
+ // conn_id was already set in ESP_GATTC_CONNECT_EVT
240
279
  this->service_count_ = 0;
241
280
  if (this->state_ != espbt::ClientState::CONNECTING) {
242
281
  // This should not happen but lets log it in case it does
243
282
  // because it means we have a bad assumption about how the
244
283
  // ESP BT stack works.
245
- if (this->state_ == espbt::ClientState::CONNECTED) {
246
- ESP_LOGE(TAG, "[%d] [%s] Got ESP_GATTC_OPEN_EVT while already connected, status=%d", this->connection_index_,
247
- this->address_str_.c_str(), param->open.status);
248
- } else if (this->state_ == espbt::ClientState::ESTABLISHED) {
249
- ESP_LOGE(TAG, "[%d] [%s] Got ESP_GATTC_OPEN_EVT while already established, status=%d",
250
- this->connection_index_, this->address_str_.c_str(), param->open.status);
251
- } else if (this->state_ == espbt::ClientState::DISCONNECTING) {
252
- ESP_LOGE(TAG, "[%d] [%s] Got ESP_GATTC_OPEN_EVT while disconnecting, status=%d", this->connection_index_,
253
- this->address_str_.c_str(), param->open.status);
254
- } else {
255
- ESP_LOGE(TAG, "[%d] [%s] Got ESP_GATTC_OPEN_EVT while not in connecting state, status=%d",
256
- this->connection_index_, this->address_str_.c_str(), param->open.status);
257
- }
284
+ ESP_LOGE(TAG, "[%d] [%s] Got ESP_GATTC_OPEN_EVT while in %s state, status=%d", this->connection_index_,
285
+ this->address_str_.c_str(), espbt::client_state_to_string(this->state_), param->open.status);
258
286
  }
259
287
  if (param->open.status != ESP_GATT_OK && param->open.status != ESP_GATT_ALREADY_OPEN) {
260
- ESP_LOGW(TAG, "[%d] [%s] Connection failed, status=%d", this->connection_index_, this->address_str_.c_str(),
261
- param->open.status);
288
+ this->log_gattc_warning_("Connection open", param->open.status);
262
289
  this->set_state(espbt::ClientState::IDLE);
263
290
  break;
264
291
  }
@@ -270,32 +297,47 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
270
297
  this->conn_id_ = UNSET_CONN_ID;
271
298
  break;
272
299
  }
273
- auto ret = esp_ble_gattc_send_mtu_req(this->gattc_if_, param->open.conn_id);
274
- if (ret) {
275
- ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_send_mtu_req failed, status=%x", this->connection_index_,
276
- this->address_str_.c_str(), ret);
277
- }
300
+ // MTU negotiation already started in ESP_GATTC_CONNECT_EVT
278
301
  this->set_state(espbt::ClientState::CONNECTED);
302
+ ESP_LOGI(TAG, "[%d] [%s] Connection open", this->connection_index_, this->address_str_.c_str());
279
303
  if (this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE) {
280
- ESP_LOGI(TAG, "[%d] [%s] Connected", this->connection_index_, this->address_str_.c_str());
304
+ // Restore to medium connection parameters for cached connections too
305
+ this->restore_medium_conn_params_();
281
306
  // only set our state, subclients might have more stuff to do yet.
282
307
  this->state_ = espbt::ClientState::ESTABLISHED;
283
308
  break;
284
309
  }
310
+ ESP_LOGD(TAG, "[%d] [%s] Searching for services", this->connection_index_, this->address_str_.c_str());
285
311
  esp_ble_gattc_search_service(esp_gattc_if, param->cfg_mtu.conn_id, nullptr);
286
312
  break;
287
313
  }
288
314
  case ESP_GATTC_CONNECT_EVT: {
289
315
  if (!this->check_addr(param->connect.remote_bda))
290
316
  return false;
291
- this->log_event_("ESP_GATTC_CONNECT_EVT");
317
+ this->log_gattc_event_("CONNECT");
318
+ this->conn_id_ = param->connect.conn_id;
319
+ // Start MTU negotiation immediately as recommended by ESP-IDF examples
320
+ // (gatt_client, ble_throughput) which call esp_ble_gattc_send_mtu_req in
321
+ // ESP_GATTC_CONNECT_EVT instead of waiting for ESP_GATTC_OPEN_EVT.
322
+ // This saves ~3ms in the connection process.
323
+ auto ret = esp_ble_gattc_send_mtu_req(this->gattc_if_, param->connect.conn_id);
324
+ if (ret) {
325
+ this->log_gattc_warning_("esp_ble_gattc_send_mtu_req", ret);
326
+ }
292
327
  break;
293
328
  }
294
329
  case ESP_GATTC_DISCONNECT_EVT: {
295
330
  if (!this->check_addr(param->disconnect.remote_bda))
296
331
  return false;
297
- ESP_LOGD(TAG, "[%d] [%s] ESP_GATTC_DISCONNECT_EVT, reason %d", this->connection_index_,
298
- this->address_str_.c_str(), param->disconnect.reason);
332
+ // Check if we were disconnected while waiting for service discovery
333
+ if (param->disconnect.reason == ESP_GATT_CONN_TERMINATE_PEER_USER &&
334
+ this->state_ == espbt::ClientState::CONNECTED) {
335
+ ESP_LOGW(TAG, "[%d] [%s] Disconnected by remote during service discovery", this->connection_index_,
336
+ this->address_str_.c_str());
337
+ } else {
338
+ ESP_LOGD(TAG, "[%d] [%s] ESP_GATTC_DISCONNECT_EVT, reason 0x%02x", this->connection_index_,
339
+ this->address_str_.c_str(), param->disconnect.reason);
340
+ }
299
341
  this->release_services();
300
342
  this->set_state(espbt::ClientState::IDLE);
301
343
  break;
@@ -318,7 +360,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
318
360
  case ESP_GATTC_CLOSE_EVT: {
319
361
  if (this->conn_id_ != param->close.conn_id)
320
362
  return false;
321
- this->log_event_("ESP_GATTC_CLOSE_EVT");
363
+ this->log_gattc_event_("CLOSE");
322
364
  this->release_services();
323
365
  this->set_state(espbt::ClientState::IDLE);
324
366
  this->conn_id_ = UNSET_CONN_ID;
@@ -330,63 +372,74 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
330
372
  this->service_count_++;
331
373
  if (this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE) {
332
374
  // V3 clients don't need services initialized since
333
- // they only request by handle after receiving the services.
375
+ // as they use the ESP APIs to get services.
334
376
  break;
335
377
  }
378
+ #ifdef USE_ESP32_BLE_DEVICE
336
379
  BLEService *ble_service = new BLEService(); // NOLINT(cppcoreguidelines-owning-memory)
337
380
  ble_service->uuid = espbt::ESPBTUUID::from_uuid(param->search_res.srvc_id.uuid);
338
381
  ble_service->start_handle = param->search_res.start_handle;
339
382
  ble_service->end_handle = param->search_res.end_handle;
340
383
  ble_service->client = this;
341
384
  this->services_.push_back(ble_service);
385
+ #endif
342
386
  break;
343
387
  }
344
388
  case ESP_GATTC_SEARCH_CMPL_EVT: {
345
389
  if (this->conn_id_ != param->search_cmpl.conn_id)
346
390
  return false;
347
- this->log_event_("ESP_GATTC_SEARCH_CMPL_EVT");
348
- for (auto &svc : this->services_) {
349
- ESP_LOGV(TAG, "[%d] [%s] Service UUID: %s", this->connection_index_, this->address_str_.c_str(),
350
- svc->uuid.to_string().c_str());
351
- ESP_LOGV(TAG, "[%d] [%s] start_handle: 0x%x end_handle: 0x%x", this->connection_index_,
352
- this->address_str_.c_str(), svc->start_handle, svc->end_handle);
391
+ this->log_gattc_event_("SEARCH_CMPL");
392
+ // For V3 connections, restore to medium connection parameters after service discovery
393
+ // This balances performance with bandwidth usage after the critical discovery phase
394
+ if (this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE ||
395
+ this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE) {
396
+ this->restore_medium_conn_params_();
397
+ } else {
398
+ #ifdef USE_ESP32_BLE_DEVICE
399
+ for (auto &svc : this->services_) {
400
+ ESP_LOGV(TAG, "[%d] [%s] Service UUID: %s", this->connection_index_, this->address_str_.c_str(),
401
+ svc->uuid.to_string().c_str());
402
+ ESP_LOGV(TAG, "[%d] [%s] start_handle: 0x%x end_handle: 0x%x", this->connection_index_,
403
+ this->address_str_.c_str(), svc->start_handle, svc->end_handle);
404
+ }
405
+ #endif
353
406
  }
354
- ESP_LOGI(TAG, "[%d] [%s] Connected", this->connection_index_, this->address_str_.c_str());
407
+ ESP_LOGI(TAG, "[%d] [%s] Service discovery complete", this->connection_index_, this->address_str_.c_str());
355
408
  this->state_ = espbt::ClientState::ESTABLISHED;
356
409
  break;
357
410
  }
358
411
  case ESP_GATTC_READ_DESCR_EVT: {
359
412
  if (this->conn_id_ != param->write.conn_id)
360
413
  return false;
361
- this->log_event_("ESP_GATTC_READ_DESCR_EVT");
414
+ this->log_gattc_event_("READ_DESCR");
362
415
  break;
363
416
  }
364
417
  case ESP_GATTC_WRITE_DESCR_EVT: {
365
418
  if (this->conn_id_ != param->write.conn_id)
366
419
  return false;
367
- this->log_event_("ESP_GATTC_WRITE_DESCR_EVT");
420
+ this->log_gattc_event_("WRITE_DESCR");
368
421
  break;
369
422
  }
370
423
  case ESP_GATTC_WRITE_CHAR_EVT: {
371
424
  if (this->conn_id_ != param->write.conn_id)
372
425
  return false;
373
- this->log_event_("ESP_GATTC_WRITE_CHAR_EVT");
426
+ this->log_gattc_event_("WRITE_CHAR");
374
427
  break;
375
428
  }
376
429
  case ESP_GATTC_READ_CHAR_EVT: {
377
430
  if (this->conn_id_ != param->read.conn_id)
378
431
  return false;
379
- this->log_event_("ESP_GATTC_READ_CHAR_EVT");
432
+ this->log_gattc_event_("READ_CHAR");
380
433
  break;
381
434
  }
382
435
  case ESP_GATTC_NOTIFY_EVT: {
383
436
  if (this->conn_id_ != param->notify.conn_id)
384
437
  return false;
385
- this->log_event_("ESP_GATTC_NOTIFY_EVT");
438
+ this->log_gattc_event_("NOTIFY");
386
439
  break;
387
440
  }
388
441
  case ESP_GATTC_REG_FOR_NOTIFY_EVT: {
389
- this->log_event_("ESP_GATTC_REG_FOR_NOTIFY_EVT");
442
+ this->log_gattc_event_("REG_FOR_NOTIFY");
390
443
  if (this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE ||
391
444
  this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE) {
392
445
  // Client is responsible for flipping the descriptor value
@@ -398,8 +451,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
398
451
  esp_gatt_status_t descr_status = esp_ble_gattc_get_descr_by_char_handle(
399
452
  this->gattc_if_, this->conn_id_, param->reg_for_notify.handle, NOTIFY_DESC_UUID, &desc_result, &count);
400
453
  if (descr_status != ESP_GATT_OK) {
401
- ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_get_descr_by_char_handle error, status=%d", this->connection_index_,
402
- this->address_str_.c_str(), descr_status);
454
+ this->log_gattc_warning_("esp_ble_gattc_get_descr_by_char_handle", descr_status);
403
455
  break;
404
456
  }
405
457
  esp_gattc_char_elem_t char_result;
@@ -407,8 +459,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
407
459
  esp_ble_gattc_get_all_char(this->gattc_if_, this->conn_id_, param->reg_for_notify.handle,
408
460
  param->reg_for_notify.handle, &char_result, &count, 0);
409
461
  if (char_status != ESP_GATT_OK) {
410
- ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_get_all_char error, status=%d", this->connection_index_,
411
- this->address_str_.c_str(), char_status);
462
+ this->log_gattc_warning_("esp_ble_gattc_get_all_char", char_status);
412
463
  break;
413
464
  }
414
465
 
@@ -422,8 +473,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
422
473
  (uint8_t *) &notify_en, ESP_GATT_WRITE_TYPE_RSP, ESP_GATT_AUTH_REQ_NONE);
423
474
  ESP_LOGD(TAG, "Wrote notify descriptor %d, properties=%d", notify_en, char_result.properties);
424
475
  if (status) {
425
- ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_write_char_descr error, status=%d", this->connection_index_,
426
- this->address_str_.c_str(), status);
476
+ this->log_gattc_warning_("esp_ble_gattc_write_char_descr", status);
427
477
  }
428
478
  break;
429
479
  }
@@ -531,6 +581,7 @@ float BLEClientBase::parse_char_value(uint8_t *value, uint16_t length) {
531
581
  return NAN;
532
582
  }
533
583
 
584
+ #ifdef USE_ESP32_BLE_DEVICE
534
585
  BLEService *BLEClientBase::get_service(espbt::ESPBTUUID uuid) {
535
586
  for (auto *svc : this->services_) {
536
587
  if (svc->uuid == uuid)
@@ -607,8 +658,8 @@ BLEDescriptor *BLEClientBase::get_descriptor(uint16_t handle) {
607
658
  }
608
659
  return nullptr;
609
660
  }
661
+ #endif // USE_ESP32_BLE_DEVICE
610
662
 
611
- } // namespace esp32_ble_client
612
- } // namespace esphome
663
+ } // namespace esphome::esp32_ble_client
613
664
 
614
665
  #endif // USE_ESP32
@@ -5,7 +5,9 @@
5
5
  #include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
6
6
  #include "esphome/core/component.h"
7
7
 
8
+ #ifdef USE_ESP32_BLE_DEVICE
8
9
  #include "ble_service.h"
10
+ #endif
9
11
 
10
12
  #include <array>
11
13
  #include <string>
@@ -16,8 +18,7 @@
16
18
  #include <esp_gatt_common_api.h>
17
19
  #include <esp_gattc_api.h>
18
20
 
19
- namespace esphome {
20
- namespace esp32_ble_client {
21
+ namespace esphome::esp32_ble_client {
21
22
 
22
23
  namespace espbt = esphome::esp32_ble_tracker;
23
24
 
@@ -31,7 +32,9 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
31
32
  void dump_config() override;
32
33
 
33
34
  void run_later(std::function<void()> &&f); // NOLINT
35
+ #ifdef USE_ESP32_BLE_DEVICE
34
36
  bool parse_device(const espbt::ESPBTDevice &device) override;
37
+ #endif
35
38
  void on_scan_end() override {}
36
39
  bool gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
37
40
  esp_ble_gattc_cb_param_t *param) override;
@@ -46,7 +49,7 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
46
49
 
47
50
  void set_auto_connect(bool auto_connect) { this->auto_connect_ = auto_connect; }
48
51
 
49
- void set_address(uint64_t address) {
52
+ virtual void set_address(uint64_t address) {
50
53
  this->address_ = address;
51
54
  this->remote_bda_[0] = (address >> 40) & 0xFF;
52
55
  this->remote_bda_[1] = (address >> 32) & 0xFF;
@@ -64,8 +67,9 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
64
67
  (uint8_t) (this->address_ >> 0) & 0xff);
65
68
  }
66
69
  }
67
- std::string address_str() const { return this->address_str_; }
70
+ const std::string &address_str() const { return this->address_str_; }
68
71
 
72
+ #ifdef USE_ESP32_BLE_DEVICE
69
73
  BLEService *get_service(espbt::ESPBTUUID uuid);
70
74
  BLEService *get_service(uint16_t uuid);
71
75
  BLECharacteristic *get_characteristic(espbt::ESPBTUUID service, espbt::ESPBTUUID chr);
@@ -76,6 +80,7 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
76
80
  BLEDescriptor *get_descriptor(uint16_t handle);
77
81
  // Get the configuration descriptor for the given characteristic handle.
78
82
  BLEDescriptor *get_config_descriptor(uint16_t handle);
83
+ #endif
79
84
 
80
85
  float parse_char_value(uint8_t *value, uint16_t length);
81
86
 
@@ -102,7 +107,9 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
102
107
 
103
108
  // Group 2: Container types (grouped for memory optimization)
104
109
  std::string address_str_{};
110
+ #ifdef USE_ESP32_BLE_DEVICE
105
111
  std::vector<BLEService *> services_;
112
+ #endif
106
113
 
107
114
  // Group 3: 4-byte types
108
115
  int gattc_if_;
@@ -125,9 +132,13 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
125
132
  // 6 bytes used, 2 bytes padding
126
133
 
127
134
  void log_event_(const char *name);
135
+ void log_gattc_event_(const char *name);
136
+ void restore_medium_conn_params_();
137
+ void log_gattc_warning_(const char *operation, esp_gatt_status_t status);
138
+ void log_gattc_warning_(const char *operation, esp_err_t err);
139
+ void log_connection_params_(const char *param_type);
128
140
  };
129
141
 
130
- } // namespace esp32_ble_client
131
- } // namespace esphome
142
+ } // namespace esphome::esp32_ble_client
132
143
 
133
144
  #endif // USE_ESP32
@@ -1,11 +1,13 @@
1
1
  #pragma once
2
2
 
3
+ #include "esphome/core/defines.h"
4
+
3
5
  #ifdef USE_ESP32
6
+ #ifdef USE_ESP32_BLE_DEVICE
4
7
 
5
8
  #include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
6
9
 
7
- namespace esphome {
8
- namespace esp32_ble_client {
10
+ namespace esphome::esp32_ble_client {
9
11
 
10
12
  namespace espbt = esphome::esp32_ble_tracker;
11
13
 
@@ -19,7 +21,7 @@ class BLEDescriptor {
19
21
  BLECharacteristic *characteristic;
20
22
  };
21
23
 
22
- } // namespace esp32_ble_client
23
- } // namespace esphome
24
+ } // namespace esphome::esp32_ble_client
24
25
 
26
+ #endif // USE_ESP32_BLE_DEVICE
25
27
  #endif // USE_ESP32
@@ -4,9 +4,9 @@
4
4
  #include "esphome/core/log.h"
5
5
 
6
6
  #ifdef USE_ESP32
7
+ #ifdef USE_ESP32_BLE_DEVICE
7
8
 
8
- namespace esphome {
9
- namespace esp32_ble_client {
9
+ namespace esphome::esp32_ble_client {
10
10
 
11
11
  static const char *const TAG = "esp32_ble_client";
12
12
 
@@ -71,7 +71,7 @@ void BLEService::parse_characteristics() {
71
71
  }
72
72
  }
73
73
 
74
- } // namespace esp32_ble_client
75
- } // namespace esphome
74
+ } // namespace esphome::esp32_ble_client
76
75
 
76
+ #endif // USE_ESP32_BLE_DEVICE
77
77
  #endif // USE_ESP32
@@ -1,6 +1,9 @@
1
1
  #pragma once
2
2
 
3
+ #include "esphome/core/defines.h"
4
+
3
5
  #ifdef USE_ESP32
6
+ #ifdef USE_ESP32_BLE_DEVICE
4
7
 
5
8
  #include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
6
9
 
@@ -8,8 +11,7 @@
8
11
 
9
12
  #include <vector>
10
13
 
11
- namespace esphome {
12
- namespace esp32_ble_client {
14
+ namespace esphome::esp32_ble_client {
13
15
 
14
16
  namespace espbt = esphome::esp32_ble_tracker;
15
17
 
@@ -30,7 +32,7 @@ class BLEService {
30
32
  BLECharacteristic *get_characteristic(uint16_t uuid);
31
33
  };
32
34
 
33
- } // namespace esp32_ble_client
34
- } // namespace esphome
35
+ } // namespace esphome::esp32_ble_client
35
36
 
37
+ #endif // USE_ESP32_BLE_DEVICE
36
38
  #endif // USE_ESP32