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
@@ -11,7 +11,11 @@ namespace ble_client {
11
11
 
12
12
  static const char *const TAG = "ble_rssi_sensor";
13
13
 
14
- void BLEClientRSSISensor::loop() {}
14
+ void BLEClientRSSISensor::loop() {
15
+ // Parent BLEClientNode has a loop() method, but this component uses
16
+ // polling via update() and BLE GAP callbacks so loop isn't needed
17
+ this->disable_loop();
18
+ }
15
19
 
16
20
  void BLEClientRSSISensor::dump_config() {
17
21
  LOG_SENSOR("", "BLE Client RSSI Sensor", this);
@@ -18,7 +18,6 @@ class BLEClientRSSISensor : public sensor::Sensor, public PollingComponent, publ
18
18
  void loop() override;
19
19
  void update() override;
20
20
  void dump_config() override;
21
- float get_setup_priority() const override { return setup_priority::DATA; }
22
21
 
23
22
  void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) override;
24
23
 
@@ -11,7 +11,11 @@ namespace ble_client {
11
11
 
12
12
  static const char *const TAG = "ble_sensor";
13
13
 
14
- void BLESensor::loop() {}
14
+ void BLESensor::loop() {
15
+ // Parent BLEClientNode has a loop() method, but this component uses
16
+ // polling via update() and BLE callbacks so loop isn't needed
17
+ this->disable_loop();
18
+ }
15
19
 
16
20
  void BLESensor::dump_config() {
17
21
  LOG_SENSOR("", "BLE Sensor", this);
@@ -24,7 +24,6 @@ class BLESensor : public sensor::Sensor, public PollingComponent, public BLEClie
24
24
  void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
25
25
  esp_ble_gattc_cb_param_t *param) override;
26
26
  void dump_config() override;
27
- float get_setup_priority() const override { return setup_priority::DATA; }
28
27
  void set_service_uuid16(uint16_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint16(uuid); }
29
28
  void set_service_uuid32(uint32_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint32(uuid); }
30
29
  void set_service_uuid128(uint8_t *uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_raw(uuid); }
@@ -19,7 +19,6 @@ class BLEClientSwitch : public switch_::Switch, public Component, public BLEClie
19
19
  void loop() override {}
20
20
  void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
21
21
  esp_ble_gattc_cb_param_t *param) override;
22
- float get_setup_priority() const override { return setup_priority::DATA; }
23
22
 
24
23
  protected:
25
24
  void write_state(bool state) override;
@@ -14,7 +14,11 @@ static const char *const TAG = "ble_text_sensor";
14
14
 
15
15
  static const std::string EMPTY = "";
16
16
 
17
- void BLETextSensor::loop() {}
17
+ void BLETextSensor::loop() {
18
+ // Parent BLEClientNode has a loop() method, but this component uses
19
+ // polling via update() and BLE callbacks so loop isn't needed
20
+ this->disable_loop();
21
+ }
18
22
 
19
23
  void BLETextSensor::dump_config() {
20
24
  LOG_TEXT_SENSOR("", "BLE Text Sensor", this);
@@ -20,7 +20,6 @@ class BLETextSensor : public text_sensor::TextSensor, public PollingComponent, p
20
20
  void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
21
21
  esp_ble_gattc_cb_param_t *param) override;
22
22
  void dump_config() override;
23
- float get_setup_priority() const override { return setup_priority::DATA; }
24
23
  void set_service_uuid16(uint16_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint16(uuid); }
25
24
  void set_service_uuid32(uint32_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint32(uuid); }
26
25
  void set_service_uuid128(uint8_t *uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_raw(uuid); }
@@ -105,7 +105,6 @@ class BLEPresenceDevice : public binary_sensor::BinarySensorInitiallyOff,
105
105
  this->set_found_(false);
106
106
  }
107
107
  void dump_config() override;
108
- float get_setup_priority() const override { return setup_priority::DATA; }
109
108
 
110
109
  protected:
111
110
  void set_found_(bool state) {
@@ -99,7 +99,6 @@ class BLERSSISensor : public sensor::Sensor, public esp32_ble_tracker::ESPBTDevi
99
99
  return false;
100
100
  }
101
101
  void dump_config() override;
102
- float get_setup_priority() const override { return setup_priority::DATA; }
103
102
 
104
103
  protected:
105
104
  enum MatchType { MATCH_BY_MAC_ADDRESS, MATCH_BY_IRK, MATCH_BY_SERVICE_UUID, MATCH_BY_IBEACON_UUID };
@@ -29,7 +29,6 @@ class BLEScanner : public text_sensor::TextSensor, public esp32_ble_tracker::ESP
29
29
  return true;
30
30
  }
31
31
  void dump_config() override;
32
- float get_setup_priority() const override { return setup_priority::DATA; }
33
32
  };
34
33
 
35
34
  } // namespace ble_scanner
@@ -26,10 +26,17 @@ class BluetoothConnection : public esp32_ble_client::BLEClientBase {
26
26
 
27
27
  protected:
28
28
  friend class BluetoothProxy;
29
- bool seen_mtu_or_services_{false};
30
29
 
31
- int16_t send_service_{-2};
30
+ // Memory optimized layout for 32-bit systems
31
+ // Group 1: Pointers (4 bytes each, naturally aligned)
32
32
  BluetoothProxy *proxy_;
33
+
34
+ // Group 2: 2-byte types
35
+ int16_t send_service_{-2}; // Needs to handle negative values and service count
36
+
37
+ // Group 3: 1-byte types
38
+ bool seen_mtu_or_services_{false};
39
+ // 1 byte used, 1 byte padding
33
40
  };
34
41
 
35
42
  } // namespace bluetooth_proxy
@@ -52,11 +52,21 @@ bool BluetoothProxy::parse_device(const esp32_ble_tracker::ESPBTDevice &device)
52
52
  return true;
53
53
  }
54
54
 
55
- static constexpr size_t FLUSH_BATCH_SIZE = 8;
56
- static std::vector<api::BluetoothLERawAdvertisement> &get_batch_buffer() {
57
- static std::vector<api::BluetoothLERawAdvertisement> batch_buffer;
58
- return batch_buffer;
59
- }
55
+ // Batch size for BLE advertisements to maximize WiFi efficiency
56
+ // Each advertisement is up to 80 bytes when packaged (including protocol overhead)
57
+ // Most advertisements are 20-30 bytes, allowing even more to fit per packet
58
+ // 16 advertisements × 80 bytes (worst case) = 1280 bytes out of ~1320 bytes usable payload
59
+ // This achieves ~97% WiFi MTU utilization while staying under the limit
60
+ static constexpr size_t FLUSH_BATCH_SIZE = 16;
61
+
62
+ namespace {
63
+ // Batch buffer in anonymous namespace to avoid guard variable (saves 8 bytes)
64
+ // This is initialized at program startup before any threads
65
+ // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
66
+ std::vector<api::BluetoothLERawAdvertisement> batch_buffer;
67
+ } // namespace
68
+
69
+ static std::vector<api::BluetoothLERawAdvertisement> &get_batch_buffer() { return batch_buffer; }
60
70
 
61
71
  bool BluetoothProxy::parse_devices(const esp32_ble::BLEScanResult *scan_results, size_t count) {
62
72
  if (!api::global_api_server->is_connected() || this->api_connection_ == nullptr || !this->raw_advertisements_)
@@ -170,7 +180,7 @@ int BluetoothProxy::get_bluetooth_connections_free() {
170
180
  void BluetoothProxy::loop() {
171
181
  if (!api::global_api_server->is_connected() || this->api_connection_ == nullptr) {
172
182
  for (auto *connection : this->connections_) {
173
- if (connection->get_address() != 0) {
183
+ if (connection->get_address() != 0 && !connection->disconnect_pending()) {
174
184
  connection->disconnect();
175
185
  }
176
186
  }
@@ -134,11 +134,17 @@ class BluetoothProxy : public esp32_ble_tracker::ESPBTDeviceListener, public Com
134
134
 
135
135
  BluetoothConnection *get_connection_(uint64_t address, bool reserve);
136
136
 
137
- bool active_;
137
+ // Memory optimized layout for 32-bit systems
138
+ // Group 1: Pointers (4 bytes each, naturally aligned)
139
+ api::APIConnection *api_connection_{nullptr};
138
140
 
141
+ // Group 2: Container types (typically 12 bytes on 32-bit)
139
142
  std::vector<BluetoothConnection *> connections_{};
140
- api::APIConnection *api_connection_{nullptr};
143
+
144
+ // Group 3: 1-byte types grouped together
145
+ bool active_;
141
146
  bool raw_advertisements_{false};
147
+ // 2 bytes used, 2 bytes padding
142
148
  };
143
149
 
144
150
  extern BluetoothProxy *global_bluetooth_proxy; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
@@ -12,8 +12,8 @@ from esphome.const import (
12
12
  CONF_OVERSAMPLING,
13
13
  CONF_PRESSURE,
14
14
  CONF_TEMPERATURE,
15
- DEVICE_CLASS_HUMIDITY,
16
15
  DEVICE_CLASS_ATMOSPHERIC_PRESSURE,
16
+ DEVICE_CLASS_HUMIDITY,
17
17
  DEVICE_CLASS_TEMPERATURE,
18
18
  ICON_GAS_CYLINDER,
19
19
  STATE_CLASS_MEASUREMENT,
@@ -61,8 +61,6 @@ enum IIRFilter {
61
61
 
62
62
  class BMP581Component : public PollingComponent, public i2c::I2CDevice {
63
63
  public:
64
- float get_setup_priority() const override { return setup_priority::DATA; }
65
-
66
64
  void dump_config() override;
67
65
 
68
66
  void setup() override;
@@ -18,8 +18,8 @@ from esphome.const import (
18
18
  DEVICE_CLASS_UPDATE,
19
19
  )
20
20
  from esphome.core import CORE, coroutine_with_priority
21
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
21
22
  from esphome.cpp_generator import MockObjClass
22
- from esphome.cpp_helpers import setup_entity
23
23
 
24
24
  CODEOWNERS = ["@esphome/core"]
25
25
  IS_PLATFORM_COMPONENT = True
@@ -61,6 +61,9 @@ _BUTTON_SCHEMA = (
61
61
  )
62
62
 
63
63
 
64
+ _BUTTON_SCHEMA.add_extra(entity_duplicate_validator("button"))
65
+
66
+
64
67
  def button_schema(
65
68
  class_: MockObjClass,
66
69
  *,
@@ -87,7 +90,7 @@ BUTTON_SCHEMA.add_extra(cv.deprecated_schema_constant("button"))
87
90
 
88
91
 
89
92
  async def setup_button_core_(var, config):
90
- await setup_entity(var, config)
93
+ await setup_entity(var, config, "button")
91
94
 
92
95
  for conf in config.get(CONF_ON_PRESS, []):
93
96
  trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
@@ -0,0 +1 @@
1
+ CODEOWNERS = ["@DT-art1", "@bdraco"]
@@ -0,0 +1,22 @@
1
+ #include "camera.h"
2
+
3
+ namespace esphome {
4
+ namespace camera {
5
+
6
+ // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
7
+ Camera *Camera::global_camera = nullptr;
8
+
9
+ Camera::Camera() {
10
+ if (global_camera != nullptr) {
11
+ this->status_set_error("Multiple cameras are configured, but only one is supported.");
12
+ this->mark_failed();
13
+ return;
14
+ }
15
+
16
+ global_camera = this;
17
+ }
18
+
19
+ Camera *Camera::instance() { return global_camera; }
20
+
21
+ } // namespace camera
22
+ } // namespace esphome
@@ -0,0 +1,80 @@
1
+ #pragma once
2
+
3
+ #include "esphome/core/automation.h"
4
+ #include "esphome/core/component.h"
5
+ #include "esphome/core/entity_base.h"
6
+ #include "esphome/core/helpers.h"
7
+
8
+ namespace esphome {
9
+ namespace camera {
10
+
11
+ /** Different sources for filtering.
12
+ * IDLE: Camera requests to send an image to the API.
13
+ * API_REQUESTER: API requests a new image.
14
+ * WEB_REQUESTER: ESP32 web server request an image. Ignored by API.
15
+ */
16
+ enum CameraRequester : uint8_t { IDLE, API_REQUESTER, WEB_REQUESTER };
17
+
18
+ /** Abstract camera image base class.
19
+ * Encapsulates the JPEG encoded data and it is shared among
20
+ * all connected clients.
21
+ */
22
+ class CameraImage {
23
+ public:
24
+ virtual uint8_t *get_data_buffer() = 0;
25
+ virtual size_t get_data_length() = 0;
26
+ virtual bool was_requested_by(CameraRequester requester) const = 0;
27
+ virtual ~CameraImage() {}
28
+ };
29
+
30
+ /** Abstract image reader base class.
31
+ * Keeps track of the data offset of the camera image and
32
+ * how many bytes are remaining to read. When the image
33
+ * is returned, the shared_ptr is reset and the camera can
34
+ * reuse the memory of the camera image.
35
+ */
36
+ class CameraImageReader {
37
+ public:
38
+ virtual void set_image(std::shared_ptr<CameraImage> image) = 0;
39
+ virtual size_t available() const = 0;
40
+ virtual uint8_t *peek_data_buffer() = 0;
41
+ virtual void consume_data(size_t consumed) = 0;
42
+ virtual void return_image() = 0;
43
+ virtual ~CameraImageReader() {}
44
+ };
45
+
46
+ /** Abstract camera base class. Collaborates with API.
47
+ * 1) API server starts and installs callback (add_image_callback)
48
+ * which is called by the camera when a new image is available.
49
+ * 2) New API client connects and creates a new image reader (create_image_reader).
50
+ * 3) API connection receives protobuf CameraImageRequest and calls request_image.
51
+ * 3.a) API connection receives protobuf CameraImageRequest and calls start_stream.
52
+ * 4) Camera implementation provides JPEG data in the CameraImage and calls callback.
53
+ * 5) API connection sets the image in the image reader.
54
+ * 6) API connection consumes data from the image reader and returns the image when finished.
55
+ * 7.a) Camera captures a new image and continues with 4) until start_stream is called.
56
+ */
57
+ class Camera : public EntityBase, public Component {
58
+ public:
59
+ Camera();
60
+ // Camera implementation invokes callback to publish a new image.
61
+ virtual void add_image_callback(std::function<void(std::shared_ptr<CameraImage>)> &&callback) = 0;
62
+ /// Returns a new camera image reader that keeps track of the JPEG data in the camera image.
63
+ virtual CameraImageReader *create_image_reader() = 0;
64
+ // Connection, camera or web server requests one new JPEG image.
65
+ virtual void request_image(CameraRequester requester) = 0;
66
+ // Connection, camera or web server requests a stream of images.
67
+ virtual void start_stream(CameraRequester requester) = 0;
68
+ // Connection or web server stops the previously started stream.
69
+ virtual void stop_stream(CameraRequester requester) = 0;
70
+ virtual ~Camera() {}
71
+ /// The singleton instance of the camera implementation.
72
+ static Camera *instance();
73
+
74
+ protected:
75
+ // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
76
+ static Camera *global_camera;
77
+ };
78
+
79
+ } // namespace camera
80
+ } // namespace esphome
@@ -1,4 +1,5 @@
1
1
  import re
2
+
2
3
  from esphome import automation
3
4
  import esphome.codegen as cg
4
5
  import esphome.config_validation as cv
@@ -46,7 +46,6 @@ class CAP1188Component : public Component, public i2c::I2CDevice {
46
46
  void set_reset_pin(GPIOPin *reset_pin) { this->reset_pin_ = reset_pin; }
47
47
  void setup() override;
48
48
  void dump_config() override;
49
- float get_setup_priority() const override { return setup_priority::DATA; }
50
49
  void loop() override;
51
50
 
52
51
  protected:
@@ -7,11 +7,12 @@ from esphome.const import (
7
7
  PLATFORM_BK72XX,
8
8
  PLATFORM_ESP32,
9
9
  PLATFORM_ESP8266,
10
+ PLATFORM_LN882X,
10
11
  PLATFORM_RTL87XX,
11
12
  )
12
13
  from esphome.core import CORE, coroutine_with_priority
13
14
 
14
- AUTO_LOAD = ["web_server_base"]
15
+ AUTO_LOAD = ["web_server_base", "ota.web_server"]
15
16
  DEPENDENCIES = ["wifi"]
16
17
  CODEOWNERS = ["@OttoWinter"]
17
18
 
@@ -27,7 +28,15 @@ CONFIG_SCHEMA = cv.All(
27
28
  ),
28
29
  }
29
30
  ).extend(cv.COMPONENT_SCHEMA),
30
- cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_BK72XX, PLATFORM_RTL87XX]),
31
+ cv.only_on(
32
+ [
33
+ PLATFORM_ESP32,
34
+ PLATFORM_ESP8266,
35
+ PLATFORM_BK72XX,
36
+ PLATFORM_LN882X,
37
+ PLATFORM_RTL87XX,
38
+ ]
39
+ ),
31
40
  )
32
41
 
33
42
 
@@ -41,6 +50,7 @@ async def to_code(config):
41
50
 
42
51
  if CORE.using_arduino:
43
52
  if CORE.is_esp32:
53
+ cg.add_library("ESP32 Async UDP", None)
44
54
  cg.add_library("DNSServer", None)
45
55
  cg.add_library("WiFi", None)
46
56
  if CORE.is_esp8266:
@@ -37,12 +37,16 @@ void CaptivePortal::handle_wifisave(AsyncWebServerRequest *request) {
37
37
  request->redirect("/?save");
38
38
  }
39
39
 
40
- void CaptivePortal::setup() {}
40
+ void CaptivePortal::setup() {
41
+ #ifndef USE_ARDUINO
42
+ // No DNS server needed for non-Arduino frameworks
43
+ this->disable_loop();
44
+ #endif
45
+ }
41
46
  void CaptivePortal::start() {
42
47
  this->base_->init();
43
48
  if (!this->initialized_) {
44
49
  this->base_->add_handler(this);
45
- this->base_->add_ota_handler();
46
50
  }
47
51
 
48
52
  #ifdef USE_ARDUINO
@@ -50,6 +54,8 @@ void CaptivePortal::start() {
50
54
  this->dns_server_->setErrorReplyCode(DNSReplyCode::NoError);
51
55
  network::IPAddress ip = wifi::global_wifi_component->wifi_soft_ap_ip();
52
56
  this->dns_server_->start(53, "*", ip);
57
+ // Re-enable loop() when DNS server is started
58
+ this->enable_loop();
53
59
  #endif
54
60
 
55
61
  this->base_->get_server()->onNotFound([this](AsyncWebServerRequest *req) {
@@ -68,7 +74,11 @@ void CaptivePortal::start() {
68
74
 
69
75
  void CaptivePortal::handleRequest(AsyncWebServerRequest *req) {
70
76
  if (req->url() == "/") {
77
+ #ifndef USE_ESP8266
78
+ auto *response = req->beginResponse(200, "text/html", INDEX_GZ, sizeof(INDEX_GZ));
79
+ #else
71
80
  auto *response = req->beginResponse_P(200, "text/html", INDEX_GZ, sizeof(INDEX_GZ));
81
+ #endif
72
82
  response->addHeader("Content-Encoding", "gzip");
73
83
  req->send(response);
74
84
  return;
@@ -21,8 +21,11 @@ class CaptivePortal : public AsyncWebHandler, public Component {
21
21
  void dump_config() override;
22
22
  #ifdef USE_ARDUINO
23
23
  void loop() override {
24
- if (this->dns_server_ != nullptr)
24
+ if (this->dns_server_ != nullptr) {
25
25
  this->dns_server_->processNextRequest();
26
+ } else {
27
+ this->disable_loop();
28
+ }
26
29
  }
27
30
  #endif
28
31
  float get_setup_priority() const override;
@@ -37,7 +40,7 @@ class CaptivePortal : public AsyncWebHandler, public Component {
37
40
  #endif
38
41
  }
39
42
 
40
- bool canHandle(AsyncWebServerRequest *request) override {
43
+ bool canHandle(AsyncWebServerRequest *request) const override {
41
44
  if (!this->active_)
42
45
  return false;
43
46
 
@@ -25,8 +25,6 @@ class CCS811Component : public PollingComponent, public i2c::I2CDevice {
25
25
 
26
26
  void dump_config() override;
27
27
 
28
- float get_setup_priority() const override { return setup_priority::DATA; }
29
-
30
28
  protected:
31
29
  optional<uint8_t> read_status_() { return this->read_byte(0x00); }
32
30
  bool status_has_error_() { return this->read_status_().value_or(1) & 1; }
@@ -48,8 +48,8 @@ from esphome.const import (
48
48
  CONF_WEB_SERVER,
49
49
  )
50
50
  from esphome.core import CORE, coroutine_with_priority
51
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
51
52
  from esphome.cpp_generator import MockObjClass
52
- from esphome.cpp_helpers import setup_entity
53
53
 
54
54
  IS_PLATFORM_COMPONENT = True
55
55
 
@@ -247,6 +247,9 @@ _CLIMATE_SCHEMA = (
247
247
  )
248
248
 
249
249
 
250
+ _CLIMATE_SCHEMA.add_extra(entity_duplicate_validator("climate"))
251
+
252
+
250
253
  def climate_schema(
251
254
  class_: MockObjClass,
252
255
  *,
@@ -273,7 +276,7 @@ CLIMATE_SCHEMA.add_extra(cv.deprecated_schema_constant("climate"))
273
276
 
274
277
 
275
278
  async def setup_climate_core_(var, config):
276
- await setup_entity(var, config)
279
+ await setup_entity(var, config, "climate")
277
280
 
278
281
  visual = config[CONF_VISUAL]
279
282
  if (min_temp := visual.get(CONF_MIN_TEMPERATURE)) is not None:
@@ -1,10 +1,10 @@
1
1
  """CM1106 Sensor component for ESPHome."""
2
2
 
3
- import esphome.codegen as cg
4
- import esphome.config_validation as cv
5
3
  from esphome import automation
6
4
  from esphome.automation import maybe_simple_id
5
+ import esphome.codegen as cg
7
6
  from esphome.components import sensor, uart
7
+ import esphome.config_validation as cv
8
8
  from esphome.const import (
9
9
  CONF_CO2,
10
10
  CONF_ID,
@@ -2,5 +2,7 @@
2
2
 
3
3
  CODEOWNERS = ["@esphome/core"]
4
4
 
5
+ CONF_BYTE_ORDER = "byte_order"
5
6
  CONF_DRAW_ROUNDING = "draw_rounding"
7
+ CONF_ON_STATE_CHANGE = "on_state_change"
6
8
  CONF_REQUEST_HEADERS = "request_headers"
@@ -11,7 +11,6 @@ class CopyBinarySensor : public binary_sensor::BinarySensor, public Component {
11
11
  void set_source(binary_sensor::BinarySensor *source) { source_ = source; }
12
12
  void setup() override;
13
13
  void dump_config() override;
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
 
16
15
  protected:
17
16
  binary_sensor::BinarySensor *source_;
@@ -10,7 +10,6 @@ class CopyButton : public button::Button, public Component {
10
10
  public:
11
11
  void set_source(button::Button *source) { source_ = source; }
12
12
  void dump_config() override;
13
- float get_setup_priority() const override { return setup_priority::DATA; }
14
13
 
15
14
  protected:
16
15
  void press_action() override;
@@ -11,7 +11,6 @@ class CopyCover : public cover::Cover, public Component {
11
11
  void set_source(cover::Cover *source) { source_ = source; }
12
12
  void setup() override;
13
13
  void dump_config() override;
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
 
16
15
  cover::CoverTraits get_traits() override;
17
16
 
@@ -11,7 +11,6 @@ class CopyFan : public fan::Fan, public Component {
11
11
  void set_source(fan::Fan *source) { source_ = source; }
12
12
  void setup() override;
13
13
  void dump_config() override;
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
 
16
15
  fan::FanTraits get_traits() override;
17
16
 
@@ -11,7 +11,6 @@ class CopyLock : public lock::Lock, public Component {
11
11
  void set_source(lock::Lock *source) { source_ = source; }
12
12
  void setup() override;
13
13
  void dump_config() override;
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
 
16
15
  protected:
17
16
  void control(const lock::LockCall &call) override;
@@ -11,7 +11,6 @@ class CopyNumber : public number::Number, public Component {
11
11
  void set_source(number::Number *source) { source_ = source; }
12
12
  void setup() override;
13
13
  void dump_config() override;
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
 
16
15
  protected:
17
16
  void control(float value) override;
@@ -11,7 +11,6 @@ class CopySelect : public select::Select, public Component {
11
11
  void set_source(select::Select *source) { source_ = source; }
12
12
  void setup() override;
13
13
  void dump_config() override;
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
 
16
15
  protected:
17
16
  void control(const std::string &value) override;
@@ -11,7 +11,6 @@ class CopySensor : public sensor::Sensor, public Component {
11
11
  void set_source(sensor::Sensor *source) { source_ = source; }
12
12
  void setup() override;
13
13
  void dump_config() override;
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
 
16
15
  protected:
17
16
  sensor::Sensor *source_;
@@ -11,7 +11,6 @@ class CopySwitch : public switch_::Switch, public Component {
11
11
  void set_source(switch_::Switch *source) { source_ = source; }
12
12
  void setup() override;
13
13
  void dump_config() override;
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
 
16
15
  protected:
17
16
  void write_state(bool state) override;
@@ -11,7 +11,6 @@ class CopyText : public text::Text, public Component {
11
11
  void set_source(text::Text *source) { source_ = source; }
12
12
  void setup() override;
13
13
  void dump_config() override;
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
 
16
15
  protected:
17
16
  void control(const std::string &value) override;
@@ -11,7 +11,6 @@ class CopyTextSensor : public text_sensor::TextSensor, public Component {
11
11
  void set_source(text_sensor::TextSensor *source) { source_ = source; }
12
12
  void setup() override;
13
13
  void dump_config() override;
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
 
16
15
  protected:
17
16
  text_sensor::TextSensor *source_;
@@ -33,8 +33,8 @@ from esphome.const import (
33
33
  DEVICE_CLASS_WINDOW,
34
34
  )
35
35
  from esphome.core import CORE, coroutine_with_priority
36
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
36
37
  from esphome.cpp_generator import MockObjClass
37
- from esphome.cpp_helpers import setup_entity
38
38
 
39
39
  IS_PLATFORM_COMPONENT = True
40
40
 
@@ -126,6 +126,9 @@ _COVER_SCHEMA = (
126
126
  )
127
127
 
128
128
 
129
+ _COVER_SCHEMA.add_extra(entity_duplicate_validator("cover"))
130
+
131
+
129
132
  def cover_schema(
130
133
  class_: MockObjClass,
131
134
  *,
@@ -154,7 +157,7 @@ COVER_SCHEMA.add_extra(cv.deprecated_schema_constant("cover"))
154
157
 
155
158
 
156
159
  async def setup_cover_core_(var, config):
157
- await setup_entity(var, config)
160
+ await setup_entity(var, config, "cover")
158
161
 
159
162
  if (device_class := config.get(CONF_DEVICE_CLASS)) is not None:
160
163
  cg.add(var.set_device_class(device_class))