esphome 2025.6.2__py3-none-any.whl → 2025.7.0__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 (648) 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 +10 -4
  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/as3935_spi/as3935_spi.h +0 -2
  42. esphome/components/as5600/as5600.h +0 -1
  43. esphome/components/async_tcp/__init__.py +14 -5
  44. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  45. esphome/components/atm90e32/atm90e32.cpp +2 -1
  46. esphome/components/audio/audio_decoder.cpp +1 -1
  47. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  48. esphome/components/b_parasite/b_parasite.h +0 -1
  49. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  50. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  51. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  52. esphome/components/bh1750/bh1750.cpp +5 -5
  53. esphome/components/binary_sensor/__init__.py +82 -5
  54. esphome/components/binary_sensor/automation.h +19 -1
  55. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  56. esphome/components/binary_sensor/binary_sensor.h +11 -25
  57. esphome/components/binary_sensor/filter.cpp +29 -24
  58. esphome/components/binary_sensor/filter.h +20 -10
  59. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  60. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  63. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  64. esphome/components/ble_client/switch/ble_switch.h +0 -1
  65. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  66. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  67. esphome/components/ble_presence/ble_presence_device.h +0 -1
  68. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  69. esphome/components/ble_scanner/ble_scanner.h +0 -1
  70. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  71. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  72. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  73. esphome/components/bme680/sensor.py +1 -1
  74. esphome/components/bmp581/bmp581.h +0 -2
  75. esphome/components/button/__init__.py +5 -2
  76. esphome/components/camera/__init__.py +1 -0
  77. esphome/components/camera/camera.cpp +22 -0
  78. esphome/components/camera/camera.h +80 -0
  79. esphome/components/canbus/__init__.py +1 -0
  80. esphome/components/cap1188/cap1188.h +0 -1
  81. esphome/components/captive_portal/__init__.py +12 -2
  82. esphome/components/captive_portal/captive_portal.cpp +12 -2
  83. esphome/components/captive_portal/captive_portal.h +5 -2
  84. esphome/components/ccs811/ccs811.h +0 -2
  85. esphome/components/climate/__init__.py +5 -2
  86. esphome/components/cm1106/sensor.py +2 -2
  87. esphome/components/const/__init__.py +2 -0
  88. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  89. esphome/components/copy/button/copy_button.h +0 -1
  90. esphome/components/copy/cover/copy_cover.h +0 -1
  91. esphome/components/copy/fan/copy_fan.h +0 -1
  92. esphome/components/copy/lock/copy_lock.h +0 -1
  93. esphome/components/copy/number/copy_number.h +0 -1
  94. esphome/components/copy/select/copy_select.h +0 -1
  95. esphome/components/copy/sensor/copy_sensor.h +0 -1
  96. esphome/components/copy/switch/copy_switch.h +0 -1
  97. esphome/components/copy/text/copy_text.h +0 -1
  98. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  99. esphome/components/cover/__init__.py +5 -2
  100. esphome/components/cs5460a/cs5460a.h +0 -1
  101. esphome/components/datetime/__init__.py +4 -2
  102. esphome/components/debug/__init__.py +20 -0
  103. esphome/components/debug/debug_esp32.cpp +2 -0
  104. esphome/components/deep_sleep/__init__.py +43 -9
  105. esphome/components/demo/__init__.py +2 -2
  106. esphome/components/display/display.cpp +4 -3
  107. esphome/components/display/display.h +0 -2
  108. esphome/components/display/display_buffer.cpp +1 -1
  109. esphome/components/ds2484/__init__.py +1 -0
  110. esphome/components/ds2484/ds2484.cpp +209 -0
  111. esphome/components/ds2484/ds2484.h +43 -0
  112. esphome/components/ds2484/one_wire.py +37 -0
  113. esphome/components/duty_time/duty_time_sensor.h +0 -1
  114. esphome/components/ens160_base/ens160_base.h +0 -1
  115. esphome/components/es7210/es7210.h +0 -1
  116. esphome/components/es7243e/es7243e.h +0 -1
  117. esphome/components/es8156/es8156.h +0 -1
  118. esphome/components/es8311/es8311.h +0 -1
  119. esphome/components/es8388/es8388.h +0 -1
  120. esphome/components/esp32/__init__.py +103 -135
  121. esphome/components/esp32/core.cpp +0 -4
  122. esphome/components/esp32/gpio.h +1 -1
  123. esphome/components/esp32/helpers.cpp +69 -0
  124. esphome/components/esp32_ble/ble.cpp +5 -6
  125. esphome/components/esp32_ble/ble.h +29 -14
  126. esphome/components/esp32_ble/ble_event.h +6 -6
  127. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  128. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  129. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  130. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  131. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  132. esphome/components/esp32_camera/__init__.py +112 -98
  133. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  134. esphome/components/esp32_camera/esp32_camera.h +35 -30
  135. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  136. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  137. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  138. esphome/components/esp32_hall/sensor.py +2 -21
  139. esphome/components/esp32_hosted/__init__.py +101 -0
  140. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  141. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  142. esphome/components/esp32_rmt/__init__.py +0 -58
  143. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  144. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  145. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  146. esphome/components/esp32_touch/esp32_touch.h +174 -28
  147. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  148. esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
  149. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  150. esphome/components/esp8266/__init__.py +2 -0
  151. esphome/components/esp8266/gpio.cpp +10 -10
  152. esphome/components/esp8266/helpers.cpp +31 -0
  153. esphome/components/esp_ldo/__init__.py +10 -8
  154. esphome/components/esp_ldo/esp_ldo.h +3 -0
  155. esphome/components/esphome/ota/__init__.py +1 -0
  156. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  157. esphome/components/ethernet/__init__.py +42 -23
  158. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  159. esphome/components/ethernet/ethernet_component.cpp +69 -29
  160. esphome/components/ethernet/ethernet_component.h +18 -10
  161. esphome/components/event/__init__.py +5 -2
  162. esphome/components/ezo/ezo.h +0 -1
  163. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  164. esphome/components/fan/__init__.py +5 -2
  165. esphome/components/fan/fan.cpp +4 -0
  166. esphome/components/feedback/feedback_cover.h +0 -1
  167. esphome/components/font/__init__.py +92 -82
  168. esphome/components/font/font.cpp +9 -2
  169. esphome/components/font/font.h +20 -5
  170. esphome/components/fs3000/fs3000.h +0 -1
  171. esphome/components/gcja5/gcja5.h +0 -1
  172. esphome/components/gl_r01_i2c/__init__.py +0 -0
  173. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  174. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  175. esphome/components/gl_r01_i2c/sensor.py +36 -0
  176. esphome/components/gp8403/gp8403.h +0 -1
  177. esphome/components/gpio/binary_sensor/__init__.py +39 -1
  178. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  179. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  180. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  181. esphome/components/he60r/he60r.h +0 -1
  182. esphome/components/heatpumpir/climate.py +2 -1
  183. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  184. esphome/components/heatpumpir/heatpumpir.h +1 -0
  185. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  186. esphome/components/host/__init__.py +3 -1
  187. esphome/components/host/helpers.cpp +57 -0
  188. esphome/components/http_request/__init__.py +19 -1
  189. esphome/components/http_request/http_request.h +1 -1
  190. esphome/components/http_request/http_request_arduino.cpp +0 -1
  191. esphome/components/http_request/http_request_arduino.h +1 -0
  192. esphome/components/http_request/http_request_idf.cpp +0 -1
  193. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  194. esphome/components/http_request/update/http_request_update.cpp +35 -16
  195. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  196. esphome/components/hydreon_rgxx/sensor.py +1 -1
  197. esphome/components/i2c/__init__.py +23 -11
  198. esphome/components/i2c/i2c_bus.h +8 -1
  199. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  200. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  201. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  202. esphome/components/i2c_device/i2c_device.h +0 -1
  203. esphome/components/i2s_audio/__init__.py +2 -10
  204. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  205. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  206. esphome/components/i2s_audio/speaker/__init__.py +1 -1
  207. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  208. esphome/components/iaqcore/iaqcore.h +0 -2
  209. esphome/components/image/__init__.py +123 -24
  210. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  211. esphome/components/ina219/ina219.cpp +7 -0
  212. esphome/components/ina219/ina219.h +1 -0
  213. esphome/components/ina260/ina260.h +0 -2
  214. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  215. esphome/components/inkplate6/display.py +15 -0
  216. esphome/components/inkplate6/inkplate.cpp +2 -2
  217. esphome/components/integration/integration_sensor.h +0 -1
  218. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  219. esphome/components/internal_temperature/sensor.py +0 -26
  220. esphome/components/interval/interval.h +0 -2
  221. esphome/components/json/__init__.py +1 -1
  222. esphome/components/json/json_util.cpp +56 -63
  223. esphome/components/ld2410/button/__init__.py +3 -3
  224. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  225. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  226. esphome/components/ld2410/ld2410.cpp +421 -268
  227. esphome/components/ld2410/ld2410.h +44 -146
  228. esphome/components/ld2410/number/__init__.py +2 -2
  229. esphome/components/ld2410/sensor.py +1 -1
  230. esphome/components/ld2410/switch/__init__.py +1 -1
  231. esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp +2 -2
  232. esphome/components/ld2420/button/reconfig_buttons.cpp +1 -1
  233. esphome/components/ld2420/ld2420.cpp +252 -147
  234. esphome/components/ld2420/ld2420.h +52 -126
  235. esphome/components/ld2420/number/__init__.py +2 -2
  236. esphome/components/ld2420/number/gate_config_number.cpp +1 -1
  237. esphome/components/ld2420/select/operating_mode_select.cpp +1 -1
  238. esphome/components/ld2420/sensor/__init__.py +6 -2
  239. esphome/components/ld2420/sensor/ld2420_sensor.cpp +2 -2
  240. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  241. esphome/components/ld2420/text_sensor/text_sensor.cpp +2 -2
  242. esphome/components/ld2450/button/__init__.py +3 -3
  243. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  244. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  245. esphome/components/ld2450/ld2450.cpp +384 -232
  246. esphome/components/ld2450/ld2450.h +60 -69
  247. esphome/components/ld2450/switch/__init__.py +1 -1
  248. esphome/components/ledc/ledc_output.cpp +1 -63
  249. esphome/components/libretiny/__init__.py +5 -3
  250. esphome/components/libretiny/const.py +5 -0
  251. esphome/components/libretiny/generate_components.py +1 -0
  252. esphome/components/libretiny/helpers.cpp +35 -0
  253. esphome/components/libretiny/lt_component.cpp +5 -3
  254. esphome/components/light/__init__.py +4 -2
  255. esphome/components/light/addressable_light.h +3 -3
  256. esphome/components/light/light_call.cpp +180 -243
  257. esphome/components/light/light_call.h +72 -20
  258. esphome/components/light/light_color_values.h +14 -14
  259. esphome/components/light/light_json_schema.cpp +17 -16
  260. esphome/components/light/light_state.h +15 -13
  261. esphome/components/light/transformers.h +2 -2
  262. esphome/components/ln882x/__init__.py +52 -0
  263. esphome/components/ln882x/boards.py +285 -0
  264. esphome/components/lock/__init__.py +5 -2
  265. esphome/components/logger/__init__.py +40 -3
  266. esphome/components/logger/logger.cpp +47 -12
  267. esphome/components/logger/logger.h +80 -49
  268. esphome/components/logger/logger_esp32.cpp +3 -3
  269. esphome/components/lps22/__init__.py +0 -0
  270. esphome/components/lps22/lps22.cpp +75 -0
  271. esphome/components/lps22/lps22.h +27 -0
  272. esphome/components/lps22/sensor.py +58 -0
  273. esphome/components/ltr390/ltr390.h +0 -1
  274. esphome/components/ltr501/ltr501.h +0 -1
  275. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  276. esphome/components/lvgl/__init__.py +1 -1
  277. esphome/components/lvgl/schemas.py +66 -6
  278. esphome/components/lvgl/styles.py +24 -16
  279. esphome/components/lvgl/widgets/__init__.py +12 -2
  280. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  281. esphome/components/lvgl/widgets/meter.py +20 -13
  282. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  283. esphome/components/max9611/max9611.h +0 -1
  284. esphome/components/mcp23016/__init__.py +1 -1
  285. esphome/components/mcp23xxx_base/__init__.py +1 -1
  286. esphome/components/mcp4461/__init__.py +1 -1
  287. esphome/components/mcp4461/output/__init__.py +3 -2
  288. esphome/components/mcp9600/mcp9600.h +0 -2
  289. esphome/components/md5/md5.cpp +3 -3
  290. esphome/components/md5/md5.h +1 -6
  291. esphome/components/mdns/__init__.py +22 -11
  292. esphome/components/media_player/__init__.py +4 -3
  293. esphome/components/micro_wake_word/__init__.py +1 -5
  294. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  295. esphome/components/microphone/microphone.cpp +7 -9
  296. esphome/components/microphone/microphone.h +0 -2
  297. esphome/components/mipi_spi/display.py +1 -0
  298. esphome/components/mmc5603/mmc5603.cpp +1 -1
  299. esphome/components/modbus/modbus.cpp +33 -15
  300. esphome/components/modbus/modbus.h +9 -0
  301. esphome/components/modbus_controller/__init__.py +42 -10
  302. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  303. esphome/components/modbus_controller/modbus_controller.h +61 -7
  304. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  305. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  306. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  307. esphome/components/mqtt/__init__.py +16 -0
  308. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +2 -1
  309. esphome/components/mqtt/mqtt_backend.h +2 -1
  310. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  311. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  312. esphome/components/mqtt/mqtt_binary_sensor.cpp +1 -0
  313. esphome/components/mqtt/mqtt_button.cpp +4 -1
  314. esphome/components/mqtt/mqtt_client.cpp +17 -9
  315. esphome/components/mqtt/mqtt_client.h +8 -3
  316. esphome/components/mqtt/mqtt_climate.cpp +6 -4
  317. esphome/components/mqtt/mqtt_component.cpp +3 -1
  318. esphome/components/mqtt/mqtt_cover.cpp +1 -0
  319. esphome/components/mqtt/mqtt_date.cpp +4 -3
  320. esphome/components/mqtt/mqtt_datetime.cpp +7 -6
  321. esphome/components/mqtt/mqtt_event.cpp +6 -3
  322. esphome/components/mqtt/mqtt_fan.cpp +1 -0
  323. esphome/components/mqtt/mqtt_light.cpp +8 -4
  324. esphome/components/mqtt/mqtt_lock.cpp +3 -1
  325. esphome/components/mqtt/mqtt_number.cpp +1 -0
  326. esphome/components/mqtt/mqtt_select.cpp +2 -1
  327. esphome/components/mqtt/mqtt_sensor.cpp +3 -1
  328. esphome/components/mqtt/mqtt_switch.cpp +3 -1
  329. esphome/components/mqtt/mqtt_text.cpp +1 -0
  330. esphome/components/mqtt/mqtt_text_sensor.cpp +3 -1
  331. esphome/components/mqtt/mqtt_time.cpp +4 -3
  332. esphome/components/mqtt/mqtt_update.cpp +1 -0
  333. esphome/components/mqtt/mqtt_valve.cpp +3 -1
  334. esphome/components/ms8607/ms8607.cpp +1 -1
  335. esphome/components/ms8607/ms8607.h +0 -1
  336. esphome/components/neopixelbus/light.py +4 -1
  337. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  338. esphome/components/network/__init__.py +4 -1
  339. esphome/components/network/ip_address.h +1 -0
  340. esphome/components/nextion/__init__.py +16 -0
  341. esphome/components/nextion/base_component.py +1 -0
  342. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  343. esphome/components/nextion/display.py +14 -4
  344. esphome/components/nextion/nextion.cpp +166 -101
  345. esphome/components/nextion/nextion.h +84 -53
  346. esphome/components/nextion/nextion_commands.cpp +11 -10
  347. esphome/components/nextion/nextion_component.cpp +28 -28
  348. esphome/components/nextion/nextion_component.h +53 -18
  349. esphome/components/nextion/nextion_component_base.h +3 -0
  350. esphome/components/nextion/nextion_upload.cpp +36 -0
  351. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  352. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  353. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  354. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  355. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  356. esphome/components/nfc/nfc.cpp +3 -22
  357. esphome/components/nfc/nfc.h +3 -3
  358. esphome/components/number/__init__.py +5 -2
  359. esphome/components/online_image/__init__.py +9 -1
  360. esphome/components/online_image/online_image.cpp +17 -7
  361. esphome/components/online_image/online_image.h +10 -2
  362. esphome/components/opentherm/opentherm.cpp +7 -12
  363. esphome/components/opentherm/output/output.cpp +1 -1
  364. esphome/components/openthread/__init__.py +47 -40
  365. esphome/components/openthread/const.py +1 -0
  366. esphome/components/openthread/openthread_esp.cpp +27 -5
  367. esphome/components/opt3001/__init__.py +0 -0
  368. esphome/components/opt3001/opt3001.cpp +122 -0
  369. esphome/components/opt3001/opt3001.h +27 -0
  370. esphome/components/opt3001/sensor.py +35 -0
  371. esphome/components/ota/__init__.py +17 -0
  372. esphome/components/ota/ota_backend.h +27 -1
  373. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  374. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  375. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  376. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  377. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  378. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  379. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  380. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  381. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  382. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  383. esphome/components/packages/__init__.py +5 -2
  384. esphome/components/packet_transport/binary_sensor.py +61 -4
  385. esphome/components/packet_transport/packet_transport.cpp +34 -1
  386. esphome/components/packet_transport/packet_transport.h +11 -5
  387. esphome/components/pcf8574/__init__.py +1 -1
  388. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  389. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  390. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  391. esphome/components/pmsa003i/pmsa003i.h +0 -1
  392. esphome/components/pmsx003/pmsx003.h +0 -1
  393. esphome/components/pn7150/pn7150.cpp +7 -7
  394. esphome/components/pn7150/pn7150.h +0 -1
  395. esphome/components/pn7160/pn7160.cpp +7 -7
  396. esphome/components/pn7160/pn7160.h +0 -1
  397. esphome/components/preferences/syncer.h +2 -0
  398. esphome/components/prometheus/prometheus_handler.h +1 -1
  399. esphome/components/psram/psram.cpp +0 -20
  400. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  401. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  402. esphome/components/pulse_width/pulse_width.h +0 -1
  403. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  404. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  405. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  406. esphome/components/qr_code/__init__.py +13 -10
  407. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  408. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  409. esphome/components/rc522/rc522.h +0 -1
  410. esphome/components/rdm6300/rdm6300.h +0 -2
  411. esphome/components/remote_base/__init__.py +7 -5
  412. esphome/components/remote_base/remote_base.cpp +24 -21
  413. esphome/components/remote_base/remote_base.h +3 -26
  414. esphome/components/remote_receiver/__init__.py +40 -46
  415. esphome/components/remote_receiver/remote_receiver.h +4 -18
  416. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  417. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  418. esphome/components/remote_transmitter/__init__.py +42 -43
  419. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  420. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  421. esphome/components/resistance/resistance_sensor.h +0 -1
  422. esphome/components/rp2040/__init__.py +2 -0
  423. esphome/components/rp2040/helpers.cpp +55 -0
  424. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  425. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  426. esphome/components/rtttl/__init__.py +4 -4
  427. esphome/components/rtttl/rtttl.cpp +10 -1
  428. esphome/components/ruuvitag/ruuvitag.h +0 -1
  429. esphome/components/safe_mode/safe_mode.cpp +2 -0
  430. esphome/components/safe_mode/safe_mode.h +4 -1
  431. esphome/components/scd30/scd30.h +0 -1
  432. esphome/components/scd30/sensor.py +2 -2
  433. esphome/components/scd4x/scd4x.cpp +61 -54
  434. esphome/components/scd4x/scd4x.h +17 -15
  435. esphome/components/scd4x/sensor.py +4 -4
  436. esphome/components/script/script.h +0 -2
  437. esphome/components/sdp3x/sensor.py +1 -1
  438. esphome/components/select/__init__.py +5 -2
  439. esphome/components/sen5x/sen5x.h +0 -1
  440. esphome/components/senseair/senseair.h +0 -1
  441. esphome/components/sensor/__init__.py +4 -2
  442. esphome/components/sensor/filter.cpp +1 -1
  443. esphome/components/sensor/sensor.cpp +12 -6
  444. esphome/components/sensor/sensor.h +13 -5
  445. esphome/components/servo/servo.cpp +2 -2
  446. esphome/components/servo/servo.h +0 -1
  447. esphome/components/sfa30/sfa30.h +0 -1
  448. esphome/components/sgp30/sgp30.h +0 -1
  449. esphome/components/sgp4x/sgp4x.h +0 -1
  450. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  451. esphome/components/sht4x/sht4x.h +0 -1
  452. esphome/components/sm300d2/sm300d2.h +0 -2
  453. esphome/components/smt100/sensor.py +8 -4
  454. esphome/components/smt100/smt100.cpp +5 -5
  455. esphome/components/smt100/smt100.h +3 -3
  456. esphome/components/sn74hc595/__init__.py +1 -1
  457. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  458. esphome/components/sntp/sntp_component.cpp +9 -3
  459. esphome/components/sntp/time.py +2 -0
  460. esphome/components/socket/__init__.py +17 -0
  461. esphome/components/spi/__init__.py +27 -6
  462. esphome/components/spi/spi.cpp +3 -2
  463. esphome/components/spi/spi.h +9 -3
  464. esphome/components/spi/spi_arduino.cpp +3 -5
  465. esphome/components/spi/spi_esp_idf.cpp +40 -21
  466. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  467. esphome/components/sps30/sps30.h +0 -1
  468. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  469. esphome/components/st7701s/st7701s.cpp +0 -4
  470. esphome/components/status/status_binary_sensor.h +0 -2
  471. esphome/components/substitutions/__init__.py +81 -21
  472. esphome/components/substitutions/jinja.py +99 -0
  473. esphome/components/sun/sun.cpp +3 -4
  474. esphome/components/switch/__init__.py +5 -2
  475. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  476. esphome/components/sx126x/__init__.py +317 -0
  477. esphome/components/sx126x/automation.h +62 -0
  478. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  479. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  480. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  481. esphome/components/sx126x/sx126x.cpp +523 -0
  482. esphome/components/sx126x/sx126x.h +140 -0
  483. esphome/components/sx126x/sx126x_reg.h +163 -0
  484. esphome/components/sx127x/__init__.py +325 -0
  485. esphome/components/sx127x/automation.h +62 -0
  486. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  487. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  488. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  489. esphome/components/sx127x/sx127x.cpp +498 -0
  490. esphome/components/sx127x/sx127x.h +128 -0
  491. esphome/components/sx127x/sx127x_reg.h +295 -0
  492. esphome/components/syslog/esphome_syslog.cpp +5 -3
  493. esphome/components/syslog/esphome_syslog.h +1 -1
  494. esphome/components/tca9555/__init__.py +1 -1
  495. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  496. esphome/components/text/__init__.py +5 -2
  497. esphome/components/text_sensor/__init__.py +5 -2
  498. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  499. esphome/components/thermostat/thermostat_climate.h +43 -39
  500. esphome/components/time/__init__.py +16 -2
  501. esphome/components/time/real_time_clock.cpp +4 -0
  502. esphome/components/time/real_time_clock.h +5 -1
  503. esphome/components/tlc5971/tlc5971.cpp +4 -1
  504. esphome/components/tmp1075/tmp1075.h +0 -2
  505. esphome/components/tof10120/tof10120_sensor.h +0 -1
  506. esphome/components/tormatic/tormatic_cover.h +0 -1
  507. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  508. esphome/components/tsl2591/tsl2591.cpp +1 -1
  509. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  510. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  511. esphome/components/tx20/tx20.cpp +2 -2
  512. esphome/components/uart/__init__.py +18 -0
  513. esphome/components/uart/uart_component_esp_idf.cpp +1 -5
  514. esphome/components/update/__init__.py +5 -2
  515. esphome/components/update/update_entity.h +8 -0
  516. esphome/components/usb_host/__init__.py +5 -2
  517. esphome/components/usb_host/usb_host_client.cpp +10 -10
  518. esphome/components/usb_uart/cp210x.cpp +1 -1
  519. esphome/components/usb_uart/usb_uart.cpp +41 -44
  520. esphome/components/usb_uart/usb_uart.h +4 -3
  521. esphome/components/valve/__init__.py +5 -2
  522. esphome/components/vbus/vbus.h +0 -1
  523. esphome/components/veml3235/veml3235.h +0 -1
  524. esphome/components/veml7700/veml7700.h +0 -1
  525. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  526. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  527. esphome/components/watchdog/watchdog.cpp +0 -4
  528. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  529. esphome/components/web_server/__init__.py +34 -19
  530. esphome/components/web_server/ota/__init__.py +32 -0
  531. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  532. esphome/components/web_server/ota/ota_web_server.h +26 -0
  533. esphome/components/web_server/web_server.cpp +324 -439
  534. esphome/components/web_server/web_server.h +33 -23
  535. esphome/components/web_server/web_server_v1.cpp +4 -5
  536. esphome/components/web_server_base/__init__.py +5 -2
  537. esphome/components/web_server_base/web_server_base.cpp +2 -94
  538. esphome/components/web_server_base/web_server_base.h +5 -25
  539. esphome/components/web_server_idf/multipart.cpp +254 -0
  540. esphome/components/web_server_idf/multipart.h +86 -0
  541. esphome/components/web_server_idf/utils.cpp +32 -0
  542. esphome/components/web_server_idf/utils.h +10 -0
  543. esphome/components/web_server_idf/web_server_idf.cpp +164 -16
  544. esphome/components/web_server_idf/web_server_idf.h +11 -10
  545. esphome/components/wiegand/wiegand.cpp +2 -2
  546. esphome/components/wifi/__init__.py +18 -0
  547. esphome/components/wifi/wifi_component.cpp +17 -22
  548. esphome/components/wifi/wifi_component.h +27 -23
  549. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  550. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  551. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  552. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  553. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  554. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  555. esphome/components/wireguard/__init__.py +2 -11
  556. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  557. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  558. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  559. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  560. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  561. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  562. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  563. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  564. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  565. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  566. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  567. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  568. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  569. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  570. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  571. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  572. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  573. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  574. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  575. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  576. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  577. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  578. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  579. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  580. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  581. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  582. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  583. esphome/components/zyaura/zyaura.h +0 -1
  584. esphome/config.py +88 -22
  585. esphome/config_helpers.py +74 -1
  586. esphome/config_validation.py +12 -1
  587. esphome/const.py +65 -10
  588. esphome/core/__init__.py +18 -2
  589. esphome/core/application.cpp +169 -10
  590. esphome/core/application.h +145 -165
  591. esphome/core/area.h +19 -0
  592. esphome/core/automation.h +58 -9
  593. esphome/core/color.cpp +3 -5
  594. esphome/core/color.h +16 -16
  595. esphome/core/component.cpp +156 -22
  596. esphome/core/component.h +98 -4
  597. esphome/core/component_iterator.cpp +11 -9
  598. esphome/core/component_iterator.h +12 -10
  599. esphome/core/config.py +155 -6
  600. esphome/core/controller.cpp +4 -2
  601. esphome/core/controller.h +1 -1
  602. esphome/core/datatypes.h +2 -2
  603. esphome/core/defines.h +17 -2
  604. esphome/core/device.h +20 -0
  605. esphome/core/entity_base.cpp +20 -15
  606. esphome/core/entity_base.h +76 -0
  607. esphome/core/entity_helpers.py +168 -1
  608. esphome/core/event_pool.h +81 -0
  609. esphome/core/helpers.cpp +75 -230
  610. esphome/core/helpers.h +165 -105
  611. esphome/core/lock_free_queue.h +151 -0
  612. esphome/core/log.cpp +2 -2
  613. esphome/core/log.h +2 -0
  614. esphome/core/optional.h +5 -0
  615. esphome/core/ring_buffer.cpp +2 -2
  616. esphome/core/scheduler.cpp +275 -103
  617. esphome/core/scheduler.h +154 -17
  618. esphome/core/time.cpp +5 -5
  619. esphome/core/time.h +5 -5
  620. esphome/cpp_generator.py +17 -0
  621. esphome/cpp_helpers.py +0 -22
  622. esphome/cpp_types.py +3 -1
  623. esphome/dashboard/entries.py +1 -1
  624. esphome/dashboard/util/text.py +5 -21
  625. esphome/dashboard/web_server.py +9 -1
  626. esphome/helpers.py +47 -0
  627. esphome/loader.py +15 -1
  628. esphome/pins.py +14 -8
  629. esphome/platformio_api.py +2 -0
  630. esphome/wizard.py +17 -4
  631. esphome/writer.py +44 -3
  632. esphome/yaml_util.py +0 -2
  633. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
  634. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/RECORD +639 -580
  635. esphome/components/api/api_pb2_size.h +0 -361
  636. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  637. esphome/components/esp32_ble/queue.h +0 -85
  638. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  639. esphome/components/esp32_hall/esp32_hall.h +0 -23
  640. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  641. esphome/components/ld2410/button/reset_button.cpp +0 -9
  642. esphome/components/ld2450/button/reset_button.cpp +0 -9
  643. esphome/components/openthread/tlv.py +0 -65
  644. /esphome/{dashboard/enum.py → enum.py} +0 -0
  645. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/WHEEL +0 -0
  646. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
  647. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
  648. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,36 @@
1
+ #pragma once
2
+
3
+ #include "esphome/core/component.h"
4
+ #include "esphome/components/sensor/sensor.h"
5
+ #include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
6
+ #include "esphome/components/xiaomi_ble/xiaomi_ble.h"
7
+
8
+ #ifdef USE_ESP32
9
+
10
+ namespace esphome {
11
+ namespace xiaomi_xmwsdj04mmc {
12
+
13
+ class XiaomiXMWSDJ04MMC : public Component, public esp32_ble_tracker::ESPBTDeviceListener {
14
+ public:
15
+ void set_address(uint64_t address) { this->address_ = address; }
16
+ void set_bindkey(const std::string &bindkey);
17
+
18
+ bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
19
+
20
+ void dump_config() override;
21
+ void set_temperature(sensor::Sensor *temperature) { this->temperature_ = temperature; }
22
+ void set_humidity(sensor::Sensor *humidity) { this->humidity_ = humidity; }
23
+ void set_battery_level(sensor::Sensor *battery_level) { this->battery_level_ = battery_level; }
24
+
25
+ protected:
26
+ uint64_t address_;
27
+ uint8_t bindkey_[16];
28
+ sensor::Sensor *temperature_{nullptr};
29
+ sensor::Sensor *humidity_{nullptr};
30
+ sensor::Sensor *battery_level_{nullptr};
31
+ };
32
+
33
+ } // namespace xiaomi_xmwsdj04mmc
34
+ } // namespace esphome
35
+
36
+ #endif
@@ -11,8 +11,6 @@ namespace zio_ultrasonic {
11
11
 
12
12
  class ZioUltrasonicComponent : public i2c::I2CDevice, public PollingComponent, public sensor::Sensor {
13
13
  public:
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
-
16
14
  void dump_config() override;
17
15
 
18
16
  void update() override;
@@ -69,7 +69,6 @@ class ZyAuraSensor : public PollingComponent {
69
69
  void setup() override { this->store_.setup(this->pin_clock_, this->pin_data_); }
70
70
  void dump_config() override;
71
71
  void update() override;
72
- float get_setup_priority() const override { return setup_priority::DATA; }
73
72
 
74
73
  protected:
75
74
  ZaSensorStore store_;
esphome/config.py CHANGED
@@ -67,6 +67,42 @@ ConfigPath = list[str | int]
67
67
  path_context = contextvars.ContextVar("Config path")
68
68
 
69
69
 
70
+ def _process_platform_config(
71
+ result: Config,
72
+ component_name: str,
73
+ platform_name: str,
74
+ platform_config: ConfigType,
75
+ path: ConfigPath,
76
+ ) -> None:
77
+ """Process a platform configuration and add necessary validation steps.
78
+
79
+ This is shared between LoadValidationStep and AutoLoadValidationStep to avoid duplication.
80
+ """
81
+ # Get the platform manifest
82
+ platform = get_platform(component_name, platform_name)
83
+ if platform is None:
84
+ result.add_str_error(
85
+ f"Platform not found: '{component_name}.{platform_name}'", path
86
+ )
87
+ return
88
+
89
+ # Add platform to loaded integrations
90
+ CORE.loaded_integrations.add(platform_name)
91
+ CORE.loaded_platforms.add(f"{component_name}/{platform_name}")
92
+
93
+ # Process platform's AUTO_LOAD
94
+ for load in platform.auto_load:
95
+ if load not in result:
96
+ result.add_validation_step(AutoLoadValidationStep(load))
97
+
98
+ # Add validation steps for the platform
99
+ p_domain = f"{component_name}.{platform_name}"
100
+ result.add_output_path(path, p_domain)
101
+ result.add_validation_step(
102
+ MetadataValidationStep(path, p_domain, platform_config, platform)
103
+ )
104
+
105
+
70
106
  def _path_begins_with(path: ConfigPath, other: ConfigPath) -> bool:
71
107
  if len(path) < len(other):
72
108
  return False
@@ -379,26 +415,11 @@ class LoadValidationStep(ConfigValidationStep):
379
415
  path,
380
416
  )
381
417
  continue
382
- # Remove temp output path and construct new one
418
+ # Remove temp output path
383
419
  result.remove_output_path(path, p_domain)
384
- p_domain = f"{self.domain}.{p_name}"
385
- result.add_output_path(path, p_domain)
386
- # Try Load platform
387
- platform = get_platform(self.domain, p_name)
388
- if platform is None:
389
- result.add_str_error(f"Platform not found: '{p_domain}'", path)
390
- continue
391
- CORE.loaded_integrations.add(p_name)
392
- CORE.loaded_platforms.add(f"{self.domain}/{p_name}")
393
420
 
394
- # Process AUTO_LOAD
395
- for load in platform.auto_load:
396
- if load not in result:
397
- result.add_validation_step(AutoLoadValidationStep(load))
398
-
399
- result.add_validation_step(
400
- MetadataValidationStep(path, p_domain, p_config, platform)
401
- )
421
+ # Process the platform configuration
422
+ _process_platform_config(result, self.domain, p_name, p_config, path)
402
423
 
403
424
 
404
425
  class AutoLoadValidationStep(ConfigValidationStep):
@@ -413,10 +434,56 @@ class AutoLoadValidationStep(ConfigValidationStep):
413
434
  self.domain = domain
414
435
 
415
436
  def run(self, result: Config) -> None:
416
- if self.domain in result:
417
- # already loaded
437
+ # Regular component auto-load (no platform)
438
+ if "." not in self.domain:
439
+ if self.domain in result:
440
+ # already loaded
441
+ return
442
+ result.add_validation_step(LoadValidationStep(self.domain, core.AutoLoad()))
418
443
  return
419
- result.add_validation_step(LoadValidationStep(self.domain, core.AutoLoad()))
444
+
445
+ # Platform-specific auto-load (e.g., "ota.web_server")
446
+ component_name, _, platform_name = self.domain.partition(".")
447
+
448
+ # Check if component exists
449
+ if component_name not in result:
450
+ # Component doesn't exist, load it first
451
+ result.add_validation_step(LoadValidationStep(component_name, []))
452
+ # Re-run this step after the component is loaded
453
+ result.add_validation_step(AutoLoadValidationStep(self.domain))
454
+ return
455
+
456
+ # Component exists, check if it's a platform component
457
+ component = get_component(component_name)
458
+ if component is None or not component.is_platform_component:
459
+ result.add_str_error(
460
+ f"Component {component_name} is not a platform component, "
461
+ f"cannot auto-load platform {platform_name}",
462
+ [component_name],
463
+ )
464
+ return
465
+
466
+ # Ensure the component config is a list
467
+ component_conf = result.get(component_name)
468
+ if not isinstance(component_conf, list):
469
+ component_conf = result[component_name] = []
470
+
471
+ # Check if platform already exists
472
+ if any(
473
+ isinstance(conf, dict) and conf.get(CONF_PLATFORM) == platform_name
474
+ for conf in component_conf
475
+ ):
476
+ return
477
+
478
+ # Add and process the platform configuration
479
+ platform_conf = core.AutoLoad()
480
+ platform_conf[CONF_PLATFORM] = platform_name
481
+ component_conf.append(platform_conf)
482
+
483
+ path = [component_name, len(component_conf) - 1]
484
+ _process_platform_config(
485
+ result, component_name, platform_name, platform_conf, path
486
+ )
420
487
 
421
488
 
422
489
  class MetadataValidationStep(ConfigValidationStep):
@@ -789,7 +856,6 @@ def validate_config(
789
856
  result.add_output_path([CONF_SUBSTITUTIONS], CONF_SUBSTITUTIONS)
790
857
  try:
791
858
  substitutions.do_substitution_pass(config, command_line_substitutions)
792
- substitutions.do_substitution_pass(config, command_line_substitutions)
793
859
  except vol.Invalid as err:
794
860
  result.add_error(err)
795
861
  return result
esphome/config_helpers.py CHANGED
@@ -1,4 +1,20 @@
1
- from esphome.const import CONF_ID
1
+ from collections.abc import Callable
2
+
3
+ from esphome.const import (
4
+ CONF_ID,
5
+ CONF_LEVEL,
6
+ CONF_LOGGER,
7
+ KEY_CORE,
8
+ KEY_TARGET_FRAMEWORK,
9
+ KEY_TARGET_PLATFORM,
10
+ PlatformFramework,
11
+ )
12
+ from esphome.core import CORE
13
+
14
+ # Pre-build lookup map from (platform, framework) tuples to PlatformFramework enum
15
+ _PLATFORM_FRAMEWORK_LOOKUP = {
16
+ (pf.value[0].value, pf.value[1].value): pf for pf in PlatformFramework
17
+ }
2
18
 
3
19
 
4
20
  class Extend:
@@ -103,3 +119,60 @@ def merge_config(full_old, full_new):
103
119
  return new
104
120
 
105
121
  return merge(full_old, full_new)
122
+
123
+
124
+ def filter_source_files_from_platform(
125
+ files_map: dict[str, set[PlatformFramework]],
126
+ ) -> Callable[[], list[str]]:
127
+ """Helper to build a FILTER_SOURCE_FILES function from platform mapping.
128
+
129
+ Args:
130
+ files_map: Dict mapping filename to set of PlatformFramework enums
131
+ that should compile this file
132
+
133
+ Returns:
134
+ Function that returns list of files to exclude for current platform
135
+ """
136
+
137
+ def filter_source_files() -> list[str]:
138
+ # Get current platform/framework
139
+ core_data = CORE.data.get(KEY_CORE, {})
140
+ target_platform = core_data.get(KEY_TARGET_PLATFORM)
141
+ target_framework = core_data.get(KEY_TARGET_FRAMEWORK)
142
+
143
+ if not target_platform or not target_framework:
144
+ return []
145
+
146
+ # Direct lookup of current PlatformFramework
147
+ current_platform_framework = _PLATFORM_FRAMEWORK_LOOKUP.get(
148
+ (target_platform, target_framework)
149
+ )
150
+
151
+ if not current_platform_framework:
152
+ return []
153
+
154
+ # Return files that should be excluded for current platform
155
+ return [
156
+ filename
157
+ for filename, platforms in files_map.items()
158
+ if current_platform_framework not in platforms
159
+ ]
160
+
161
+ return filter_source_files
162
+
163
+
164
+ def get_logger_level() -> str:
165
+ """Get the configured logger level.
166
+
167
+ This is used by components to determine what logging features to include
168
+ based on the configured log level.
169
+
170
+ Returns:
171
+ The configured logger level string, defaults to "DEBUG" if not configured
172
+ """
173
+ # Check if logger config exists
174
+ if CONF_LOGGER not in CORE.config:
175
+ return "DEBUG"
176
+
177
+ logger_config = CORE.config[CONF_LOGGER]
178
+ return logger_config.get(CONF_LEVEL, "DEBUG")
@@ -1,5 +1,7 @@
1
1
  """Helpers for config validation using voluptuous."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  from contextlib import contextmanager
4
6
  from dataclasses import dataclass
5
7
  from datetime import datetime
@@ -29,6 +31,7 @@ from esphome.const import (
29
31
  CONF_COMMAND_RETAIN,
30
32
  CONF_COMMAND_TOPIC,
31
33
  CONF_DAY,
34
+ CONF_DEVICE_ID,
32
35
  CONF_DISABLED_BY_DEFAULT,
33
36
  CONF_DISCOVERY,
34
37
  CONF_ENTITY_CATEGORY,
@@ -355,6 +358,13 @@ def icon(value):
355
358
  )
356
359
 
357
360
 
361
+ def sub_device_id(value: str | None) -> core.ID:
362
+ # Lazy import to avoid circular imports
363
+ from esphome.core.config import Device
364
+
365
+ return use_id(Device)(value)
366
+
367
+
358
368
  def boolean(value):
359
369
  """Validate the given config option to be a boolean.
360
370
 
@@ -1896,6 +1906,7 @@ ENTITY_BASE_SCHEMA = Schema(
1896
1906
  Optional(CONF_DISABLED_BY_DEFAULT, default=False): boolean,
1897
1907
  Optional(CONF_ICON): icon,
1898
1908
  Optional(CONF_ENTITY_CATEGORY): entity_category,
1909
+ Optional(CONF_DEVICE_ID): sub_device_id,
1899
1910
  }
1900
1911
  )
1901
1912
 
@@ -1964,7 +1975,7 @@ class Version:
1964
1975
  return f"{self.major}.{self.minor}.{self.patch}"
1965
1976
 
1966
1977
  @classmethod
1967
- def parse(cls, value: str) -> "Version":
1978
+ def parse(cls, value: str) -> Version:
1968
1979
  match = re.match(r"^(\d+).(\d+).(\d+)-?\w*$", value)
1969
1980
  if match is None:
1970
1981
  raise ValueError(f"Not a valid version number {value}")
esphome/const.py CHANGED
@@ -1,19 +1,65 @@
1
1
  """Constants used by esphome."""
2
2
 
3
- __version__ = "2025.6.2"
3
+ from enum import Enum
4
+
5
+ from esphome.enum import StrEnum
6
+
7
+ __version__ = "2025.7.0"
4
8
 
5
9
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
6
10
  VALID_SUBSTITUTIONS_CHARACTERS = (
7
11
  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
8
12
  )
9
13
 
10
- PLATFORM_BK72XX = "bk72xx"
11
- PLATFORM_ESP32 = "esp32"
12
- PLATFORM_ESP8266 = "esp8266"
13
- PLATFORM_HOST = "host"
14
- PLATFORM_LIBRETINY_OLDSTYLE = "libretiny"
15
- PLATFORM_RP2040 = "rp2040"
16
- PLATFORM_RTL87XX = "rtl87xx"
14
+
15
+ class Platform(StrEnum):
16
+ """Platform identifiers for ESPHome."""
17
+
18
+ BK72XX = "bk72xx"
19
+ ESP32 = "esp32"
20
+ ESP8266 = "esp8266"
21
+ HOST = "host"
22
+ LIBRETINY_OLDSTYLE = "libretiny"
23
+ LN882X = "ln882x"
24
+ RP2040 = "rp2040"
25
+ RTL87XX = "rtl87xx"
26
+
27
+
28
+ class Framework(StrEnum):
29
+ """Framework identifiers for ESPHome."""
30
+
31
+ ARDUINO = "arduino"
32
+ ESP_IDF = "esp-idf"
33
+ NATIVE = "host"
34
+
35
+
36
+ class PlatformFramework(Enum):
37
+ """Combined platform-framework identifiers with tuple values."""
38
+
39
+ # ESP32 variants
40
+ ESP32_ARDUINO = (Platform.ESP32, Framework.ARDUINO)
41
+ ESP32_IDF = (Platform.ESP32, Framework.ESP_IDF)
42
+
43
+ # Arduino framework platforms
44
+ ESP8266_ARDUINO = (Platform.ESP8266, Framework.ARDUINO)
45
+ RP2040_ARDUINO = (Platform.RP2040, Framework.ARDUINO)
46
+ BK72XX_ARDUINO = (Platform.BK72XX, Framework.ARDUINO)
47
+ RTL87XX_ARDUINO = (Platform.RTL87XX, Framework.ARDUINO)
48
+ LN882X_ARDUINO = (Platform.LN882X, Framework.ARDUINO)
49
+
50
+ # Host platform (native)
51
+ HOST_NATIVE = (Platform.HOST, Framework.NATIVE)
52
+
53
+
54
+ # Maintain backward compatibility by reassigning after enum definition
55
+ PLATFORM_BK72XX = Platform.BK72XX
56
+ PLATFORM_ESP32 = Platform.ESP32
57
+ PLATFORM_ESP8266 = Platform.ESP8266
58
+ PLATFORM_HOST = Platform.HOST
59
+ PLATFORM_LIBRETINY_OLDSTYLE = Platform.LIBRETINY_OLDSTYLE
60
+ PLATFORM_LN882X = Platform.LN882X
61
+ PLATFORM_RP2040 = Platform.RP2040
62
+ PLATFORM_RTL87XX = Platform.RTL87XX
17
63
 
18
64
 
19
65
  SOURCE_FILE_EXTENSIONS = {".cpp", ".hpp", ".h", ".c", ".tcc", ".ino"}
@@ -56,6 +102,8 @@ CONF_AP = "ap"
56
102
  CONF_APPARENT_POWER = "apparent_power"
57
103
  CONF_ARDUINO_VERSION = "arduino_version"
58
104
  CONF_AREA = "area"
105
+ CONF_AREA_ID = "area_id"
106
+ CONF_AREAS = "areas"
59
107
  CONF_ARGS = "args"
60
108
  CONF_ASSUMED_STATE = "assumed_state"
61
109
  CONF_AT = "at"
@@ -89,6 +137,7 @@ CONF_BIT_DEPTH = "bit_depth"
89
137
  CONF_BITS_PER_SAMPLE = "bits_per_sample"
90
138
  CONF_BLOCK = "block"
91
139
  CONF_BLUE = "blue"
140
+ CONF_BLUETOOTH = "bluetooth"
92
141
  CONF_BOARD = "board"
93
142
  CONF_BOARD_FLASH_MODE = "board_flash_mode"
94
143
  CONF_BORDER = "border"
@@ -216,6 +265,8 @@ CONF_DEST = "dest"
216
265
  CONF_DEVICE = "device"
217
266
  CONF_DEVICE_CLASS = "device_class"
218
267
  CONF_DEVICE_FACTOR = "device_factor"
268
+ CONF_DEVICE_ID = "device_id"
269
+ CONF_DEVICES = "devices"
219
270
  CONF_DIELECTRIC_CONSTANT = "dielectric_constant"
220
271
  CONF_DIMENSIONS = "dimensions"
221
272
  CONF_DIO_PIN = "dio_pin"
@@ -527,7 +578,9 @@ CONF_MONTH = "month"
527
578
  CONF_MONTHS = "months"
528
579
  CONF_MOSI_PIN = "mosi_pin"
529
580
  CONF_MOTION = "motion"
581
+ CONF_MOVE_THRESHOLD = "move_threshold"
530
582
  CONF_MOVEMENT_COUNTER = "movement_counter"
583
+ CONF_MOVING_DISTANCE = "moving_distance"
531
584
  CONF_MQTT = "mqtt"
532
585
  CONF_MQTT_ID = "mqtt_id"
533
586
  CONF_MULTIPLE = "multiple"
@@ -646,6 +699,7 @@ CONF_PAYLOAD = "payload"
646
699
  CONF_PAYLOAD_AVAILABLE = "payload_available"
647
700
  CONF_PAYLOAD_NOT_AVAILABLE = "payload_not_available"
648
701
  CONF_PERIOD = "period"
702
+ CONF_PERMITTIVITY = "permittivity"
649
703
  CONF_PH = "ph"
650
704
  CONF_PHASE_A = "phase_a"
651
705
  CONF_PHASE_ANGLE = "phase_angle"
@@ -835,6 +889,7 @@ CONF_STEP = "step"
835
889
  CONF_STEP_DELAY = "step_delay"
836
890
  CONF_STEP_MODE = "step_mode"
837
891
  CONF_STEP_PIN = "step_pin"
892
+ CONF_STILL_THRESHOLD = "still_threshold"
838
893
  CONF_STOP = "stop"
839
894
  CONF_STOP_ACTION = "stop_action"
840
895
  CONF_STORE_BASELINE = "store_baseline"
@@ -1091,7 +1146,7 @@ UNIT_KILOMETER_PER_HOUR = "km/h"
1091
1146
  UNIT_KILOVOLT_AMPS = "kVA"
1092
1147
  UNIT_KILOVOLT_AMPS_HOURS = "kVAh"
1093
1148
  UNIT_KILOVOLT_AMPS_REACTIVE = "kVAR"
1094
- UNIT_KILOVOLT_AMPS_REACTIVE_HOURS = "kVARh"
1149
+ UNIT_KILOVOLT_AMPS_REACTIVE_HOURS = "kvarh"
1095
1150
  UNIT_KILOWATT = "kW"
1096
1151
  UNIT_KILOWATT_HOURS = "kWh"
1097
1152
  UNIT_LITRE = "L"
@@ -1127,7 +1182,7 @@ UNIT_VOLT = "V"
1127
1182
  UNIT_VOLT_AMPS = "VA"
1128
1183
  UNIT_VOLT_AMPS_HOURS = "VAh"
1129
1184
  UNIT_VOLT_AMPS_REACTIVE = "var"
1130
- UNIT_VOLT_AMPS_REACTIVE_HOURS = "VARh"
1185
+ UNIT_VOLT_AMPS_REACTIVE_HOURS = "varh"
1131
1186
  UNIT_WATT = "W"
1132
1187
  UNIT_WATT_HOURS = "Wh"
1133
1188
 
esphome/core/__init__.py CHANGED
@@ -20,6 +20,7 @@ from esphome.const import (
20
20
  PLATFORM_ESP32,
21
21
  PLATFORM_ESP8266,
22
22
  PLATFORM_HOST,
23
+ PLATFORM_LN882X,
23
24
  PLATFORM_RP2040,
24
25
  PLATFORM_RTL87XX,
25
26
  )
@@ -507,6 +508,8 @@ class EsphomeCore:
507
508
  self.libraries: list[Library] = []
508
509
  # A set of build flags to set in the platformio project
509
510
  self.build_flags: set[str] = set()
511
+ # A set of build unflags to set in the platformio project
512
+ self.build_unflags: set[str] = set()
510
513
  # A set of defines to set for the compile process in esphome/core/defines.h
511
514
  self.defines: set[Define] = set()
512
515
  # A map of all platformio options to apply
@@ -520,6 +523,9 @@ class EsphomeCore:
520
523
  # Dict to track platform entity counts for pre-allocation
521
524
  # Key: platform name (e.g. "sensor", "binary_sensor"), Value: count
522
525
  self.platform_counts: defaultdict[str, int] = defaultdict(int)
526
+ # Track entity unique IDs to handle duplicates
527
+ # Set of (device_id, platform, sanitized_name) tuples
528
+ self.unique_ids: set[tuple[str, str, str]] = set()
523
529
  # Whether ESPHome was started in verbose mode
524
530
  self.verbose = False
525
531
  # Whether ESPHome was started in quiet mode
@@ -545,11 +551,13 @@ class EsphomeCore:
545
551
  self.global_statements = []
546
552
  self.libraries = []
547
553
  self.build_flags = set()
554
+ self.build_unflags = set()
548
555
  self.defines = set()
549
556
  self.platformio_options = {}
550
557
  self.loaded_integrations = set()
551
558
  self.component_ids = set()
552
559
  self.platform_counts = defaultdict(int)
560
+ self.unique_ids = set()
553
561
  PIN_SCHEMA_REGISTRY.reset()
554
562
 
555
563
  @property
@@ -654,9 +662,13 @@ class EsphomeCore:
654
662
  def is_rtl87xx(self):
655
663
  return self.target_platform == PLATFORM_RTL87XX
656
664
 
665
+ @property
666
+ def is_ln882x(self):
667
+ return self.target_platform == PLATFORM_LN882X
668
+
657
669
  @property
658
670
  def is_libretiny(self):
659
- return self.is_bk72xx or self.is_rtl87xx
671
+ return self.is_bk72xx or self.is_rtl87xx or self.is_ln882x
660
672
 
661
673
  @property
662
674
  def is_host(self):
@@ -766,11 +778,15 @@ class EsphomeCore:
766
778
  self.libraries.append(library)
767
779
  return library
768
780
 
769
- def add_build_flag(self, build_flag):
781
+ def add_build_flag(self, build_flag: str) -> str:
770
782
  self.build_flags.add(build_flag)
771
783
  _LOGGER.debug("Adding build flag: %s", build_flag)
772
784
  return build_flag
773
785
 
786
+ def add_build_unflag(self, build_unflag: str) -> None:
787
+ self.build_unflags.add(build_unflag)
788
+ _LOGGER.debug("Adding build unflag: %s", build_unflag)
789
+
774
790
  def add_define(self, define):
775
791
  if isinstance(define, str):
776
792
  define = Define(define)