esphome 2025.6.3__py3-none-any.whl → 2025.7.0b2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) 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 +57 -21
  22. esphome/components/api/api_connection.cpp +344 -539
  23. esphome/components/api/api_connection.h +224 -141
  24. esphome/components/api/api_frame_helper.cpp +91 -127
  25. esphome/components/api/api_frame_helper.h +64 -54
  26. esphome/components/api/api_pb2.cpp +1837 -9044
  27. esphome/components/api/api_pb2.h +532 -685
  28. esphome/components/api/api_pb2_dump.cpp +4432 -0
  29. esphome/components/api/api_pb2_service.cpp +184 -425
  30. esphome/components/api/api_pb2_service.h +13 -6
  31. esphome/components/api/api_server.cpp +131 -167
  32. esphome/components/api/api_server.h +38 -10
  33. esphome/components/api/client.py +8 -2
  34. esphome/components/api/custom_api_device.h +8 -0
  35. esphome/components/api/list_entities.cpp +37 -104
  36. esphome/components/api/list_entities.h +33 -23
  37. esphome/components/api/proto.h +532 -26
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/api/user_services.h +2 -0
  41. esphome/components/as5600/as5600.h +0 -1
  42. esphome/components/async_tcp/__init__.py +14 -5
  43. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  44. esphome/components/atm90e32/atm90e32.cpp +2 -1
  45. esphome/components/audio/audio_decoder.cpp +1 -1
  46. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  47. esphome/components/b_parasite/b_parasite.h +0 -1
  48. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  49. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  50. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  51. esphome/components/bh1750/bh1750.cpp +5 -5
  52. esphome/components/binary_sensor/__init__.py +82 -5
  53. esphome/components/binary_sensor/automation.h +19 -1
  54. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  55. esphome/components/binary_sensor/binary_sensor.h +11 -25
  56. esphome/components/binary_sensor/filter.cpp +29 -24
  57. esphome/components/binary_sensor/filter.h +20 -10
  58. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  60. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  61. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  62. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  63. esphome/components/ble_client/switch/ble_switch.h +0 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  65. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  66. esphome/components/ble_presence/ble_presence_device.h +0 -1
  67. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  68. esphome/components/ble_scanner/ble_scanner.h +0 -1
  69. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  71. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  72. esphome/components/bme680/sensor.py +1 -1
  73. esphome/components/bmp581/bmp581.h +0 -2
  74. esphome/components/button/__init__.py +5 -2
  75. esphome/components/camera/__init__.py +1 -0
  76. esphome/components/camera/camera.cpp +22 -0
  77. esphome/components/camera/camera.h +80 -0
  78. esphome/components/canbus/__init__.py +1 -0
  79. esphome/components/cap1188/cap1188.h +0 -1
  80. esphome/components/captive_portal/__init__.py +12 -2
  81. esphome/components/captive_portal/captive_portal.cpp +12 -2
  82. esphome/components/captive_portal/captive_portal.h +5 -2
  83. esphome/components/ccs811/ccs811.h +0 -2
  84. esphome/components/climate/__init__.py +5 -2
  85. esphome/components/cm1106/sensor.py +2 -2
  86. esphome/components/const/__init__.py +2 -0
  87. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  88. esphome/components/copy/button/copy_button.h +0 -1
  89. esphome/components/copy/cover/copy_cover.h +0 -1
  90. esphome/components/copy/fan/copy_fan.h +0 -1
  91. esphome/components/copy/lock/copy_lock.h +0 -1
  92. esphome/components/copy/number/copy_number.h +0 -1
  93. esphome/components/copy/select/copy_select.h +0 -1
  94. esphome/components/copy/sensor/copy_sensor.h +0 -1
  95. esphome/components/copy/switch/copy_switch.h +0 -1
  96. esphome/components/copy/text/copy_text.h +0 -1
  97. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  98. esphome/components/cover/__init__.py +5 -2
  99. esphome/components/cs5460a/cs5460a.h +0 -1
  100. esphome/components/datetime/__init__.py +4 -2
  101. esphome/components/debug/__init__.py +20 -0
  102. esphome/components/debug/debug_esp32.cpp +2 -0
  103. esphome/components/deep_sleep/__init__.py +43 -9
  104. esphome/components/demo/__init__.py +2 -2
  105. esphome/components/display/display.cpp +4 -3
  106. esphome/components/display/display.h +0 -2
  107. esphome/components/display/display_buffer.cpp +1 -1
  108. esphome/components/ds2484/__init__.py +1 -0
  109. esphome/components/ds2484/ds2484.cpp +209 -0
  110. esphome/components/ds2484/ds2484.h +43 -0
  111. esphome/components/ds2484/one_wire.py +37 -0
  112. esphome/components/duty_time/duty_time_sensor.h +0 -1
  113. esphome/components/ens160_base/ens160_base.h +0 -1
  114. esphome/components/es7210/es7210.h +0 -1
  115. esphome/components/es7243e/es7243e.h +0 -1
  116. esphome/components/es8156/es8156.h +0 -1
  117. esphome/components/es8311/es8311.h +0 -1
  118. esphome/components/es8388/es8388.h +0 -1
  119. esphome/components/esp32/__init__.py +103 -135
  120. esphome/components/esp32/core.cpp +0 -4
  121. esphome/components/esp32/gpio.h +1 -1
  122. esphome/components/esp32/helpers.cpp +69 -0
  123. esphome/components/esp32_ble/ble.cpp +5 -6
  124. esphome/components/esp32_ble/ble.h +29 -14
  125. esphome/components/esp32_ble/ble_event.h +6 -6
  126. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  127. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  128. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  129. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  130. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  131. esphome/components/esp32_camera/__init__.py +112 -98
  132. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  133. esphome/components/esp32_camera/esp32_camera.h +35 -30
  134. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  135. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  136. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  137. esphome/components/esp32_hall/sensor.py +2 -21
  138. esphome/components/esp32_hosted/__init__.py +101 -0
  139. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  140. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  141. esphome/components/esp32_rmt/__init__.py +0 -58
  142. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  143. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  144. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  145. esphome/components/esp32_touch/esp32_touch.h +174 -28
  146. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  147. esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
  148. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  149. esphome/components/esp8266/__init__.py +2 -0
  150. esphome/components/esp8266/gpio.cpp +10 -10
  151. esphome/components/esp8266/helpers.cpp +31 -0
  152. esphome/components/esphome/ota/__init__.py +1 -0
  153. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  154. esphome/components/ethernet/__init__.py +42 -23
  155. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  156. esphome/components/ethernet/ethernet_component.cpp +69 -29
  157. esphome/components/ethernet/ethernet_component.h +18 -10
  158. esphome/components/event/__init__.py +5 -2
  159. esphome/components/ezo/ezo.h +0 -1
  160. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  161. esphome/components/fan/__init__.py +5 -2
  162. esphome/components/feedback/feedback_cover.h +0 -1
  163. esphome/components/font/__init__.py +92 -82
  164. esphome/components/font/font.cpp +9 -2
  165. esphome/components/font/font.h +20 -5
  166. esphome/components/fs3000/fs3000.h +0 -1
  167. esphome/components/gcja5/gcja5.h +0 -1
  168. esphome/components/gl_r01_i2c/__init__.py +0 -0
  169. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  170. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  171. esphome/components/gl_r01_i2c/sensor.py +36 -0
  172. esphome/components/gp8403/gp8403.h +0 -1
  173. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  174. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  175. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  176. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  177. esphome/components/he60r/he60r.h +0 -1
  178. esphome/components/heatpumpir/climate.py +2 -1
  179. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  180. esphome/components/heatpumpir/heatpumpir.h +1 -0
  181. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  182. esphome/components/host/__init__.py +3 -1
  183. esphome/components/host/helpers.cpp +57 -0
  184. esphome/components/http_request/__init__.py +19 -1
  185. esphome/components/http_request/http_request.h +1 -1
  186. esphome/components/http_request/http_request_arduino.h +1 -0
  187. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  188. esphome/components/http_request/update/http_request_update.cpp +28 -9
  189. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  190. esphome/components/hydreon_rgxx/sensor.py +1 -1
  191. esphome/components/i2c/__init__.py +23 -11
  192. esphome/components/i2c/i2c_bus.h +8 -1
  193. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  194. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  195. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  196. esphome/components/i2c_device/i2c_device.h +0 -1
  197. esphome/components/i2s_audio/__init__.py +2 -10
  198. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  199. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  200. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  201. esphome/components/iaqcore/iaqcore.h +0 -2
  202. esphome/components/image/__init__.py +123 -24
  203. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  204. esphome/components/ina219/ina219.cpp +7 -0
  205. esphome/components/ina219/ina219.h +1 -0
  206. esphome/components/ina260/ina260.h +0 -2
  207. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  208. esphome/components/inkplate6/display.py +15 -0
  209. esphome/components/inkplate6/inkplate.cpp +2 -2
  210. esphome/components/integration/integration_sensor.h +0 -1
  211. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  212. esphome/components/internal_temperature/sensor.py +0 -26
  213. esphome/components/interval/interval.h +0 -2
  214. esphome/components/ld2410/button/__init__.py +3 -3
  215. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  216. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  217. esphome/components/ld2410/ld2410.cpp +421 -268
  218. esphome/components/ld2410/ld2410.h +44 -146
  219. esphome/components/ld2410/number/__init__.py +2 -2
  220. esphome/components/ld2410/sensor.py +1 -1
  221. esphome/components/ld2410/switch/__init__.py +1 -1
  222. esphome/components/ld2420/ld2420.cpp +196 -100
  223. esphome/components/ld2420/ld2420.h +46 -118
  224. esphome/components/ld2420/number/__init__.py +2 -2
  225. esphome/components/ld2420/sensor/__init__.py +6 -2
  226. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  227. esphome/components/ld2450/button/__init__.py +3 -3
  228. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  229. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  230. esphome/components/ld2450/ld2450.cpp +384 -232
  231. esphome/components/ld2450/ld2450.h +60 -69
  232. esphome/components/ld2450/switch/__init__.py +1 -1
  233. esphome/components/ledc/ledc_output.cpp +1 -63
  234. esphome/components/libretiny/__init__.py +5 -3
  235. esphome/components/libretiny/const.py +5 -0
  236. esphome/components/libretiny/generate_components.py +1 -0
  237. esphome/components/libretiny/helpers.cpp +35 -0
  238. esphome/components/libretiny/lt_component.cpp +5 -3
  239. esphome/components/light/__init__.py +4 -2
  240. esphome/components/light/addressable_light.h +3 -3
  241. esphome/components/light/light_call.cpp +180 -243
  242. esphome/components/light/light_call.h +72 -20
  243. esphome/components/light/light_color_values.h +14 -14
  244. esphome/components/light/light_state.h +15 -13
  245. esphome/components/light/transformers.h +2 -2
  246. esphome/components/ln882x/__init__.py +52 -0
  247. esphome/components/ln882x/boards.py +285 -0
  248. esphome/components/lock/__init__.py +5 -2
  249. esphome/components/logger/__init__.py +40 -3
  250. esphome/components/logger/logger.cpp +47 -12
  251. esphome/components/logger/logger.h +80 -49
  252. esphome/components/logger/logger_esp32.cpp +3 -3
  253. esphome/components/lps22/__init__.py +0 -0
  254. esphome/components/lps22/lps22.cpp +75 -0
  255. esphome/components/lps22/lps22.h +27 -0
  256. esphome/components/lps22/sensor.py +58 -0
  257. esphome/components/ltr390/ltr390.h +0 -1
  258. esphome/components/ltr501/ltr501.h +0 -1
  259. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  260. esphome/components/lvgl/__init__.py +1 -1
  261. esphome/components/lvgl/schemas.py +66 -6
  262. esphome/components/lvgl/styles.py +24 -16
  263. esphome/components/lvgl/widgets/__init__.py +12 -2
  264. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  265. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  266. esphome/components/max9611/max9611.h +0 -1
  267. esphome/components/mcp23016/__init__.py +1 -1
  268. esphome/components/mcp23xxx_base/__init__.py +1 -1
  269. esphome/components/mcp4461/__init__.py +1 -1
  270. esphome/components/mcp4461/output/__init__.py +3 -2
  271. esphome/components/mcp9600/mcp9600.h +0 -2
  272. esphome/components/md5/md5.cpp +3 -3
  273. esphome/components/md5/md5.h +1 -6
  274. esphome/components/mdns/__init__.py +22 -11
  275. esphome/components/media_player/__init__.py +4 -3
  276. esphome/components/micro_wake_word/__init__.py +1 -5
  277. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  278. esphome/components/microphone/microphone.cpp +7 -9
  279. esphome/components/microphone/microphone.h +0 -2
  280. esphome/components/mipi_spi/display.py +1 -0
  281. esphome/components/mmc5603/mmc5603.cpp +1 -1
  282. esphome/components/modbus/modbus.cpp +33 -15
  283. esphome/components/modbus/modbus.h +9 -0
  284. esphome/components/modbus_controller/__init__.py +42 -10
  285. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  286. esphome/components/modbus_controller/modbus_controller.h +61 -7
  287. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  288. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  289. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  290. esphome/components/mqtt/__init__.py +16 -0
  291. esphome/components/mqtt/mqtt_backend.h +2 -1
  292. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  293. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  294. esphome/components/mqtt/mqtt_client.cpp +15 -9
  295. esphome/components/mqtt/mqtt_client.h +8 -3
  296. esphome/components/ms8607/ms8607.h +0 -1
  297. esphome/components/neopixelbus/light.py +4 -1
  298. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  299. esphome/components/network/__init__.py +4 -1
  300. esphome/components/network/ip_address.h +1 -0
  301. esphome/components/nextion/__init__.py +16 -0
  302. esphome/components/nextion/base_component.py +1 -0
  303. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  304. esphome/components/nextion/display.py +14 -4
  305. esphome/components/nextion/nextion.cpp +166 -101
  306. esphome/components/nextion/nextion.h +84 -53
  307. esphome/components/nextion/nextion_commands.cpp +11 -10
  308. esphome/components/nextion/nextion_component.cpp +28 -28
  309. esphome/components/nextion/nextion_component.h +53 -18
  310. esphome/components/nextion/nextion_component_base.h +3 -0
  311. esphome/components/nextion/nextion_upload.cpp +36 -0
  312. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  313. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  314. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  315. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  316. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  317. esphome/components/nfc/nfc.cpp +3 -22
  318. esphome/components/nfc/nfc.h +3 -3
  319. esphome/components/number/__init__.py +5 -2
  320. esphome/components/online_image/__init__.py +5 -0
  321. esphome/components/online_image/online_image.cpp +6 -2
  322. esphome/components/online_image/online_image.h +4 -1
  323. esphome/components/opentherm/opentherm.cpp +7 -12
  324. esphome/components/openthread/__init__.py +47 -40
  325. esphome/components/openthread/const.py +1 -0
  326. esphome/components/openthread/openthread_esp.cpp +27 -5
  327. esphome/components/opt3001/__init__.py +0 -0
  328. esphome/components/opt3001/opt3001.cpp +122 -0
  329. esphome/components/opt3001/opt3001.h +27 -0
  330. esphome/components/opt3001/sensor.py +35 -0
  331. esphome/components/ota/__init__.py +17 -0
  332. esphome/components/ota/ota_backend.h +27 -1
  333. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  334. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  336. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  338. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  339. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  340. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  341. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  342. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  343. esphome/components/packages/__init__.py +5 -2
  344. esphome/components/packet_transport/binary_sensor.py +61 -4
  345. esphome/components/packet_transport/packet_transport.cpp +34 -1
  346. esphome/components/packet_transport/packet_transport.h +11 -5
  347. esphome/components/pcf8574/__init__.py +1 -1
  348. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  349. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  350. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  351. esphome/components/pmsa003i/pmsa003i.h +0 -1
  352. esphome/components/pmsx003/pmsx003.h +0 -1
  353. esphome/components/pn7150/pn7150.cpp +7 -7
  354. esphome/components/pn7150/pn7150.h +0 -1
  355. esphome/components/pn7160/pn7160.cpp +7 -7
  356. esphome/components/pn7160/pn7160.h +0 -1
  357. esphome/components/preferences/syncer.h +2 -0
  358. esphome/components/prometheus/prometheus_handler.h +1 -1
  359. esphome/components/psram/psram.cpp +0 -20
  360. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  361. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  362. esphome/components/pulse_width/pulse_width.h +0 -1
  363. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  364. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  365. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  366. esphome/components/qr_code/__init__.py +13 -10
  367. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  368. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  369. esphome/components/rc522/rc522.h +0 -1
  370. esphome/components/rdm6300/rdm6300.h +0 -2
  371. esphome/components/remote_base/__init__.py +7 -5
  372. esphome/components/remote_base/remote_base.cpp +24 -21
  373. esphome/components/remote_base/remote_base.h +3 -26
  374. esphome/components/remote_receiver/__init__.py +40 -46
  375. esphome/components/remote_receiver/remote_receiver.h +4 -18
  376. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  377. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  378. esphome/components/remote_transmitter/__init__.py +42 -43
  379. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  380. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  381. esphome/components/resistance/resistance_sensor.h +0 -1
  382. esphome/components/rp2040/__init__.py +2 -0
  383. esphome/components/rp2040/helpers.cpp +55 -0
  384. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  385. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  386. esphome/components/rtttl/__init__.py +4 -4
  387. esphome/components/rtttl/rtttl.cpp +10 -1
  388. esphome/components/ruuvitag/ruuvitag.h +0 -1
  389. esphome/components/safe_mode/safe_mode.cpp +2 -0
  390. esphome/components/safe_mode/safe_mode.h +4 -1
  391. esphome/components/scd30/scd30.h +0 -1
  392. esphome/components/scd30/sensor.py +2 -2
  393. esphome/components/scd4x/scd4x.cpp +61 -54
  394. esphome/components/scd4x/scd4x.h +17 -15
  395. esphome/components/scd4x/sensor.py +4 -4
  396. esphome/components/script/script.h +0 -2
  397. esphome/components/sdp3x/sensor.py +1 -1
  398. esphome/components/select/__init__.py +5 -2
  399. esphome/components/sen5x/sen5x.h +0 -1
  400. esphome/components/senseair/senseair.h +0 -1
  401. esphome/components/sensor/__init__.py +4 -2
  402. esphome/components/sensor/filter.cpp +1 -1
  403. esphome/components/sensor/sensor.cpp +12 -6
  404. esphome/components/sensor/sensor.h +13 -5
  405. esphome/components/servo/servo.h +0 -1
  406. esphome/components/sfa30/sfa30.h +0 -1
  407. esphome/components/sgp30/sgp30.h +0 -1
  408. esphome/components/sgp4x/sgp4x.h +0 -1
  409. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  410. esphome/components/sht4x/sht4x.h +0 -1
  411. esphome/components/sm300d2/sm300d2.h +0 -2
  412. esphome/components/smt100/sensor.py +8 -4
  413. esphome/components/smt100/smt100.cpp +5 -5
  414. esphome/components/smt100/smt100.h +3 -3
  415. esphome/components/sn74hc595/__init__.py +1 -1
  416. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  417. esphome/components/sntp/sntp_component.cpp +9 -3
  418. esphome/components/sntp/time.py +2 -0
  419. esphome/components/socket/__init__.py +17 -0
  420. esphome/components/spi/__init__.py +27 -6
  421. esphome/components/spi/spi.cpp +3 -2
  422. esphome/components/spi/spi.h +9 -3
  423. esphome/components/spi/spi_arduino.cpp +3 -5
  424. esphome/components/spi/spi_esp_idf.cpp +40 -21
  425. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  426. esphome/components/sps30/sps30.h +0 -1
  427. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  428. esphome/components/st7701s/st7701s.cpp +0 -4
  429. esphome/components/status/status_binary_sensor.h +0 -2
  430. esphome/components/substitutions/__init__.py +76 -19
  431. esphome/components/substitutions/jinja.py +99 -0
  432. esphome/components/sun/sun.cpp +3 -4
  433. esphome/components/switch/__init__.py +5 -2
  434. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  435. esphome/components/sx126x/__init__.py +317 -0
  436. esphome/components/sx126x/automation.h +62 -0
  437. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  438. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  439. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  440. esphome/components/sx126x/sx126x.cpp +523 -0
  441. esphome/components/sx126x/sx126x.h +140 -0
  442. esphome/components/sx126x/sx126x_reg.h +163 -0
  443. esphome/components/sx127x/__init__.py +325 -0
  444. esphome/components/sx127x/automation.h +62 -0
  445. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  446. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  447. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  448. esphome/components/sx127x/sx127x.cpp +498 -0
  449. esphome/components/sx127x/sx127x.h +128 -0
  450. esphome/components/sx127x/sx127x_reg.h +295 -0
  451. esphome/components/syslog/esphome_syslog.cpp +5 -3
  452. esphome/components/syslog/esphome_syslog.h +1 -1
  453. esphome/components/tca9555/__init__.py +1 -1
  454. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  455. esphome/components/text/__init__.py +5 -2
  456. esphome/components/text_sensor/__init__.py +5 -2
  457. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  458. esphome/components/thermostat/thermostat_climate.h +43 -39
  459. esphome/components/time/__init__.py +16 -2
  460. esphome/components/time/real_time_clock.cpp +4 -0
  461. esphome/components/time/real_time_clock.h +5 -1
  462. esphome/components/tlc5971/tlc5971.cpp +4 -1
  463. esphome/components/tmp1075/tmp1075.h +0 -2
  464. esphome/components/tof10120/tof10120_sensor.h +0 -1
  465. esphome/components/tormatic/tormatic_cover.h +0 -1
  466. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  467. esphome/components/tsl2591/tsl2591.cpp +1 -1
  468. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  469. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  470. esphome/components/tx20/tx20.cpp +2 -2
  471. esphome/components/uart/__init__.py +18 -0
  472. esphome/components/uart/uart_component_esp_idf.cpp +0 -4
  473. esphome/components/update/__init__.py +5 -2
  474. esphome/components/update/update_entity.h +8 -0
  475. esphome/components/usb_host/__init__.py +5 -2
  476. esphome/components/usb_host/usb_host_client.cpp +10 -10
  477. esphome/components/usb_uart/cp210x.cpp +1 -1
  478. esphome/components/usb_uart/usb_uart.cpp +41 -44
  479. esphome/components/usb_uart/usb_uart.h +4 -3
  480. esphome/components/valve/__init__.py +5 -2
  481. esphome/components/vbus/vbus.h +0 -1
  482. esphome/components/veml3235/veml3235.h +0 -1
  483. esphome/components/veml7700/veml7700.h +0 -1
  484. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  485. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  486. esphome/components/watchdog/watchdog.cpp +0 -4
  487. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  488. esphome/components/web_server/__init__.py +34 -19
  489. esphome/components/web_server/ota/__init__.py +32 -0
  490. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  491. esphome/components/web_server/ota/ota_web_server.h +26 -0
  492. esphome/components/web_server/web_server.cpp +305 -427
  493. esphome/components/web_server/web_server.h +33 -23
  494. esphome/components/web_server/web_server_v1.cpp +4 -5
  495. esphome/components/web_server_base/__init__.py +5 -2
  496. esphome/components/web_server_base/web_server_base.cpp +2 -94
  497. esphome/components/web_server_base/web_server_base.h +5 -25
  498. esphome/components/web_server_idf/multipart.cpp +254 -0
  499. esphome/components/web_server_idf/multipart.h +86 -0
  500. esphome/components/web_server_idf/utils.cpp +32 -0
  501. esphome/components/web_server_idf/utils.h +10 -0
  502. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  503. esphome/components/web_server_idf/web_server_idf.h +11 -10
  504. esphome/components/wiegand/wiegand.cpp +2 -2
  505. esphome/components/wifi/__init__.py +18 -0
  506. esphome/components/wifi/wifi_component.cpp +17 -22
  507. esphome/components/wifi/wifi_component.h +27 -23
  508. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  509. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  510. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  511. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  512. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  513. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  514. esphome/components/wireguard/__init__.py +2 -11
  515. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  516. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  517. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  518. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  519. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  520. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  521. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  522. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  523. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  524. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  525. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  526. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  527. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  528. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  529. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  530. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  531. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  532. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  533. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  534. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  535. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  536. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  537. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  538. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  539. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  540. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  541. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  542. esphome/components/zyaura/zyaura.h +0 -1
  543. esphome/config.py +88 -22
  544. esphome/config_helpers.py +74 -1
  545. esphome/config_validation.py +12 -1
  546. esphome/const.py +65 -10
  547. esphome/core/__init__.py +18 -2
  548. esphome/core/application.cpp +163 -10
  549. esphome/core/application.h +145 -165
  550. esphome/core/area.h +19 -0
  551. esphome/core/automation.h +58 -9
  552. esphome/core/color.cpp +3 -5
  553. esphome/core/color.h +16 -16
  554. esphome/core/component.cpp +151 -18
  555. esphome/core/component.h +98 -4
  556. esphome/core/component_iterator.cpp +11 -9
  557. esphome/core/component_iterator.h +12 -10
  558. esphome/core/config.py +155 -6
  559. esphome/core/controller.cpp +4 -2
  560. esphome/core/controller.h +1 -1
  561. esphome/core/datatypes.h +2 -2
  562. esphome/core/defines.h +17 -2
  563. esphome/core/device.h +20 -0
  564. esphome/core/entity_base.cpp +20 -15
  565. esphome/core/entity_base.h +76 -0
  566. esphome/core/entity_helpers.py +168 -1
  567. esphome/core/event_pool.h +81 -0
  568. esphome/core/helpers.cpp +75 -230
  569. esphome/core/helpers.h +164 -104
  570. esphome/core/lock_free_queue.h +151 -0
  571. esphome/core/log.cpp +2 -2
  572. esphome/core/log.h +2 -0
  573. esphome/core/optional.h +5 -0
  574. esphome/core/ring_buffer.cpp +2 -2
  575. esphome/core/scheduler.cpp +275 -103
  576. esphome/core/scheduler.h +154 -17
  577. esphome/core/time.cpp +5 -5
  578. esphome/core/time.h +5 -5
  579. esphome/cpp_generator.py +17 -0
  580. esphome/cpp_helpers.py +0 -22
  581. esphome/cpp_types.py +3 -1
  582. esphome/dashboard/entries.py +1 -1
  583. esphome/dashboard/util/text.py +5 -21
  584. esphome/dashboard/web_server.py +9 -1
  585. esphome/helpers.py +47 -0
  586. esphome/loader.py +15 -1
  587. esphome/pins.py +14 -8
  588. esphome/wizard.py +17 -4
  589. esphome/writer.py +21 -3
  590. esphome/yaml_util.py +0 -2
  591. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/METADATA +10 -9
  592. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/RECORD +597 -538
  593. esphome/components/api/api_pb2_size.h +0 -361
  594. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  595. esphome/components/esp32_ble/queue.h +0 -85
  596. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  597. esphome/components/esp32_hall/esp32_hall.h +0 -23
  598. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  599. esphome/components/ld2410/button/reset_button.cpp +0 -9
  600. esphome/components/ld2450/button/reset_button.cpp +0 -9
  601. esphome/components/openthread/tlv.py +0 -65
  602. /esphome/{dashboard/enum.py → enum.py} +0 -0
  603. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/WHEEL +0 -0
  604. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/entry_points.txt +0 -0
  605. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/licenses/LICENSE +0 -0
  606. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.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
 
@@ -30,102 +33,83 @@ class APIConnection : public APIServerConnection {
30
33
 
31
34
  bool send_list_info_done() {
32
35
  return this->schedule_message_(nullptr, &APIConnection::try_send_list_info_done,
33
- ListEntitiesDoneResponse::MESSAGE_TYPE);
36
+ ListEntitiesDoneResponse::MESSAGE_TYPE, ListEntitiesDoneResponse::ESTIMATED_SIZE);
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,30 +179,35 @@ 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 {
215
195
  // TODO
216
196
  return {};
217
197
  }
198
+ #ifdef USE_API_SERVICES
218
199
  void execute_service(const ExecuteServiceRequest &msg) override;
200
+ #endif
219
201
  #ifdef USE_API_NOISE
220
202
  NoiseEncryptionSetKeyResponse noise_encryption_set_key(const NoiseEncryptionSetKeyRequest &msg) override;
221
203
  #endif
222
204
 
223
- bool is_authenticated() override { return this->connection_state_ == ConnectionState::AUTHENTICATED; }
205
+ bool is_authenticated() override {
206
+ return static_cast<ConnectionState>(this->flags_.connection_state) == ConnectionState::AUTHENTICATED;
207
+ }
224
208
  bool is_connection_setup() override {
225
- return this->connection_state_ == ConnectionState ::CONNECTED || this->is_authenticated();
209
+ return static_cast<ConnectionState>(this->flags_.connection_state) == ConnectionState::CONNECTED ||
210
+ this->is_authenticated();
226
211
  }
227
212
  void on_fatal_error() override;
228
213
  void on_unauthenticated_access() override;
@@ -273,9 +258,15 @@ class APIConnection : public APIServerConnection {
273
258
  }
274
259
 
275
260
  bool try_to_clear_buffer(bool log_out_of_space);
276
- bool send_buffer(ProtoWriteBuffer buffer, uint16_t message_type) override;
261
+ bool send_buffer(ProtoWriteBuffer buffer, uint8_t message_type) override;
277
262
 
278
- std::string get_client_combined_info() const { return this->client_combined_info_; }
263
+ std::string get_client_combined_info() const {
264
+ if (this->client_info_ == this->client_peername_) {
265
+ // Before Hello message, both are the same (just IP:port)
266
+ return this->client_info_;
267
+ }
268
+ return this->client_info_ + " (" + this->client_peername_ + ")";
269
+ }
279
270
 
280
271
  // Buffer allocator methods for batch processing
281
272
  ProtoWriteBuffer allocate_single_message_buffer(uint16_t size);
@@ -295,17 +286,42 @@ class APIConnection : public APIServerConnection {
295
286
  response.icon = entity->get_icon();
296
287
  response.disabled_by_default = entity->is_disabled_by_default();
297
288
  response.entity_category = static_cast<enums::EntityCategory>(entity->get_entity_category());
289
+ #ifdef USE_DEVICES
290
+ response.device_id = entity->get_device_id();
291
+ #endif
298
292
  }
299
293
 
300
294
  // Helper function to fill common entity state fields
301
295
  static void fill_entity_state_base(esphome::EntityBase *entity, StateResponseProtoMessage &response) {
302
296
  response.key = entity->get_object_id_hash();
297
+ #ifdef USE_DEVICES
298
+ response.device_id = entity->get_device_id();
299
+ #endif
303
300
  }
304
301
 
305
302
  // Non-template helper to encode any ProtoMessage
306
- static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint16_t message_type, APIConnection *conn,
303
+ static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint8_t message_type, APIConnection *conn,
307
304
  uint32_t remaining_size, bool is_single);
308
305
 
306
+ #ifdef USE_VOICE_ASSISTANT
307
+ // Helper to check voice assistant validity and connection ownership
308
+ inline bool check_voice_assistant_api_connection_() const;
309
+ #endif
310
+
311
+ // Helper method to process multiple entities from an iterator in a batch
312
+ template<typename Iterator> void process_iterator_batch_(Iterator &iterator) {
313
+ size_t initial_size = this->deferred_batch_.size();
314
+ while (!iterator.completed() && (this->deferred_batch_.size() - initial_size) < MAX_INITIAL_PER_BATCH) {
315
+ iterator.advance();
316
+ }
317
+
318
+ // If the batch is full, process it immediately
319
+ // Note: iterator.advance() already calls schedule_batch_() via schedule_message_()
320
+ if (this->deferred_batch_.size() >= MAX_INITIAL_PER_BATCH) {
321
+ this->process_batch_();
322
+ }
323
+ }
324
+
309
325
  #ifdef USE_BINARY_SENSOR
310
326
  static uint16_t try_send_binary_sensor_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
311
327
  bool is_single);
@@ -416,7 +432,7 @@ class APIConnection : public APIServerConnection {
416
432
  static uint16_t try_send_update_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
417
433
  bool is_single);
418
434
  #endif
419
- #ifdef USE_ESP32_CAMERA
435
+ #ifdef USE_CAMERA
420
436
  static uint16_t try_send_camera_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
421
437
  bool is_single);
422
438
  #endif
@@ -429,127 +445,82 @@ class APIConnection : public APIServerConnection {
429
445
  static uint16_t try_send_disconnect_request(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
430
446
  bool is_single);
431
447
 
432
- // Helper function to get estimated message size for buffer pre-allocation
433
- static uint16_t get_estimated_message_size(uint16_t message_type);
434
-
435
- enum class ConnectionState {
436
- WAITING_FOR_HELLO,
437
- CONNECTED,
438
- AUTHENTICATED,
439
- } connection_state_{ConnectionState::WAITING_FOR_HELLO};
448
+ // Batch message method for ping requests
449
+ static uint16_t try_send_ping_request(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
450
+ bool is_single);
440
451
 
441
- bool remove_{false};
452
+ // === Optimal member ordering for 32-bit systems ===
442
453
 
454
+ // Group 1: Pointers (4 bytes each on 32-bit)
443
455
  std::unique_ptr<APIFrameHelper> helper_;
456
+ APIServer *parent_;
457
+
458
+ // Group 2: Larger objects (must be 4-byte aligned)
459
+ // These contain vectors/pointers internally, so putting them early ensures good alignment
460
+ InitialStateIterator initial_state_iterator_;
461
+ ListEntitiesIterator list_entities_iterator_;
462
+ #ifdef USE_CAMERA
463
+ std::unique_ptr<camera::CameraImageReader> image_reader_;
464
+ #endif
444
465
 
466
+ // Group 3: Strings (12 bytes each on 32-bit, 4-byte aligned)
445
467
  std::string client_info_;
446
468
  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
469
 
454
- bool state_subscription_{false};
455
- int log_subscription_{ESPHOME_LOG_LEVEL_NONE};
470
+ // Group 4: 4-byte types
456
471
  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
472
  int state_subs_at_ = -1;
466
473
 
467
474
  // Function pointer type for message encoding
468
475
  using MessageCreatorPtr = uint16_t (*)(EntityBase *, APIConnection *, uint32_t remaining_size, bool is_single);
469
476
 
470
- // Optimized MessageCreator class using union dispatch
471
477
  class MessageCreator {
472
478
  public:
473
- // Constructor for function pointer (message_type = 0)
474
- MessageCreator(MessageCreatorPtr ptr) : message_type_(0) { data_.ptr = ptr; }
479
+ // Constructor for function pointer
480
+ MessageCreator(MessageCreatorPtr ptr) { data_.function_ptr = ptr; }
475
481
 
476
482
  // 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
- }
483
+ explicit MessageCreator(const std::string &str_value) { data_.string_ptr = new std::string(str_value); }
480
484
 
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
- }
485
+ // No destructor - cleanup must be called explicitly with message_type
488
486
 
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
- }
487
+ // Delete copy operations - MessageCreator should only be moved
488
+ MessageCreator(const MessageCreator &other) = delete;
489
+ MessageCreator &operator=(const MessageCreator &other) = delete;
499
490
 
500
491
  // 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
- }
492
+ MessageCreator(MessageCreator &&other) noexcept : data_(other.data_) { other.data_.function_ptr = nullptr; }
525
493
 
494
+ // Move assignment
526
495
  MessageCreator &operator=(MessageCreator &&other) noexcept {
527
496
  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_;
497
+ // IMPORTANT: Caller must ensure cleanup() was called if this contains a string!
498
+ // In our usage, this happens in add_item() deduplication and vector::erase()
534
499
  data_ = other.data_;
535
- // Reset other to safe state
536
- other.message_type_ = 0;
537
- other.data_.ptr = nullptr;
500
+ other.data_.function_ptr = nullptr;
538
501
  }
539
502
  return *this;
540
503
  }
541
504
 
542
- // Call operator
543
- uint16_t operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single) const;
505
+ // Call operator - uses message_type to determine union type
506
+ uint16_t operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single,
507
+ uint8_t message_type) const;
508
+
509
+ // Manual cleanup method - must be called before destruction for string types
510
+ void cleanup(uint8_t message_type) {
511
+ #ifdef USE_EVENT
512
+ if (message_type == EventResponse::MESSAGE_TYPE && data_.string_ptr != nullptr) {
513
+ delete data_.string_ptr;
514
+ data_.string_ptr = nullptr;
515
+ }
516
+ #endif
517
+ }
544
518
 
545
519
  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)
520
+ union Data {
521
+ MessageCreatorPtr function_ptr;
522
+ std::string *string_ptr;
523
+ } data_; // 4 bytes on 32-bit, 8 bytes on 64-bit - same as before
553
524
  };
554
525
 
555
526
  // Generic batching mechanism for both state updates and entity info
@@ -557,33 +528,96 @@ class APIConnection : public APIServerConnection {
557
528
  struct BatchItem {
558
529
  EntityBase *entity; // Entity pointer
559
530
  MessageCreator creator; // Function that creates the message when needed
560
- uint16_t message_type; // Message type for overhead calculation
531
+ uint8_t message_type; // Message type for overhead calculation (max 255)
532
+ uint8_t estimated_size; // Estimated message size (max 255 bytes)
561
533
 
562
534
  // Constructor for creating BatchItem
563
- BatchItem(EntityBase *entity, MessageCreator creator, uint16_t message_type)
564
- : entity(entity), creator(std::move(creator)), message_type(message_type) {}
535
+ BatchItem(EntityBase *entity, MessageCreator creator, uint8_t message_type, uint8_t estimated_size)
536
+ : entity(entity), creator(std::move(creator)), message_type(message_type), estimated_size(estimated_size) {}
565
537
  };
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
- void add_item(EntityBase *entity, MessageCreator creator, uint16_t message_type);
562
+ void add_item(EntityBase *entity, MessageCreator creator, uint8_t message_type, uint8_t estimated_size);
563
+ // Add item to the front of the batch (for high priority messages like ping)
564
+ void add_item_front(EntityBase *entity, MessageCreator creator, uint8_t message_type, uint8_t estimated_size);
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.
@@ -596,23 +630,72 @@ class APIConnection : public APIServerConnection {
596
630
  // to send in one go. This is the maximum size of a single packet
597
631
  // that can be sent over the network.
598
632
  // This is to avoid fragmentation of the packet.
599
- static constexpr size_t MAX_PACKET_SIZE = 1390; // MTU
633
+ static constexpr size_t MAX_BATCH_PACKET_SIZE = 1390; // MTU
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
+ }
641
+
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, uint8_t message_type) {
645
+ this->flags_.log_only_mode = true;
646
+ creator(entity, this, MAX_BATCH_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
603
655
 
604
- // State for batch buffer allocation
605
- bool batch_first_message_{false};
656
+ // Helper method to send a message either immediately or via batching
657
+ bool send_message_smart_(EntityBase *entity, MessageCreatorPtr creator, uint8_t message_type,
658
+ uint8_t estimated_size) {
659
+ // Try to send immediately if:
660
+ // 1. We should try to send immediately (should_try_send_immediately = true)
661
+ // 2. Batch delay is 0 (user has opted in to immediate sending)
662
+ // 3. Buffer has space available
663
+ if (this->flags_.should_try_send_immediately && this->get_batch_delay_ms_() == 0 &&
664
+ this->helper_->can_write_without_blocking()) {
665
+ // Now actually encode and send
666
+ if (creator(entity, this, MAX_BATCH_PACKET_SIZE, true) &&
667
+ this->send_buffer(ProtoWriteBuffer{&this->parent_->get_shared_buffer_ref()}, message_type)) {
668
+ #ifdef HAS_PROTO_MESSAGE_DUMP
669
+ // Log the message in verbose mode
670
+ this->log_proto_message_(entity, MessageCreator(creator), message_type);
671
+ #endif
672
+ return true;
673
+ }
674
+
675
+ // If immediate send failed, fall through to batching
676
+ }
677
+
678
+ // Fall back to scheduled batching
679
+ return this->schedule_message_(entity, creator, message_type, estimated_size);
680
+ }
606
681
 
607
682
  // Helper function to schedule a deferred message with known message type
608
- bool schedule_message_(EntityBase *entity, MessageCreator creator, uint16_t message_type) {
609
- this->deferred_batch_.add_item(entity, std::move(creator), message_type);
683
+ bool schedule_message_(EntityBase *entity, MessageCreator creator, uint8_t message_type, uint8_t estimated_size) {
684
+ this->deferred_batch_.add_item(entity, std::move(creator), message_type, estimated_size);
610
685
  return this->schedule_batch_();
611
686
  }
612
687
 
613
688
  // Overload for function pointers (for info messages and current state reads)
614
- bool schedule_message_(EntityBase *entity, MessageCreatorPtr function_ptr, uint16_t message_type) {
615
- return schedule_message_(entity, MessageCreator(function_ptr), message_type);
689
+ bool schedule_message_(EntityBase *entity, MessageCreatorPtr function_ptr, uint8_t message_type,
690
+ uint8_t estimated_size) {
691
+ return schedule_message_(entity, MessageCreator(function_ptr), message_type, estimated_size);
692
+ }
693
+
694
+ // Helper function to schedule a high priority message at the front of the batch
695
+ bool schedule_message_front_(EntityBase *entity, MessageCreatorPtr function_ptr, uint8_t message_type,
696
+ uint8_t estimated_size) {
697
+ this->deferred_batch_.add_item_front(entity, MessageCreator(function_ptr), message_type, estimated_size);
698
+ return this->schedule_batch_();
616
699
  }
617
700
  };
618
701