esphome 2025.6.3__py3-none-any.whl → 2025.7.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 (599) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +42 -20
  22. esphome/components/api/api_connection.cpp +318 -391
  23. esphome/components/api/api_connection.h +206 -126
  24. esphome/components/api/api_frame_helper.cpp +89 -124
  25. esphome/components/api/api_frame_helper.h +57 -45
  26. esphome/components/api/api_pb2.cpp +414 -4350
  27. esphome/components/api/api_pb2.h +287 -198
  28. esphome/components/api/api_pb2_dump.cpp +4333 -0
  29. esphome/components/api/api_pb2_service.cpp +180 -425
  30. esphome/components/api/api_pb2_service.h +7 -6
  31. esphome/components/api/api_pb2_size.h +2 -4
  32. esphome/components/api/api_server.cpp +138 -167
  33. esphome/components/api/api_server.h +66 -12
  34. esphome/components/api/client.py +8 -2
  35. esphome/components/api/list_entities.cpp +36 -105
  36. esphome/components/api/list_entities.h +31 -23
  37. esphome/components/api/proto.h +26 -3
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/as5600/as5600.h +0 -1
  41. esphome/components/async_tcp/__init__.py +14 -5
  42. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  43. esphome/components/atm90e32/atm90e32.cpp +2 -1
  44. esphome/components/audio/audio_decoder.cpp +1 -1
  45. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  46. esphome/components/b_parasite/b_parasite.h +0 -1
  47. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  48. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  49. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  50. esphome/components/bh1750/bh1750.cpp +5 -5
  51. esphome/components/binary_sensor/__init__.py +82 -5
  52. esphome/components/binary_sensor/automation.h +19 -1
  53. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  54. esphome/components/binary_sensor/binary_sensor.h +11 -25
  55. esphome/components/binary_sensor/filter.cpp +29 -24
  56. esphome/components/binary_sensor/filter.h +20 -10
  57. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  58. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  60. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  62. esphome/components/ble_client/switch/ble_switch.h +0 -1
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  65. esphome/components/ble_presence/ble_presence_device.h +0 -1
  66. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  67. esphome/components/ble_scanner/ble_scanner.h +0 -1
  68. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  69. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  71. esphome/components/bme680/sensor.py +1 -1
  72. esphome/components/bmp581/bmp581.h +0 -2
  73. esphome/components/button/__init__.py +5 -2
  74. esphome/components/camera/__init__.py +1 -0
  75. esphome/components/camera/camera.cpp +22 -0
  76. esphome/components/camera/camera.h +80 -0
  77. esphome/components/canbus/__init__.py +1 -0
  78. esphome/components/cap1188/cap1188.h +0 -1
  79. esphome/components/captive_portal/__init__.py +12 -2
  80. esphome/components/captive_portal/captive_portal.cpp +12 -2
  81. esphome/components/captive_portal/captive_portal.h +5 -2
  82. esphome/components/ccs811/ccs811.h +0 -2
  83. esphome/components/climate/__init__.py +5 -2
  84. esphome/components/cm1106/sensor.py +2 -2
  85. esphome/components/const/__init__.py +2 -0
  86. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  87. esphome/components/copy/button/copy_button.h +0 -1
  88. esphome/components/copy/cover/copy_cover.h +0 -1
  89. esphome/components/copy/fan/copy_fan.h +0 -1
  90. esphome/components/copy/lock/copy_lock.h +0 -1
  91. esphome/components/copy/number/copy_number.h +0 -1
  92. esphome/components/copy/select/copy_select.h +0 -1
  93. esphome/components/copy/sensor/copy_sensor.h +0 -1
  94. esphome/components/copy/switch/copy_switch.h +0 -1
  95. esphome/components/copy/text/copy_text.h +0 -1
  96. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  97. esphome/components/cover/__init__.py +5 -2
  98. esphome/components/cs5460a/cs5460a.h +0 -1
  99. esphome/components/datetime/__init__.py +4 -2
  100. esphome/components/debug/__init__.py +20 -0
  101. esphome/components/deep_sleep/__init__.py +43 -9
  102. esphome/components/demo/__init__.py +2 -2
  103. esphome/components/display/display.cpp +4 -3
  104. esphome/components/display/display.h +0 -2
  105. esphome/components/display/display_buffer.cpp +1 -1
  106. esphome/components/ds2484/__init__.py +1 -0
  107. esphome/components/ds2484/ds2484.cpp +209 -0
  108. esphome/components/ds2484/ds2484.h +43 -0
  109. esphome/components/ds2484/one_wire.py +37 -0
  110. esphome/components/duty_time/duty_time_sensor.h +0 -1
  111. esphome/components/ens160_base/ens160_base.h +0 -1
  112. esphome/components/es7210/es7210.h +0 -1
  113. esphome/components/es7243e/es7243e.h +0 -1
  114. esphome/components/es8156/es8156.h +0 -1
  115. esphome/components/es8311/es8311.h +0 -1
  116. esphome/components/es8388/es8388.h +0 -1
  117. esphome/components/esp32/__init__.py +102 -135
  118. esphome/components/esp32/core.cpp +0 -4
  119. esphome/components/esp32/gpio.h +1 -1
  120. esphome/components/esp32/helpers.cpp +69 -0
  121. esphome/components/esp32_ble/ble.cpp +5 -6
  122. esphome/components/esp32_ble/ble.h +29 -14
  123. esphome/components/esp32_ble/ble_event.h +6 -6
  124. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  125. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  126. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  127. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  128. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  129. esphome/components/esp32_camera/__init__.py +111 -97
  130. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  131. esphome/components/esp32_camera/esp32_camera.h +35 -30
  132. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  133. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  134. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  135. esphome/components/esp32_hall/sensor.py +2 -21
  136. esphome/components/esp32_hosted/__init__.py +101 -0
  137. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  138. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  139. esphome/components/esp32_rmt/__init__.py +0 -58
  140. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  141. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  142. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  143. esphome/components/esp32_touch/esp32_touch.h +174 -28
  144. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  145. esphome/components/esp32_touch/esp32_touch_v1.cpp +238 -0
  146. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  147. esphome/components/esp8266/__init__.py +1 -0
  148. esphome/components/esp8266/gpio.cpp +10 -10
  149. esphome/components/esp8266/helpers.cpp +31 -0
  150. esphome/components/esphome/ota/__init__.py +1 -0
  151. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  152. esphome/components/ethernet/__init__.py +42 -23
  153. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  154. esphome/components/ethernet/ethernet_component.cpp +69 -29
  155. esphome/components/ethernet/ethernet_component.h +18 -10
  156. esphome/components/event/__init__.py +5 -2
  157. esphome/components/ezo/ezo.h +0 -1
  158. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  159. esphome/components/fan/__init__.py +5 -2
  160. esphome/components/feedback/feedback_cover.h +0 -1
  161. esphome/components/font/__init__.py +92 -82
  162. esphome/components/font/font.cpp +9 -2
  163. esphome/components/font/font.h +20 -5
  164. esphome/components/fs3000/fs3000.h +0 -1
  165. esphome/components/gcja5/gcja5.h +0 -1
  166. esphome/components/gl_r01_i2c/__init__.py +0 -0
  167. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  168. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  169. esphome/components/gl_r01_i2c/sensor.py +36 -0
  170. esphome/components/gp8403/gp8403.h +0 -1
  171. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  172. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  173. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  174. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  175. esphome/components/he60r/he60r.h +0 -1
  176. esphome/components/heatpumpir/climate.py +2 -1
  177. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  178. esphome/components/heatpumpir/heatpumpir.h +1 -0
  179. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  180. esphome/components/host/__init__.py +2 -1
  181. esphome/components/host/helpers.cpp +57 -0
  182. esphome/components/http_request/__init__.py +19 -1
  183. esphome/components/http_request/http_request.h +1 -1
  184. esphome/components/http_request/http_request_arduino.h +1 -0
  185. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  186. esphome/components/http_request/update/http_request_update.cpp +28 -9
  187. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  188. esphome/components/hydreon_rgxx/sensor.py +1 -1
  189. esphome/components/i2c/__init__.py +23 -11
  190. esphome/components/i2c/i2c_bus.h +8 -1
  191. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  192. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  193. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  194. esphome/components/i2c_device/i2c_device.h +0 -1
  195. esphome/components/i2s_audio/__init__.py +2 -10
  196. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  197. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  198. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  199. esphome/components/iaqcore/iaqcore.h +0 -2
  200. esphome/components/image/__init__.py +123 -24
  201. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  202. esphome/components/ina219/ina219.cpp +7 -0
  203. esphome/components/ina219/ina219.h +1 -0
  204. esphome/components/ina260/ina260.h +0 -2
  205. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  206. esphome/components/inkplate6/display.py +15 -0
  207. esphome/components/inkplate6/inkplate.cpp +2 -2
  208. esphome/components/integration/integration_sensor.h +0 -1
  209. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  210. esphome/components/internal_temperature/sensor.py +0 -26
  211. esphome/components/interval/interval.h +0 -2
  212. esphome/components/ld2410/button/__init__.py +3 -3
  213. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  214. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  215. esphome/components/ld2410/ld2410.cpp +430 -261
  216. esphome/components/ld2410/ld2410.h +44 -146
  217. esphome/components/ld2410/number/__init__.py +2 -2
  218. esphome/components/ld2410/sensor.py +1 -1
  219. esphome/components/ld2410/switch/__init__.py +1 -1
  220. esphome/components/ld2420/ld2420.cpp +196 -100
  221. esphome/components/ld2420/ld2420.h +46 -118
  222. esphome/components/ld2420/number/__init__.py +2 -2
  223. esphome/components/ld2420/sensor/__init__.py +6 -2
  224. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  225. esphome/components/ld2450/button/__init__.py +3 -3
  226. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  227. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  228. esphome/components/ld2450/ld2450.cpp +384 -232
  229. esphome/components/ld2450/ld2450.h +60 -69
  230. esphome/components/ld2450/switch/__init__.py +1 -1
  231. esphome/components/ledc/ledc_output.cpp +1 -63
  232. esphome/components/libretiny/__init__.py +4 -3
  233. esphome/components/libretiny/const.py +5 -0
  234. esphome/components/libretiny/generate_components.py +1 -0
  235. esphome/components/libretiny/helpers.cpp +35 -0
  236. esphome/components/libretiny/lt_component.cpp +5 -3
  237. esphome/components/light/__init__.py +4 -2
  238. esphome/components/light/addressable_light.h +3 -3
  239. esphome/components/light/light_call.cpp +180 -243
  240. esphome/components/light/light_call.h +72 -20
  241. esphome/components/light/light_color_values.h +14 -14
  242. esphome/components/light/light_state.h +15 -13
  243. esphome/components/light/transformers.h +2 -2
  244. esphome/components/ln882x/__init__.py +52 -0
  245. esphome/components/ln882x/boards.py +285 -0
  246. esphome/components/lock/__init__.py +5 -2
  247. esphome/components/logger/__init__.py +40 -3
  248. esphome/components/logger/logger.cpp +47 -12
  249. esphome/components/logger/logger.h +80 -49
  250. esphome/components/logger/logger_esp32.cpp +3 -3
  251. esphome/components/lps22/__init__.py +0 -0
  252. esphome/components/lps22/lps22.cpp +75 -0
  253. esphome/components/lps22/lps22.h +27 -0
  254. esphome/components/lps22/sensor.py +58 -0
  255. esphome/components/ltr390/ltr390.h +0 -1
  256. esphome/components/ltr501/ltr501.h +0 -1
  257. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  258. esphome/components/lvgl/__init__.py +1 -1
  259. esphome/components/lvgl/schemas.py +66 -6
  260. esphome/components/lvgl/styles.py +24 -16
  261. esphome/components/lvgl/widgets/__init__.py +12 -2
  262. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  263. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  264. esphome/components/max9611/max9611.h +0 -1
  265. esphome/components/mcp23016/__init__.py +1 -1
  266. esphome/components/mcp23xxx_base/__init__.py +1 -1
  267. esphome/components/mcp4461/__init__.py +1 -1
  268. esphome/components/mcp4461/output/__init__.py +3 -2
  269. esphome/components/mcp9600/mcp9600.h +0 -2
  270. esphome/components/md5/md5.cpp +3 -3
  271. esphome/components/md5/md5.h +1 -6
  272. esphome/components/mdns/__init__.py +22 -11
  273. esphome/components/media_player/__init__.py +4 -3
  274. esphome/components/micro_wake_word/__init__.py +1 -5
  275. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  276. esphome/components/microphone/microphone.cpp +7 -9
  277. esphome/components/microphone/microphone.h +0 -2
  278. esphome/components/mipi_spi/display.py +1 -0
  279. esphome/components/mmc5603/mmc5603.cpp +1 -1
  280. esphome/components/modbus/modbus.cpp +33 -15
  281. esphome/components/modbus/modbus.h +9 -0
  282. esphome/components/modbus_controller/__init__.py +42 -10
  283. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  284. esphome/components/modbus_controller/modbus_controller.h +61 -7
  285. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  286. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  287. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  288. esphome/components/mqtt/__init__.py +16 -0
  289. esphome/components/mqtt/mqtt_backend.h +2 -1
  290. esphome/components/mqtt/mqtt_backend_esp32.cpp +126 -45
  291. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  292. esphome/components/mqtt/mqtt_client.cpp +15 -9
  293. esphome/components/mqtt/mqtt_client.h +8 -3
  294. esphome/components/ms8607/ms8607.h +0 -1
  295. esphome/components/neopixelbus/light.py +4 -1
  296. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  297. esphome/components/network/__init__.py +4 -1
  298. esphome/components/network/ip_address.h +1 -0
  299. esphome/components/nextion/__init__.py +16 -0
  300. esphome/components/nextion/base_component.py +1 -0
  301. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  302. esphome/components/nextion/display.py +14 -4
  303. esphome/components/nextion/nextion.cpp +166 -101
  304. esphome/components/nextion/nextion.h +84 -53
  305. esphome/components/nextion/nextion_commands.cpp +11 -10
  306. esphome/components/nextion/nextion_component.cpp +28 -28
  307. esphome/components/nextion/nextion_component.h +53 -18
  308. esphome/components/nextion/nextion_component_base.h +3 -0
  309. esphome/components/nextion/nextion_upload.cpp +36 -0
  310. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  311. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  312. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  313. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  314. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  315. esphome/components/nfc/nfc.cpp +3 -22
  316. esphome/components/nfc/nfc.h +3 -3
  317. esphome/components/number/__init__.py +5 -2
  318. esphome/components/online_image/__init__.py +5 -0
  319. esphome/components/online_image/online_image.cpp +6 -2
  320. esphome/components/online_image/online_image.h +4 -1
  321. esphome/components/opentherm/opentherm.cpp +7 -12
  322. esphome/components/openthread/__init__.py +47 -40
  323. esphome/components/openthread/const.py +1 -0
  324. esphome/components/openthread/openthread_esp.cpp +27 -5
  325. esphome/components/opt3001/__init__.py +0 -0
  326. esphome/components/opt3001/opt3001.cpp +122 -0
  327. esphome/components/opt3001/opt3001.h +27 -0
  328. esphome/components/opt3001/sensor.py +35 -0
  329. esphome/components/ota/__init__.py +17 -0
  330. esphome/components/ota/ota_backend.h +27 -1
  331. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  332. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  333. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  334. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  336. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  338. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  339. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  340. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  341. esphome/components/packages/__init__.py +5 -2
  342. esphome/components/packet_transport/binary_sensor.py +61 -4
  343. esphome/components/packet_transport/packet_transport.cpp +31 -1
  344. esphome/components/packet_transport/packet_transport.h +11 -5
  345. esphome/components/pcf8574/__init__.py +1 -1
  346. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  347. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  348. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  349. esphome/components/pmsa003i/pmsa003i.h +0 -1
  350. esphome/components/pmsx003/pmsx003.h +0 -1
  351. esphome/components/pn7150/pn7150.cpp +7 -7
  352. esphome/components/pn7150/pn7150.h +0 -1
  353. esphome/components/pn7160/pn7160.cpp +7 -7
  354. esphome/components/pn7160/pn7160.h +0 -1
  355. esphome/components/preferences/syncer.h +2 -0
  356. esphome/components/prometheus/prometheus_handler.h +1 -1
  357. esphome/components/psram/psram.cpp +0 -20
  358. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  359. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  360. esphome/components/pulse_width/pulse_width.h +0 -1
  361. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  362. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  363. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  364. esphome/components/qr_code/__init__.py +13 -10
  365. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  366. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  367. esphome/components/rc522/rc522.h +0 -1
  368. esphome/components/rdm6300/rdm6300.h +0 -2
  369. esphome/components/remote_base/__init__.py +7 -5
  370. esphome/components/remote_base/remote_base.cpp +24 -21
  371. esphome/components/remote_base/remote_base.h +3 -26
  372. esphome/components/remote_receiver/__init__.py +40 -46
  373. esphome/components/remote_receiver/remote_receiver.h +4 -18
  374. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  375. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  376. esphome/components/remote_transmitter/__init__.py +42 -43
  377. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  378. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  379. esphome/components/resistance/resistance_sensor.h +0 -1
  380. esphome/components/rp2040/__init__.py +1 -0
  381. esphome/components/rp2040/helpers.cpp +55 -0
  382. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  383. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  384. esphome/components/rtttl/__init__.py +4 -4
  385. esphome/components/rtttl/rtttl.cpp +10 -1
  386. esphome/components/ruuvitag/ruuvitag.h +0 -1
  387. esphome/components/safe_mode/safe_mode.cpp +2 -0
  388. esphome/components/safe_mode/safe_mode.h +4 -1
  389. esphome/components/scd30/scd30.h +0 -1
  390. esphome/components/scd30/sensor.py +2 -2
  391. esphome/components/scd4x/scd4x.cpp +61 -54
  392. esphome/components/scd4x/scd4x.h +17 -15
  393. esphome/components/scd4x/sensor.py +4 -4
  394. esphome/components/script/script.h +0 -2
  395. esphome/components/sdp3x/sensor.py +1 -1
  396. esphome/components/select/__init__.py +5 -2
  397. esphome/components/sen5x/sen5x.h +0 -1
  398. esphome/components/senseair/senseair.h +0 -1
  399. esphome/components/sensor/__init__.py +4 -2
  400. esphome/components/sensor/filter.cpp +1 -1
  401. esphome/components/sensor/sensor.cpp +12 -6
  402. esphome/components/sensor/sensor.h +13 -5
  403. esphome/components/servo/servo.h +0 -1
  404. esphome/components/sfa30/sfa30.h +0 -1
  405. esphome/components/sgp30/sgp30.h +0 -1
  406. esphome/components/sgp4x/sgp4x.h +0 -1
  407. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  408. esphome/components/sht4x/sht4x.h +0 -1
  409. esphome/components/sm300d2/sm300d2.h +0 -2
  410. esphome/components/smt100/sensor.py +8 -4
  411. esphome/components/smt100/smt100.cpp +5 -5
  412. esphome/components/smt100/smt100.h +3 -3
  413. esphome/components/sn74hc595/__init__.py +1 -1
  414. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  415. esphome/components/sntp/sntp_component.cpp +9 -3
  416. esphome/components/sntp/time.py +2 -0
  417. esphome/components/socket/__init__.py +17 -0
  418. esphome/components/spi/__init__.py +27 -6
  419. esphome/components/spi/spi.cpp +3 -2
  420. esphome/components/spi/spi.h +9 -3
  421. esphome/components/spi/spi_arduino.cpp +3 -5
  422. esphome/components/spi/spi_esp_idf.cpp +40 -21
  423. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  424. esphome/components/sps30/sps30.h +0 -1
  425. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  426. esphome/components/st7701s/st7701s.cpp +0 -4
  427. esphome/components/status/status_binary_sensor.h +0 -2
  428. esphome/components/substitutions/__init__.py +76 -19
  429. esphome/components/substitutions/jinja.py +99 -0
  430. esphome/components/sun/sun.cpp +3 -4
  431. esphome/components/switch/__init__.py +5 -2
  432. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  433. esphome/components/sx126x/__init__.py +317 -0
  434. esphome/components/sx126x/automation.h +62 -0
  435. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  436. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  437. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  438. esphome/components/sx126x/sx126x.cpp +523 -0
  439. esphome/components/sx126x/sx126x.h +140 -0
  440. esphome/components/sx126x/sx126x_reg.h +163 -0
  441. esphome/components/sx127x/__init__.py +325 -0
  442. esphome/components/sx127x/automation.h +62 -0
  443. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  444. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  445. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  446. esphome/components/sx127x/sx127x.cpp +498 -0
  447. esphome/components/sx127x/sx127x.h +128 -0
  448. esphome/components/sx127x/sx127x_reg.h +295 -0
  449. esphome/components/syslog/esphome_syslog.cpp +5 -3
  450. esphome/components/syslog/esphome_syslog.h +1 -1
  451. esphome/components/tca9555/__init__.py +1 -1
  452. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  453. esphome/components/text/__init__.py +5 -2
  454. esphome/components/text_sensor/__init__.py +5 -2
  455. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  456. esphome/components/thermostat/thermostat_climate.h +43 -39
  457. esphome/components/time/__init__.py +16 -2
  458. esphome/components/time/real_time_clock.cpp +4 -0
  459. esphome/components/time/real_time_clock.h +5 -1
  460. esphome/components/tlc5971/tlc5971.cpp +4 -1
  461. esphome/components/tmp1075/tmp1075.h +0 -2
  462. esphome/components/tof10120/tof10120_sensor.h +0 -1
  463. esphome/components/tormatic/tormatic_cover.h +0 -1
  464. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  465. esphome/components/tsl2591/tsl2591.cpp +1 -1
  466. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  467. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  468. esphome/components/tx20/tx20.cpp +2 -2
  469. esphome/components/uart/__init__.py +18 -0
  470. esphome/components/uart/uart_component_esp_idf.cpp +0 -4
  471. esphome/components/update/__init__.py +5 -2
  472. esphome/components/update/update_entity.h +8 -0
  473. esphome/components/usb_host/__init__.py +5 -2
  474. esphome/components/valve/__init__.py +5 -2
  475. esphome/components/vbus/vbus.h +0 -1
  476. esphome/components/veml3235/veml3235.h +0 -1
  477. esphome/components/veml7700/veml7700.h +0 -1
  478. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  479. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  480. esphome/components/watchdog/watchdog.cpp +0 -4
  481. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  482. esphome/components/web_server/__init__.py +34 -19
  483. esphome/components/web_server/ota/__init__.py +32 -0
  484. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  485. esphome/components/web_server/ota/ota_web_server.h +26 -0
  486. esphome/components/web_server/web_server.cpp +305 -427
  487. esphome/components/web_server/web_server.h +33 -23
  488. esphome/components/web_server/web_server_v1.cpp +4 -5
  489. esphome/components/web_server_base/__init__.py +5 -2
  490. esphome/components/web_server_base/web_server_base.cpp +2 -94
  491. esphome/components/web_server_base/web_server_base.h +5 -25
  492. esphome/components/web_server_idf/multipart.cpp +254 -0
  493. esphome/components/web_server_idf/multipart.h +86 -0
  494. esphome/components/web_server_idf/utils.cpp +32 -0
  495. esphome/components/web_server_idf/utils.h +10 -0
  496. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  497. esphome/components/web_server_idf/web_server_idf.h +11 -10
  498. esphome/components/wiegand/wiegand.cpp +2 -2
  499. esphome/components/wifi/__init__.py +18 -0
  500. esphome/components/wifi/wifi_component.cpp +17 -22
  501. esphome/components/wifi/wifi_component.h +27 -23
  502. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  503. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  504. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  505. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  506. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  507. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  508. esphome/components/wireguard/__init__.py +2 -11
  509. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  510. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  511. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  512. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  513. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  514. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  515. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  516. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  517. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  518. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  519. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  520. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  521. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  522. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  523. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  524. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  525. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  526. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  527. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  528. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  529. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  530. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  531. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  532. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  533. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  534. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  535. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  536. esphome/components/zyaura/zyaura.h +0 -1
  537. esphome/config.py +88 -22
  538. esphome/config_helpers.py +74 -1
  539. esphome/config_validation.py +12 -1
  540. esphome/const.py +65 -10
  541. esphome/core/__init__.py +18 -2
  542. esphome/core/application.cpp +163 -10
  543. esphome/core/application.h +145 -165
  544. esphome/core/area.h +19 -0
  545. esphome/core/automation.h +58 -9
  546. esphome/core/color.cpp +3 -5
  547. esphome/core/color.h +16 -16
  548. esphome/core/component.cpp +151 -18
  549. esphome/core/component.h +98 -4
  550. esphome/core/component_iterator.cpp +7 -7
  551. esphome/core/component_iterator.h +9 -7
  552. esphome/core/config.py +155 -6
  553. esphome/core/controller.cpp +4 -2
  554. esphome/core/controller.h +1 -1
  555. esphome/core/datatypes.h +2 -2
  556. esphome/core/defines.h +17 -2
  557. esphome/core/device.h +20 -0
  558. esphome/core/entity_base.cpp +20 -15
  559. esphome/core/entity_base.h +76 -0
  560. esphome/core/entity_helpers.py +162 -1
  561. esphome/core/event_pool.h +81 -0
  562. esphome/core/helpers.cpp +75 -230
  563. esphome/core/helpers.h +164 -104
  564. esphome/core/lock_free_queue.h +151 -0
  565. esphome/core/log.cpp +2 -2
  566. esphome/core/log.h +2 -0
  567. esphome/core/optional.h +5 -0
  568. esphome/core/ring_buffer.cpp +2 -2
  569. esphome/core/scheduler.cpp +278 -103
  570. esphome/core/scheduler.h +157 -17
  571. esphome/core/time.cpp +5 -5
  572. esphome/core/time.h +5 -5
  573. esphome/cpp_generator.py +17 -0
  574. esphome/cpp_helpers.py +0 -22
  575. esphome/cpp_types.py +3 -1
  576. esphome/dashboard/entries.py +1 -1
  577. esphome/dashboard/util/text.py +5 -21
  578. esphome/dashboard/web_server.py +9 -1
  579. esphome/helpers.py +47 -0
  580. esphome/loader.py +15 -1
  581. esphome/pins.py +14 -8
  582. esphome/wizard.py +16 -3
  583. esphome/writer.py +21 -3
  584. esphome/yaml_util.py +0 -2
  585. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
  586. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +591 -531
  587. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  588. esphome/components/esp32_ble/queue.h +0 -85
  589. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  590. esphome/components/esp32_hall/esp32_hall.h +0 -23
  591. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  592. esphome/components/ld2410/button/reset_button.cpp +0 -9
  593. esphome/components/ld2450/button/reset_button.cpp +0 -9
  594. esphome/components/openthread/tlv.py +0 -65
  595. /esphome/{dashboard/enum.py → enum.py} +0 -0
  596. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/WHEEL +0 -0
  597. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  598. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
  599. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
@@ -18,10 +18,13 @@ namespace api {
18
18
 
19
19
  // Keepalive timeout in milliseconds
20
20
  static constexpr uint32_t KEEPALIVE_TIMEOUT_MS = 60000;
21
+ // Maximum number of entities to process in a single batch during initial state/info sending
22
+ static constexpr size_t MAX_INITIAL_PER_BATCH = 20;
21
23
 
22
24
  class APIConnection : public APIServerConnection {
23
25
  public:
24
26
  friend class APIServer;
27
+ friend class ListEntitiesIterator;
25
28
  APIConnection(std::unique_ptr<socket::Socket> socket, APIServer *parent);
26
29
  virtual ~APIConnection();
27
30
 
@@ -34,98 +37,79 @@ class APIConnection : public APIServerConnection {
34
37
  }
35
38
  #ifdef USE_BINARY_SENSOR
36
39
  bool send_binary_sensor_state(binary_sensor::BinarySensor *binary_sensor);
37
- void send_binary_sensor_info(binary_sensor::BinarySensor *binary_sensor);
38
40
  #endif
39
41
  #ifdef USE_COVER
40
42
  bool send_cover_state(cover::Cover *cover);
41
- void send_cover_info(cover::Cover *cover);
42
43
  void cover_command(const CoverCommandRequest &msg) override;
43
44
  #endif
44
45
  #ifdef USE_FAN
45
46
  bool send_fan_state(fan::Fan *fan);
46
- void send_fan_info(fan::Fan *fan);
47
47
  void fan_command(const FanCommandRequest &msg) override;
48
48
  #endif
49
49
  #ifdef USE_LIGHT
50
50
  bool send_light_state(light::LightState *light);
51
- void send_light_info(light::LightState *light);
52
51
  void light_command(const LightCommandRequest &msg) override;
53
52
  #endif
54
53
  #ifdef USE_SENSOR
55
54
  bool send_sensor_state(sensor::Sensor *sensor);
56
- void send_sensor_info(sensor::Sensor *sensor);
57
55
  #endif
58
56
  #ifdef USE_SWITCH
59
57
  bool send_switch_state(switch_::Switch *a_switch);
60
- void send_switch_info(switch_::Switch *a_switch);
61
58
  void switch_command(const SwitchCommandRequest &msg) override;
62
59
  #endif
63
60
  #ifdef USE_TEXT_SENSOR
64
61
  bool send_text_sensor_state(text_sensor::TextSensor *text_sensor);
65
- void send_text_sensor_info(text_sensor::TextSensor *text_sensor);
66
62
  #endif
67
- #ifdef USE_ESP32_CAMERA
68
- void set_camera_state(std::shared_ptr<esp32_camera::CameraImage> image);
69
- void send_camera_info(esp32_camera::ESP32Camera *camera);
63
+ #ifdef USE_CAMERA
64
+ void set_camera_state(std::shared_ptr<camera::CameraImage> image);
70
65
  void camera_image(const CameraImageRequest &msg) override;
71
66
  #endif
72
67
  #ifdef USE_CLIMATE
73
68
  bool send_climate_state(climate::Climate *climate);
74
- void send_climate_info(climate::Climate *climate);
75
69
  void climate_command(const ClimateCommandRequest &msg) override;
76
70
  #endif
77
71
  #ifdef USE_NUMBER
78
72
  bool send_number_state(number::Number *number);
79
- void send_number_info(number::Number *number);
80
73
  void number_command(const NumberCommandRequest &msg) override;
81
74
  #endif
82
75
  #ifdef USE_DATETIME_DATE
83
76
  bool send_date_state(datetime::DateEntity *date);
84
- void send_date_info(datetime::DateEntity *date);
85
77
  void date_command(const DateCommandRequest &msg) override;
86
78
  #endif
87
79
  #ifdef USE_DATETIME_TIME
88
80
  bool send_time_state(datetime::TimeEntity *time);
89
- void send_time_info(datetime::TimeEntity *time);
90
81
  void time_command(const TimeCommandRequest &msg) override;
91
82
  #endif
92
83
  #ifdef USE_DATETIME_DATETIME
93
84
  bool send_datetime_state(datetime::DateTimeEntity *datetime);
94
- void send_datetime_info(datetime::DateTimeEntity *datetime);
95
85
  void datetime_command(const DateTimeCommandRequest &msg) override;
96
86
  #endif
97
87
  #ifdef USE_TEXT
98
88
  bool send_text_state(text::Text *text);
99
- void send_text_info(text::Text *text);
100
89
  void text_command(const TextCommandRequest &msg) override;
101
90
  #endif
102
91
  #ifdef USE_SELECT
103
92
  bool send_select_state(select::Select *select);
104
- void send_select_info(select::Select *select);
105
93
  void select_command(const SelectCommandRequest &msg) override;
106
94
  #endif
107
95
  #ifdef USE_BUTTON
108
- void send_button_info(button::Button *button);
109
96
  void button_command(const ButtonCommandRequest &msg) override;
110
97
  #endif
111
98
  #ifdef USE_LOCK
112
99
  bool send_lock_state(lock::Lock *a_lock);
113
- void send_lock_info(lock::Lock *a_lock);
114
100
  void lock_command(const LockCommandRequest &msg) override;
115
101
  #endif
116
102
  #ifdef USE_VALVE
117
103
  bool send_valve_state(valve::Valve *valve);
118
- void send_valve_info(valve::Valve *valve);
119
104
  void valve_command(const ValveCommandRequest &msg) override;
120
105
  #endif
121
106
  #ifdef USE_MEDIA_PLAYER
122
107
  bool send_media_player_state(media_player::MediaPlayer *media_player);
123
- void send_media_player_info(media_player::MediaPlayer *media_player);
124
108
  void media_player_command(const MediaPlayerCommandRequest &msg) override;
125
109
  #endif
126
- bool try_send_log_message(int level, const char *tag, const char *line);
110
+ bool try_send_log_message(int level, const char *tag, const char *line, size_t message_len);
127
111
  void send_homeassistant_service_call(const HomeassistantServiceResponse &call) {
128
- if (!this->service_call_subscription_)
112
+ if (!this->flags_.service_call_subscription)
129
113
  return;
130
114
  this->send_message(call);
131
115
  }
@@ -167,26 +151,22 @@ class APIConnection : public APIServerConnection {
167
151
 
168
152
  #ifdef USE_ALARM_CONTROL_PANEL
169
153
  bool send_alarm_control_panel_state(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel);
170
- void send_alarm_control_panel_info(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel);
171
154
  void alarm_control_panel_command(const AlarmControlPanelCommandRequest &msg) override;
172
155
  #endif
173
156
 
174
157
  #ifdef USE_EVENT
175
158
  void send_event(event::Event *event, const std::string &event_type);
176
- void send_event_info(event::Event *event);
177
159
  #endif
178
160
 
179
161
  #ifdef USE_UPDATE
180
162
  bool send_update_state(update::UpdateEntity *update);
181
- void send_update_info(update::UpdateEntity *update);
182
163
  void update_command(const UpdateCommandRequest &msg) override;
183
164
  #endif
184
165
 
185
166
  void on_disconnect_response(const DisconnectResponse &value) override;
186
167
  void on_ping_response(const PingResponse &value) override {
187
168
  // we initiated ping
188
- this->ping_retries_ = 0;
189
- this->sent_ping_ = false;
169
+ this->flags_.sent_ping = false;
190
170
  }
191
171
  void on_home_assistant_state_response(const HomeAssistantStateResponse &msg) override;
192
172
  #ifdef USE_HOMEASSISTANT_TIME
@@ -199,16 +179,16 @@ class APIConnection : public APIServerConnection {
199
179
  DeviceInfoResponse device_info(const DeviceInfoRequest &msg) override;
200
180
  void list_entities(const ListEntitiesRequest &msg) override { this->list_entities_iterator_.begin(); }
201
181
  void subscribe_states(const SubscribeStatesRequest &msg) override {
202
- this->state_subscription_ = true;
182
+ this->flags_.state_subscription = true;
203
183
  this->initial_state_iterator_.begin();
204
184
  }
205
185
  void subscribe_logs(const SubscribeLogsRequest &msg) override {
206
- this->log_subscription_ = msg.level;
186
+ this->flags_.log_subscription = msg.level;
207
187
  if (msg.dump_config)
208
188
  App.schedule_dump_config();
209
189
  }
210
190
  void subscribe_homeassistant_services(const SubscribeHomeassistantServicesRequest &msg) override {
211
- this->service_call_subscription_ = true;
191
+ this->flags_.service_call_subscription = true;
212
192
  }
213
193
  void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) override;
214
194
  GetTimeResponse get_time(const GetTimeRequest &msg) override {
@@ -220,9 +200,12 @@ class APIConnection : public APIServerConnection {
220
200
  NoiseEncryptionSetKeyResponse noise_encryption_set_key(const NoiseEncryptionSetKeyRequest &msg) override;
221
201
  #endif
222
202
 
223
- bool is_authenticated() override { return this->connection_state_ == ConnectionState::AUTHENTICATED; }
203
+ bool is_authenticated() override {
204
+ return static_cast<ConnectionState>(this->flags_.connection_state) == ConnectionState::AUTHENTICATED;
205
+ }
224
206
  bool is_connection_setup() override {
225
- return this->connection_state_ == ConnectionState ::CONNECTED || this->is_authenticated();
207
+ return static_cast<ConnectionState>(this->flags_.connection_state) == ConnectionState::CONNECTED ||
208
+ this->is_authenticated();
226
209
  }
227
210
  void on_fatal_error() override;
228
211
  void on_unauthenticated_access() override;
@@ -275,7 +258,13 @@ class APIConnection : public APIServerConnection {
275
258
  bool try_to_clear_buffer(bool log_out_of_space);
276
259
  bool send_buffer(ProtoWriteBuffer buffer, uint16_t message_type) override;
277
260
 
278
- std::string get_client_combined_info() const { return this->client_combined_info_; }
261
+ std::string get_client_combined_info() const {
262
+ if (this->client_info_ == this->client_peername_) {
263
+ // Before Hello message, both are the same (just IP:port)
264
+ return this->client_info_;
265
+ }
266
+ return this->client_info_ + " (" + this->client_peername_ + ")";
267
+ }
279
268
 
280
269
  // Buffer allocator methods for batch processing
281
270
  ProtoWriteBuffer allocate_single_message_buffer(uint16_t size);
@@ -295,17 +284,42 @@ class APIConnection : public APIServerConnection {
295
284
  response.icon = entity->get_icon();
296
285
  response.disabled_by_default = entity->is_disabled_by_default();
297
286
  response.entity_category = static_cast<enums::EntityCategory>(entity->get_entity_category());
287
+ #ifdef USE_DEVICES
288
+ response.device_id = entity->get_device_id();
289
+ #endif
298
290
  }
299
291
 
300
292
  // Helper function to fill common entity state fields
301
293
  static void fill_entity_state_base(esphome::EntityBase *entity, StateResponseProtoMessage &response) {
302
294
  response.key = entity->get_object_id_hash();
295
+ #ifdef USE_DEVICES
296
+ response.device_id = entity->get_device_id();
297
+ #endif
303
298
  }
304
299
 
305
300
  // Non-template helper to encode any ProtoMessage
306
301
  static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint16_t message_type, APIConnection *conn,
307
302
  uint32_t remaining_size, bool is_single);
308
303
 
304
+ #ifdef USE_VOICE_ASSISTANT
305
+ // Helper to check voice assistant validity and connection ownership
306
+ inline bool check_voice_assistant_api_connection_() const;
307
+ #endif
308
+
309
+ // Helper method to process multiple entities from an iterator in a batch
310
+ template<typename Iterator> void process_iterator_batch_(Iterator &iterator) {
311
+ size_t initial_size = this->deferred_batch_.size();
312
+ while (!iterator.completed() && (this->deferred_batch_.size() - initial_size) < MAX_INITIAL_PER_BATCH) {
313
+ iterator.advance();
314
+ }
315
+
316
+ // If the batch is full, process it immediately
317
+ // Note: iterator.advance() already calls schedule_batch_() via schedule_message_()
318
+ if (this->deferred_batch_.size() >= MAX_INITIAL_PER_BATCH) {
319
+ this->process_batch_();
320
+ }
321
+ }
322
+
309
323
  #ifdef USE_BINARY_SENSOR
310
324
  static uint16_t try_send_binary_sensor_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
311
325
  bool is_single);
@@ -416,7 +430,7 @@ class APIConnection : public APIServerConnection {
416
430
  static uint16_t try_send_update_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
417
431
  bool is_single);
418
432
  #endif
419
- #ifdef USE_ESP32_CAMERA
433
+ #ifdef USE_CAMERA
420
434
  static uint16_t try_send_camera_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
421
435
  bool is_single);
422
436
  #endif
@@ -432,124 +446,82 @@ class APIConnection : public APIServerConnection {
432
446
  // Helper function to get estimated message size for buffer pre-allocation
433
447
  static uint16_t get_estimated_message_size(uint16_t message_type);
434
448
 
435
- enum class ConnectionState {
436
- WAITING_FOR_HELLO,
437
- CONNECTED,
438
- AUTHENTICATED,
439
- } connection_state_{ConnectionState::WAITING_FOR_HELLO};
449
+ // Batch message method for ping requests
450
+ static uint16_t try_send_ping_request(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
451
+ bool is_single);
440
452
 
441
- bool remove_{false};
453
+ // === Optimal member ordering for 32-bit systems ===
442
454
 
455
+ // Group 1: Pointers (4 bytes each on 32-bit)
443
456
  std::unique_ptr<APIFrameHelper> helper_;
457
+ APIServer *parent_;
444
458
 
459
+ // Group 2: Larger objects (must be 4-byte aligned)
460
+ // These contain vectors/pointers internally, so putting them early ensures good alignment
461
+ InitialStateIterator initial_state_iterator_;
462
+ ListEntitiesIterator list_entities_iterator_;
463
+ #ifdef USE_CAMERA
464
+ std::unique_ptr<camera::CameraImageReader> image_reader_;
465
+ #endif
466
+
467
+ // Group 3: Strings (12 bytes each on 32-bit, 4-byte aligned)
445
468
  std::string client_info_;
446
469
  std::string client_peername_;
447
- std::string client_combined_info_;
448
- uint32_t client_api_version_major_{0};
449
- uint32_t client_api_version_minor_{0};
450
- #ifdef USE_ESP32_CAMERA
451
- esp32_camera::CameraImageReader image_reader_;
452
- #endif
453
470
 
454
- bool state_subscription_{false};
455
- int log_subscription_{ESPHOME_LOG_LEVEL_NONE};
471
+ // Group 4: 4-byte types
456
472
  uint32_t last_traffic_;
457
- uint32_t next_ping_retry_{0};
458
- uint8_t ping_retries_{0};
459
- bool sent_ping_{false};
460
- bool service_call_subscription_{false};
461
- bool next_close_ = false;
462
- APIServer *parent_;
463
- InitialStateIterator initial_state_iterator_;
464
- ListEntitiesIterator list_entities_iterator_;
465
473
  int state_subs_at_ = -1;
466
474
 
467
475
  // Function pointer type for message encoding
468
476
  using MessageCreatorPtr = uint16_t (*)(EntityBase *, APIConnection *, uint32_t remaining_size, bool is_single);
469
477
 
470
- // Optimized MessageCreator class using union dispatch
471
478
  class MessageCreator {
472
479
  public:
473
- // Constructor for function pointer (message_type = 0)
474
- MessageCreator(MessageCreatorPtr ptr) : message_type_(0) { data_.ptr = ptr; }
480
+ // Constructor for function pointer
481
+ MessageCreator(MessageCreatorPtr ptr) { data_.function_ptr = ptr; }
475
482
 
476
483
  // Constructor for string state capture
477
- MessageCreator(const std::string &value, uint16_t msg_type) : message_type_(msg_type) {
478
- data_.string_ptr = new std::string(value);
479
- }
484
+ explicit MessageCreator(const std::string &str_value) { data_.string_ptr = new std::string(str_value); }
480
485
 
481
- // Destructor
482
- ~MessageCreator() {
483
- // Clean up string data for string-based message types
484
- if (uses_string_data_()) {
485
- delete data_.string_ptr;
486
- }
487
- }
486
+ // No destructor - cleanup must be called explicitly with message_type
488
487
 
489
- // Copy constructor
490
- MessageCreator(const MessageCreator &other) : message_type_(other.message_type_) {
491
- if (message_type_ == 0) {
492
- data_.ptr = other.data_.ptr;
493
- } else if (uses_string_data_()) {
494
- data_.string_ptr = new std::string(*other.data_.string_ptr);
495
- } else {
496
- data_ = other.data_; // For POD types
497
- }
498
- }
488
+ // Delete copy operations - MessageCreator should only be moved
489
+ MessageCreator(const MessageCreator &other) = delete;
490
+ MessageCreator &operator=(const MessageCreator &other) = delete;
499
491
 
500
492
  // Move constructor
501
- MessageCreator(MessageCreator &&other) noexcept : data_(other.data_), message_type_(other.message_type_) {
502
- other.message_type_ = 0; // Reset other to function pointer type
503
- other.data_.ptr = nullptr;
504
- }
505
-
506
- // Assignment operators (needed for batch deduplication)
507
- MessageCreator &operator=(const MessageCreator &other) {
508
- if (this != &other) {
509
- // Clean up current string data if needed
510
- if (uses_string_data_()) {
511
- delete data_.string_ptr;
512
- }
513
- // Copy new data
514
- message_type_ = other.message_type_;
515
- if (other.message_type_ == 0) {
516
- data_.ptr = other.data_.ptr;
517
- } else if (other.uses_string_data_()) {
518
- data_.string_ptr = new std::string(*other.data_.string_ptr);
519
- } else {
520
- data_ = other.data_;
521
- }
522
- }
523
- return *this;
524
- }
493
+ MessageCreator(MessageCreator &&other) noexcept : data_(other.data_) { other.data_.function_ptr = nullptr; }
525
494
 
495
+ // Move assignment
526
496
  MessageCreator &operator=(MessageCreator &&other) noexcept {
527
497
  if (this != &other) {
528
- // Clean up current string data if needed
529
- if (uses_string_data_()) {
530
- delete data_.string_ptr;
531
- }
532
- // Move data
533
- message_type_ = other.message_type_;
498
+ // IMPORTANT: Caller must ensure cleanup() was called if this contains a string!
499
+ // In our usage, this happens in add_item() deduplication and vector::erase()
534
500
  data_ = other.data_;
535
- // Reset other to safe state
536
- other.message_type_ = 0;
537
- other.data_.ptr = nullptr;
501
+ other.data_.function_ptr = nullptr;
538
502
  }
539
503
  return *this;
540
504
  }
541
505
 
542
- // Call operator
543
- uint16_t operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single) const;
506
+ // Call operator - uses message_type to determine union type
507
+ uint16_t operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single,
508
+ uint16_t message_type) const;
509
+
510
+ // Manual cleanup method - must be called before destruction for string types
511
+ void cleanup(uint16_t message_type) {
512
+ #ifdef USE_EVENT
513
+ if (message_type == EventResponse::MESSAGE_TYPE && data_.string_ptr != nullptr) {
514
+ delete data_.string_ptr;
515
+ data_.string_ptr = nullptr;
516
+ }
517
+ #endif
518
+ }
544
519
 
545
520
  private:
546
- // Helper to check if this message type uses heap-allocated strings
547
- bool uses_string_data_() const { return message_type_ == EventResponse::MESSAGE_TYPE; }
548
- union CreatorData {
549
- MessageCreatorPtr ptr; // 8 bytes
550
- std::string *string_ptr; // 8 bytes
551
- } data_; // 8 bytes
552
- uint16_t message_type_; // 2 bytes (0 = function ptr, >0 = state capture)
521
+ union Data {
522
+ MessageCreatorPtr function_ptr;
523
+ std::string *string_ptr;
524
+ } data_; // 4 bytes on 32-bit, 8 bytes on 64-bit - same as before
553
525
  };
554
526
 
555
527
  // Generic batching mechanism for both state updates and entity info
@@ -566,24 +538,86 @@ class APIConnection : public APIServerConnection {
566
538
 
567
539
  std::vector<BatchItem> items;
568
540
  uint32_t batch_start_time{0};
569
- bool batch_scheduled{false};
570
541
 
542
+ private:
543
+ // Helper to cleanup items from the beginning
544
+ void cleanup_items_(size_t count) {
545
+ for (size_t i = 0; i < count; i++) {
546
+ items[i].creator.cleanup(items[i].message_type);
547
+ }
548
+ }
549
+
550
+ public:
571
551
  DeferredBatch() {
572
552
  // Pre-allocate capacity for typical batch sizes to avoid reallocation
573
553
  items.reserve(8);
574
554
  }
575
555
 
556
+ ~DeferredBatch() {
557
+ // Ensure cleanup of any remaining items
558
+ clear();
559
+ }
560
+
576
561
  // Add item to the batch
577
562
  void add_item(EntityBase *entity, MessageCreator creator, uint16_t message_type);
563
+ // Add item to the front of the batch (for high priority messages like ping)
564
+ void add_item_front(EntityBase *entity, MessageCreator creator, uint16_t message_type);
565
+
566
+ // Clear all items with proper cleanup
578
567
  void clear() {
568
+ cleanup_items_(items.size());
579
569
  items.clear();
580
- batch_scheduled = false;
581
570
  batch_start_time = 0;
582
571
  }
572
+
573
+ // Remove processed items from the front with proper cleanup
574
+ void remove_front(size_t count) {
575
+ cleanup_items_(count);
576
+ items.erase(items.begin(), items.begin() + count);
577
+ }
578
+
583
579
  bool empty() const { return items.empty(); }
580
+ size_t size() const { return items.size(); }
581
+ const BatchItem &operator[](size_t index) const { return items[index]; }
584
582
  };
585
583
 
584
+ // DeferredBatch here (16 bytes, 4-byte aligned)
586
585
  DeferredBatch deferred_batch_;
586
+
587
+ // ConnectionState enum for type safety
588
+ enum class ConnectionState : uint8_t {
589
+ WAITING_FOR_HELLO = 0,
590
+ CONNECTED = 1,
591
+ AUTHENTICATED = 2,
592
+ };
593
+
594
+ // Group 5: Pack all small members together to minimize padding
595
+ // This group starts at a 4-byte boundary after DeferredBatch
596
+ struct APIFlags {
597
+ // Connection state only needs 2 bits (3 states)
598
+ uint8_t connection_state : 2;
599
+ // Log subscription needs 3 bits (log levels 0-7)
600
+ uint8_t log_subscription : 3;
601
+ // Boolean flags (1 bit each)
602
+ uint8_t remove : 1;
603
+ uint8_t state_subscription : 1;
604
+ uint8_t sent_ping : 1;
605
+
606
+ uint8_t service_call_subscription : 1;
607
+ uint8_t next_close : 1;
608
+ uint8_t batch_scheduled : 1;
609
+ uint8_t batch_first_message : 1; // For batch buffer allocation
610
+ uint8_t should_try_send_immediately : 1; // True after initial states are sent
611
+ #ifdef HAS_PROTO_MESSAGE_DUMP
612
+ uint8_t log_only_mode : 1;
613
+ #endif
614
+ } flags_{}; // 2 bytes total
615
+
616
+ // 2-byte types immediately after flags_ (no padding between them)
617
+ uint16_t client_api_version_major_{0};
618
+ uint16_t client_api_version_minor_{0};
619
+ // Total: 2 (flags) + 2 + 2 = 6 bytes, then 2 bytes padding to next 4-byte boundary
620
+
587
621
  uint32_t get_batch_delay_ms_() const;
588
622
  // Message will use 8 more bytes than the minimum size, and typical
589
623
  // MTU is 1500. Sometimes users will see as low as 1460 MTU.
@@ -600,9 +634,49 @@ class APIConnection : public APIServerConnection {
600
634
 
601
635
  bool schedule_batch_();
602
636
  void process_batch_();
637
+ void clear_batch_() {
638
+ this->deferred_batch_.clear();
639
+ this->flags_.batch_scheduled = false;
640
+ }
603
641
 
604
- // State for batch buffer allocation
605
- bool batch_first_message_{false};
642
+ #ifdef HAS_PROTO_MESSAGE_DUMP
643
+ // Helper to log a proto message from a MessageCreator object
644
+ void log_proto_message_(EntityBase *entity, const MessageCreator &creator, uint16_t message_type) {
645
+ this->flags_.log_only_mode = true;
646
+ creator(entity, this, MAX_PACKET_SIZE, true, message_type);
647
+ this->flags_.log_only_mode = false;
648
+ }
649
+
650
+ void log_batch_item_(const DeferredBatch::BatchItem &item) {
651
+ // Use the helper to log the message
652
+ this->log_proto_message_(item.entity, item.creator, item.message_type);
653
+ }
654
+ #endif
655
+
656
+ // Helper method to send a message either immediately or via batching
657
+ bool send_message_smart_(EntityBase *entity, MessageCreatorPtr creator, uint16_t message_type) {
658
+ // Try to send immediately if:
659
+ // 1. We should try to send immediately (should_try_send_immediately = true)
660
+ // 2. Batch delay is 0 (user has opted in to immediate sending)
661
+ // 3. Buffer has space available
662
+ if (this->flags_.should_try_send_immediately && this->get_batch_delay_ms_() == 0 &&
663
+ this->helper_->can_write_without_blocking()) {
664
+ // Now actually encode and send
665
+ if (creator(entity, this, MAX_PACKET_SIZE, true) &&
666
+ this->send_buffer(ProtoWriteBuffer{&this->parent_->get_shared_buffer_ref()}, message_type)) {
667
+ #ifdef HAS_PROTO_MESSAGE_DUMP
668
+ // Log the message in verbose mode
669
+ this->log_proto_message_(entity, MessageCreator(creator), message_type);
670
+ #endif
671
+ return true;
672
+ }
673
+
674
+ // If immediate send failed, fall through to batching
675
+ }
676
+
677
+ // Fall back to scheduled batching
678
+ return this->schedule_message_(entity, creator, message_type);
679
+ }
606
680
 
607
681
  // Helper function to schedule a deferred message with known message type
608
682
  bool schedule_message_(EntityBase *entity, MessageCreator creator, uint16_t message_type) {
@@ -614,6 +688,12 @@ class APIConnection : public APIServerConnection {
614
688
  bool schedule_message_(EntityBase *entity, MessageCreatorPtr function_ptr, uint16_t message_type) {
615
689
  return schedule_message_(entity, MessageCreator(function_ptr), message_type);
616
690
  }
691
+
692
+ // Helper function to schedule a high priority message at the front of the batch
693
+ bool schedule_message_front_(EntityBase *entity, MessageCreatorPtr function_ptr, uint16_t message_type) {
694
+ this->deferred_batch_.add_item_front(entity, MessageCreator(function_ptr), message_type);
695
+ return this->schedule_batch_();
696
+ }
617
697
  };
618
698
 
619
699
  } // namespace api