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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +57 -21
  22. esphome/components/api/api_connection.cpp +344 -539
  23. esphome/components/api/api_connection.h +224 -141
  24. esphome/components/api/api_frame_helper.cpp +91 -127
  25. esphome/components/api/api_frame_helper.h +64 -54
  26. esphome/components/api/api_pb2.cpp +1837 -9044
  27. esphome/components/api/api_pb2.h +532 -685
  28. esphome/components/api/api_pb2_dump.cpp +4432 -0
  29. esphome/components/api/api_pb2_service.cpp +184 -425
  30. esphome/components/api/api_pb2_service.h +13 -6
  31. esphome/components/api/api_server.cpp +131 -167
  32. esphome/components/api/api_server.h +38 -10
  33. esphome/components/api/client.py +8 -2
  34. esphome/components/api/custom_api_device.h +8 -0
  35. esphome/components/api/list_entities.cpp +37 -104
  36. esphome/components/api/list_entities.h +33 -23
  37. esphome/components/api/proto.h +532 -26
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/api/user_services.h +2 -0
  41. esphome/components/as5600/as5600.h +0 -1
  42. esphome/components/async_tcp/__init__.py +14 -5
  43. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  44. esphome/components/atm90e32/atm90e32.cpp +2 -1
  45. esphome/components/audio/audio_decoder.cpp +1 -1
  46. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  47. esphome/components/b_parasite/b_parasite.h +0 -1
  48. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  49. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  50. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  51. esphome/components/bh1750/bh1750.cpp +5 -5
  52. esphome/components/binary_sensor/__init__.py +82 -5
  53. esphome/components/binary_sensor/automation.h +19 -1
  54. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  55. esphome/components/binary_sensor/binary_sensor.h +11 -25
  56. esphome/components/binary_sensor/filter.cpp +29 -24
  57. esphome/components/binary_sensor/filter.h +20 -10
  58. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  60. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  61. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  62. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  63. esphome/components/ble_client/switch/ble_switch.h +0 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  65. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  66. esphome/components/ble_presence/ble_presence_device.h +0 -1
  67. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  68. esphome/components/ble_scanner/ble_scanner.h +0 -1
  69. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  71. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  72. esphome/components/bme680/sensor.py +1 -1
  73. esphome/components/bmp581/bmp581.h +0 -2
  74. esphome/components/button/__init__.py +5 -2
  75. esphome/components/camera/__init__.py +1 -0
  76. esphome/components/camera/camera.cpp +22 -0
  77. esphome/components/camera/camera.h +80 -0
  78. esphome/components/canbus/__init__.py +1 -0
  79. esphome/components/cap1188/cap1188.h +0 -1
  80. esphome/components/captive_portal/__init__.py +12 -2
  81. esphome/components/captive_portal/captive_portal.cpp +12 -2
  82. esphome/components/captive_portal/captive_portal.h +5 -2
  83. esphome/components/ccs811/ccs811.h +0 -2
  84. esphome/components/climate/__init__.py +5 -2
  85. esphome/components/cm1106/sensor.py +2 -2
  86. esphome/components/const/__init__.py +2 -0
  87. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  88. esphome/components/copy/button/copy_button.h +0 -1
  89. esphome/components/copy/cover/copy_cover.h +0 -1
  90. esphome/components/copy/fan/copy_fan.h +0 -1
  91. esphome/components/copy/lock/copy_lock.h +0 -1
  92. esphome/components/copy/number/copy_number.h +0 -1
  93. esphome/components/copy/select/copy_select.h +0 -1
  94. esphome/components/copy/sensor/copy_sensor.h +0 -1
  95. esphome/components/copy/switch/copy_switch.h +0 -1
  96. esphome/components/copy/text/copy_text.h +0 -1
  97. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  98. esphome/components/cover/__init__.py +5 -2
  99. esphome/components/cs5460a/cs5460a.h +0 -1
  100. esphome/components/datetime/__init__.py +4 -2
  101. esphome/components/debug/__init__.py +20 -0
  102. esphome/components/debug/debug_esp32.cpp +2 -0
  103. esphome/components/deep_sleep/__init__.py +43 -9
  104. esphome/components/demo/__init__.py +2 -2
  105. esphome/components/display/display.cpp +4 -3
  106. esphome/components/display/display.h +0 -2
  107. esphome/components/display/display_buffer.cpp +1 -1
  108. esphome/components/ds2484/__init__.py +1 -0
  109. esphome/components/ds2484/ds2484.cpp +209 -0
  110. esphome/components/ds2484/ds2484.h +43 -0
  111. esphome/components/ds2484/one_wire.py +37 -0
  112. esphome/components/duty_time/duty_time_sensor.h +0 -1
  113. esphome/components/ens160_base/ens160_base.h +0 -1
  114. esphome/components/es7210/es7210.h +0 -1
  115. esphome/components/es7243e/es7243e.h +0 -1
  116. esphome/components/es8156/es8156.h +0 -1
  117. esphome/components/es8311/es8311.h +0 -1
  118. esphome/components/es8388/es8388.h +0 -1
  119. esphome/components/esp32/__init__.py +103 -135
  120. esphome/components/esp32/core.cpp +0 -4
  121. esphome/components/esp32/gpio.h +1 -1
  122. esphome/components/esp32/helpers.cpp +69 -0
  123. esphome/components/esp32_ble/ble.cpp +5 -6
  124. esphome/components/esp32_ble/ble.h +29 -14
  125. esphome/components/esp32_ble/ble_event.h +6 -6
  126. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  127. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  128. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  129. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  130. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  131. esphome/components/esp32_camera/__init__.py +112 -98
  132. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  133. esphome/components/esp32_camera/esp32_camera.h +35 -30
  134. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  135. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  136. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  137. esphome/components/esp32_hall/sensor.py +2 -21
  138. esphome/components/esp32_hosted/__init__.py +101 -0
  139. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  140. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  141. esphome/components/esp32_rmt/__init__.py +0 -58
  142. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  143. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  144. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  145. esphome/components/esp32_touch/esp32_touch.h +174 -28
  146. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  147. esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
  148. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  149. esphome/components/esp8266/__init__.py +2 -0
  150. esphome/components/esp8266/gpio.cpp +10 -10
  151. esphome/components/esp8266/helpers.cpp +31 -0
  152. esphome/components/esphome/ota/__init__.py +1 -0
  153. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  154. esphome/components/ethernet/__init__.py +42 -23
  155. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  156. esphome/components/ethernet/ethernet_component.cpp +69 -29
  157. esphome/components/ethernet/ethernet_component.h +18 -10
  158. esphome/components/event/__init__.py +5 -2
  159. esphome/components/ezo/ezo.h +0 -1
  160. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  161. esphome/components/fan/__init__.py +5 -2
  162. esphome/components/feedback/feedback_cover.h +0 -1
  163. esphome/components/font/__init__.py +92 -82
  164. esphome/components/font/font.cpp +9 -2
  165. esphome/components/font/font.h +20 -5
  166. esphome/components/fs3000/fs3000.h +0 -1
  167. esphome/components/gcja5/gcja5.h +0 -1
  168. esphome/components/gl_r01_i2c/__init__.py +0 -0
  169. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  170. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  171. esphome/components/gl_r01_i2c/sensor.py +36 -0
  172. esphome/components/gp8403/gp8403.h +0 -1
  173. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  174. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  175. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  176. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  177. esphome/components/he60r/he60r.h +0 -1
  178. esphome/components/heatpumpir/climate.py +2 -1
  179. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  180. esphome/components/heatpumpir/heatpumpir.h +1 -0
  181. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  182. esphome/components/host/__init__.py +3 -1
  183. esphome/components/host/helpers.cpp +57 -0
  184. esphome/components/http_request/__init__.py +19 -1
  185. esphome/components/http_request/http_request.h +1 -1
  186. esphome/components/http_request/http_request_arduino.h +1 -0
  187. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  188. esphome/components/http_request/update/http_request_update.cpp +28 -9
  189. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  190. esphome/components/hydreon_rgxx/sensor.py +1 -1
  191. esphome/components/i2c/__init__.py +23 -11
  192. esphome/components/i2c/i2c_bus.h +8 -1
  193. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  194. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  195. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  196. esphome/components/i2c_device/i2c_device.h +0 -1
  197. esphome/components/i2s_audio/__init__.py +2 -10
  198. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  199. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  200. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  201. esphome/components/iaqcore/iaqcore.h +0 -2
  202. esphome/components/image/__init__.py +123 -24
  203. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  204. esphome/components/ina219/ina219.cpp +7 -0
  205. esphome/components/ina219/ina219.h +1 -0
  206. esphome/components/ina260/ina260.h +0 -2
  207. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  208. esphome/components/inkplate6/display.py +15 -0
  209. esphome/components/inkplate6/inkplate.cpp +2 -2
  210. esphome/components/integration/integration_sensor.h +0 -1
  211. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  212. esphome/components/internal_temperature/sensor.py +0 -26
  213. esphome/components/interval/interval.h +0 -2
  214. esphome/components/ld2410/button/__init__.py +3 -3
  215. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  216. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  217. esphome/components/ld2410/ld2410.cpp +421 -268
  218. esphome/components/ld2410/ld2410.h +44 -146
  219. esphome/components/ld2410/number/__init__.py +2 -2
  220. esphome/components/ld2410/sensor.py +1 -1
  221. esphome/components/ld2410/switch/__init__.py +1 -1
  222. esphome/components/ld2420/ld2420.cpp +196 -100
  223. esphome/components/ld2420/ld2420.h +46 -118
  224. esphome/components/ld2420/number/__init__.py +2 -2
  225. esphome/components/ld2420/sensor/__init__.py +6 -2
  226. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  227. esphome/components/ld2450/button/__init__.py +3 -3
  228. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  229. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  230. esphome/components/ld2450/ld2450.cpp +384 -232
  231. esphome/components/ld2450/ld2450.h +60 -69
  232. esphome/components/ld2450/switch/__init__.py +1 -1
  233. esphome/components/ledc/ledc_output.cpp +1 -63
  234. esphome/components/libretiny/__init__.py +5 -3
  235. esphome/components/libretiny/const.py +5 -0
  236. esphome/components/libretiny/generate_components.py +1 -0
  237. esphome/components/libretiny/helpers.cpp +35 -0
  238. esphome/components/libretiny/lt_component.cpp +5 -3
  239. esphome/components/light/__init__.py +4 -2
  240. esphome/components/light/addressable_light.h +3 -3
  241. esphome/components/light/light_call.cpp +180 -243
  242. esphome/components/light/light_call.h +72 -20
  243. esphome/components/light/light_color_values.h +14 -14
  244. esphome/components/light/light_state.h +15 -13
  245. esphome/components/light/transformers.h +2 -2
  246. esphome/components/ln882x/__init__.py +52 -0
  247. esphome/components/ln882x/boards.py +285 -0
  248. esphome/components/lock/__init__.py +5 -2
  249. esphome/components/logger/__init__.py +40 -3
  250. esphome/components/logger/logger.cpp +47 -12
  251. esphome/components/logger/logger.h +80 -49
  252. esphome/components/logger/logger_esp32.cpp +3 -3
  253. esphome/components/lps22/__init__.py +0 -0
  254. esphome/components/lps22/lps22.cpp +75 -0
  255. esphome/components/lps22/lps22.h +27 -0
  256. esphome/components/lps22/sensor.py +58 -0
  257. esphome/components/ltr390/ltr390.h +0 -1
  258. esphome/components/ltr501/ltr501.h +0 -1
  259. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  260. esphome/components/lvgl/__init__.py +1 -1
  261. esphome/components/lvgl/schemas.py +66 -6
  262. esphome/components/lvgl/styles.py +24 -16
  263. esphome/components/lvgl/widgets/__init__.py +12 -2
  264. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  265. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  266. esphome/components/max9611/max9611.h +0 -1
  267. esphome/components/mcp23016/__init__.py +1 -1
  268. esphome/components/mcp23xxx_base/__init__.py +1 -1
  269. esphome/components/mcp4461/__init__.py +1 -1
  270. esphome/components/mcp4461/output/__init__.py +3 -2
  271. esphome/components/mcp9600/mcp9600.h +0 -2
  272. esphome/components/md5/md5.cpp +3 -3
  273. esphome/components/md5/md5.h +1 -6
  274. esphome/components/mdns/__init__.py +22 -11
  275. esphome/components/media_player/__init__.py +4 -3
  276. esphome/components/micro_wake_word/__init__.py +1 -5
  277. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  278. esphome/components/microphone/microphone.cpp +7 -9
  279. esphome/components/microphone/microphone.h +0 -2
  280. esphome/components/mipi_spi/display.py +1 -0
  281. esphome/components/mmc5603/mmc5603.cpp +1 -1
  282. esphome/components/modbus/modbus.cpp +33 -15
  283. esphome/components/modbus/modbus.h +9 -0
  284. esphome/components/modbus_controller/__init__.py +42 -10
  285. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  286. esphome/components/modbus_controller/modbus_controller.h +61 -7
  287. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  288. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  289. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  290. esphome/components/mqtt/__init__.py +16 -0
  291. esphome/components/mqtt/mqtt_backend.h +2 -1
  292. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  293. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  294. esphome/components/mqtt/mqtt_client.cpp +15 -9
  295. esphome/components/mqtt/mqtt_client.h +8 -3
  296. esphome/components/ms8607/ms8607.h +0 -1
  297. esphome/components/neopixelbus/light.py +4 -1
  298. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  299. esphome/components/network/__init__.py +4 -1
  300. esphome/components/network/ip_address.h +1 -0
  301. esphome/components/nextion/__init__.py +16 -0
  302. esphome/components/nextion/base_component.py +1 -0
  303. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  304. esphome/components/nextion/display.py +14 -4
  305. esphome/components/nextion/nextion.cpp +166 -101
  306. esphome/components/nextion/nextion.h +84 -53
  307. esphome/components/nextion/nextion_commands.cpp +11 -10
  308. esphome/components/nextion/nextion_component.cpp +28 -28
  309. esphome/components/nextion/nextion_component.h +53 -18
  310. esphome/components/nextion/nextion_component_base.h +3 -0
  311. esphome/components/nextion/nextion_upload.cpp +36 -0
  312. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  313. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  314. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  315. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  316. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  317. esphome/components/nfc/nfc.cpp +3 -22
  318. esphome/components/nfc/nfc.h +3 -3
  319. esphome/components/number/__init__.py +5 -2
  320. esphome/components/online_image/__init__.py +5 -0
  321. esphome/components/online_image/online_image.cpp +6 -2
  322. esphome/components/online_image/online_image.h +4 -1
  323. esphome/components/opentherm/opentherm.cpp +7 -12
  324. esphome/components/openthread/__init__.py +47 -40
  325. esphome/components/openthread/const.py +1 -0
  326. esphome/components/openthread/openthread_esp.cpp +27 -5
  327. esphome/components/opt3001/__init__.py +0 -0
  328. esphome/components/opt3001/opt3001.cpp +122 -0
  329. esphome/components/opt3001/opt3001.h +27 -0
  330. esphome/components/opt3001/sensor.py +35 -0
  331. esphome/components/ota/__init__.py +17 -0
  332. esphome/components/ota/ota_backend.h +27 -1
  333. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  334. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  336. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  338. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  339. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  340. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  341. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  342. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  343. esphome/components/packages/__init__.py +5 -2
  344. esphome/components/packet_transport/binary_sensor.py +61 -4
  345. esphome/components/packet_transport/packet_transport.cpp +34 -1
  346. esphome/components/packet_transport/packet_transport.h +11 -5
  347. esphome/components/pcf8574/__init__.py +1 -1
  348. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  349. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  350. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  351. esphome/components/pmsa003i/pmsa003i.h +0 -1
  352. esphome/components/pmsx003/pmsx003.h +0 -1
  353. esphome/components/pn7150/pn7150.cpp +7 -7
  354. esphome/components/pn7150/pn7150.h +0 -1
  355. esphome/components/pn7160/pn7160.cpp +7 -7
  356. esphome/components/pn7160/pn7160.h +0 -1
  357. esphome/components/preferences/syncer.h +2 -0
  358. esphome/components/prometheus/prometheus_handler.h +1 -1
  359. esphome/components/psram/psram.cpp +0 -20
  360. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  361. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  362. esphome/components/pulse_width/pulse_width.h +0 -1
  363. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  364. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  365. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  366. esphome/components/qr_code/__init__.py +13 -10
  367. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  368. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  369. esphome/components/rc522/rc522.h +0 -1
  370. esphome/components/rdm6300/rdm6300.h +0 -2
  371. esphome/components/remote_base/__init__.py +7 -5
  372. esphome/components/remote_base/remote_base.cpp +24 -21
  373. esphome/components/remote_base/remote_base.h +3 -26
  374. esphome/components/remote_receiver/__init__.py +40 -46
  375. esphome/components/remote_receiver/remote_receiver.h +4 -18
  376. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  377. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  378. esphome/components/remote_transmitter/__init__.py +42 -43
  379. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  380. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  381. esphome/components/resistance/resistance_sensor.h +0 -1
  382. esphome/components/rp2040/__init__.py +2 -0
  383. esphome/components/rp2040/helpers.cpp +55 -0
  384. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  385. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  386. esphome/components/rtttl/__init__.py +4 -4
  387. esphome/components/rtttl/rtttl.cpp +10 -1
  388. esphome/components/ruuvitag/ruuvitag.h +0 -1
  389. esphome/components/safe_mode/safe_mode.cpp +2 -0
  390. esphome/components/safe_mode/safe_mode.h +4 -1
  391. esphome/components/scd30/scd30.h +0 -1
  392. esphome/components/scd30/sensor.py +2 -2
  393. esphome/components/scd4x/scd4x.cpp +61 -54
  394. esphome/components/scd4x/scd4x.h +17 -15
  395. esphome/components/scd4x/sensor.py +4 -4
  396. esphome/components/script/script.h +0 -2
  397. esphome/components/sdp3x/sensor.py +1 -1
  398. esphome/components/select/__init__.py +5 -2
  399. esphome/components/sen5x/sen5x.h +0 -1
  400. esphome/components/senseair/senseair.h +0 -1
  401. esphome/components/sensor/__init__.py +4 -2
  402. esphome/components/sensor/filter.cpp +1 -1
  403. esphome/components/sensor/sensor.cpp +12 -6
  404. esphome/components/sensor/sensor.h +13 -5
  405. esphome/components/servo/servo.h +0 -1
  406. esphome/components/sfa30/sfa30.h +0 -1
  407. esphome/components/sgp30/sgp30.h +0 -1
  408. esphome/components/sgp4x/sgp4x.h +0 -1
  409. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  410. esphome/components/sht4x/sht4x.h +0 -1
  411. esphome/components/sm300d2/sm300d2.h +0 -2
  412. esphome/components/smt100/sensor.py +8 -4
  413. esphome/components/smt100/smt100.cpp +5 -5
  414. esphome/components/smt100/smt100.h +3 -3
  415. esphome/components/sn74hc595/__init__.py +1 -1
  416. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  417. esphome/components/sntp/sntp_component.cpp +9 -3
  418. esphome/components/sntp/time.py +2 -0
  419. esphome/components/socket/__init__.py +17 -0
  420. esphome/components/spi/__init__.py +27 -6
  421. esphome/components/spi/spi.cpp +3 -2
  422. esphome/components/spi/spi.h +9 -3
  423. esphome/components/spi/spi_arduino.cpp +3 -5
  424. esphome/components/spi/spi_esp_idf.cpp +40 -21
  425. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  426. esphome/components/sps30/sps30.h +0 -1
  427. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  428. esphome/components/st7701s/st7701s.cpp +0 -4
  429. esphome/components/status/status_binary_sensor.h +0 -2
  430. esphome/components/substitutions/__init__.py +76 -19
  431. esphome/components/substitutions/jinja.py +99 -0
  432. esphome/components/sun/sun.cpp +3 -4
  433. esphome/components/switch/__init__.py +5 -2
  434. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  435. esphome/components/sx126x/__init__.py +317 -0
  436. esphome/components/sx126x/automation.h +62 -0
  437. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  438. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  439. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  440. esphome/components/sx126x/sx126x.cpp +523 -0
  441. esphome/components/sx126x/sx126x.h +140 -0
  442. esphome/components/sx126x/sx126x_reg.h +163 -0
  443. esphome/components/sx127x/__init__.py +325 -0
  444. esphome/components/sx127x/automation.h +62 -0
  445. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  446. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  447. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  448. esphome/components/sx127x/sx127x.cpp +498 -0
  449. esphome/components/sx127x/sx127x.h +128 -0
  450. esphome/components/sx127x/sx127x_reg.h +295 -0
  451. esphome/components/syslog/esphome_syslog.cpp +5 -3
  452. esphome/components/syslog/esphome_syslog.h +1 -1
  453. esphome/components/tca9555/__init__.py +1 -1
  454. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  455. esphome/components/text/__init__.py +5 -2
  456. esphome/components/text_sensor/__init__.py +5 -2
  457. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  458. esphome/components/thermostat/thermostat_climate.h +43 -39
  459. esphome/components/time/__init__.py +16 -2
  460. esphome/components/time/real_time_clock.cpp +4 -0
  461. esphome/components/time/real_time_clock.h +5 -1
  462. esphome/components/tlc5971/tlc5971.cpp +4 -1
  463. esphome/components/tmp1075/tmp1075.h +0 -2
  464. esphome/components/tof10120/tof10120_sensor.h +0 -1
  465. esphome/components/tormatic/tormatic_cover.h +0 -1
  466. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  467. esphome/components/tsl2591/tsl2591.cpp +1 -1
  468. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  469. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  470. esphome/components/tx20/tx20.cpp +2 -2
  471. esphome/components/uart/__init__.py +18 -0
  472. esphome/components/uart/uart_component_esp_idf.cpp +0 -4
  473. esphome/components/update/__init__.py +5 -2
  474. esphome/components/update/update_entity.h +8 -0
  475. esphome/components/usb_host/__init__.py +5 -2
  476. esphome/components/usb_host/usb_host_client.cpp +10 -10
  477. esphome/components/usb_uart/cp210x.cpp +1 -1
  478. esphome/components/usb_uart/usb_uart.cpp +41 -44
  479. esphome/components/usb_uart/usb_uart.h +4 -3
  480. esphome/components/valve/__init__.py +5 -2
  481. esphome/components/vbus/vbus.h +0 -1
  482. esphome/components/veml3235/veml3235.h +0 -1
  483. esphome/components/veml7700/veml7700.h +0 -1
  484. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  485. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  486. esphome/components/watchdog/watchdog.cpp +0 -4
  487. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  488. esphome/components/web_server/__init__.py +34 -19
  489. esphome/components/web_server/ota/__init__.py +32 -0
  490. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  491. esphome/components/web_server/ota/ota_web_server.h +26 -0
  492. esphome/components/web_server/web_server.cpp +305 -427
  493. esphome/components/web_server/web_server.h +33 -23
  494. esphome/components/web_server/web_server_v1.cpp +4 -5
  495. esphome/components/web_server_base/__init__.py +5 -2
  496. esphome/components/web_server_base/web_server_base.cpp +2 -94
  497. esphome/components/web_server_base/web_server_base.h +5 -25
  498. esphome/components/web_server_idf/multipart.cpp +254 -0
  499. esphome/components/web_server_idf/multipart.h +86 -0
  500. esphome/components/web_server_idf/utils.cpp +32 -0
  501. esphome/components/web_server_idf/utils.h +10 -0
  502. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  503. esphome/components/web_server_idf/web_server_idf.h +11 -10
  504. esphome/components/wiegand/wiegand.cpp +2 -2
  505. esphome/components/wifi/__init__.py +18 -0
  506. esphome/components/wifi/wifi_component.cpp +17 -22
  507. esphome/components/wifi/wifi_component.h +27 -23
  508. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  509. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  510. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  511. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  512. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  513. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  514. esphome/components/wireguard/__init__.py +2 -11
  515. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  516. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  517. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  518. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  519. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  520. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  521. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  522. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  523. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  524. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  525. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  526. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  527. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  528. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  529. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  530. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  531. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  532. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  533. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  534. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  535. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  536. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  537. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  538. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  539. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  540. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  541. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  542. esphome/components/zyaura/zyaura.h +0 -1
  543. esphome/config.py +88 -22
  544. esphome/config_helpers.py +74 -1
  545. esphome/config_validation.py +12 -1
  546. esphome/const.py +65 -10
  547. esphome/core/__init__.py +18 -2
  548. esphome/core/application.cpp +163 -10
  549. esphome/core/application.h +145 -165
  550. esphome/core/area.h +19 -0
  551. esphome/core/automation.h +58 -9
  552. esphome/core/color.cpp +3 -5
  553. esphome/core/color.h +16 -16
  554. esphome/core/component.cpp +151 -18
  555. esphome/core/component.h +98 -4
  556. esphome/core/component_iterator.cpp +11 -9
  557. esphome/core/component_iterator.h +12 -10
  558. esphome/core/config.py +155 -6
  559. esphome/core/controller.cpp +4 -2
  560. esphome/core/controller.h +1 -1
  561. esphome/core/datatypes.h +2 -2
  562. esphome/core/defines.h +17 -2
  563. esphome/core/device.h +20 -0
  564. esphome/core/entity_base.cpp +20 -15
  565. esphome/core/entity_base.h +76 -0
  566. esphome/core/entity_helpers.py +168 -1
  567. esphome/core/event_pool.h +81 -0
  568. esphome/core/helpers.cpp +75 -230
  569. esphome/core/helpers.h +164 -104
  570. esphome/core/lock_free_queue.h +151 -0
  571. esphome/core/log.cpp +2 -2
  572. esphome/core/log.h +2 -0
  573. esphome/core/optional.h +5 -0
  574. esphome/core/ring_buffer.cpp +2 -2
  575. esphome/core/scheduler.cpp +275 -103
  576. esphome/core/scheduler.h +154 -17
  577. esphome/core/time.cpp +5 -5
  578. esphome/core/time.h +5 -5
  579. esphome/cpp_generator.py +17 -0
  580. esphome/cpp_helpers.py +0 -22
  581. esphome/cpp_types.py +3 -1
  582. esphome/dashboard/entries.py +1 -1
  583. esphome/dashboard/util/text.py +5 -21
  584. esphome/dashboard/web_server.py +9 -1
  585. esphome/helpers.py +47 -0
  586. esphome/loader.py +15 -1
  587. esphome/pins.py +14 -8
  588. esphome/wizard.py +17 -4
  589. esphome/writer.py +21 -3
  590. esphome/yaml_util.py +0 -2
  591. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/METADATA +10 -9
  592. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/RECORD +597 -538
  593. esphome/components/api/api_pb2_size.h +0 -361
  594. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  595. esphome/components/esp32_ble/queue.h +0 -85
  596. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  597. esphome/components/esp32_hall/esp32_hall.h +0 -23
  598. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  599. esphome/components/ld2410/button/reset_button.cpp +0 -9
  600. esphome/components/ld2450/button/reset_button.cpp +0 -9
  601. esphome/components/openthread/tlv.py +0 -65
  602. /esphome/{dashboard/enum.py → enum.py} +0 -0
  603. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/WHEEL +0 -0
  604. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/entry_points.txt +0 -0
  605. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/licenses/LICENSE +0 -0
  606. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/top_level.txt +0 -0
@@ -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)
@@ -0,0 +1,32 @@
1
+ import esphome.codegen as cg
2
+ from esphome.components.esp32 import add_idf_component
3
+ from esphome.components.ota import BASE_OTA_SCHEMA, OTAComponent, ota_to_code
4
+ import esphome.config_validation as cv
5
+ from esphome.const import CONF_ID
6
+ from esphome.core import CORE, coroutine_with_priority
7
+
8
+ CODEOWNERS = ["@esphome/core"]
9
+ DEPENDENCIES = ["network", "web_server_base"]
10
+
11
+ web_server_ns = cg.esphome_ns.namespace("web_server")
12
+ WebServerOTAComponent = web_server_ns.class_("WebServerOTAComponent", OTAComponent)
13
+
14
+ CONFIG_SCHEMA = (
15
+ cv.Schema(
16
+ {
17
+ cv.GenerateID(): cv.declare_id(WebServerOTAComponent),
18
+ }
19
+ )
20
+ .extend(BASE_OTA_SCHEMA)
21
+ .extend(cv.COMPONENT_SCHEMA)
22
+ )
23
+
24
+
25
+ @coroutine_with_priority(52.0)
26
+ async def to_code(config):
27
+ var = cg.new_Pvariable(config[CONF_ID])
28
+ await ota_to_code(var, config)
29
+ await cg.register_component(var, config)
30
+ cg.add_define("USE_WEBSERVER_OTA")
31
+ if CORE.using_esp_idf:
32
+ add_idf_component(name="zorxx/multipart-parser", ref="1.0.1")
@@ -0,0 +1,210 @@
1
+ #include "ota_web_server.h"
2
+ #ifdef USE_WEBSERVER_OTA
3
+
4
+ #include "esphome/components/ota/ota_backend.h"
5
+ #include "esphome/core/application.h"
6
+ #include "esphome/core/log.h"
7
+
8
+ #ifdef USE_ARDUINO
9
+ #ifdef USE_ESP8266
10
+ #include <Updater.h>
11
+ #elif defined(USE_ESP32) || defined(USE_LIBRETINY)
12
+ #include <Update.h>
13
+ #endif
14
+ #endif // USE_ARDUINO
15
+
16
+ namespace esphome {
17
+ namespace web_server {
18
+
19
+ static const char *const TAG = "web_server.ota";
20
+
21
+ class OTARequestHandler : public AsyncWebHandler {
22
+ public:
23
+ OTARequestHandler(WebServerOTAComponent *parent) : parent_(parent) {}
24
+ void handleRequest(AsyncWebServerRequest *request) override;
25
+ void handleUpload(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len,
26
+ bool final) override;
27
+ bool canHandle(AsyncWebServerRequest *request) const override {
28
+ return request->url() == "/update" && request->method() == HTTP_POST;
29
+ }
30
+
31
+ // NOLINTNEXTLINE(readability-identifier-naming)
32
+ bool isRequestHandlerTrivial() const override { return false; }
33
+
34
+ protected:
35
+ void report_ota_progress_(AsyncWebServerRequest *request);
36
+ void schedule_ota_reboot_();
37
+ void ota_init_(const char *filename);
38
+
39
+ uint32_t last_ota_progress_{0};
40
+ uint32_t ota_read_length_{0};
41
+ WebServerOTAComponent *parent_;
42
+ bool ota_success_{false};
43
+
44
+ private:
45
+ std::unique_ptr<ota::OTABackend> ota_backend_{nullptr};
46
+ };
47
+
48
+ void OTARequestHandler::report_ota_progress_(AsyncWebServerRequest *request) {
49
+ const uint32_t now = millis();
50
+ if (now - this->last_ota_progress_ > 1000) {
51
+ float percentage = 0.0f;
52
+ if (request->contentLength() != 0) {
53
+ // Note: Using contentLength() for progress calculation is technically wrong as it includes
54
+ // multipart headers/boundaries, but it's only off by a small amount and we don't have
55
+ // access to the actual firmware size until the upload is complete. This is intentional
56
+ // as it still gives the user a reasonable progress indication.
57
+ percentage = (this->ota_read_length_ * 100.0f) / request->contentLength();
58
+ ESP_LOGD(TAG, "OTA in progress: %0.1f%%", percentage);
59
+ } else {
60
+ ESP_LOGD(TAG, "OTA in progress: %u bytes read", this->ota_read_length_);
61
+ }
62
+ #ifdef USE_OTA_STATE_CALLBACK
63
+ // Report progress - use call_deferred since we're in web server task
64
+ this->parent_->state_callback_.call_deferred(ota::OTA_IN_PROGRESS, percentage, 0);
65
+ #endif
66
+ this->last_ota_progress_ = now;
67
+ }
68
+ }
69
+
70
+ void OTARequestHandler::schedule_ota_reboot_() {
71
+ ESP_LOGI(TAG, "OTA update successful!");
72
+ this->parent_->set_timeout(100, []() {
73
+ ESP_LOGI(TAG, "Performing OTA reboot now");
74
+ App.safe_reboot();
75
+ });
76
+ }
77
+
78
+ void OTARequestHandler::ota_init_(const char *filename) {
79
+ ESP_LOGI(TAG, "OTA Update Start: %s", filename);
80
+ this->ota_read_length_ = 0;
81
+ this->ota_success_ = false;
82
+ }
83
+
84
+ void OTARequestHandler::handleUpload(AsyncWebServerRequest *request, const String &filename, size_t index,
85
+ uint8_t *data, size_t len, bool final) {
86
+ ota::OTAResponseTypes error_code = ota::OTA_RESPONSE_OK;
87
+
88
+ if (index == 0 && !this->ota_backend_) {
89
+ // Initialize OTA on first call
90
+ this->ota_init_(filename.c_str());
91
+
92
+ #ifdef USE_OTA_STATE_CALLBACK
93
+ // Notify OTA started - use call_deferred since we're in web server task
94
+ this->parent_->state_callback_.call_deferred(ota::OTA_STARTED, 0.0f, 0);
95
+ #endif
96
+
97
+ // Platform-specific pre-initialization
98
+ #ifdef USE_ARDUINO
99
+ #ifdef USE_ESP8266
100
+ Update.runAsync(true);
101
+ #endif
102
+ #if defined(USE_ESP32) || defined(USE_LIBRETINY)
103
+ if (Update.isRunning()) {
104
+ Update.abort();
105
+ }
106
+ #endif
107
+ #endif // USE_ARDUINO
108
+
109
+ this->ota_backend_ = ota::make_ota_backend();
110
+ if (!this->ota_backend_) {
111
+ ESP_LOGE(TAG, "Failed to create OTA backend");
112
+ #ifdef USE_OTA_STATE_CALLBACK
113
+ this->parent_->state_callback_.call_deferred(ota::OTA_ERROR, 0.0f,
114
+ static_cast<uint8_t>(ota::OTA_RESPONSE_ERROR_UNKNOWN));
115
+ #endif
116
+ return;
117
+ }
118
+
119
+ // Web server OTA uses multipart uploads where the actual firmware size
120
+ // is unknown (contentLength includes multipart overhead)
121
+ // Pass 0 to indicate unknown size
122
+ error_code = this->ota_backend_->begin(0);
123
+ if (error_code != ota::OTA_RESPONSE_OK) {
124
+ ESP_LOGE(TAG, "OTA begin failed: %d", error_code);
125
+ this->ota_backend_.reset();
126
+ #ifdef USE_OTA_STATE_CALLBACK
127
+ this->parent_->state_callback_.call_deferred(ota::OTA_ERROR, 0.0f, static_cast<uint8_t>(error_code));
128
+ #endif
129
+ return;
130
+ }
131
+ }
132
+
133
+ if (!this->ota_backend_) {
134
+ return;
135
+ }
136
+
137
+ // Process data
138
+ if (len > 0) {
139
+ error_code = this->ota_backend_->write(data, len);
140
+ if (error_code != ota::OTA_RESPONSE_OK) {
141
+ ESP_LOGE(TAG, "OTA write failed: %d", error_code);
142
+ this->ota_backend_->abort();
143
+ this->ota_backend_.reset();
144
+ #ifdef USE_OTA_STATE_CALLBACK
145
+ this->parent_->state_callback_.call_deferred(ota::OTA_ERROR, 0.0f, static_cast<uint8_t>(error_code));
146
+ #endif
147
+ return;
148
+ }
149
+ this->ota_read_length_ += len;
150
+ this->report_ota_progress_(request);
151
+ }
152
+
153
+ // Finalize
154
+ if (final) {
155
+ ESP_LOGD(TAG, "OTA final chunk: index=%u, len=%u, total_read=%u, contentLength=%u", index, len,
156
+ this->ota_read_length_, request->contentLength());
157
+
158
+ // For Arduino framework, the Update library tracks expected size from firmware header
159
+ // If we haven't received enough data, calling end() will fail
160
+ // This can happen if the upload is interrupted or the client disconnects
161
+ error_code = this->ota_backend_->end();
162
+ if (error_code == ota::OTA_RESPONSE_OK) {
163
+ this->ota_success_ = true;
164
+ #ifdef USE_OTA_STATE_CALLBACK
165
+ // Report completion before reboot - use call_deferred since we're in web server task
166
+ this->parent_->state_callback_.call_deferred(ota::OTA_COMPLETED, 100.0f, 0);
167
+ #endif
168
+ this->schedule_ota_reboot_();
169
+ } else {
170
+ ESP_LOGE(TAG, "OTA end failed: %d", error_code);
171
+ #ifdef USE_OTA_STATE_CALLBACK
172
+ this->parent_->state_callback_.call_deferred(ota::OTA_ERROR, 0.0f, static_cast<uint8_t>(error_code));
173
+ #endif
174
+ }
175
+ this->ota_backend_.reset();
176
+ }
177
+ }
178
+
179
+ void OTARequestHandler::handleRequest(AsyncWebServerRequest *request) {
180
+ AsyncWebServerResponse *response;
181
+ // Use the ota_success_ flag to determine the actual result
182
+ const char *msg = this->ota_success_ ? "Update Successful!" : "Update Failed!";
183
+ response = request->beginResponse(200, "text/plain", msg);
184
+ response->addHeader("Connection", "close");
185
+ request->send(response);
186
+ }
187
+
188
+ void WebServerOTAComponent::setup() {
189
+ // Get the global web server base instance and register our handler
190
+ auto *base = web_server_base::global_web_server_base;
191
+ if (base == nullptr) {
192
+ ESP_LOGE(TAG, "WebServerBase not found");
193
+ this->mark_failed();
194
+ return;
195
+ }
196
+
197
+ // AsyncWebServer takes ownership of the handler and will delete it when the server is destroyed
198
+ base->add_handler(new OTARequestHandler(this)); // NOLINT
199
+ #ifdef USE_OTA_STATE_CALLBACK
200
+ // Register with global OTA callback system
201
+ ota::register_ota_platform(this);
202
+ #endif
203
+ }
204
+
205
+ void WebServerOTAComponent::dump_config() { ESP_LOGCONFIG(TAG, "Web Server OTA"); }
206
+
207
+ } // namespace web_server
208
+ } // namespace esphome
209
+
210
+ #endif // USE_WEBSERVER_OTA
@@ -0,0 +1,26 @@
1
+ #pragma once
2
+
3
+ #include "esphome/core/defines.h"
4
+ #ifdef USE_WEBSERVER_OTA
5
+
6
+ #include "esphome/components/ota/ota_backend.h"
7
+ #include "esphome/components/web_server_base/web_server_base.h"
8
+ #include "esphome/core/component.h"
9
+
10
+ namespace esphome {
11
+ namespace web_server {
12
+
13
+ class WebServerOTAComponent : public ota::OTAComponent {
14
+ public:
15
+ void setup() override;
16
+ void dump_config() override;
17
+ float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
18
+
19
+ protected:
20
+ friend class OTARequestHandler;
21
+ };
22
+
23
+ } // namespace web_server
24
+ } // namespace esphome
25
+
26
+ #endif // USE_WEBSERVER_OTA