esphome 2025.6.2__py3-none-any.whl → 2025.7.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +42 -20
  22. esphome/components/api/api_connection.cpp +318 -391
  23. esphome/components/api/api_connection.h +206 -126
  24. esphome/components/api/api_frame_helper.cpp +89 -124
  25. esphome/components/api/api_frame_helper.h +57 -45
  26. esphome/components/api/api_pb2.cpp +414 -4350
  27. esphome/components/api/api_pb2.h +287 -198
  28. esphome/components/api/api_pb2_dump.cpp +4333 -0
  29. esphome/components/api/api_pb2_service.cpp +180 -425
  30. esphome/components/api/api_pb2_service.h +7 -6
  31. esphome/components/api/api_pb2_size.h +2 -4
  32. esphome/components/api/api_server.cpp +138 -167
  33. esphome/components/api/api_server.h +66 -12
  34. esphome/components/api/client.py +10 -4
  35. esphome/components/api/list_entities.cpp +36 -105
  36. esphome/components/api/list_entities.h +31 -23
  37. esphome/components/api/proto.h +26 -3
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/as5600/as5600.h +0 -1
  41. esphome/components/async_tcp/__init__.py +14 -5
  42. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  43. esphome/components/atm90e32/atm90e32.cpp +2 -1
  44. esphome/components/audio/audio_decoder.cpp +1 -1
  45. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  46. esphome/components/b_parasite/b_parasite.h +0 -1
  47. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  48. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  49. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  50. esphome/components/bh1750/bh1750.cpp +5 -5
  51. esphome/components/binary_sensor/__init__.py +82 -5
  52. esphome/components/binary_sensor/automation.h +19 -1
  53. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  54. esphome/components/binary_sensor/binary_sensor.h +11 -25
  55. esphome/components/binary_sensor/filter.cpp +29 -24
  56. esphome/components/binary_sensor/filter.h +20 -10
  57. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  58. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  60. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  62. esphome/components/ble_client/switch/ble_switch.h +0 -1
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  65. esphome/components/ble_presence/ble_presence_device.h +0 -1
  66. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  67. esphome/components/ble_scanner/ble_scanner.h +0 -1
  68. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  69. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  71. esphome/components/bme680/sensor.py +1 -1
  72. esphome/components/bmp581/bmp581.h +0 -2
  73. esphome/components/button/__init__.py +5 -2
  74. esphome/components/camera/__init__.py +1 -0
  75. esphome/components/camera/camera.cpp +22 -0
  76. esphome/components/camera/camera.h +80 -0
  77. esphome/components/canbus/__init__.py +1 -0
  78. esphome/components/cap1188/cap1188.h +0 -1
  79. esphome/components/captive_portal/__init__.py +12 -2
  80. esphome/components/captive_portal/captive_portal.cpp +12 -2
  81. esphome/components/captive_portal/captive_portal.h +5 -2
  82. esphome/components/ccs811/ccs811.h +0 -2
  83. esphome/components/climate/__init__.py +5 -2
  84. esphome/components/cm1106/sensor.py +2 -2
  85. esphome/components/const/__init__.py +2 -0
  86. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  87. esphome/components/copy/button/copy_button.h +0 -1
  88. esphome/components/copy/cover/copy_cover.h +0 -1
  89. esphome/components/copy/fan/copy_fan.h +0 -1
  90. esphome/components/copy/lock/copy_lock.h +0 -1
  91. esphome/components/copy/number/copy_number.h +0 -1
  92. esphome/components/copy/select/copy_select.h +0 -1
  93. esphome/components/copy/sensor/copy_sensor.h +0 -1
  94. esphome/components/copy/switch/copy_switch.h +0 -1
  95. esphome/components/copy/text/copy_text.h +0 -1
  96. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  97. esphome/components/cover/__init__.py +5 -2
  98. esphome/components/cs5460a/cs5460a.h +0 -1
  99. esphome/components/datetime/__init__.py +4 -2
  100. esphome/components/debug/__init__.py +20 -0
  101. esphome/components/deep_sleep/__init__.py +43 -9
  102. esphome/components/demo/__init__.py +2 -2
  103. esphome/components/display/display.cpp +4 -3
  104. esphome/components/display/display.h +0 -2
  105. esphome/components/display/display_buffer.cpp +1 -1
  106. esphome/components/ds2484/__init__.py +1 -0
  107. esphome/components/ds2484/ds2484.cpp +209 -0
  108. esphome/components/ds2484/ds2484.h +43 -0
  109. esphome/components/ds2484/one_wire.py +37 -0
  110. esphome/components/duty_time/duty_time_sensor.h +0 -1
  111. esphome/components/ens160_base/ens160_base.h +0 -1
  112. esphome/components/es7210/es7210.h +0 -1
  113. esphome/components/es7243e/es7243e.h +0 -1
  114. esphome/components/es8156/es8156.h +0 -1
  115. esphome/components/es8311/es8311.h +0 -1
  116. esphome/components/es8388/es8388.h +0 -1
  117. esphome/components/esp32/__init__.py +102 -135
  118. esphome/components/esp32/core.cpp +0 -4
  119. esphome/components/esp32/gpio.h +1 -1
  120. esphome/components/esp32/helpers.cpp +69 -0
  121. esphome/components/esp32_ble/ble.cpp +5 -6
  122. esphome/components/esp32_ble/ble.h +29 -14
  123. esphome/components/esp32_ble/ble_event.h +6 -6
  124. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  125. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  126. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  127. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  128. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  129. esphome/components/esp32_camera/__init__.py +111 -97
  130. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  131. esphome/components/esp32_camera/esp32_camera.h +35 -30
  132. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  133. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  134. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  135. esphome/components/esp32_hall/sensor.py +2 -21
  136. esphome/components/esp32_hosted/__init__.py +101 -0
  137. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  138. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  139. esphome/components/esp32_rmt/__init__.py +0 -58
  140. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  141. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  142. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  143. esphome/components/esp32_touch/esp32_touch.h +174 -28
  144. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  145. esphome/components/esp32_touch/esp32_touch_v1.cpp +238 -0
  146. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  147. esphome/components/esp8266/__init__.py +1 -0
  148. esphome/components/esp8266/gpio.cpp +10 -10
  149. esphome/components/esp8266/helpers.cpp +31 -0
  150. esphome/components/esphome/ota/__init__.py +1 -0
  151. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  152. esphome/components/ethernet/__init__.py +42 -23
  153. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  154. esphome/components/ethernet/ethernet_component.cpp +69 -29
  155. esphome/components/ethernet/ethernet_component.h +18 -10
  156. esphome/components/event/__init__.py +5 -2
  157. esphome/components/ezo/ezo.h +0 -1
  158. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  159. esphome/components/fan/__init__.py +5 -2
  160. esphome/components/feedback/feedback_cover.h +0 -1
  161. esphome/components/font/__init__.py +92 -82
  162. esphome/components/font/font.cpp +9 -2
  163. esphome/components/font/font.h +20 -5
  164. esphome/components/fs3000/fs3000.h +0 -1
  165. esphome/components/gcja5/gcja5.h +0 -1
  166. esphome/components/gl_r01_i2c/__init__.py +0 -0
  167. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  168. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  169. esphome/components/gl_r01_i2c/sensor.py +36 -0
  170. esphome/components/gp8403/gp8403.h +0 -1
  171. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  172. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  173. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  174. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  175. esphome/components/he60r/he60r.h +0 -1
  176. esphome/components/heatpumpir/climate.py +2 -1
  177. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  178. esphome/components/heatpumpir/heatpumpir.h +1 -0
  179. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  180. esphome/components/host/__init__.py +2 -1
  181. esphome/components/host/helpers.cpp +57 -0
  182. esphome/components/http_request/__init__.py +19 -1
  183. esphome/components/http_request/http_request.h +1 -1
  184. esphome/components/http_request/http_request_arduino.cpp +0 -1
  185. esphome/components/http_request/http_request_arduino.h +1 -0
  186. esphome/components/http_request/http_request_idf.cpp +0 -1
  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 +430 -261
  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 +4 -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 +126 -45
  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 +31 -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 +1 -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 +1 -5
  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/valve/__init__.py +5 -2
  477. esphome/components/vbus/vbus.h +0 -1
  478. esphome/components/veml3235/veml3235.h +0 -1
  479. esphome/components/veml7700/veml7700.h +0 -1
  480. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  481. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  482. esphome/components/watchdog/watchdog.cpp +0 -4
  483. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  484. esphome/components/web_server/__init__.py +34 -19
  485. esphome/components/web_server/ota/__init__.py +32 -0
  486. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  487. esphome/components/web_server/ota/ota_web_server.h +26 -0
  488. esphome/components/web_server/web_server.cpp +311 -430
  489. esphome/components/web_server/web_server.h +33 -23
  490. esphome/components/web_server/web_server_v1.cpp +4 -5
  491. esphome/components/web_server_base/__init__.py +5 -2
  492. esphome/components/web_server_base/web_server_base.cpp +2 -94
  493. esphome/components/web_server_base/web_server_base.h +5 -25
  494. esphome/components/web_server_idf/multipart.cpp +254 -0
  495. esphome/components/web_server_idf/multipart.h +86 -0
  496. esphome/components/web_server_idf/utils.cpp +32 -0
  497. esphome/components/web_server_idf/utils.h +10 -0
  498. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  499. esphome/components/web_server_idf/web_server_idf.h +11 -10
  500. esphome/components/wiegand/wiegand.cpp +2 -2
  501. esphome/components/wifi/__init__.py +18 -0
  502. esphome/components/wifi/wifi_component.cpp +17 -22
  503. esphome/components/wifi/wifi_component.h +27 -23
  504. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  505. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  506. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  507. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  508. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  509. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  510. esphome/components/wireguard/__init__.py +2 -11
  511. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  512. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  513. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  514. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  515. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  516. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  517. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  518. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  519. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  520. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  521. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  522. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  523. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  524. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  525. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  526. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  527. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  528. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  529. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  530. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  531. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  532. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  533. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  534. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  535. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  536. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  537. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  538. esphome/components/zyaura/zyaura.h +0 -1
  539. esphome/config.py +88 -22
  540. esphome/config_helpers.py +74 -1
  541. esphome/config_validation.py +12 -1
  542. esphome/const.py +65 -10
  543. esphome/core/__init__.py +18 -2
  544. esphome/core/application.cpp +163 -10
  545. esphome/core/application.h +145 -165
  546. esphome/core/area.h +19 -0
  547. esphome/core/automation.h +58 -9
  548. esphome/core/color.cpp +3 -5
  549. esphome/core/color.h +16 -16
  550. esphome/core/component.cpp +151 -18
  551. esphome/core/component.h +98 -4
  552. esphome/core/component_iterator.cpp +7 -7
  553. esphome/core/component_iterator.h +9 -7
  554. esphome/core/config.py +155 -6
  555. esphome/core/controller.cpp +4 -2
  556. esphome/core/controller.h +1 -1
  557. esphome/core/datatypes.h +2 -2
  558. esphome/core/defines.h +17 -2
  559. esphome/core/device.h +20 -0
  560. esphome/core/entity_base.cpp +20 -15
  561. esphome/core/entity_base.h +76 -0
  562. esphome/core/entity_helpers.py +162 -1
  563. esphome/core/event_pool.h +81 -0
  564. esphome/core/helpers.cpp +75 -230
  565. esphome/core/helpers.h +164 -104
  566. esphome/core/lock_free_queue.h +151 -0
  567. esphome/core/log.cpp +2 -2
  568. esphome/core/log.h +2 -0
  569. esphome/core/optional.h +5 -0
  570. esphome/core/ring_buffer.cpp +2 -2
  571. esphome/core/scheduler.cpp +278 -103
  572. esphome/core/scheduler.h +157 -17
  573. esphome/core/time.cpp +5 -5
  574. esphome/core/time.h +5 -5
  575. esphome/cpp_generator.py +17 -0
  576. esphome/cpp_helpers.py +0 -22
  577. esphome/cpp_types.py +3 -1
  578. esphome/dashboard/entries.py +1 -1
  579. esphome/dashboard/util/text.py +5 -21
  580. esphome/dashboard/web_server.py +9 -1
  581. esphome/helpers.py +47 -0
  582. esphome/loader.py +15 -1
  583. esphome/pins.py +14 -8
  584. esphome/wizard.py +16 -3
  585. esphome/writer.py +21 -3
  586. esphome/yaml_util.py +0 -2
  587. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
  588. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +593 -533
  589. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  590. esphome/components/esp32_ble/queue.h +0 -85
  591. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  592. esphome/components/esp32_hall/esp32_hall.h +0 -23
  593. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  594. esphome/components/ld2410/button/reset_button.cpp +0 -9
  595. esphome/components/ld2450/button/reset_button.cpp +0 -9
  596. esphome/components/openthread/tlv.py +0 -65
  597. /esphome/{dashboard/enum.py → enum.py} +0 -0
  598. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/WHEEL +0 -0
  599. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  600. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
  601. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
@@ -268,7 +268,19 @@ def validate_tz(value: str) -> str:
268
268
 
269
269
  TIME_SCHEMA = cv.Schema(
270
270
  {
271
- cv.Optional(CONF_TIMEZONE, default=detect_tz): validate_tz,
271
+ cv.SplitDefault(
272
+ CONF_TIMEZONE,
273
+ esp8266=detect_tz,
274
+ esp32=detect_tz,
275
+ rp2040=detect_tz,
276
+ bk72xx=detect_tz,
277
+ rtl87xx=detect_tz,
278
+ ln882x=detect_tz,
279
+ host=detect_tz,
280
+ ): cv.All(
281
+ cv.only_with_framework(["arduino", "esp-idf", "host"]),
282
+ validate_tz,
283
+ ),
272
284
  cv.Optional(CONF_ON_TIME): automation.validate_automation(
273
285
  {
274
286
  cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CronTrigger),
@@ -293,7 +305,9 @@ TIME_SCHEMA = cv.Schema(
293
305
 
294
306
 
295
307
  async def setup_time_core_(time_var, config):
296
- cg.add(time_var.set_timezone(config[CONF_TIMEZONE]))
308
+ if timezone := config.get(CONF_TIMEZONE):
309
+ cg.add(time_var.set_timezone(timezone))
310
+ cg.add_define("USE_TIME_TIMEZONE")
297
311
 
298
312
  for conf in config.get(CONF_ON_TIME, []):
299
313
  trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], time_var)
@@ -35,8 +35,10 @@ void RealTimeClock::synchronize_epoch_(uint32_t epoch) {
35
35
  ret = settimeofday(&timev, nullptr);
36
36
  }
37
37
 
38
+ #ifdef USE_TIME_TIMEZONE
38
39
  // Move timezone back to local timezone.
39
40
  this->apply_timezone_();
41
+ #endif
40
42
 
41
43
  if (ret != 0) {
42
44
  ESP_LOGW(TAG, "setimeofday() failed with code %d", ret);
@@ -49,10 +51,12 @@ void RealTimeClock::synchronize_epoch_(uint32_t epoch) {
49
51
  this->time_sync_callback_.call();
50
52
  }
51
53
 
54
+ #ifdef USE_TIME_TIMEZONE
52
55
  void RealTimeClock::apply_timezone_() {
53
56
  setenv("TZ", this->timezone_.c_str(), 1);
54
57
  tzset();
55
58
  }
59
+ #endif
56
60
 
57
61
  } // namespace time
58
62
  } // namespace esphome
@@ -20,6 +20,7 @@ class RealTimeClock : public PollingComponent {
20
20
  public:
21
21
  explicit RealTimeClock();
22
22
 
23
+ #ifdef USE_TIME_TIMEZONE
23
24
  /// Set the time zone.
24
25
  void set_timezone(const std::string &tz) {
25
26
  this->timezone_ = tz;
@@ -28,6 +29,7 @@ class RealTimeClock : public PollingComponent {
28
29
 
29
30
  /// Get the time zone currently in use.
30
31
  std::string get_timezone() { return this->timezone_; }
32
+ #endif
31
33
 
32
34
  /// Get the time in the currently defined timezone.
33
35
  ESPTime now() { return ESPTime::from_epoch_local(this->timestamp_now()); }
@@ -38,7 +40,7 @@ class RealTimeClock : public PollingComponent {
38
40
  /// Get the current time as the UTC epoch since January 1st 1970.
39
41
  time_t timestamp_now() { return ::time(nullptr); }
40
42
 
41
- void add_on_time_sync_callback(std::function<void()> callback) {
43
+ void add_on_time_sync_callback(std::function<void()> &&callback) {
42
44
  this->time_sync_callback_.add(std::move(callback));
43
45
  };
44
46
 
@@ -46,8 +48,10 @@ class RealTimeClock : public PollingComponent {
46
48
  /// Report a unix epoch as current time.
47
49
  void synchronize_epoch_(uint32_t epoch);
48
50
 
51
+ #ifdef USE_TIME_TIMEZONE
49
52
  std::string timezone_{};
50
53
  void apply_timezone_();
54
+ #endif
51
55
 
52
56
  CallbackManager<void()> time_sync_callback_;
53
57
  };
@@ -24,8 +24,10 @@ void TLC5971::dump_config() {
24
24
  }
25
25
 
26
26
  void TLC5971::loop() {
27
- if (!this->update_)
27
+ if (!this->update_) {
28
+ this->disable_loop();
28
29
  return;
30
+ }
29
31
 
30
32
  uint32_t command;
31
33
 
@@ -93,6 +95,7 @@ void TLC5971::set_channel_value(uint16_t channel, uint16_t value) {
93
95
  return;
94
96
  if (this->pwm_amounts_[channel] != value) {
95
97
  this->update_ = true;
98
+ this->enable_loop();
96
99
  }
97
100
  this->pwm_amounts_[channel] = value;
98
101
  }
@@ -58,8 +58,6 @@ class TMP1075Sensor : public PollingComponent, public sensor::Sensor, public i2c
58
58
  void setup() override;
59
59
  void update() override;
60
60
 
61
- float get_setup_priority() const override { return setup_priority::DATA; }
62
-
63
61
  void dump_config() override;
64
62
 
65
63
  // Call write_config() after calling any of these to send the new config to
@@ -12,7 +12,6 @@ class TOF10120Sensor : public sensor::Sensor, public PollingComponent, public i2
12
12
  void setup() override;
13
13
 
14
14
  void dump_config() override;
15
- float get_setup_priority() const override { return setup_priority::DATA; }
16
15
  void update() override;
17
16
  };
18
17
  } // namespace tof10120
@@ -16,7 +16,6 @@ class Tormatic : public cover::Cover, public uart::UARTDevice, public PollingCom
16
16
  void loop() override;
17
17
  void update() override;
18
18
  void dump_config() override;
19
- float get_setup_priority() const override { return setup_priority::DATA; };
20
19
 
21
20
  void set_open_duration(uint32_t duration) { this->open_duration_ = duration; }
22
21
  void set_close_duration(uint32_t duration) { this->close_duration_ = duration; }
@@ -23,7 +23,6 @@ class TotalDailyEnergy : public sensor::Sensor, public Component {
23
23
  void set_method(TotalDailyEnergyMethod method) { method_ = method; }
24
24
  void setup() override;
25
25
  void dump_config() override;
26
- float get_setup_priority() const override { return setup_priority::DATA; }
27
26
  void loop() override;
28
27
 
29
28
  void publish_state_and_save(float state);
@@ -232,7 +232,7 @@ void TSL2591Component::set_integration_time_and_gain(TSL2591IntegrationTime inte
232
232
  this->integration_time_ = integration_time;
233
233
  this->gain_ = gain;
234
234
  if (!this->write_byte(TSL2591_COMMAND_BIT | TSL2591_REGISTER_CONTROL,
235
- this->integration_time_ | this->gain_)) { // NOLINT
235
+ static_cast<uint8_t>(this->integration_time_) | static_cast<uint8_t>(this->gain_))) {
236
236
  ESP_LOGE(TAG, "I2C write failed");
237
237
  }
238
238
  // The ADC values can be confused if gain or integration time are changed in the middle of a cycle.
@@ -25,7 +25,6 @@ class TTP229BSFComponent : public Component {
25
25
  void register_channel(TTP229BSFChannel *channel) { this->channels_.push_back(channel); }
26
26
  void setup() override;
27
27
  void dump_config() override;
28
- float get_setup_priority() const override { return setup_priority::DATA; }
29
28
  void loop() override {
30
29
  // check datavalid if sdo is high
31
30
  if (!this->sdo_pin_->digital_read()) {
@@ -23,7 +23,6 @@ class TTP229LSFComponent : public Component, public i2c::I2CDevice {
23
23
  void register_channel(TTP229Channel *channel) { this->channels_.push_back(channel); }
24
24
  void setup() override;
25
25
  void dump_config() override;
26
- float get_setup_priority() const override { return setup_priority::DATA; }
27
26
  void loop() override;
28
27
 
29
28
  protected:
@@ -152,7 +152,7 @@ void IRAM_ATTR Tx20ComponentStore::gpio_intr(Tx20ComponentStore *arg) {
152
152
  }
153
153
  arg->buffer[arg->buffer_index] = 1;
154
154
  arg->start_time = now;
155
- arg->buffer_index++;
155
+ arg->buffer_index++; // NOLINT(clang-diagnostic-deprecated-volatile)
156
156
  return;
157
157
  }
158
158
  const uint32_t delay = now - arg->start_time;
@@ -183,7 +183,7 @@ void IRAM_ATTR Tx20ComponentStore::gpio_intr(Tx20ComponentStore *arg) {
183
183
  }
184
184
  arg->spent_time += delay;
185
185
  arg->start_time = now;
186
- arg->buffer_index++;
186
+ arg->buffer_index++; // NOLINT(clang-diagnostic-deprecated-volatile)
187
187
  }
188
188
  void IRAM_ATTR Tx20ComponentStore::reset() {
189
189
  tx20_available = false;
@@ -2,6 +2,7 @@ import re
2
2
 
3
3
  from esphome import automation, pins
4
4
  import esphome.codegen as cg
5
+ from esphome.config_helpers import filter_source_files_from_platform
5
6
  import esphome.config_validation as cv
6
7
  from esphome.const import (
7
8
  CONF_AFTER,
@@ -27,6 +28,7 @@ from esphome.const import (
27
28
  CONF_TX_PIN,
28
29
  CONF_UART_ID,
29
30
  PLATFORM_HOST,
31
+ PlatformFramework,
30
32
  )
31
33
  from esphome.core import CORE
32
34
  import esphome.final_validate as fv
@@ -438,3 +440,19 @@ async def uart_write_to_code(config, action_id, template_arg, args):
438
440
  else:
439
441
  cg.add(var.set_data_static(data))
440
442
  return var
443
+
444
+
445
+ FILTER_SOURCE_FILES = filter_source_files_from_platform(
446
+ {
447
+ "uart_component_esp32_arduino.cpp": {PlatformFramework.ESP32_ARDUINO},
448
+ "uart_component_esp_idf.cpp": {PlatformFramework.ESP32_IDF},
449
+ "uart_component_esp8266.cpp": {PlatformFramework.ESP8266_ARDUINO},
450
+ "uart_component_host.cpp": {PlatformFramework.HOST_NATIVE},
451
+ "uart_component_rp2040.cpp": {PlatformFramework.RP2040_ARDUINO},
452
+ "uart_component_libretiny.cpp": {
453
+ PlatformFramework.BK72XX_ARDUINO,
454
+ PlatformFramework.RTL87XX_ARDUINO,
455
+ PlatformFramework.LN882X_ARDUINO,
456
+ },
457
+ }
458
+ )
@@ -42,17 +42,13 @@ uart_config_t IDFUARTComponent::get_config_() {
42
42
  break;
43
43
  }
44
44
 
45
- uart_config_t uart_config;
45
+ uart_config_t uart_config{};
46
46
  uart_config.baud_rate = this->baud_rate_;
47
47
  uart_config.data_bits = data_bits;
48
48
  uart_config.parity = parity;
49
49
  uart_config.stop_bits = this->stop_bits_ == 1 ? UART_STOP_BITS_1 : UART_STOP_BITS_2;
50
50
  uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
51
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
52
51
  uart_config.source_clk = UART_SCLK_DEFAULT;
53
- #else
54
- uart_config.source_clk = UART_SCLK_APB;
55
- #endif
56
52
  uart_config.rx_flow_ctrl_thresh = 122;
57
53
 
58
54
  return uart_config;
@@ -15,8 +15,8 @@ from esphome.const import (
15
15
  ENTITY_CATEGORY_CONFIG,
16
16
  )
17
17
  from esphome.core import CORE, coroutine_with_priority
18
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
18
19
  from esphome.cpp_generator import MockObjClass
19
- from esphome.cpp_helpers import setup_entity
20
20
 
21
21
  CODEOWNERS = ["@jesserockz"]
22
22
  IS_PLATFORM_COMPONENT = True
@@ -58,6 +58,9 @@ _UPDATE_SCHEMA = (
58
58
  )
59
59
 
60
60
 
61
+ _UPDATE_SCHEMA.add_extra(entity_duplicate_validator("update"))
62
+
63
+
61
64
  def update_schema(
62
65
  class_: MockObjClass = cv.UNDEFINED,
63
66
  *,
@@ -87,7 +90,7 @@ UPDATE_SCHEMA.add_extra(cv.deprecated_schema_constant("update"))
87
90
 
88
91
 
89
92
  async def setup_update_core_(var, config):
90
- await setup_entity(var, config)
93
+ await setup_entity(var, config, "update")
91
94
 
92
95
  if device_class_config := config.get(CONF_DEVICE_CLASS):
93
96
  cg.add(var.set_device_class(device_class_config))
@@ -1,5 +1,6 @@
1
1
  #pragma once
2
2
 
3
+ #include <memory>
3
4
  #include "esphome/core/automation.h"
4
5
  #include "esphome/core/component.h"
5
6
  #include "esphome/core/entity_base.h"
@@ -38,12 +39,19 @@ class UpdateEntity : public EntityBase, public EntityBase_DeviceClass {
38
39
  const UpdateState &state = state_;
39
40
 
40
41
  void add_on_state_callback(std::function<void()> &&callback) { this->state_callback_.add(std::move(callback)); }
42
+ Trigger<const UpdateInfo &> *get_update_available_trigger() {
43
+ if (!update_available_trigger_) {
44
+ update_available_trigger_ = std::make_unique<Trigger<const UpdateInfo &>>();
45
+ }
46
+ return update_available_trigger_.get();
47
+ }
41
48
 
42
49
  protected:
43
50
  UpdateState state_{UPDATE_STATE_UNKNOWN};
44
51
  UpdateInfo update_info_;
45
52
 
46
53
  CallbackManager<void()> state_callback_{};
54
+ std::unique_ptr<Trigger<const UpdateInfo &>> update_available_trigger_{nullptr};
47
55
  };
48
56
 
49
57
  } // namespace update
@@ -6,7 +6,7 @@ from esphome.components.esp32 import (
6
6
  only_on_variant,
7
7
  )
8
8
  import esphome.config_validation as cv
9
- from esphome.const import CONF_ID
9
+ from esphome.const import CONF_DEVICES, CONF_ID
10
10
  from esphome.cpp_types import Component
11
11
 
12
12
  AUTO_LOAD = ["bytebuffer"]
@@ -16,9 +16,9 @@ usb_host_ns = cg.esphome_ns.namespace("usb_host")
16
16
  USBHost = usb_host_ns.class_("USBHost", Component)
17
17
  USBClient = usb_host_ns.class_("USBClient", Component)
18
18
 
19
- CONF_DEVICES = "devices"
20
19
  CONF_VID = "vid"
21
20
  CONF_PID = "pid"
21
+ CONF_ENABLE_HUBS = "enable_hubs"
22
22
 
23
23
 
24
24
  def usb_device_schema(cls=USBClient, vid: int = None, pid: [int] = None) -> cv.Schema:
@@ -42,6 +42,7 @@ CONFIG_SCHEMA = cv.All(
42
42
  cv.COMPONENT_SCHEMA.extend(
43
43
  {
44
44
  cv.GenerateID(): cv.declare_id(USBHost),
45
+ cv.Optional(CONF_ENABLE_HUBS, default=False): cv.boolean,
45
46
  cv.Optional(CONF_DEVICES): cv.ensure_list(usb_device_schema()),
46
47
  }
47
48
  ),
@@ -58,6 +59,8 @@ async def register_usb_client(config):
58
59
 
59
60
  async def to_code(config):
60
61
  add_idf_sdkconfig_option("CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE", 1024)
62
+ if config.get(CONF_ENABLE_HUBS):
63
+ add_idf_sdkconfig_option("CONFIG_USB_HOST_HUBS_SUPPORTED", True)
61
64
  var = cg.new_Pvariable(config[CONF_ID])
62
65
  await cg.register_component(var, config)
63
66
  for device in config.get(CONF_DEVICES) or ():
@@ -22,8 +22,8 @@ from esphome.const import (
22
22
  DEVICE_CLASS_WATER,
23
23
  )
24
24
  from esphome.core import CORE, coroutine_with_priority
25
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
25
26
  from esphome.cpp_generator import MockObjClass
26
- from esphome.cpp_helpers import setup_entity
27
27
 
28
28
  IS_PLATFORM_COMPONENT = True
29
29
 
@@ -103,6 +103,9 @@ _VALVE_SCHEMA = (
103
103
  )
104
104
 
105
105
 
106
+ _VALVE_SCHEMA.add_extra(entity_duplicate_validator("valve"))
107
+
108
+
106
109
  def valve_schema(
107
110
  class_: MockObjClass = cv.UNDEFINED,
108
111
  *,
@@ -132,7 +135,7 @@ VALVE_SCHEMA.add_extra(cv.deprecated_schema_constant("valve"))
132
135
 
133
136
 
134
137
  async def _setup_valve_core(var, config):
135
- await setup_entity(var, config)
138
+ await setup_entity(var, config, "valve")
136
139
 
137
140
  if device_class_config := config.get(CONF_DEVICE_CLASS):
138
141
  cg.add(var.set_device_class(device_class_config))
@@ -30,7 +30,6 @@ class VBus : public uart::UARTDevice, public Component {
30
30
  public:
31
31
  void dump_config() override;
32
32
  void loop() override;
33
- float get_setup_priority() const override { return setup_priority::DATA; }
34
33
 
35
34
  void register_listener(VBusListener *listener) { this->listeners_.push_back(listener); }
36
35
 
@@ -65,7 +65,6 @@ class VEML3235Sensor : public sensor::Sensor, public PollingComponent, public i2
65
65
  void setup() override;
66
66
  void dump_config() override;
67
67
  void update() override { this->publish_state(this->read_lx_()); }
68
- float get_setup_priority() const override { return setup_priority::DATA; }
69
68
 
70
69
  // Used by ESPHome framework. Does NOT actually set the value on the device.
71
70
  void set_auto_gain(bool auto_gain) { this->auto_gain_ = auto_gain; }
@@ -102,7 +102,6 @@ class VEML7700Component : public PollingComponent, public i2c::I2CDevice {
102
102
  //
103
103
  // EspHome framework functions
104
104
  //
105
- float get_setup_priority() const override { return setup_priority::DATA; }
106
105
  void setup() override;
107
106
  void dump_config() override;
108
107
  void update() override;
@@ -30,7 +30,6 @@ class VL53L0XSensor : public sensor::Sensor, public PollingComponent, public i2c
30
30
  void setup() override;
31
31
 
32
32
  void dump_config() override;
33
- float get_setup_priority() const override { return setup_priority::DATA; }
34
33
  void update() override;
35
34
 
36
35
  void loop() override;
@@ -85,7 +85,7 @@ bool VoiceAssistant::start_udp_socket_() {
85
85
  bool VoiceAssistant::allocate_buffers_() {
86
86
  #ifdef USE_SPEAKER
87
87
  if ((this->speaker_ != nullptr) && (this->speaker_buffer_ == nullptr)) {
88
- ExternalRAMAllocator<uint8_t> speaker_allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
88
+ RAMAllocator<uint8_t> speaker_allocator;
89
89
  this->speaker_buffer_ = speaker_allocator.allocate(SPEAKER_BUFFER_SIZE);
90
90
  if (this->speaker_buffer_ == nullptr) {
91
91
  ESP_LOGW(TAG, "Could not allocate speaker buffer");
@@ -103,7 +103,7 @@ bool VoiceAssistant::allocate_buffers_() {
103
103
  }
104
104
 
105
105
  if (this->send_buffer_ == nullptr) {
106
- ExternalRAMAllocator<uint8_t> send_allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
106
+ RAMAllocator<uint8_t> send_allocator;
107
107
  this->send_buffer_ = send_allocator.allocate(SEND_BUFFER_SIZE);
108
108
  if (send_buffer_ == nullptr) {
109
109
  ESP_LOGW(TAG, "Could not allocate send buffer");
@@ -136,7 +136,7 @@ void VoiceAssistant::clear_buffers_() {
136
136
 
137
137
  void VoiceAssistant::deallocate_buffers_() {
138
138
  if (this->send_buffer_ != nullptr) {
139
- ExternalRAMAllocator<uint8_t> send_deallocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
139
+ RAMAllocator<uint8_t> send_deallocator;
140
140
  send_deallocator.deallocate(this->send_buffer_, SEND_BUFFER_SIZE);
141
141
  this->send_buffer_ = nullptr;
142
142
  }
@@ -147,7 +147,7 @@ void VoiceAssistant::deallocate_buffers_() {
147
147
 
148
148
  #ifdef USE_SPEAKER
149
149
  if ((this->speaker_ != nullptr) && (this->speaker_buffer_ != nullptr)) {
150
- ExternalRAMAllocator<uint8_t> speaker_deallocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
150
+ RAMAllocator<uint8_t> speaker_deallocator;
151
151
  speaker_deallocator.deallocate(this->speaker_buffer_, SPEAKER_BUFFER_SIZE);
152
152
  this->speaker_buffer_ = nullptr;
153
153
  }
@@ -38,16 +38,12 @@ WatchdogManager::~WatchdogManager() {
38
38
  void WatchdogManager::set_timeout_(uint32_t timeout_ms) {
39
39
  ESP_LOGV(TAG, "Adjusting WDT to %" PRIu32 "ms", timeout_ms);
40
40
  #ifdef USE_ESP32
41
- #if ESP_IDF_VERSION_MAJOR >= 5
42
41
  esp_task_wdt_config_t wdt_config = {
43
42
  .timeout_ms = timeout_ms,
44
43
  .idle_core_mask = (1 << SOC_CPU_CORES_NUM) - 1,
45
44
  .trigger_panic = true,
46
45
  };
47
46
  esp_task_wdt_reconfigure(&wdt_config);
48
- #else
49
- esp_task_wdt_init(timeout_ms / 1000, true);
50
- #endif // ESP_IDF_VERSION_MAJOR
51
47
  #endif // USE_ESP32
52
48
 
53
49
  #ifdef USE_RP2040
@@ -1,9 +1,9 @@
1
1
  #include "waveshare_epaper.h"
2
+ #include <bitset>
3
+ #include <cinttypes>
2
4
  #include "esphome/core/application.h"
3
5
  #include "esphome/core/helpers.h"
4
6
  #include "esphome/core/log.h"
5
- #include <cinttypes>
6
- #include <bitset>
7
7
 
8
8
  namespace esphome {
9
9
  namespace waveshare_epaper {
@@ -185,7 +185,7 @@ void WaveshareEPaper7C::setup() {
185
185
  this->initialize();
186
186
  }
187
187
  void WaveshareEPaper7C::init_internal_7c_(uint32_t buffer_length) {
188
- ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
188
+ RAMAllocator<uint8_t> allocator;
189
189
  uint32_t small_buffer_length = buffer_length / NUM_BUFFERS;
190
190
 
191
191
  for (int i = 0; i < NUM_BUFFERS; i++) {
@@ -2054,7 +2054,7 @@ void GDEW029T5::initialize() {
2054
2054
  this->deep_sleep_between_updates_ = true;
2055
2055
 
2056
2056
  // old buffer for partial update
2057
- ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
2057
+ RAMAllocator<uint8_t> allocator;
2058
2058
  this->old_buffer_ = allocator.allocate(this->get_buffer_length_());
2059
2059
  if (this->old_buffer_ == nullptr) {
2060
2060
  ESP_LOGE(TAG, "Could not allocate old buffer for display!");
@@ -2199,7 +2199,7 @@ void GDEW029T5::dump_config() {
2199
2199
 
2200
2200
  void GDEW0154M09::initialize() {
2201
2201
  this->init_internal_();
2202
- ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
2202
+ RAMAllocator<uint8_t> allocator;
2203
2203
  this->lastbuff_ = allocator.allocate(this->get_buffer_length_());
2204
2204
  if (this->lastbuff_ != nullptr) {
2205
2205
  memset(this->lastbuff_, 0xff, sizeof(uint8_t) * this->get_buffer_length_());
@@ -3132,7 +3132,7 @@ void HOT GDEY0583T81::display() {
3132
3132
  } else {
3133
3133
  // Partial out (PTOUT), makes the display exit partial mode
3134
3134
  this->command(0x92);
3135
- ESP_LOGD(TAG, "Partial update done, next full update after %d cycles",
3135
+ ESP_LOGD(TAG, "Partial update done, next full update after %" PRIu32 " cycles",
3136
3136
  this->full_update_every_ - this->at_update_ - 1);
3137
3137
  }
3138
3138
 
@@ -28,10 +28,12 @@ from esphome.const import (
28
28
  PLATFORM_BK72XX,
29
29
  PLATFORM_ESP32,
30
30
  PLATFORM_ESP8266,
31
+ PLATFORM_LN882X,
31
32
  PLATFORM_RTL87XX,
32
33
  )
33
34
  from esphome.core import CORE, coroutine_with_priority
34
35
  import esphome.final_validate as fv
36
+ from esphome.types import ConfigType
35
37
 
36
38
  AUTO_LOAD = ["json", "web_server_base"]
37
39
 
@@ -39,13 +41,14 @@ CONF_SORTING_GROUP_ID = "sorting_group_id"
39
41
  CONF_SORTING_GROUPS = "sorting_groups"
40
42
  CONF_SORTING_WEIGHT = "sorting_weight"
41
43
 
44
+
42
45
  web_server_ns = cg.esphome_ns.namespace("web_server")
43
46
  WebServer = web_server_ns.class_("WebServer", cg.Component, cg.Controller)
44
47
 
45
48
  sorting_groups = {}
46
49
 
47
50
 
48
- def default_url(config):
51
+ def default_url(config: ConfigType) -> ConfigType:
49
52
  config = config.copy()
50
53
  if config[CONF_VERSION] == 1:
51
54
  if CONF_CSS_URL not in config:
@@ -65,19 +68,27 @@ def default_url(config):
65
68
  return config
66
69
 
67
70
 
68
- def validate_local(config):
71
+ def validate_local(config: ConfigType) -> ConfigType:
69
72
  if CONF_LOCAL in config and config[CONF_VERSION] == 1:
70
73
  raise cv.Invalid("'local' is not supported in version 1")
71
74
  return config
72
75
 
73
76
 
74
- def validate_ota(config):
75
- if CORE.using_esp_idf and config[CONF_OTA]:
76
- raise cv.Invalid("Enabling 'ota' is not supported for IDF framework yet")
77
+ def validate_ota_removed(config: ConfigType) -> ConfigType:
78
+ # Only raise error if OTA is explicitly enabled (True)
79
+ # If it's False or not specified, we can safely ignore it
80
+ if config.get(CONF_OTA):
81
+ raise cv.Invalid(
82
+ f"The '{CONF_OTA}' option has been removed from 'web_server'. "
83
+ f"Please use the new OTA platform structure instead:\n\n"
84
+ f"ota:\n"
85
+ f" - platform: web_server\n\n"
86
+ f"See https://esphome.io/components/ota for more information."
87
+ )
77
88
  return config
78
89
 
79
90
 
80
- def validate_sorting_groups(config):
91
+ def validate_sorting_groups(config: ConfigType) -> ConfigType:
81
92
  if CONF_SORTING_GROUPS in config and config[CONF_VERSION] != 3:
82
93
  raise cv.Invalid(
83
94
  f"'{CONF_SORTING_GROUPS}' is only supported in 'web_server' version 3"
@@ -88,7 +99,7 @@ def validate_sorting_groups(config):
88
99
  def _validate_no_sorting_component(
89
100
  sorting_component: str,
90
101
  webserver_version: int,
91
- config: dict,
102
+ config: ConfigType,
92
103
  path: list[str] | None = None,
93
104
  ) -> None:
94
105
  if path is None:
@@ -111,7 +122,7 @@ def _validate_no_sorting_component(
111
122
  )
112
123
 
113
124
 
114
- def _final_validate_sorting(config):
125
+ def _final_validate_sorting(config: ConfigType) -> ConfigType:
115
126
  if (webserver_version := config.get(CONF_VERSION)) != 3:
116
127
  _validate_no_sorting_component(
117
128
  CONF_SORTING_WEIGHT, webserver_version, fv.full_config.get()
@@ -174,24 +185,25 @@ CONFIG_SCHEMA = cv.All(
174
185
  web_server_base.WebServerBase
175
186
  ),
176
187
  cv.Optional(CONF_INCLUDE_INTERNAL, default=False): cv.boolean,
177
- cv.SplitDefault(
178
- CONF_OTA,
179
- esp8266=True,
180
- esp32_arduino=True,
181
- esp32_idf=False,
182
- bk72xx=True,
183
- rtl87xx=True,
184
- ): cv.boolean,
188
+ cv.Optional(CONF_OTA, default=False): cv.boolean,
185
189
  cv.Optional(CONF_LOG, default=True): cv.boolean,
186
190
  cv.Optional(CONF_LOCAL): cv.boolean,
187
191
  cv.Optional(CONF_SORTING_GROUPS): cv.ensure_list(sorting_group),
188
192
  }
189
193
  ).extend(cv.COMPONENT_SCHEMA),
190
- cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_BK72XX, PLATFORM_RTL87XX]),
194
+ cv.only_on(
195
+ [
196
+ PLATFORM_ESP32,
197
+ PLATFORM_ESP8266,
198
+ PLATFORM_BK72XX,
199
+ PLATFORM_LN882X,
200
+ PLATFORM_RTL87XX,
201
+ ]
202
+ ),
191
203
  default_url,
192
204
  validate_local,
193
- validate_ota,
194
205
  validate_sorting_groups,
206
+ validate_ota_removed,
195
207
  )
196
208
 
197
209
 
@@ -211,6 +223,7 @@ async def add_entity_config(entity, config):
211
223
  sorting_weight = config.get(CONF_SORTING_WEIGHT, 50)
212
224
  sorting_group_hash = hash(config.get(CONF_SORTING_GROUP_ID))
213
225
 
226
+ cg.add_define("USE_WEBSERVER_SORTING")
214
227
  cg.add(
215
228
  web_server.add_entity_config(
216
229
  entity,
@@ -274,7 +287,8 @@ async def to_code(config):
274
287
  else:
275
288
  cg.add(var.set_css_url(config[CONF_CSS_URL]))
276
289
  cg.add(var.set_js_url(config[CONF_JS_URL]))
277
- cg.add(var.set_allow_ota(config[CONF_OTA]))
290
+ # OTA is now handled by the web_server OTA platform
291
+ # The CONF_OTA option is kept only for backwards compatibility validation
278
292
  cg.add(var.set_expose_log(config[CONF_LOG]))
279
293
  if config[CONF_ENABLE_PRIVATE_NETWORK_ACCESS]:
280
294
  cg.add_define("USE_WEBSERVER_PRIVATE_NETWORK_ACCESS")
@@ -296,4 +310,5 @@ async def to_code(config):
296
310
  cg.add_define("USE_WEBSERVER_LOCAL")
297
311
 
298
312
  if (sorting_group_config := config.get(CONF_SORTING_GROUPS)) is not None:
313
+ cg.add_define("USE_WEBSERVER_SORTING")
299
314
  add_sorting_groups(var, sorting_group_config)