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
@@ -1,5 +1,7 @@
1
1
  #pragma once
2
2
 
3
+ #include <algorithm>
4
+ #include <limits>
3
5
  #include <string>
4
6
  #include <vector>
5
7
  #include "esphome/core/component.h"
@@ -9,6 +11,13 @@
9
11
  #include "esphome/core/preferences.h"
10
12
  #include "esphome/core/scheduler.h"
11
13
 
14
+ #ifdef USE_DEVICES
15
+ #include "esphome/core/device.h"
16
+ #endif
17
+ #ifdef USE_AREAS
18
+ #include "esphome/core/area.h"
19
+ #endif
20
+
12
21
  #ifdef USE_SOCKET_SELECT_SUPPORT
13
22
  #include <sys/select.h>
14
23
  #endif
@@ -87,7 +96,7 @@ static const uint32_t TEARDOWN_TIMEOUT_REBOOT_MS = 1000; // 1 second for quick
87
96
 
88
97
  class Application {
89
98
  public:
90
- void pre_setup(const std::string &name, const std::string &friendly_name, const char *area, const char *comment,
99
+ void pre_setup(const std::string &name, const std::string &friendly_name, const char *comment,
91
100
  const char *compilation_time, bool name_add_mac_suffix) {
92
101
  arch_init();
93
102
  this->name_add_mac_suffix_ = name_add_mac_suffix;
@@ -102,11 +111,17 @@ class Application {
102
111
  this->name_ = name;
103
112
  this->friendly_name_ = friendly_name;
104
113
  }
105
- this->area_ = area;
106
114
  this->comment_ = comment;
107
115
  this->compilation_time_ = compilation_time;
108
116
  }
109
117
 
118
+ #ifdef USE_DEVICES
119
+ void register_device(Device *device) { this->devices_.push_back(device); }
120
+ #endif
121
+ #ifdef USE_AREAS
122
+ void register_area(Area *area) { this->areas_.push_back(area); }
123
+ #endif
124
+
110
125
  void set_current_component(Component *component) { this->current_component_ = component; }
111
126
  Component *get_current_component() { return this->current_component_; }
112
127
 
@@ -264,6 +279,12 @@ class Application {
264
279
  #ifdef USE_UPDATE
265
280
  void reserve_update(size_t count) { this->updates_.reserve(count); }
266
281
  #endif
282
+ #ifdef USE_AREAS
283
+ void reserve_area(size_t count) { this->areas_.reserve(count); }
284
+ #endif
285
+ #ifdef USE_DEVICES
286
+ void reserve_device(size_t count) { this->devices_.reserve(count); }
287
+ #endif
267
288
 
268
289
  /// Register the component in this Application instance.
269
290
  template<class C> C *register_component(C *c) {
@@ -285,7 +306,15 @@ class Application {
285
306
  const std::string &get_friendly_name() const { return this->friendly_name_; }
286
307
 
287
308
  /// Get the area of this Application set by pre_setup().
288
- std::string get_area() const { return this->area_ == nullptr ? "" : this->area_; }
309
+ const char *get_area() const {
310
+ #ifdef USE_AREAS
311
+ // If we have areas registered, return the name of the first one (which is the top-level area)
312
+ if (!this->areas_.empty() && this->areas_[0] != nullptr) {
313
+ return this->areas_[0]->get_name();
314
+ }
315
+ #endif
316
+ return "";
317
+ }
289
318
 
290
319
  /// Get the comment of this Application set by pre_setup().
291
320
  std::string get_comment() const { return this->comment_; }
@@ -308,11 +337,16 @@ class Application {
308
337
  * Each component can request a high frequency loop execution by using the HighFrequencyLoopRequester
309
338
  * helper in helpers.h
310
339
  *
340
+ * Note: This method is not called by ESPHome core code. It is only used by lambda functions
341
+ * in YAML configurations or by external components.
342
+ *
311
343
  * @param loop_interval The interval in milliseconds to run the core loop at. Defaults to 16 milliseconds.
312
344
  */
313
- void set_loop_interval(uint32_t loop_interval) { this->loop_interval_ = loop_interval; }
345
+ void set_loop_interval(uint32_t loop_interval) {
346
+ this->loop_interval_ = std::min(loop_interval, static_cast<uint32_t>(std::numeric_limits<uint16_t>::max()));
347
+ }
314
348
 
315
- uint32_t get_loop_interval() const { return this->loop_interval_; }
349
+ uint32_t get_loop_interval() const { return static_cast<uint32_t>(this->loop_interval_); }
316
350
 
317
351
  void schedule_dump_config() { this->dump_config_at_ = 0; }
318
352
 
@@ -334,220 +368,111 @@ class Application {
334
368
 
335
369
  uint8_t get_app_state() const { return this->app_state_; }
336
370
 
371
+ // Helper macro for entity getter method declarations - reduces code duplication
372
+ // When USE_DEVICE_ID is enabled in the future, this can be conditionally compiled to add device_id parameter
373
+ #define GET_ENTITY_METHOD(entity_type, entity_name, entities_member) \
374
+ entity_type *get_##entity_name##_by_key(uint32_t key, bool include_internal = false) { \
375
+ for (auto *obj : this->entities_member##_) { \
376
+ if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal())) \
377
+ return obj; \
378
+ } \
379
+ return nullptr; \
380
+ }
381
+
382
+ #ifdef USE_DEVICES
383
+ const std::vector<Device *> &get_devices() { return this->devices_; }
384
+ #endif
385
+ #ifdef USE_AREAS
386
+ const std::vector<Area *> &get_areas() { return this->areas_; }
387
+ #endif
337
388
  #ifdef USE_BINARY_SENSOR
338
389
  const std::vector<binary_sensor::BinarySensor *> &get_binary_sensors() { return this->binary_sensors_; }
339
- binary_sensor::BinarySensor *get_binary_sensor_by_key(uint32_t key, bool include_internal = false) {
340
- for (auto *obj : this->binary_sensors_) {
341
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
342
- return obj;
343
- }
344
- return nullptr;
345
- }
390
+ GET_ENTITY_METHOD(binary_sensor::BinarySensor, binary_sensor, binary_sensors)
346
391
  #endif
347
392
  #ifdef USE_SWITCH
348
393
  const std::vector<switch_::Switch *> &get_switches() { return this->switches_; }
349
- switch_::Switch *get_switch_by_key(uint32_t key, bool include_internal = false) {
350
- for (auto *obj : this->switches_) {
351
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
352
- return obj;
353
- }
354
- return nullptr;
355
- }
394
+ GET_ENTITY_METHOD(switch_::Switch, switch, switches)
356
395
  #endif
357
396
  #ifdef USE_BUTTON
358
397
  const std::vector<button::Button *> &get_buttons() { return this->buttons_; }
359
- button::Button *get_button_by_key(uint32_t key, bool include_internal = false) {
360
- for (auto *obj : this->buttons_) {
361
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
362
- return obj;
363
- }
364
- return nullptr;
365
- }
398
+ GET_ENTITY_METHOD(button::Button, button, buttons)
366
399
  #endif
367
400
  #ifdef USE_SENSOR
368
401
  const std::vector<sensor::Sensor *> &get_sensors() { return this->sensors_; }
369
- sensor::Sensor *get_sensor_by_key(uint32_t key, bool include_internal = false) {
370
- for (auto *obj : this->sensors_) {
371
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
372
- return obj;
373
- }
374
- return nullptr;
375
- }
402
+ GET_ENTITY_METHOD(sensor::Sensor, sensor, sensors)
376
403
  #endif
377
404
  #ifdef USE_TEXT_SENSOR
378
405
  const std::vector<text_sensor::TextSensor *> &get_text_sensors() { return this->text_sensors_; }
379
- text_sensor::TextSensor *get_text_sensor_by_key(uint32_t key, bool include_internal = false) {
380
- for (auto *obj : this->text_sensors_) {
381
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
382
- return obj;
383
- }
384
- return nullptr;
385
- }
406
+ GET_ENTITY_METHOD(text_sensor::TextSensor, text_sensor, text_sensors)
386
407
  #endif
387
408
  #ifdef USE_FAN
388
409
  const std::vector<fan::Fan *> &get_fans() { return this->fans_; }
389
- fan::Fan *get_fan_by_key(uint32_t key, bool include_internal = false) {
390
- for (auto *obj : this->fans_) {
391
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
392
- return obj;
393
- }
394
- return nullptr;
395
- }
410
+ GET_ENTITY_METHOD(fan::Fan, fan, fans)
396
411
  #endif
397
412
  #ifdef USE_COVER
398
413
  const std::vector<cover::Cover *> &get_covers() { return this->covers_; }
399
- cover::Cover *get_cover_by_key(uint32_t key, bool include_internal = false) {
400
- for (auto *obj : this->covers_) {
401
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
402
- return obj;
403
- }
404
- return nullptr;
405
- }
414
+ GET_ENTITY_METHOD(cover::Cover, cover, covers)
406
415
  #endif
407
416
  #ifdef USE_LIGHT
408
417
  const std::vector<light::LightState *> &get_lights() { return this->lights_; }
409
- light::LightState *get_light_by_key(uint32_t key, bool include_internal = false) {
410
- for (auto *obj : this->lights_) {
411
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
412
- return obj;
413
- }
414
- return nullptr;
415
- }
418
+ GET_ENTITY_METHOD(light::LightState, light, lights)
416
419
  #endif
417
420
  #ifdef USE_CLIMATE
418
421
  const std::vector<climate::Climate *> &get_climates() { return this->climates_; }
419
- climate::Climate *get_climate_by_key(uint32_t key, bool include_internal = false) {
420
- for (auto *obj : this->climates_) {
421
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
422
- return obj;
423
- }
424
- return nullptr;
425
- }
422
+ GET_ENTITY_METHOD(climate::Climate, climate, climates)
426
423
  #endif
427
424
  #ifdef USE_NUMBER
428
425
  const std::vector<number::Number *> &get_numbers() { return this->numbers_; }
429
- number::Number *get_number_by_key(uint32_t key, bool include_internal = false) {
430
- for (auto *obj : this->numbers_) {
431
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
432
- return obj;
433
- }
434
- return nullptr;
435
- }
426
+ GET_ENTITY_METHOD(number::Number, number, numbers)
436
427
  #endif
437
428
  #ifdef USE_DATETIME_DATE
438
429
  const std::vector<datetime::DateEntity *> &get_dates() { return this->dates_; }
439
- datetime::DateEntity *get_date_by_key(uint32_t key, bool include_internal = false) {
440
- for (auto *obj : this->dates_) {
441
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
442
- return obj;
443
- }
444
- return nullptr;
445
- }
430
+ GET_ENTITY_METHOD(datetime::DateEntity, date, dates)
446
431
  #endif
447
432
  #ifdef USE_DATETIME_TIME
448
433
  const std::vector<datetime::TimeEntity *> &get_times() { return this->times_; }
449
- datetime::TimeEntity *get_time_by_key(uint32_t key, bool include_internal = false) {
450
- for (auto *obj : this->times_) {
451
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
452
- return obj;
453
- }
454
- return nullptr;
455
- }
434
+ GET_ENTITY_METHOD(datetime::TimeEntity, time, times)
456
435
  #endif
457
436
  #ifdef USE_DATETIME_DATETIME
458
437
  const std::vector<datetime::DateTimeEntity *> &get_datetimes() { return this->datetimes_; }
459
- datetime::DateTimeEntity *get_datetime_by_key(uint32_t key, bool include_internal = false) {
460
- for (auto *obj : this->datetimes_) {
461
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
462
- return obj;
463
- }
464
- return nullptr;
465
- }
438
+ GET_ENTITY_METHOD(datetime::DateTimeEntity, datetime, datetimes)
466
439
  #endif
467
440
  #ifdef USE_TEXT
468
441
  const std::vector<text::Text *> &get_texts() { return this->texts_; }
469
- text::Text *get_text_by_key(uint32_t key, bool include_internal = false) {
470
- for (auto *obj : this->texts_) {
471
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
472
- return obj;
473
- }
474
- return nullptr;
475
- }
442
+ GET_ENTITY_METHOD(text::Text, text, texts)
476
443
  #endif
477
444
  #ifdef USE_SELECT
478
445
  const std::vector<select::Select *> &get_selects() { return this->selects_; }
479
- select::Select *get_select_by_key(uint32_t key, bool include_internal = false) {
480
- for (auto *obj : this->selects_) {
481
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
482
- return obj;
483
- }
484
- return nullptr;
485
- }
446
+ GET_ENTITY_METHOD(select::Select, select, selects)
486
447
  #endif
487
448
  #ifdef USE_LOCK
488
449
  const std::vector<lock::Lock *> &get_locks() { return this->locks_; }
489
- lock::Lock *get_lock_by_key(uint32_t key, bool include_internal = false) {
490
- for (auto *obj : this->locks_) {
491
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
492
- return obj;
493
- }
494
- return nullptr;
495
- }
450
+ GET_ENTITY_METHOD(lock::Lock, lock, locks)
496
451
  #endif
497
452
  #ifdef USE_VALVE
498
453
  const std::vector<valve::Valve *> &get_valves() { return this->valves_; }
499
- valve::Valve *get_valve_by_key(uint32_t key, bool include_internal = false) {
500
- for (auto *obj : this->valves_) {
501
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
502
- return obj;
503
- }
504
- return nullptr;
505
- }
454
+ GET_ENTITY_METHOD(valve::Valve, valve, valves)
506
455
  #endif
507
456
  #ifdef USE_MEDIA_PLAYER
508
457
  const std::vector<media_player::MediaPlayer *> &get_media_players() { return this->media_players_; }
509
- media_player::MediaPlayer *get_media_player_by_key(uint32_t key, bool include_internal = false) {
510
- for (auto *obj : this->media_players_) {
511
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
512
- return obj;
513
- }
514
- return nullptr;
515
- }
458
+ GET_ENTITY_METHOD(media_player::MediaPlayer, media_player, media_players)
516
459
  #endif
517
460
 
518
461
  #ifdef USE_ALARM_CONTROL_PANEL
519
462
  const std::vector<alarm_control_panel::AlarmControlPanel *> &get_alarm_control_panels() {
520
463
  return this->alarm_control_panels_;
521
464
  }
522
- alarm_control_panel::AlarmControlPanel *get_alarm_control_panel_by_key(uint32_t key, bool include_internal = false) {
523
- for (auto *obj : this->alarm_control_panels_) {
524
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
525
- return obj;
526
- }
527
- return nullptr;
528
- }
465
+ GET_ENTITY_METHOD(alarm_control_panel::AlarmControlPanel, alarm_control_panel, alarm_control_panels)
529
466
  #endif
530
467
 
531
468
  #ifdef USE_EVENT
532
469
  const std::vector<event::Event *> &get_events() { return this->events_; }
533
- event::Event *get_event_by_key(uint32_t key, bool include_internal = false) {
534
- for (auto *obj : this->events_) {
535
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
536
- return obj;
537
- }
538
- return nullptr;
539
- }
470
+ GET_ENTITY_METHOD(event::Event, event, events)
540
471
  #endif
541
472
 
542
473
  #ifdef USE_UPDATE
543
474
  const std::vector<update::UpdateEntity *> &get_updates() { return this->updates_; }
544
- update::UpdateEntity *get_update_by_key(uint32_t key, bool include_internal = false) {
545
- for (auto *obj : this->updates_) {
546
- if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
547
- return obj;
548
- }
549
- return nullptr;
550
- }
475
+ GET_ENTITY_METHOD(update::UpdateEntity, update, updates)
551
476
  #endif
552
477
 
553
478
  Scheduler scheduler;
@@ -572,14 +497,56 @@ class Application {
572
497
 
573
498
  void calculate_looping_components_();
574
499
 
500
+ // These methods are called by Component::disable_loop() and Component::enable_loop()
501
+ // Components should not call these directly - use this->disable_loop() or this->enable_loop()
502
+ // to ensure component state is properly updated along with the loop partition
503
+ void disable_component_loop_(Component *component);
504
+ void enable_component_loop_(Component *component);
505
+ void enable_pending_loops_();
506
+ void activate_looping_component_(uint16_t index);
507
+
575
508
  void feed_wdt_arch_();
576
509
 
577
510
  /// Perform a delay while also monitoring socket file descriptors for readiness
578
511
  void yield_with_select_(uint32_t delay_ms);
579
512
 
513
+ // === Member variables ordered by size to minimize padding ===
514
+
515
+ // Pointer-sized members first
516
+ Component *current_component_{nullptr};
517
+ const char *comment_{nullptr};
518
+ const char *compilation_time_{nullptr};
519
+
520
+ // size_t members
521
+ size_t dump_config_at_{SIZE_MAX};
522
+
523
+ // Vectors (largest members)
580
524
  std::vector<Component *> components_{};
525
+
526
+ // Partitioned vector design for looping components
527
+ // =================================================
528
+ // Components are partitioned into [active | inactive] sections:
529
+ //
530
+ // looping_components_: [A, B, C, D | E, F]
531
+ // ^
532
+ // looping_components_active_end_ (4)
533
+ //
534
+ // - Components A,B,C,D are active and will be called in loop()
535
+ // - Components E,F are inactive (disabled/failed) and won't be called
536
+ // - No flag checking needed during iteration - just loop 0 to active_end_
537
+ // - When a component is disabled, it's swapped with the last active component
538
+ // and active_end_ is decremented
539
+ // - When a component is enabled, it's swapped with the first inactive component
540
+ // and active_end_ is incremented
541
+ // - This eliminates branch mispredictions from flag checking in the hot loop
581
542
  std::vector<Component *> looping_components_{};
582
543
 
544
+ #ifdef USE_DEVICES
545
+ std::vector<Device *> devices_{};
546
+ #endif
547
+ #ifdef USE_AREAS
548
+ std::vector<Area *> areas_{};
549
+ #endif
583
550
  #ifdef USE_BINARY_SENSOR
584
551
  std::vector<binary_sensor::BinarySensor *> binary_sensors_{};
585
552
  #endif
@@ -644,26 +611,39 @@ class Application {
644
611
  std::vector<update::UpdateEntity *> updates_{};
645
612
  #endif
646
613
 
614
+ #ifdef USE_SOCKET_SELECT_SUPPORT
615
+ std::vector<int> socket_fds_; // Vector of all monitored socket file descriptors
616
+ #endif
617
+
618
+ // String members
647
619
  std::string name_;
648
620
  std::string friendly_name_;
649
- const char *area_{nullptr};
650
- const char *comment_{nullptr};
651
- const char *compilation_time_{nullptr};
652
- bool name_add_mac_suffix_;
621
+
622
+ // 4-byte members
653
623
  uint32_t last_loop_{0};
654
- uint32_t loop_interval_{16};
655
- size_t dump_config_at_{SIZE_MAX};
656
- uint8_t app_state_{0};
657
- Component *current_component_{nullptr};
658
624
  uint32_t loop_component_start_time_{0};
659
625
 
660
626
  #ifdef USE_SOCKET_SELECT_SUPPORT
661
- // Socket select management
662
- std::vector<int> socket_fds_; // Vector of all monitored socket file descriptors
627
+ int max_fd_{-1}; // Highest file descriptor number for select()
628
+ #endif
629
+
630
+ // 2-byte members (grouped together for alignment)
631
+ uint16_t loop_interval_{16}; // Loop interval in ms (max 65535ms = 65.5 seconds)
632
+ uint16_t looping_components_active_end_{0};
633
+ uint16_t current_loop_index_{0}; // For safe reentrant modifications during iteration
634
+
635
+ // 1-byte members (grouped together to minimize padding)
636
+ uint8_t app_state_{0};
637
+ bool name_add_mac_suffix_;
638
+ bool in_loop_{false};
639
+ volatile bool has_pending_enable_loop_requests_{false};
640
+
641
+ #ifdef USE_SOCKET_SELECT_SUPPORT
663
642
  bool socket_fds_changed_{false}; // Flag to rebuild base_read_fds_ when socket_fds_ changes
664
- int max_fd_{-1}; // Highest file descriptor number for select()
665
- fd_set base_read_fds_{}; // Cached fd_set rebuilt only when socket_fds_ changes
666
- fd_set read_fds_{}; // Working fd_set for select(), copied from base_read_fds_
643
+
644
+ // Variable-sized members at end
645
+ fd_set base_read_fds_{}; // Cached fd_set rebuilt only when socket_fds_ changes
646
+ fd_set read_fds_{}; // Working fd_set for select(), copied from base_read_fds_
667
647
  #endif
668
648
  };
669
649
 
esphome/core/area.h ADDED
@@ -0,0 +1,19 @@
1
+ #pragma once
2
+
3
+ #include <cstdint>
4
+
5
+ namespace esphome {
6
+
7
+ class Area {
8
+ public:
9
+ void set_area_id(uint32_t area_id) { this->area_id_ = area_id; }
10
+ uint32_t get_area_id() { return this->area_id_; }
11
+ void set_name(const char *name) { this->name_ = name; }
12
+ const char *get_name() { return this->name_; }
13
+
14
+ protected:
15
+ uint32_t area_id_{};
16
+ const char *name_ = "";
17
+ };
18
+
19
+ } // namespace esphome
esphome/core/automation.h CHANGED
@@ -27,20 +27,67 @@ template<typename T, typename... X> class TemplatableValue {
27
27
  public:
28
28
  TemplatableValue() : type_(NONE) {}
29
29
 
30
- template<typename F, enable_if_t<!is_invocable<F, X...>::value, int> = 0>
31
- TemplatableValue(F value) : type_(VALUE), value_(std::move(value)) {}
30
+ template<typename F, enable_if_t<!is_invocable<F, X...>::value, int> = 0> TemplatableValue(F value) : type_(VALUE) {
31
+ new (&this->value_) T(std::move(value));
32
+ }
33
+
34
+ template<typename F, enable_if_t<is_invocable<F, X...>::value, int> = 0> TemplatableValue(F f) : type_(LAMBDA) {
35
+ this->f_ = new std::function<T(X...)>(std::move(f));
36
+ }
37
+
38
+ // Copy constructor
39
+ TemplatableValue(const TemplatableValue &other) : type_(other.type_) {
40
+ if (type_ == VALUE) {
41
+ new (&this->value_) T(other.value_);
42
+ } else if (type_ == LAMBDA) {
43
+ this->f_ = new std::function<T(X...)>(*other.f_);
44
+ }
45
+ }
46
+
47
+ // Move constructor
48
+ TemplatableValue(TemplatableValue &&other) noexcept : type_(other.type_) {
49
+ if (type_ == VALUE) {
50
+ new (&this->value_) T(std::move(other.value_));
51
+ } else if (type_ == LAMBDA) {
52
+ this->f_ = other.f_;
53
+ other.f_ = nullptr;
54
+ }
55
+ other.type_ = NONE;
56
+ }
32
57
 
33
- template<typename F, enable_if_t<is_invocable<F, X...>::value, int> = 0>
34
- TemplatableValue(F f) : type_(LAMBDA), f_(f) {}
58
+ // Assignment operators
59
+ TemplatableValue &operator=(const TemplatableValue &other) {
60
+ if (this != &other) {
61
+ this->~TemplatableValue();
62
+ new (this) TemplatableValue(other);
63
+ }
64
+ return *this;
65
+ }
66
+
67
+ TemplatableValue &operator=(TemplatableValue &&other) noexcept {
68
+ if (this != &other) {
69
+ this->~TemplatableValue();
70
+ new (this) TemplatableValue(std::move(other));
71
+ }
72
+ return *this;
73
+ }
74
+
75
+ ~TemplatableValue() {
76
+ if (type_ == VALUE) {
77
+ this->value_.~T();
78
+ } else if (type_ == LAMBDA) {
79
+ delete this->f_;
80
+ }
81
+ }
35
82
 
36
83
  bool has_value() { return this->type_ != NONE; }
37
84
 
38
85
  T value(X... x) {
39
86
  if (this->type_ == LAMBDA) {
40
- return this->f_(x...);
87
+ return (*this->f_)(x...);
41
88
  }
42
89
  // return value also when none
43
- return this->value_;
90
+ return this->type_ == VALUE ? this->value_ : T{};
44
91
  }
45
92
 
46
93
  optional<T> optional_value(X... x) {
@@ -58,14 +105,16 @@ template<typename T, typename... X> class TemplatableValue {
58
105
  }
59
106
 
60
107
  protected:
61
- enum {
108
+ enum : uint8_t {
62
109
  NONE,
63
110
  VALUE,
64
111
  LAMBDA,
65
112
  } type_;
66
113
 
67
- T value_{};
68
- std::function<T(X...)> f_{};
114
+ union {
115
+ T value_;
116
+ std::function<T(X...)> *f_;
117
+ };
69
118
  };
70
119
 
71
120
  /** Base class for all automation conditions.
esphome/core/color.cpp CHANGED
@@ -2,10 +2,8 @@
2
2
 
3
3
  namespace esphome {
4
4
 
5
- const Color Color::BLACK(0, 0, 0, 0);
6
- const Color Color::WHITE(255, 255, 255, 255);
7
-
8
- const Color COLOR_BLACK(0, 0, 0, 0);
9
- const Color COLOR_WHITE(255, 255, 255, 255);
5
+ // C++20 constinit ensures compile-time initialization (stored in ROM)
6
+ constinit const Color Color::BLACK(0, 0, 0, 0);
7
+ constinit const Color Color::WHITE(255, 255, 255, 255);
10
8
 
11
9
  } // namespace esphome
esphome/core/color.h CHANGED
@@ -5,7 +5,9 @@
5
5
 
6
6
  namespace esphome {
7
7
 
8
- inline static uint8_t esp_scale8(uint8_t i, uint8_t scale) { return (uint16_t(i) * (1 + uint16_t(scale))) / 256; }
8
+ inline static constexpr uint8_t esp_scale8(uint8_t i, uint8_t scale) {
9
+ return (uint16_t(i) * (1 + uint16_t(scale))) / 256;
10
+ }
9
11
 
10
12
  struct Color {
11
13
  union {
@@ -31,17 +33,20 @@ struct Color {
31
33
  uint32_t raw_32;
32
34
  };
33
35
 
34
- inline Color() ESPHOME_ALWAYS_INLINE : r(0), g(0), b(0), w(0) {} // NOLINT
35
- inline Color(uint8_t red, uint8_t green, uint8_t blue) ESPHOME_ALWAYS_INLINE : r(red), g(green), b(blue), w(0) {}
36
+ inline constexpr Color() ESPHOME_ALWAYS_INLINE : raw_32(0) {} // NOLINT
37
+ inline constexpr Color(uint8_t red, uint8_t green, uint8_t blue) ESPHOME_ALWAYS_INLINE : r(red),
38
+ g(green),
39
+ b(blue),
40
+ w(0) {}
36
41
 
37
- inline Color(uint8_t red, uint8_t green, uint8_t blue, uint8_t white) ESPHOME_ALWAYS_INLINE : r(red),
38
- g(green),
39
- b(blue),
40
- w(white) {}
41
- inline explicit Color(uint32_t colorcode) ESPHOME_ALWAYS_INLINE : r((colorcode >> 16) & 0xFF),
42
- g((colorcode >> 8) & 0xFF),
43
- b((colorcode >> 0) & 0xFF),
44
- w((colorcode >> 24) & 0xFF) {}
42
+ inline constexpr Color(uint8_t red, uint8_t green, uint8_t blue, uint8_t white) ESPHOME_ALWAYS_INLINE : r(red),
43
+ g(green),
44
+ b(blue),
45
+ w(white) {}
46
+ inline explicit constexpr Color(uint32_t colorcode) ESPHOME_ALWAYS_INLINE : r((colorcode >> 16) & 0xFF),
47
+ g((colorcode >> 8) & 0xFF),
48
+ b((colorcode >> 0) & 0xFF),
49
+ w((colorcode >> 24) & 0xFF) {}
45
50
 
46
51
  inline bool is_on() ESPHOME_ALWAYS_INLINE { return this->raw_32 != 0; }
47
52
 
@@ -169,9 +174,4 @@ struct Color {
169
174
  static const Color WHITE;
170
175
  };
171
176
 
172
- ESPDEPRECATED("Use Color::BLACK instead of COLOR_BLACK", "v1.21")
173
- extern const Color COLOR_BLACK;
174
- ESPDEPRECATED("Use Color::WHITE instead of COLOR_WHITE", "v1.21")
175
- extern const Color COLOR_WHITE;
176
-
177
177
  } // namespace esphome