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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (715) hide show
  1. esphome/__main__.py +20 -14
  2. esphome/components/a4988/a4988.cpp +1 -1
  3. esphome/components/absolute_humidity/absolute_humidity.cpp +6 -4
  4. esphome/components/ac_dimmer/ac_dimmer.cpp +4 -2
  5. esphome/components/adc/adc_sensor_esp32.cpp +5 -3
  6. esphome/components/adc/adc_sensor_esp8266.cpp +5 -3
  7. esphome/components/adc/adc_sensor_libretiny.cpp +5 -3
  8. esphome/components/adc/adc_sensor_rp2040.cpp +5 -3
  9. esphome/components/adc128s102/adc128s102.cpp +1 -1
  10. esphome/components/ade7880/ade7880.cpp +28 -17
  11. esphome/components/ade7953_base/ade7953_base.cpp +12 -9
  12. esphome/components/ade7953_i2c/ade7953_i2c.cpp +1 -1
  13. esphome/components/ade7953_spi/ade7953_spi.cpp +1 -1
  14. esphome/components/ads1115/ads1115.cpp +3 -5
  15. esphome/components/ads1118/ads1118.cpp +2 -1
  16. esphome/components/ags10/ags10.cpp +3 -2
  17. esphome/components/aht10/aht10.cpp +27 -29
  18. esphome/components/aic3204/aic3204.cpp +2 -2
  19. esphome/components/alarm_control_panel/__init__.py +1 -0
  20. esphome/components/am2315c/am2315c.cpp +2 -2
  21. esphome/components/am2320/am2320.cpp +2 -2
  22. esphome/components/am43/am43_base.h +1 -1
  23. esphome/components/am43/cover/am43_cover.cpp +4 -2
  24. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +4 -2
  25. esphome/components/apds9306/apds9306.cpp +8 -5
  26. esphome/components/apds9960/apds9960.cpp +2 -2
  27. esphome/components/api/__init__.py +5 -0
  28. esphome/components/api/api_connection.cpp +712 -358
  29. esphome/components/api/api_connection.h +343 -284
  30. esphome/components/api/api_frame_helper.cpp +349 -344
  31. esphome/components/api/api_frame_helper.h +121 -94
  32. esphome/components/api/api_pb2.cpp +2 -0
  33. esphome/components/api/api_pb2.h +637 -1
  34. esphome/components/api/api_pb2_service.cpp +12 -688
  35. esphome/components/api/api_pb2_service.h +53 -207
  36. esphome/components/api/api_server.cpp +71 -29
  37. esphome/components/api/api_server.h +9 -0
  38. esphome/components/api/client.py +5 -2
  39. esphome/components/api/homeassistant_service.h +1 -1
  40. esphome/components/api/list_entities.cpp +1 -1
  41. esphome/components/api/proto.cpp +1 -0
  42. esphome/components/api/proto.h +4 -3
  43. esphome/components/api/subscribe_state.cpp +8 -16
  44. esphome/components/as3935/as3935.cpp +3 -3
  45. esphome/components/as5600/as5600.cpp +9 -7
  46. esphome/components/as7341/as7341.cpp +7 -5
  47. esphome/components/at581x/at581x.cpp +13 -10
  48. esphome/components/atm90e26/atm90e26.cpp +2 -2
  49. esphome/components/atm90e32/atm90e32.cpp +3 -3
  50. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +5 -3
  51. esphome/components/bang_bang/bang_bang_climate.cpp +8 -5
  52. esphome/components/bedjet/bedjet_hub.cpp +6 -4
  53. esphome/components/beken_spi_led_strip/led_strip.cpp +11 -7
  54. esphome/components/bh1750/bh1750.cpp +2 -2
  55. esphome/components/binary_sensor/__init__.py +1 -0
  56. esphome/components/binary_sensor/automation.cpp +1 -2
  57. esphome/components/bl0906/bl0906.cpp +1 -1
  58. esphome/components/bl0942/bl0942.cpp +11 -8
  59. esphome/components/bl0942/sensor.py +1 -1
  60. esphome/components/ble_client/__init__.py +5 -1
  61. esphome/components/ble_client/output/ble_binary_output.cpp +6 -3
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +9 -6
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +8 -5
  64. esphome/components/bluetooth_proxy/__init__.py +5 -1
  65. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -5
  66. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -14
  67. esphome/components/bme280_base/bme280_base.cpp +3 -3
  68. esphome/components/bme680/bme680.cpp +3 -3
  69. esphome/components/bme680/sensor.py +2 -2
  70. esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
  71. esphome/components/bme680_bsec/sensor.py +7 -3
  72. esphome/components/bme68x_bsec2/__init__.py +6 -5
  73. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
  74. esphome/components/bme68x_bsec2/sensor.py +4 -4
  75. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
  76. esphome/components/bmi160/bmi160.cpp +11 -11
  77. esphome/components/bmp085/bmp085.cpp +2 -2
  78. esphome/components/bmp280_base/bmp280_base.cpp +3 -3
  79. esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
  80. esphome/components/bmp581/bmp581.cpp +33 -27
  81. esphome/components/bp1658cj/bp1658cj.cpp +5 -3
  82. esphome/components/bp5758d/bp5758d.cpp +1 -1
  83. esphome/components/button/__init__.py +1 -0
  84. esphome/components/canbus/canbus.cpp +1 -1
  85. esphome/components/cap1188/cap1188.cpp +6 -4
  86. esphome/components/captive_portal/captive_portal.cpp +1 -1
  87. esphome/components/ccs811/ccs811.cpp +3 -2
  88. esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
  89. esphome/components/ch422g/ch422g.cpp +2 -2
  90. esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
  91. esphome/components/climate/__init__.py +1 -0
  92. esphome/components/climate/climate.cpp +12 -7
  93. esphome/components/climate/climate.h +1 -1
  94. esphome/components/climate_ir/climate_ir.cpp +7 -4
  95. esphome/components/cm1106/__init__.py +1 -0
  96. esphome/components/cm1106/cm1106.cpp +112 -0
  97. esphome/components/cm1106/cm1106.h +40 -0
  98. esphome/components/cm1106/sensor.py +72 -0
  99. esphome/components/const/__init__.py +1 -0
  100. esphome/components/cover/__init__.py +1 -0
  101. esphome/components/cs5460a/cs5460a.cpp +16 -11
  102. esphome/components/cse7761/cse7761.cpp +2 -2
  103. esphome/components/cse7766/cse7766.cpp +0 -5
  104. esphome/components/cse7766/cse7766.h +5 -1
  105. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
  106. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
  107. esphome/components/current_based/current_based_cover.cpp +4 -2
  108. esphome/components/dac7678/dac7678_output.cpp +4 -4
  109. esphome/components/dallas_temp/dallas_temp.cpp +2 -3
  110. esphome/components/daly_bms/daly_bms.cpp +2 -1
  111. esphome/components/dashboard_import/__init__.py +1 -2
  112. esphome/components/datetime/__init__.py +3 -1
  113. esphome/components/debug/debug_component.cpp +1 -1
  114. esphome/components/debug/debug_component.h +1 -1
  115. esphome/components/debug/debug_esp32.cpp +4 -2
  116. esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
  117. esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
  118. esphome/components/demo/__init__.py +206 -0
  119. esphome/components/demo/demo_alarm_control_panel.h +65 -0
  120. esphome/components/demo/demo_button.h +15 -0
  121. esphome/components/demo/demo_date.h +34 -0
  122. esphome/components/demo/demo_datetime.h +40 -0
  123. esphome/components/demo/demo_lock.h +17 -0
  124. esphome/components/demo/demo_select.h +15 -0
  125. esphome/components/demo/demo_text.h +18 -0
  126. esphome/components/demo/demo_time.h +34 -0
  127. esphome/components/demo/demo_valve.h +54 -0
  128. esphome/components/dfrobot_sen0395/commands.cpp +3 -3
  129. esphome/components/dht/dht.cpp +29 -50
  130. esphome/components/dht12/dht12.cpp +2 -2
  131. esphome/components/display/display.h +5 -3
  132. esphome/components/dps310/dps310.cpp +7 -5
  133. esphome/components/ds1307/ds1307.cpp +2 -2
  134. esphome/components/dsmr/dsmr.cpp +5 -3
  135. esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
  136. esphome/components/duty_time/duty_time_sensor.cpp +5 -3
  137. esphome/components/ee895/ee895.cpp +3 -3
  138. esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
  139. esphome/components/emc2101/emc2101.cpp +11 -9
  140. esphome/components/ens160_base/ens160_base.cpp +2 -2
  141. esphome/components/ens210/ens210.cpp +2 -2
  142. esphome/components/es7210/es7210.cpp +6 -4
  143. esphome/components/es7243e/es7243e.cpp +1 -1
  144. esphome/components/es8156/es8156.cpp +1 -1
  145. esphome/components/es8311/es8311.cpp +8 -6
  146. esphome/components/es8388/__init__.py +0 -0
  147. esphome/components/es8388/audio_dac.py +26 -0
  148. esphome/components/es8388/es8388.cpp +289 -0
  149. esphome/components/es8388/es8388.h +81 -0
  150. esphome/components/es8388/es8388_const.h +83 -0
  151. esphome/components/es8388/select/__init__.py +47 -0
  152. esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
  153. esphome/components/es8388/select/adc_input_mic_select.h +15 -0
  154. esphome/components/es8388/select/dac_output_select.cpp +12 -0
  155. esphome/components/es8388/select/dac_output_select.h +15 -0
  156. esphome/components/esp32/__init__.py +88 -20
  157. esphome/components/esp32/boards.py +208 -125
  158. esphome/components/esp32/const.py +6 -0
  159. esphome/components/esp32/gpio.py +14 -1
  160. esphome/components/esp32/gpio_esp32_c5.py +45 -0
  161. esphome/components/esp32/gpio_esp32_p4.py +43 -0
  162. esphome/components/esp32/preferences.cpp +7 -7
  163. esphome/components/esp32_ble/__init__.py +115 -0
  164. esphome/components/esp32_ble/ble.cpp +11 -9
  165. esphome/components/esp32_ble/ble_uuid.h +1 -1
  166. esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
  167. esphome/components/esp32_ble_server/__init__.py +4 -1
  168. esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
  169. esphome/components/esp32_ble_server/ble_server.h +0 -1
  170. esphome/components/esp32_ble_tracker/__init__.py +6 -2
  171. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +12 -9
  172. esphome/components/esp32_camera/esp32_camera.cpp +35 -27
  173. esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
  174. esphome/components/esp32_dac/esp32_dac.cpp +2 -2
  175. esphome/components/esp32_improv/__init__.py +5 -1
  176. esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
  177. esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
  178. esphome/components/esp32_rmt_led_strip/light.py +5 -1
  179. esphome/components/esp32_touch/esp32_touch.cpp +12 -8
  180. esphome/components/esp8266/preferences.cpp +6 -6
  181. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  182. esphome/components/esp_ldo/__init__.py +91 -0
  183. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  184. esphome/components/esp_ldo/esp_ldo.h +43 -0
  185. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  186. esphome/components/ethernet/ethernet_component.cpp +38 -26
  187. esphome/components/ethernet/ethernet_component.h +1 -1
  188. esphome/components/event/__init__.py +1 -0
  189. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  190. esphome/components/ezo/ezo.cpp +1 -1
  191. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  192. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  193. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  194. esphome/components/fan/__init__.py +1 -0
  195. esphome/components/fan/fan.cpp +4 -2
  196. esphome/components/fastled_base/fastled_light.cpp +7 -5
  197. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  198. esphome/components/fs3000/fs3000.cpp +1 -1
  199. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  200. esphome/components/ft63x6/ft63x6.cpp +5 -3
  201. esphome/components/gcja5/gcja5.cpp +0 -12
  202. esphome/components/gcja5/gcja5.h +8 -3
  203. esphome/components/gdk101/gdk101.cpp +2 -2
  204. esphome/components/globals/globals_component.h +13 -10
  205. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  206. esphome/components/gp8403/gp8403.cpp +4 -2
  207. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  208. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  209. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  210. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  211. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  212. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  213. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  214. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  215. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  216. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  217. esphome/components/haier/haier_base.cpp +2 -2
  218. esphome/components/haier/hon_climate.cpp +13 -6
  219. esphome/components/havells_solar/havells_solar.cpp +5 -2
  220. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  221. esphome/components/hdc1080/hdc1080.cpp +2 -2
  222. esphome/components/he60r/he60r.cpp +4 -2
  223. esphome/components/hlw8012/hlw8012.cpp +6 -4
  224. esphome/components/hm3301/hm3301.cpp +2 -2
  225. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  226. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  227. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  228. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  229. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  230. esphome/components/hte501/hte501.cpp +3 -2
  231. esphome/components/http_request/__init__.py +2 -2
  232. esphome/components/http_request/http_request.cpp +7 -5
  233. esphome/components/http_request/http_request_idf.cpp +4 -2
  234. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  235. esphome/components/htu21d/htu21d.cpp +2 -2
  236. esphome/components/htu31d/htu31d.cpp +2 -2
  237. esphome/components/hx711/hx711.cpp +2 -2
  238. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  239. esphome/components/hyt271/hyt271.cpp +2 -2
  240. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  241. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  242. esphome/components/i2s_audio/__init__.py +2 -0
  243. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  244. esphome/components/i2s_audio/i2s_audio.h +1 -1
  245. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  246. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  247. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +1 -1
  248. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
  249. esphome/components/iaqcore/iaqcore.cpp +3 -3
  250. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  251. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  252. esphome/components/image/image.cpp +1 -0
  253. esphome/components/ina219/ina219.cpp +2 -2
  254. esphome/components/ina226/ina226.cpp +8 -5
  255. esphome/components/ina260/ina260.cpp +1 -1
  256. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  257. esphome/components/ina3221/ina3221.cpp +2 -2
  258. esphome/components/inkplate6/display.py +12 -2
  259. esphome/components/inkplate6/inkplate.cpp +13 -9
  260. esphome/components/inkplate6/inkplate.h +7 -6
  261. esphome/components/integration/integration_sensor.cpp +1 -1
  262. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  263. esphome/components/json/json_util.cpp +4 -5
  264. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  265. esphome/components/key_collector/key_collector.cpp +4 -2
  266. esphome/components/kmeteriso/kmeteriso.cpp +2 -1
  267. esphome/components/kuntze/kuntze.cpp +4 -2
  268. esphome/components/lc709203f/__init__.py +1 -0
  269. esphome/components/lc709203f/lc709203f.cpp +299 -0
  270. esphome/components/lc709203f/lc709203f.h +55 -0
  271. esphome/components/lc709203f/sensor.py +93 -0
  272. esphome/components/lcd_base/lcd_display.cpp +2 -2
  273. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  274. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  275. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  276. esphome/components/ld2410/ld2410.cpp +6 -7
  277. esphome/components/ld2420/ld2420.cpp +9 -7
  278. esphome/components/ld2450/ld2450.cpp +6 -4
  279. esphome/components/ld2450/sensor.py +2 -2
  280. esphome/components/ledc/ledc_output.cpp +32 -28
  281. esphome/components/libretiny/const.py +1 -1
  282. esphome/components/libretiny/preferences.cpp +6 -7
  283. esphome/components/light/__init__.py +2 -1
  284. esphome/components/light/esp_hsv_color.h +1 -1
  285. esphome/components/light/light_state.cpp +9 -5
  286. esphome/components/light/light_transformer.h +1 -1
  287. esphome/components/lightwaverf/LwTx.cpp +1 -1
  288. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  289. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  290. esphome/components/lock/__init__.py +1 -0
  291. esphome/components/lock/lock.h +1 -1
  292. esphome/components/logger/__init__.py +6 -0
  293. esphome/components/logger/logger.cpp +9 -5
  294. esphome/components/logger/logger_esp32.cpp +5 -5
  295. esphome/components/ltr390/ltr390.cpp +8 -5
  296. esphome/components/ltr501/ltr501.cpp +19 -14
  297. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  298. esphome/components/lvgl/__init__.py +2 -2
  299. esphome/components/lvgl/automation.py +5 -4
  300. esphome/components/lvgl/defines.py +0 -2
  301. esphome/components/lvgl/lv_validation.py +1 -3
  302. esphome/components/lvgl/lvcode.py +7 -8
  303. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  304. esphome/components/lvgl/schemas.py +22 -23
  305. esphome/components/lvgl/trigger.py +8 -3
  306. esphome/components/lvgl/widgets/__init__.py +2 -2
  307. esphome/components/lvgl/widgets/canvas.py +9 -3
  308. esphome/components/lvgl/widgets/line.py +2 -1
  309. esphome/components/lvgl/widgets/tabview.py +7 -0
  310. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  311. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  312. esphome/components/max17043/max17043.cpp +2 -2
  313. esphome/components/max31855/max31855.cpp +2 -1
  314. esphome/components/max31856/max31856.cpp +9 -11
  315. esphome/components/max31865/max31865.cpp +6 -4
  316. esphome/components/max44009/max44009.cpp +2 -2
  317. esphome/components/max6675/max6675.cpp +1 -1
  318. esphome/components/max6956/max6956.cpp +5 -3
  319. esphome/components/max7219/max7219.cpp +8 -6
  320. esphome/components/max7219digit/automation.h +52 -0
  321. esphome/components/max7219digit/display.py +93 -1
  322. esphome/components/max7219digit/max7219digit.cpp +16 -13
  323. esphome/components/max9611/max9611.cpp +9 -6
  324. esphome/components/mcp23008/mcp23008.cpp +1 -1
  325. esphome/components/mcp23016/mcp23016.cpp +1 -1
  326. esphome/components/mcp23017/mcp23017.cpp +1 -1
  327. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  328. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  329. esphome/components/mcp3008/mcp3008.cpp +1 -1
  330. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  331. esphome/components/mcp3204/mcp3204.cpp +1 -1
  332. esphome/components/mcp4461/mcp4461.cpp +2 -2
  333. esphome/components/mcp4725/mcp4725.cpp +2 -2
  334. esphome/components/mcp4728/mcp4728.cpp +2 -2
  335. esphome/components/mcp9600/mcp9600.cpp +1 -1
  336. esphome/components/mcp9808/mcp9808.cpp +4 -4
  337. esphome/components/mdns/mdns_component.cpp +8 -2
  338. esphome/components/mdns/mdns_component.h +3 -1
  339. esphome/components/mdns/mdns_esp32.cpp +2 -2
  340. esphome/components/media_player/__init__.py +1 -0
  341. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  342. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  343. esphome/components/micronova/micronova.h +2 -2
  344. esphome/components/mics_4514/mics_4514.cpp +2 -2
  345. esphome/components/midea/air_conditioner.cpp +7 -5
  346. esphome/components/midea_ir/midea_ir.cpp +1 -1
  347. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  348. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  349. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  350. esphome/components/mlx90614/mlx90614.cpp +4 -3
  351. esphome/components/mmc5603/mmc5603.cpp +2 -2
  352. esphome/components/mmc5983/mmc5983.cpp +1 -1
  353. esphome/components/modbus/modbus.cpp +7 -5
  354. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  355. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  356. esphome/components/modbus_controller/switch/__init__.py +6 -2
  357. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  358. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  359. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  360. esphome/components/mpr121/mpr121.cpp +2 -2
  361. esphome/components/mpu6050/mpu6050.cpp +6 -6
  362. esphome/components/mpu6886/mpu6886.cpp +6 -6
  363. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  364. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  365. esphome/components/mqtt/mqtt_client.cpp +31 -24
  366. esphome/components/mqtt/mqtt_component.cpp +2 -2
  367. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  368. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  369. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  370. esphome/components/ms5611/ms5611.cpp +2 -2
  371. esphome/components/ms8607/ms8607.cpp +2 -2
  372. esphome/components/msa3xx/msa3xx.cpp +16 -12
  373. esphome/components/my9231/my9231.cpp +7 -5
  374. esphome/components/nau7802/nau7802.cpp +6 -4
  375. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  376. esphome/components/network/ip_address.h +1 -1
  377. esphome/components/network/util.cpp +13 -0
  378. esphome/components/nextion/base_component.py +2 -0
  379. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +2 -3
  380. esphome/components/nextion/display.py +34 -22
  381. esphome/components/nextion/nextion.cpp +182 -143
  382. esphome/components/nextion/nextion.h +36 -0
  383. esphome/components/nextion/nextion_commands.cpp +3 -3
  384. esphome/components/nextion/nextion_upload_arduino.cpp +58 -61
  385. esphome/components/nextion/nextion_upload_idf.cpp +69 -72
  386. esphome/components/nextion/sensor/nextion_sensor.cpp +4 -4
  387. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  388. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +2 -2
  389. esphome/components/nfc/nci_message.h +1 -1
  390. esphome/components/nfc/ndef_record.h +1 -1
  391. esphome/components/nfc/ndef_record_text.h +1 -1
  392. esphome/components/nfc/ndef_record_uri.h +1 -1
  393. esphome/components/nfc/nfc.h +1 -1
  394. esphome/components/nfc/nfc_tag.h +1 -1
  395. esphome/components/noblex/noblex.cpp +1 -1
  396. esphome/components/npi19/npi19.cpp +5 -7
  397. esphome/components/number/__init__.py +11 -0
  398. esphome/components/online_image/__init__.py +13 -1
  399. esphome/components/online_image/online_image.cpp +26 -4
  400. esphome/components/online_image/online_image.h +21 -4
  401. esphome/components/opentherm/generate.py +3 -3
  402. esphome/components/opentherm/hub.cpp +11 -7
  403. esphome/components/opentherm/number/number.cpp +5 -3
  404. esphome/components/opentherm/opentherm.h +1 -1
  405. esphome/components/opentherm/schema.py +13 -13
  406. esphome/components/opentherm/validate.py +1 -1
  407. esphome/components/openthread/__init__.py +146 -0
  408. esphome/components/openthread/const.py +10 -0
  409. esphome/components/openthread/openthread.cpp +206 -0
  410. esphome/components/openthread/openthread.h +68 -0
  411. esphome/components/openthread/openthread_esp.cpp +164 -0
  412. esphome/components/openthread/tlv.py +58 -0
  413. esphome/components/openthread_info/__init__.py +0 -0
  414. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  415. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  416. esphome/components/openthread_info/text_sensor.py +105 -0
  417. esphome/components/output/float_output.cpp +1 -1
  418. esphome/components/output/switch/output_switch.cpp +1 -1
  419. esphome/components/packet_transport/packet_transport.cpp +6 -4
  420. esphome/components/pca6416a/pca6416a.cpp +2 -2
  421. esphome/components/pca9554/pca9554.cpp +6 -4
  422. esphome/components/pca9685/pca9685_output.cpp +12 -8
  423. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  424. esphome/components/pcf85063/pcf85063.cpp +2 -2
  425. esphome/components/pcf8563/pcf8563.cpp +2 -2
  426. esphome/components/pcf8574/pcf8574.cpp +2 -2
  427. esphome/components/pid/pid_climate.cpp +8 -5
  428. esphome/components/pid/pid_climate.h +1 -1
  429. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  430. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  431. esphome/components/pipsolar/pipsolar.cpp +3 -3
  432. esphome/components/pm1006/pm1006.cpp +3 -7
  433. esphome/components/pm1006/pm1006.h +4 -1
  434. esphome/components/pm2005/pm2005.cpp +12 -13
  435. esphome/components/pm2005/sensor.py +1 -1
  436. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  437. esphome/components/pmsx003/pmsx003.cpp +0 -4
  438. esphome/components/pmsx003/pmsx003.h +5 -2
  439. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  440. esphome/components/pmwcs3/pmwcs3.h +0 -1
  441. esphome/components/pn532/pn532.cpp +7 -7
  442. esphome/components/pn532/pn532.h +1 -1
  443. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  444. esphome/components/pn7150/pn7150.cpp +4 -4
  445. esphome/components/pn7160/pn7160.cpp +4 -4
  446. esphome/components/power_supply/power_supply.cpp +6 -4
  447. esphome/components/power_supply/power_supply.h +1 -1
  448. esphome/components/psram/__init__.py +59 -35
  449. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  450. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  451. esphome/components/pylontech/pylontech.cpp +2 -2
  452. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  453. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  454. esphome/components/pzemac/pzemac.cpp +4 -2
  455. esphome/components/pzemdc/pzemdc.cpp +4 -2
  456. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  457. esphome/components/qmp6988/qmp6988.cpp +2 -2
  458. esphome/components/qmp6988/qmp6988.h +1 -1
  459. esphome/components/qr_code/qr_code.cpp +5 -3
  460. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  461. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  462. esphome/components/rc522/rc522.cpp +5 -5
  463. esphome/components/rdm6300/rdm6300.cpp +1 -0
  464. esphome/components/remote_receiver/__init__.py +10 -2
  465. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  466. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  467. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  468. esphome/components/remote_transmitter/__init__.py +10 -2
  469. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  470. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  471. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  472. esphome/components/resistance/resistance_sensor.cpp +6 -3
  473. esphome/components/restart/button/restart_button.cpp +1 -1
  474. esphome/components/restart/switch/restart_switch.cpp +1 -1
  475. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  476. esphome/components/rp2040/__init__.py +7 -0
  477. esphome/components/rp2040/core.cpp +8 -1
  478. esphome/components/rp2040/preferences.cpp +3 -3
  479. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  480. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  481. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  482. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  483. esphome/components/rtttl/rtttl.cpp +11 -9
  484. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  485. esphome/components/safe_mode/safe_mode.cpp +9 -8
  486. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  487. esphome/components/scd30/scd30.cpp +11 -8
  488. esphome/components/scd4x/scd4x.cpp +12 -8
  489. esphome/components/sdl/display.py +40 -0
  490. esphome/components/sdl/sdl_esphome.cpp +2 -2
  491. esphome/components/sdl/sdl_esphome.h +8 -0
  492. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  493. esphome/components/sdp3x/sdp3x.cpp +11 -11
  494. esphome/components/sds011/sds011.cpp +5 -6
  495. esphome/components/sds011/sds011.h +4 -1
  496. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  497. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  498. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  499. esphome/components/selec_meter/selec_meter.cpp +5 -2
  500. esphome/components/select/__init__.py +1 -0
  501. esphome/components/sen0321/sen0321.cpp +2 -2
  502. esphome/components/sen21231/sen21231.cpp +1 -1
  503. esphome/components/sen5x/sen5x.cpp +10 -7
  504. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  505. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  506. esphome/components/sensor/__init__.py +11 -1
  507. esphome/components/sensor/filter.h +1 -1
  508. esphome/components/sensor/sensor.h +9 -5
  509. esphome/components/servo/servo.cpp +12 -9
  510. esphome/components/servo/servo.h +1 -1
  511. esphome/components/sfa30/sfa30.cpp +1 -1
  512. esphome/components/sgp30/sgp30.cpp +10 -8
  513. esphome/components/sgp4x/sgp4x.cpp +49 -61
  514. esphome/components/sgp4x/sgp4x.h +0 -1
  515. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  516. esphome/components/sht3xd/sht3xd.cpp +1 -1
  517. esphome/components/sht4x/sht4x.cpp +2 -2
  518. esphome/components/shtcx/shtcx.cpp +13 -16
  519. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  520. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  521. esphome/components/sim800l/sim800l.cpp +2 -2
  522. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  523. esphome/components/sm16716/sm16716.cpp +1 -1
  524. esphome/components/sm2135/sm2135.cpp +1 -1
  525. esphome/components/sm2235/sm2235.cpp +5 -3
  526. esphome/components/sm2335/sm2335.cpp +5 -3
  527. esphome/components/sml/sml.cpp +1 -1
  528. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  529. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  530. esphome/components/sntp/sntp_component.cpp +1 -1
  531. esphome/components/socket/__init__.py +2 -0
  532. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  533. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  534. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  535. esphome/components/socket/socket.cpp +31 -0
  536. esphome/components/socket/socket.h +27 -1
  537. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  538. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  539. esphome/components/sound_level/sound_level.cpp +4 -2
  540. esphome/components/speaker/media_player/__init__.py +3 -0
  541. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  542. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  543. esphome/components/spi/__init__.py +10 -2
  544. esphome/components/spi/spi.cpp +4 -4
  545. esphome/components/spi_device/spi_device.cpp +1 -2
  546. esphome/components/sprinkler/sprinkler.cpp +9 -6
  547. esphome/components/sps30/sps30.cpp +16 -15
  548. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  549. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  550. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  551. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  552. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  553. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  554. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  555. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  556. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  557. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  558. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  559. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  560. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  561. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  562. esphome/components/st7567_base/st7567_base.cpp +3 -3
  563. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  564. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  565. esphome/components/st7701s/st7701s.cpp +4 -2
  566. esphome/components/st7735/st7735.cpp +3 -3
  567. esphome/components/st7789v/st7789v.cpp +10 -7
  568. esphome/components/st7920/st7920.cpp +6 -4
  569. esphome/components/statsd/statsd.cpp +9 -5
  570. esphome/components/status_led/light/status_led_light.cpp +1 -1
  571. esphome/components/status_led/status_led.cpp +1 -1
  572. esphome/components/stepper/stepper.h +5 -3
  573. esphome/components/sts3x/sts3x.cpp +2 -2
  574. esphome/components/switch/__init__.py +1 -0
  575. esphome/components/switch/switch.cpp +18 -12
  576. esphome/components/switch/switch.h +1 -1
  577. esphome/components/sx1509/__init__.py +53 -20
  578. esphome/components/sx1509/sx1509.cpp +29 -5
  579. esphome/components/sx1509/sx1509.h +9 -1
  580. esphome/components/t6615/t6615.cpp +1 -0
  581. esphome/components/tc74/tc74.cpp +1 -1
  582. esphome/components/tca9548a/tca9548a.cpp +1 -1
  583. esphome/components/tca9555/tca9555.cpp +2 -2
  584. esphome/components/tcs34725/tcs34725.cpp +4 -4
  585. esphome/components/tee501/tee501.cpp +3 -2
  586. esphome/components/tem3200/tem3200.cpp +5 -6
  587. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  588. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +38 -12
  589. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +3 -1
  590. esphome/components/template/cover/template_cover.cpp +1 -1
  591. esphome/components/template/select/template_select.cpp +6 -4
  592. esphome/components/template/text/template_text.cpp +2 -3
  593. esphome/components/template/valve/template_valve.cpp +5 -3
  594. esphome/components/text/__init__.py +10 -11
  595. esphome/components/text_sensor/__init__.py +1 -0
  596. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  597. esphome/components/time/__init__.py +1 -2
  598. esphome/components/time_based/time_based_cover.cpp +4 -2
  599. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  600. esphome/components/tm1621/tm1621.cpp +3 -3
  601. esphome/components/tm1637/tm1637.cpp +9 -7
  602. esphome/components/tm1638/tm1638.cpp +7 -5
  603. esphome/components/tm1651/tm1651.cpp +2 -2
  604. esphome/components/tmp102/tmp102.cpp +1 -3
  605. esphome/components/tmp102/tmp102.h +0 -3
  606. esphome/components/tmp1075/tmp1075.cpp +12 -9
  607. esphome/components/tmp117/tmp117.cpp +2 -2
  608. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  609. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  610. esphome/components/tsl2561/tsl2561.cpp +7 -5
  611. esphome/components/tsl2591/tsl2591.cpp +25 -27
  612. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  613. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  614. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  615. esphome/components/tuya/select/tuya_select.cpp +5 -3
  616. esphome/components/tx20/tx20.cpp +3 -3
  617. esphome/components/uart/__init__.py +4 -5
  618. esphome/components/uart/button/uart_button.cpp +1 -1
  619. esphome/components/uart/switch/uart_switch.cpp +2 -2
  620. esphome/components/uart/uart.cpp +2 -2
  621. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  622. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  623. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  624. esphome/components/uart/uart_component_host.cpp +11 -8
  625. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  626. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  627. esphome/components/udp/udp_component.cpp +9 -5
  628. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  629. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  630. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  631. esphome/components/update/__init__.py +1 -0
  632. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  633. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  634. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  635. esphome/components/usb_host/__init__.py +64 -0
  636. esphome/components/usb_host/usb_host.h +116 -0
  637. esphome/components/usb_host/usb_host_client.cpp +394 -0
  638. esphome/components/usb_host/usb_host_component.cpp +35 -0
  639. esphome/components/usb_uart/__init__.py +134 -0
  640. esphome/components/usb_uart/ch34x.cpp +80 -0
  641. esphome/components/usb_uart/cp210x.cpp +126 -0
  642. esphome/components/usb_uart/usb_uart.cpp +328 -0
  643. esphome/components/usb_uart/usb_uart.h +151 -0
  644. esphome/components/valve/__init__.py +1 -0
  645. esphome/components/veml3235/veml3235.cpp +13 -9
  646. esphome/components/veml7700/veml7700.cpp +10 -6
  647. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  648. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  649. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  650. esphome/components/web_server/server_index_v2.h +632 -630
  651. esphome/components/web_server/server_index_v3.h +411 -409
  652. esphome/components/web_server/web_server.cpp +5 -3
  653. esphome/components/web_server_base/web_server_base.cpp +1 -1
  654. esphome/components/web_server_idf/utils.cpp +1 -1
  655. esphome/components/web_server_idf/web_server_idf.cpp +1 -1
  656. esphome/components/weikai/__init__.py +2 -0
  657. esphome/components/weikai/weikai.cpp +23 -21
  658. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  659. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  660. esphome/components/wiegand/wiegand.cpp +1 -1
  661. esphome/components/wifi/wifi_component.cpp +50 -37
  662. esphome/components/wifi/wifi_component.h +7 -4
  663. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  664. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  665. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  666. esphome/components/wireguard/wireguard.cpp +21 -21
  667. esphome/components/wl_134/text_sensor.py +1 -2
  668. esphome/components/wled/wled_light_effect.cpp +1 -1
  669. esphome/components/x9c/x9c.cpp +5 -3
  670. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  671. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  672. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  673. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  674. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  675. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  676. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  677. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  678. esphome/components/xl9535/xl9535.cpp +2 -2
  679. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  680. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  681. esphome/config.py +3 -2
  682. esphome/config_validation.py +46 -17
  683. esphome/const.py +10 -1
  684. esphome/core/__init__.py +37 -18
  685. esphome/core/application.cpp +188 -5
  686. esphome/core/application.h +110 -0
  687. esphome/core/component.h +13 -0
  688. esphome/core/config.py +12 -0
  689. esphome/core/defines.h +10 -2
  690. esphome/core/helpers.cpp +1 -1
  691. esphome/core/helpers.h +4 -4
  692. esphome/core/log.h +2 -0
  693. esphome/core/log_const_en.h +4 -0
  694. esphome/core/scheduler.cpp +2 -2
  695. esphome/coroutine.py +3 -4
  696. esphome/cpp_generator.py +32 -32
  697. esphome/dashboard/core.py +2 -2
  698. esphome/dashboard/web_server.py +2 -2
  699. esphome/git.py +4 -4
  700. esphome/helpers.py +5 -6
  701. esphome/loader.py +8 -7
  702. esphome/log.py +7 -1
  703. esphome/platformio_api.py +2 -3
  704. esphome/storage_json.py +13 -5
  705. esphome/types.py +12 -13
  706. esphome/util.py +1 -2
  707. esphome/writer.py +5 -3
  708. esphome/yaml_util.py +6 -1
  709. esphome/zeroconf.py +1 -1
  710. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/METADATA +12 -11
  711. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/RECORD +715 -662
  712. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/WHEEL +1 -1
  713. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/entry_points.txt +0 -0
  714. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/licenses/LICENSE +0 -0
  715. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/top_level.txt +0 -0
@@ -10,162 +10,94 @@ namespace api {
10
10
 
11
11
  class APIServerConnectionBase : public ProtoService {
12
12
  public:
13
+ #ifdef HAS_PROTO_MESSAGE_DUMP
14
+ protected:
15
+ void log_send_message_(const char *name, const std::string &dump);
16
+
17
+ public:
18
+ #endif
19
+
20
+ template<typename T> bool send_message(const T &msg) {
21
+ #ifdef HAS_PROTO_MESSAGE_DUMP
22
+ this->log_send_message_(T::message_name(), msg.dump());
23
+ #endif
24
+ return this->send_message_(msg, T::MESSAGE_TYPE);
25
+ }
26
+
13
27
  virtual void on_hello_request(const HelloRequest &value){};
14
- bool send_hello_response(const HelloResponse &msg);
28
+
15
29
  virtual void on_connect_request(const ConnectRequest &value){};
16
- bool send_connect_response(const ConnectResponse &msg);
17
- bool send_disconnect_request(const DisconnectRequest &msg);
30
+
18
31
  virtual void on_disconnect_request(const DisconnectRequest &value){};
19
- bool send_disconnect_response(const DisconnectResponse &msg);
20
32
  virtual void on_disconnect_response(const DisconnectResponse &value){};
21
- bool send_ping_request(const PingRequest &msg);
22
33
  virtual void on_ping_request(const PingRequest &value){};
23
- bool send_ping_response(const PingResponse &msg);
24
34
  virtual void on_ping_response(const PingResponse &value){};
25
35
  virtual void on_device_info_request(const DeviceInfoRequest &value){};
26
- bool send_device_info_response(const DeviceInfoResponse &msg);
36
+
27
37
  virtual void on_list_entities_request(const ListEntitiesRequest &value){};
28
- bool send_list_entities_done_response(const ListEntitiesDoneResponse &msg);
38
+
29
39
  virtual void on_subscribe_states_request(const SubscribeStatesRequest &value){};
30
- #ifdef USE_BINARY_SENSOR
31
- bool send_list_entities_binary_sensor_response(const ListEntitiesBinarySensorResponse &msg);
32
- #endif
33
- #ifdef USE_BINARY_SENSOR
34
- bool send_binary_sensor_state_response(const BinarySensorStateResponse &msg);
35
- #endif
36
- #ifdef USE_COVER
37
- bool send_list_entities_cover_response(const ListEntitiesCoverResponse &msg);
38
- #endif
39
- #ifdef USE_COVER
40
- bool send_cover_state_response(const CoverStateResponse &msg);
41
- #endif
40
+
42
41
  #ifdef USE_COVER
43
42
  virtual void on_cover_command_request(const CoverCommandRequest &value){};
44
43
  #endif
45
- #ifdef USE_FAN
46
- bool send_list_entities_fan_response(const ListEntitiesFanResponse &msg);
47
- #endif
48
- #ifdef USE_FAN
49
- bool send_fan_state_response(const FanStateResponse &msg);
50
- #endif
44
+
51
45
  #ifdef USE_FAN
52
46
  virtual void on_fan_command_request(const FanCommandRequest &value){};
53
47
  #endif
54
- #ifdef USE_LIGHT
55
- bool send_list_entities_light_response(const ListEntitiesLightResponse &msg);
56
- #endif
57
- #ifdef USE_LIGHT
58
- bool send_light_state_response(const LightStateResponse &msg);
59
- #endif
48
+
60
49
  #ifdef USE_LIGHT
61
50
  virtual void on_light_command_request(const LightCommandRequest &value){};
62
51
  #endif
63
- #ifdef USE_SENSOR
64
- bool send_list_entities_sensor_response(const ListEntitiesSensorResponse &msg);
65
- #endif
66
- #ifdef USE_SENSOR
67
- bool send_sensor_state_response(const SensorStateResponse &msg);
68
- #endif
69
- #ifdef USE_SWITCH
70
- bool send_list_entities_switch_response(const ListEntitiesSwitchResponse &msg);
71
- #endif
72
- #ifdef USE_SWITCH
73
- bool send_switch_state_response(const SwitchStateResponse &msg);
74
- #endif
52
+
75
53
  #ifdef USE_SWITCH
76
54
  virtual void on_switch_command_request(const SwitchCommandRequest &value){};
77
55
  #endif
78
- #ifdef USE_TEXT_SENSOR
79
- bool send_list_entities_text_sensor_response(const ListEntitiesTextSensorResponse &msg);
80
- #endif
81
- #ifdef USE_TEXT_SENSOR
82
- bool send_text_sensor_state_response(const TextSensorStateResponse &msg);
83
- #endif
56
+
84
57
  virtual void on_subscribe_logs_request(const SubscribeLogsRequest &value){};
85
- bool send_subscribe_logs_response(const SubscribeLogsResponse &msg);
58
+
86
59
  #ifdef USE_API_NOISE
87
60
  virtual void on_noise_encryption_set_key_request(const NoiseEncryptionSetKeyRequest &value){};
88
61
  #endif
89
- #ifdef USE_API_NOISE
90
- bool send_noise_encryption_set_key_response(const NoiseEncryptionSetKeyResponse &msg);
91
- #endif
62
+
92
63
  virtual void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &value){};
93
- bool send_homeassistant_service_response(const HomeassistantServiceResponse &msg);
64
+
94
65
  virtual void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &value){};
95
- bool send_subscribe_home_assistant_state_response(const SubscribeHomeAssistantStateResponse &msg);
66
+
96
67
  virtual void on_home_assistant_state_response(const HomeAssistantStateResponse &value){};
97
- bool send_get_time_request(const GetTimeRequest &msg);
98
68
  virtual void on_get_time_request(const GetTimeRequest &value){};
99
- bool send_get_time_response(const GetTimeResponse &msg);
100
69
  virtual void on_get_time_response(const GetTimeResponse &value){};
101
- bool send_list_entities_services_response(const ListEntitiesServicesResponse &msg);
70
+
102
71
  virtual void on_execute_service_request(const ExecuteServiceRequest &value){};
103
- #ifdef USE_ESP32_CAMERA
104
- bool send_list_entities_camera_response(const ListEntitiesCameraResponse &msg);
105
- #endif
106
- #ifdef USE_ESP32_CAMERA
107
- bool send_camera_image_response(const CameraImageResponse &msg);
108
- #endif
72
+
109
73
  #ifdef USE_ESP32_CAMERA
110
74
  virtual void on_camera_image_request(const CameraImageRequest &value){};
111
75
  #endif
112
- #ifdef USE_CLIMATE
113
- bool send_list_entities_climate_response(const ListEntitiesClimateResponse &msg);
114
- #endif
115
- #ifdef USE_CLIMATE
116
- bool send_climate_state_response(const ClimateStateResponse &msg);
117
- #endif
76
+
118
77
  #ifdef USE_CLIMATE
119
78
  virtual void on_climate_command_request(const ClimateCommandRequest &value){};
120
79
  #endif
121
- #ifdef USE_NUMBER
122
- bool send_list_entities_number_response(const ListEntitiesNumberResponse &msg);
123
- #endif
124
- #ifdef USE_NUMBER
125
- bool send_number_state_response(const NumberStateResponse &msg);
126
- #endif
80
+
127
81
  #ifdef USE_NUMBER
128
82
  virtual void on_number_command_request(const NumberCommandRequest &value){};
129
83
  #endif
130
- #ifdef USE_SELECT
131
- bool send_list_entities_select_response(const ListEntitiesSelectResponse &msg);
132
- #endif
133
- #ifdef USE_SELECT
134
- bool send_select_state_response(const SelectStateResponse &msg);
135
- #endif
84
+
136
85
  #ifdef USE_SELECT
137
86
  virtual void on_select_command_request(const SelectCommandRequest &value){};
138
87
  #endif
139
- #ifdef USE_SIREN
140
- bool send_list_entities_siren_response(const ListEntitiesSirenResponse &msg);
141
- #endif
142
- #ifdef USE_SIREN
143
- bool send_siren_state_response(const SirenStateResponse &msg);
144
- #endif
88
+
145
89
  #ifdef USE_SIREN
146
90
  virtual void on_siren_command_request(const SirenCommandRequest &value){};
147
91
  #endif
148
- #ifdef USE_LOCK
149
- bool send_list_entities_lock_response(const ListEntitiesLockResponse &msg);
150
- #endif
151
- #ifdef USE_LOCK
152
- bool send_lock_state_response(const LockStateResponse &msg);
153
- #endif
92
+
154
93
  #ifdef USE_LOCK
155
94
  virtual void on_lock_command_request(const LockCommandRequest &value){};
156
95
  #endif
157
- #ifdef USE_BUTTON
158
- bool send_list_entities_button_response(const ListEntitiesButtonResponse &msg);
159
- #endif
96
+
160
97
  #ifdef USE_BUTTON
161
98
  virtual void on_button_command_request(const ButtonCommandRequest &value){};
162
99
  #endif
163
- #ifdef USE_MEDIA_PLAYER
164
- bool send_list_entities_media_player_response(const ListEntitiesMediaPlayerResponse &msg);
165
- #endif
166
- #ifdef USE_MEDIA_PLAYER
167
- bool send_media_player_state_response(const MediaPlayerStateResponse &msg);
168
- #endif
100
+
169
101
  #ifdef USE_MEDIA_PLAYER
170
102
  virtual void on_media_player_command_request(const MediaPlayerCommandRequest &value){};
171
103
  #endif
@@ -173,33 +105,19 @@ class APIServerConnectionBase : public ProtoService {
173
105
  virtual void on_subscribe_bluetooth_le_advertisements_request(
174
106
  const SubscribeBluetoothLEAdvertisementsRequest &value){};
175
107
  #endif
176
- #ifdef USE_BLUETOOTH_PROXY
177
- bool send_bluetooth_le_advertisement_response(const BluetoothLEAdvertisementResponse &msg);
178
- #endif
179
- #ifdef USE_BLUETOOTH_PROXY
180
- bool send_bluetooth_le_raw_advertisements_response(const BluetoothLERawAdvertisementsResponse &msg);
181
- #endif
108
+
182
109
  #ifdef USE_BLUETOOTH_PROXY
183
110
  virtual void on_bluetooth_device_request(const BluetoothDeviceRequest &value){};
184
111
  #endif
185
- #ifdef USE_BLUETOOTH_PROXY
186
- bool send_bluetooth_device_connection_response(const BluetoothDeviceConnectionResponse &msg);
187
- #endif
112
+
188
113
  #ifdef USE_BLUETOOTH_PROXY
189
114
  virtual void on_bluetooth_gatt_get_services_request(const BluetoothGATTGetServicesRequest &value){};
190
115
  #endif
191
- #ifdef USE_BLUETOOTH_PROXY
192
- bool send_bluetooth_gatt_get_services_response(const BluetoothGATTGetServicesResponse &msg);
193
- #endif
194
- #ifdef USE_BLUETOOTH_PROXY
195
- bool send_bluetooth_gatt_get_services_done_response(const BluetoothGATTGetServicesDoneResponse &msg);
196
- #endif
116
+
197
117
  #ifdef USE_BLUETOOTH_PROXY
198
118
  virtual void on_bluetooth_gatt_read_request(const BluetoothGATTReadRequest &value){};
199
119
  #endif
200
- #ifdef USE_BLUETOOTH_PROXY
201
- bool send_bluetooth_gatt_read_response(const BluetoothGATTReadResponse &msg);
202
- #endif
120
+
203
121
  #ifdef USE_BLUETOOTH_PROXY
204
122
  virtual void on_bluetooth_gatt_write_request(const BluetoothGATTWriteRequest &value){};
205
123
  #endif
@@ -212,49 +130,23 @@ class APIServerConnectionBase : public ProtoService {
212
130
  #ifdef USE_BLUETOOTH_PROXY
213
131
  virtual void on_bluetooth_gatt_notify_request(const BluetoothGATTNotifyRequest &value){};
214
132
  #endif
215
- #ifdef USE_BLUETOOTH_PROXY
216
- bool send_bluetooth_gatt_notify_data_response(const BluetoothGATTNotifyDataResponse &msg);
217
- #endif
133
+
218
134
  #ifdef USE_BLUETOOTH_PROXY
219
135
  virtual void on_subscribe_bluetooth_connections_free_request(const SubscribeBluetoothConnectionsFreeRequest &value){};
220
136
  #endif
221
- #ifdef USE_BLUETOOTH_PROXY
222
- bool send_bluetooth_connections_free_response(const BluetoothConnectionsFreeResponse &msg);
223
- #endif
224
- #ifdef USE_BLUETOOTH_PROXY
225
- bool send_bluetooth_gatt_error_response(const BluetoothGATTErrorResponse &msg);
226
- #endif
227
- #ifdef USE_BLUETOOTH_PROXY
228
- bool send_bluetooth_gatt_write_response(const BluetoothGATTWriteResponse &msg);
229
- #endif
230
- #ifdef USE_BLUETOOTH_PROXY
231
- bool send_bluetooth_gatt_notify_response(const BluetoothGATTNotifyResponse &msg);
232
- #endif
233
- #ifdef USE_BLUETOOTH_PROXY
234
- bool send_bluetooth_device_pairing_response(const BluetoothDevicePairingResponse &msg);
235
- #endif
236
- #ifdef USE_BLUETOOTH_PROXY
237
- bool send_bluetooth_device_unpairing_response(const BluetoothDeviceUnpairingResponse &msg);
238
- #endif
137
+
239
138
  #ifdef USE_BLUETOOTH_PROXY
240
139
  virtual void on_unsubscribe_bluetooth_le_advertisements_request(
241
140
  const UnsubscribeBluetoothLEAdvertisementsRequest &value){};
242
141
  #endif
243
- #ifdef USE_BLUETOOTH_PROXY
244
- bool send_bluetooth_device_clear_cache_response(const BluetoothDeviceClearCacheResponse &msg);
245
- #endif
246
- #ifdef USE_BLUETOOTH_PROXY
247
- bool send_bluetooth_scanner_state_response(const BluetoothScannerStateResponse &msg);
248
- #endif
142
+
249
143
  #ifdef USE_BLUETOOTH_PROXY
250
144
  virtual void on_bluetooth_scanner_set_mode_request(const BluetoothScannerSetModeRequest &value){};
251
145
  #endif
252
146
  #ifdef USE_VOICE_ASSISTANT
253
147
  virtual void on_subscribe_voice_assistant_request(const SubscribeVoiceAssistantRequest &value){};
254
148
  #endif
255
- #ifdef USE_VOICE_ASSISTANT
256
- bool send_voice_assistant_request(const VoiceAssistantRequest &msg);
257
- #endif
149
+
258
150
  #ifdef USE_VOICE_ASSISTANT
259
151
  virtual void on_voice_assistant_response(const VoiceAssistantResponse &value){};
260
152
  #endif
@@ -262,7 +154,6 @@ class APIServerConnectionBase : public ProtoService {
262
154
  virtual void on_voice_assistant_event_response(const VoiceAssistantEventResponse &value){};
263
155
  #endif
264
156
  #ifdef USE_VOICE_ASSISTANT
265
- bool send_voice_assistant_audio(const VoiceAssistantAudio &msg);
266
157
  virtual void on_voice_assistant_audio(const VoiceAssistantAudio &value){};
267
158
  #endif
268
159
  #ifdef USE_VOICE_ASSISTANT
@@ -271,84 +162,39 @@ class APIServerConnectionBase : public ProtoService {
271
162
  #ifdef USE_VOICE_ASSISTANT
272
163
  virtual void on_voice_assistant_announce_request(const VoiceAssistantAnnounceRequest &value){};
273
164
  #endif
274
- #ifdef USE_VOICE_ASSISTANT
275
- bool send_voice_assistant_announce_finished(const VoiceAssistantAnnounceFinished &msg);
276
- #endif
165
+
277
166
  #ifdef USE_VOICE_ASSISTANT
278
167
  virtual void on_voice_assistant_configuration_request(const VoiceAssistantConfigurationRequest &value){};
279
168
  #endif
280
- #ifdef USE_VOICE_ASSISTANT
281
- bool send_voice_assistant_configuration_response(const VoiceAssistantConfigurationResponse &msg);
282
- #endif
169
+
283
170
  #ifdef USE_VOICE_ASSISTANT
284
171
  virtual void on_voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &value){};
285
172
  #endif
286
- #ifdef USE_ALARM_CONTROL_PANEL
287
- bool send_list_entities_alarm_control_panel_response(const ListEntitiesAlarmControlPanelResponse &msg);
288
- #endif
289
- #ifdef USE_ALARM_CONTROL_PANEL
290
- bool send_alarm_control_panel_state_response(const AlarmControlPanelStateResponse &msg);
291
- #endif
173
+
292
174
  #ifdef USE_ALARM_CONTROL_PANEL
293
175
  virtual void on_alarm_control_panel_command_request(const AlarmControlPanelCommandRequest &value){};
294
176
  #endif
295
- #ifdef USE_TEXT
296
- bool send_list_entities_text_response(const ListEntitiesTextResponse &msg);
297
- #endif
298
- #ifdef USE_TEXT
299
- bool send_text_state_response(const TextStateResponse &msg);
300
- #endif
177
+
301
178
  #ifdef USE_TEXT
302
179
  virtual void on_text_command_request(const TextCommandRequest &value){};
303
180
  #endif
304
- #ifdef USE_DATETIME_DATE
305
- bool send_list_entities_date_response(const ListEntitiesDateResponse &msg);
306
- #endif
307
- #ifdef USE_DATETIME_DATE
308
- bool send_date_state_response(const DateStateResponse &msg);
309
- #endif
181
+
310
182
  #ifdef USE_DATETIME_DATE
311
183
  virtual void on_date_command_request(const DateCommandRequest &value){};
312
184
  #endif
313
- #ifdef USE_DATETIME_TIME
314
- bool send_list_entities_time_response(const ListEntitiesTimeResponse &msg);
315
- #endif
316
- #ifdef USE_DATETIME_TIME
317
- bool send_time_state_response(const TimeStateResponse &msg);
318
- #endif
185
+
319
186
  #ifdef USE_DATETIME_TIME
320
187
  virtual void on_time_command_request(const TimeCommandRequest &value){};
321
188
  #endif
322
- #ifdef USE_EVENT
323
- bool send_list_entities_event_response(const ListEntitiesEventResponse &msg);
324
- #endif
325
- #ifdef USE_EVENT
326
- bool send_event_response(const EventResponse &msg);
327
- #endif
328
- #ifdef USE_VALVE
329
- bool send_list_entities_valve_response(const ListEntitiesValveResponse &msg);
330
- #endif
331
- #ifdef USE_VALVE
332
- bool send_valve_state_response(const ValveStateResponse &msg);
333
- #endif
189
+
334
190
  #ifdef USE_VALVE
335
191
  virtual void on_valve_command_request(const ValveCommandRequest &value){};
336
192
  #endif
337
- #ifdef USE_DATETIME_DATETIME
338
- bool send_list_entities_date_time_response(const ListEntitiesDateTimeResponse &msg);
339
- #endif
340
- #ifdef USE_DATETIME_DATETIME
341
- bool send_date_time_state_response(const DateTimeStateResponse &msg);
342
- #endif
193
+
343
194
  #ifdef USE_DATETIME_DATETIME
344
195
  virtual void on_date_time_command_request(const DateTimeCommandRequest &value){};
345
196
  #endif
346
- #ifdef USE_UPDATE
347
- bool send_list_entities_update_response(const ListEntitiesUpdateResponse &msg);
348
- #endif
349
- #ifdef USE_UPDATE
350
- bool send_update_state_response(const UpdateStateResponse &msg);
351
- #endif
197
+
352
198
  #ifdef USE_UPDATE
353
199
  virtual void on_update_command_request(const UpdateCommandRequest &value){};
354
200
  #endif
@@ -24,10 +24,14 @@ static const char *const TAG = "api";
24
24
  // APIServer
25
25
  APIServer *global_api_server = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
26
26
 
27
- APIServer::APIServer() { global_api_server = this; }
27
+ APIServer::APIServer() {
28
+ global_api_server = this;
29
+ // Pre-allocate shared write buffer
30
+ shared_write_buffer_.reserve(64);
31
+ }
28
32
 
29
33
  void APIServer::setup() {
30
- ESP_LOGCONFIG(TAG, "Setting up Home Assistant API server...");
34
+ ESP_LOGCONFIG(TAG, "Running setup");
31
35
  this->setup_controller();
32
36
 
33
37
  #ifdef USE_API_NOISE
@@ -43,7 +47,7 @@ void APIServer::setup() {
43
47
  }
44
48
  #endif
45
49
 
46
- this->socket_ = socket::socket_ip(SOCK_STREAM, 0);
50
+ this->socket_ = socket::socket_ip_loop_monitored(SOCK_STREAM, 0); // monitored for incoming connections
47
51
  if (this->socket_ == nullptr) {
48
52
  ESP_LOGW(TAG, "Could not create socket");
49
53
  this->mark_failed();
@@ -88,6 +92,12 @@ void APIServer::setup() {
88
92
  #ifdef USE_LOGGER
89
93
  if (logger::global_logger != nullptr) {
90
94
  logger::global_logger->add_on_log_callback([this](int level, const char *tag, const char *message) {
95
+ if (this->shutting_down_) {
96
+ // Don't try to send logs during shutdown
97
+ // as it could result in a recursion and
98
+ // we would be filling a buffer we are trying to clear
99
+ return;
100
+ }
91
101
  for (auto &c : this->clients_) {
92
102
  if (!c->remove_)
93
103
  c->try_send_log_message(level, tag, message);
@@ -112,18 +122,20 @@ void APIServer::setup() {
112
122
  }
113
123
 
114
124
  void APIServer::loop() {
115
- // Accept new clients
116
- while (true) {
117
- struct sockaddr_storage source_addr;
118
- socklen_t addr_len = sizeof(source_addr);
119
- auto sock = this->socket_->accept((struct sockaddr *) &source_addr, &addr_len);
120
- if (!sock)
121
- break;
122
- ESP_LOGD(TAG, "Accepted %s", sock->getpeername().c_str());
123
-
124
- auto *conn = new APIConnection(std::move(sock), this);
125
- this->clients_.emplace_back(conn);
126
- conn->start();
125
+ // Accept new clients only if the socket exists and has incoming connections
126
+ if (this->socket_ && this->socket_->ready()) {
127
+ while (true) {
128
+ struct sockaddr_storage source_addr;
129
+ socklen_t addr_len = sizeof(source_addr);
130
+ auto sock = this->socket_->accept_loop_monitored((struct sockaddr *) &source_addr, &addr_len);
131
+ if (!sock)
132
+ break;
133
+ ESP_LOGD(TAG, "Accepted %s", sock->getpeername().c_str());
134
+
135
+ auto *conn = new APIConnection(std::move(sock), this);
136
+ this->clients_.emplace_back(conn);
137
+ conn->start();
138
+ }
127
139
  }
128
140
 
129
141
  // Process clients and remove disconnected ones in a single pass
@@ -155,7 +167,7 @@ void APIServer::loop() {
155
167
  const uint32_t now = millis();
156
168
  if (!this->is_connected()) {
157
169
  if (now - this->last_connected_ > this->reboot_timeout_) {
158
- ESP_LOGE(TAG, "No client connected to API. Rebooting...");
170
+ ESP_LOGE(TAG, "No client connected; rebooting");
159
171
  App.reboot();
160
172
  }
161
173
  this->status_set_warning();
@@ -167,8 +179,10 @@ void APIServer::loop() {
167
179
  }
168
180
 
169
181
  void APIServer::dump_config() {
170
- ESP_LOGCONFIG(TAG, "API Server:");
171
- ESP_LOGCONFIG(TAG, " Address: %s:%u", network::get_use_address().c_str(), this->port_);
182
+ ESP_LOGCONFIG(TAG,
183
+ "API Server:\n"
184
+ " Address: %s:%u",
185
+ network::get_use_address().c_str(), this->port_);
172
186
  #ifdef USE_API_NOISE
173
187
  ESP_LOGCONFIG(TAG, " Using noise encryption: %s", YESNO(this->noise_ctx_->has_psk()));
174
188
  if (!this->noise_ctx_->has_psk()) {
@@ -217,7 +231,7 @@ void APIServer::on_binary_sensor_update(binary_sensor::BinarySensor *obj, bool s
217
231
  if (obj->is_internal())
218
232
  return;
219
233
  for (auto &c : this->clients_)
220
- c->send_binary_sensor_state(obj, state);
234
+ c->send_binary_sensor_state(obj);
221
235
  }
222
236
  #endif
223
237
 
@@ -253,7 +267,7 @@ void APIServer::on_sensor_update(sensor::Sensor *obj, float state) {
253
267
  if (obj->is_internal())
254
268
  return;
255
269
  for (auto &c : this->clients_)
256
- c->send_sensor_state(obj, state);
270
+ c->send_sensor_state(obj);
257
271
  }
258
272
  #endif
259
273
 
@@ -262,7 +276,7 @@ void APIServer::on_switch_update(switch_::Switch *obj, bool state) {
262
276
  if (obj->is_internal())
263
277
  return;
264
278
  for (auto &c : this->clients_)
265
- c->send_switch_state(obj, state);
279
+ c->send_switch_state(obj);
266
280
  }
267
281
  #endif
268
282
 
@@ -271,7 +285,7 @@ void APIServer::on_text_sensor_update(text_sensor::TextSensor *obj, const std::s
271
285
  if (obj->is_internal())
272
286
  return;
273
287
  for (auto &c : this->clients_)
274
- c->send_text_sensor_state(obj, state);
288
+ c->send_text_sensor_state(obj);
275
289
  }
276
290
  #endif
277
291
 
@@ -289,7 +303,7 @@ void APIServer::on_number_update(number::Number *obj, float state) {
289
303
  if (obj->is_internal())
290
304
  return;
291
305
  for (auto &c : this->clients_)
292
- c->send_number_state(obj, state);
306
+ c->send_number_state(obj);
293
307
  }
294
308
  #endif
295
309
 
@@ -325,7 +339,7 @@ void APIServer::on_text_update(text::Text *obj, const std::string &state) {
325
339
  if (obj->is_internal())
326
340
  return;
327
341
  for (auto &c : this->clients_)
328
- c->send_text_state(obj, state);
342
+ c->send_text_state(obj);
329
343
  }
330
344
  #endif
331
345
 
@@ -334,7 +348,7 @@ void APIServer::on_select_update(select::Select *obj, const std::string &state,
334
348
  if (obj->is_internal())
335
349
  return;
336
350
  for (auto &c : this->clients_)
337
- c->send_select_state(obj, state);
351
+ c->send_select_state(obj);
338
352
  }
339
353
  #endif
340
354
 
@@ -343,7 +357,7 @@ void APIServer::on_lock_update(lock::Lock *obj) {
343
357
  if (obj->is_internal())
344
358
  return;
345
359
  for (auto &c : this->clients_)
346
- c->send_lock_state(obj, obj->state);
360
+ c->send_lock_state(obj);
347
361
  }
348
362
  #endif
349
363
 
@@ -394,6 +408,8 @@ void APIServer::set_port(uint16_t port) { this->port_ = port; }
394
408
 
395
409
  void APIServer::set_password(const std::string &password) { this->password_ = password; }
396
410
 
411
+ void APIServer::set_batch_delay(uint32_t batch_delay) { this->batch_delay_ = batch_delay; }
412
+
397
413
  void APIServer::send_homeassistant_service_call(const HomeassistantServiceResponse &call) {
398
414
  for (auto &client : this->clients_) {
399
415
  client->send_homeassistant_service_call(call);
@@ -452,7 +468,7 @@ bool APIServer::save_noise_psk(psk_t psk, bool make_active) {
452
468
  ESP_LOGW(TAG, "Disconnecting all clients to reset connections");
453
469
  this->set_noise_psk(psk);
454
470
  for (auto &c : this->clients_) {
455
- c->send_disconnect_request(DisconnectRequest());
471
+ c->send_message(DisconnectRequest());
456
472
  }
457
473
  });
458
474
  }
@@ -472,10 +488,36 @@ void APIServer::request_time() {
472
488
  bool APIServer::is_connected() const { return !this->clients_.empty(); }
473
489
 
474
490
  void APIServer::on_shutdown() {
491
+ this->shutting_down_ = true;
492
+
493
+ // Close the listening socket to prevent new connections
494
+ if (this->socket_) {
495
+ this->socket_->close();
496
+ this->socket_ = nullptr;
497
+ }
498
+
499
+ // Change batch delay to 5ms for quick flushing during shutdown
500
+ this->batch_delay_ = 5;
501
+
502
+ // Send disconnect requests to all connected clients
475
503
  for (auto &c : this->clients_) {
476
- c->send_disconnect_request(DisconnectRequest());
504
+ if (!c->send_message(DisconnectRequest())) {
505
+ // If we can't send the disconnect request directly (tx_buffer full),
506
+ // schedule it in the batch so it will be sent with the 5ms timer
507
+ c->schedule_message_(nullptr, &APIConnection::try_send_disconnect_request, DisconnectRequest::MESSAGE_TYPE);
508
+ }
477
509
  }
478
- delay(10);
510
+ }
511
+
512
+ bool APIServer::teardown() {
513
+ // If network is disconnected, no point trying to flush buffers
514
+ if (!network::is_connected()) {
515
+ return true;
516
+ }
517
+ this->loop();
518
+
519
+ // Return true only when all clients have been torn down
520
+ return this->clients_.empty();
479
521
  }
480
522
 
481
523
  } // namespace api
@@ -34,11 +34,17 @@ class APIServer : public Component, public Controller {
34
34
  void loop() override;
35
35
  void dump_config() override;
36
36
  void on_shutdown() override;
37
+ bool teardown() override;
37
38
  bool check_password(const std::string &password) const;
38
39
  bool uses_password() const;
39
40
  void set_port(uint16_t port);
40
41
  void set_password(const std::string &password);
41
42
  void set_reboot_timeout(uint32_t reboot_timeout);
43
+ void set_batch_delay(uint32_t batch_delay);
44
+ uint32_t get_batch_delay() const { return batch_delay_; }
45
+
46
+ // Get reference to shared buffer for API connections
47
+ std::vector<uint8_t> &get_shared_buffer_ref() { return shared_write_buffer_; }
42
48
 
43
49
  #ifdef USE_API_NOISE
44
50
  bool save_noise_psk(psk_t psk, bool make_active = true);
@@ -136,12 +142,15 @@ class APIServer : public Component, public Controller {
136
142
  }
137
143
 
138
144
  protected:
145
+ bool shutting_down_ = false;
139
146
  std::unique_ptr<socket::Socket> socket_ = nullptr;
140
147
  uint16_t port_{6053};
141
148
  uint32_t reboot_timeout_{300000};
149
+ uint32_t batch_delay_{100};
142
150
  uint32_t last_connected_{0};
143
151
  std::vector<std::unique_ptr<APIConnection>> clients_;
144
152
  std::string password_;
153
+ std::vector<uint8_t> shared_write_buffer_; // Shared proto write buffer for all connections
145
154
  std::vector<HomeAssistantStateSubscription> state_subs_;
146
155
  std::vector<UserServiceDescriptor *> user_services_;
147
156
  Trigger<std::string, std::string> *client_connected_trigger_ = new Trigger<std::string, std::string>();
@@ -5,7 +5,7 @@ from datetime import datetime
5
5
  import logging
6
6
  from typing import TYPE_CHECKING, Any
7
7
 
8
- from aioesphomeapi import APIClient
8
+ from aioesphomeapi import APIClient, parse_log_message
9
9
  from aioesphomeapi.log_runner import async_run
10
10
 
11
11
  from esphome.const import CONF_KEY, CONF_PASSWORD, CONF_PORT, __version__
@@ -48,7 +48,10 @@ async def async_run_logs(config: dict[str, Any], address: str) -> None:
48
48
  text = message.decode("utf8", "backslashreplace")
49
49
  if dashboard:
50
50
  text = text.replace("\033", "\\033")
51
- print(f"[{time_.hour:02}:{time_.minute:02}:{time_.second:02}]{text}")
51
+ for parsed_msg in parse_log_message(
52
+ text, f"[{time_.hour:02}:{time_.minute:02}:{time_.second:02}]"
53
+ ):
54
+ print(parsed_msg)
52
55
 
53
56
  stop = await async_run(cli, on_log, name=name)
54
57
  try:
@@ -3,8 +3,8 @@
3
3
  #include "api_server.h"
4
4
  #ifdef USE_API
5
5
  #include "api_pb2.h"
6
- #include "esphome/core/helpers.h"
7
6
  #include "esphome/core/automation.h"
7
+ #include "esphome/core/helpers.h"
8
8
  #include <vector>
9
9
 
10
10
  namespace esphome {
@@ -73,7 +73,7 @@ bool ListEntitiesIterator::on_end() { return this->client_->send_list_info_done(
73
73
  ListEntitiesIterator::ListEntitiesIterator(APIConnection *client) : client_(client) {}
74
74
  bool ListEntitiesIterator::on_service(UserServiceDescriptor *service) {
75
75
  auto resp = service->encode_list_service_response();
76
- return this->client_->send_list_entities_services_response(resp);
76
+ return this->client_->send_message(resp);
77
77
  }
78
78
 
79
79
  #ifdef USE_ESP32_CAMERA