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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (648) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +57 -21
  22. esphome/components/api/api_connection.cpp +344 -539
  23. esphome/components/api/api_connection.h +224 -141
  24. esphome/components/api/api_frame_helper.cpp +91 -127
  25. esphome/components/api/api_frame_helper.h +64 -54
  26. esphome/components/api/api_pb2.cpp +1837 -9044
  27. esphome/components/api/api_pb2.h +532 -685
  28. esphome/components/api/api_pb2_dump.cpp +4432 -0
  29. esphome/components/api/api_pb2_service.cpp +184 -425
  30. esphome/components/api/api_pb2_service.h +13 -6
  31. esphome/components/api/api_server.cpp +131 -167
  32. esphome/components/api/api_server.h +38 -10
  33. esphome/components/api/client.py +10 -4
  34. esphome/components/api/custom_api_device.h +8 -0
  35. esphome/components/api/list_entities.cpp +37 -104
  36. esphome/components/api/list_entities.h +33 -23
  37. esphome/components/api/proto.h +532 -26
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/api/user_services.h +2 -0
  41. esphome/components/as3935_spi/as3935_spi.h +0 -2
  42. esphome/components/as5600/as5600.h +0 -1
  43. esphome/components/async_tcp/__init__.py +14 -5
  44. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  45. esphome/components/atm90e32/atm90e32.cpp +2 -1
  46. esphome/components/audio/audio_decoder.cpp +1 -1
  47. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  48. esphome/components/b_parasite/b_parasite.h +0 -1
  49. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  50. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  51. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  52. esphome/components/bh1750/bh1750.cpp +5 -5
  53. esphome/components/binary_sensor/__init__.py +82 -5
  54. esphome/components/binary_sensor/automation.h +19 -1
  55. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  56. esphome/components/binary_sensor/binary_sensor.h +11 -25
  57. esphome/components/binary_sensor/filter.cpp +29 -24
  58. esphome/components/binary_sensor/filter.h +20 -10
  59. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  60. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  63. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  64. esphome/components/ble_client/switch/ble_switch.h +0 -1
  65. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  66. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  67. esphome/components/ble_presence/ble_presence_device.h +0 -1
  68. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  69. esphome/components/ble_scanner/ble_scanner.h +0 -1
  70. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  71. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  72. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  73. esphome/components/bme680/sensor.py +1 -1
  74. esphome/components/bmp581/bmp581.h +0 -2
  75. esphome/components/button/__init__.py +5 -2
  76. esphome/components/camera/__init__.py +1 -0
  77. esphome/components/camera/camera.cpp +22 -0
  78. esphome/components/camera/camera.h +80 -0
  79. esphome/components/canbus/__init__.py +1 -0
  80. esphome/components/cap1188/cap1188.h +0 -1
  81. esphome/components/captive_portal/__init__.py +12 -2
  82. esphome/components/captive_portal/captive_portal.cpp +12 -2
  83. esphome/components/captive_portal/captive_portal.h +5 -2
  84. esphome/components/ccs811/ccs811.h +0 -2
  85. esphome/components/climate/__init__.py +5 -2
  86. esphome/components/cm1106/sensor.py +2 -2
  87. esphome/components/const/__init__.py +2 -0
  88. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  89. esphome/components/copy/button/copy_button.h +0 -1
  90. esphome/components/copy/cover/copy_cover.h +0 -1
  91. esphome/components/copy/fan/copy_fan.h +0 -1
  92. esphome/components/copy/lock/copy_lock.h +0 -1
  93. esphome/components/copy/number/copy_number.h +0 -1
  94. esphome/components/copy/select/copy_select.h +0 -1
  95. esphome/components/copy/sensor/copy_sensor.h +0 -1
  96. esphome/components/copy/switch/copy_switch.h +0 -1
  97. esphome/components/copy/text/copy_text.h +0 -1
  98. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  99. esphome/components/cover/__init__.py +5 -2
  100. esphome/components/cs5460a/cs5460a.h +0 -1
  101. esphome/components/datetime/__init__.py +4 -2
  102. esphome/components/debug/__init__.py +20 -0
  103. esphome/components/debug/debug_esp32.cpp +2 -0
  104. esphome/components/deep_sleep/__init__.py +43 -9
  105. esphome/components/demo/__init__.py +2 -2
  106. esphome/components/display/display.cpp +4 -3
  107. esphome/components/display/display.h +0 -2
  108. esphome/components/display/display_buffer.cpp +1 -1
  109. esphome/components/ds2484/__init__.py +1 -0
  110. esphome/components/ds2484/ds2484.cpp +209 -0
  111. esphome/components/ds2484/ds2484.h +43 -0
  112. esphome/components/ds2484/one_wire.py +37 -0
  113. esphome/components/duty_time/duty_time_sensor.h +0 -1
  114. esphome/components/ens160_base/ens160_base.h +0 -1
  115. esphome/components/es7210/es7210.h +0 -1
  116. esphome/components/es7243e/es7243e.h +0 -1
  117. esphome/components/es8156/es8156.h +0 -1
  118. esphome/components/es8311/es8311.h +0 -1
  119. esphome/components/es8388/es8388.h +0 -1
  120. esphome/components/esp32/__init__.py +103 -135
  121. esphome/components/esp32/core.cpp +0 -4
  122. esphome/components/esp32/gpio.h +1 -1
  123. esphome/components/esp32/helpers.cpp +69 -0
  124. esphome/components/esp32_ble/ble.cpp +5 -6
  125. esphome/components/esp32_ble/ble.h +29 -14
  126. esphome/components/esp32_ble/ble_event.h +6 -6
  127. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  128. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  129. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  130. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  131. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  132. esphome/components/esp32_camera/__init__.py +112 -98
  133. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  134. esphome/components/esp32_camera/esp32_camera.h +35 -30
  135. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  136. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  137. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  138. esphome/components/esp32_hall/sensor.py +2 -21
  139. esphome/components/esp32_hosted/__init__.py +101 -0
  140. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  141. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  142. esphome/components/esp32_rmt/__init__.py +0 -58
  143. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  144. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  145. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  146. esphome/components/esp32_touch/esp32_touch.h +174 -28
  147. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  148. esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
  149. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  150. esphome/components/esp8266/__init__.py +2 -0
  151. esphome/components/esp8266/gpio.cpp +10 -10
  152. esphome/components/esp8266/helpers.cpp +31 -0
  153. esphome/components/esp_ldo/__init__.py +10 -8
  154. esphome/components/esp_ldo/esp_ldo.h +3 -0
  155. esphome/components/esphome/ota/__init__.py +1 -0
  156. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  157. esphome/components/ethernet/__init__.py +42 -23
  158. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  159. esphome/components/ethernet/ethernet_component.cpp +69 -29
  160. esphome/components/ethernet/ethernet_component.h +18 -10
  161. esphome/components/event/__init__.py +5 -2
  162. esphome/components/ezo/ezo.h +0 -1
  163. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  164. esphome/components/fan/__init__.py +5 -2
  165. esphome/components/fan/fan.cpp +4 -0
  166. esphome/components/feedback/feedback_cover.h +0 -1
  167. esphome/components/font/__init__.py +92 -82
  168. esphome/components/font/font.cpp +9 -2
  169. esphome/components/font/font.h +20 -5
  170. esphome/components/fs3000/fs3000.h +0 -1
  171. esphome/components/gcja5/gcja5.h +0 -1
  172. esphome/components/gl_r01_i2c/__init__.py +0 -0
  173. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  174. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  175. esphome/components/gl_r01_i2c/sensor.py +36 -0
  176. esphome/components/gp8403/gp8403.h +0 -1
  177. esphome/components/gpio/binary_sensor/__init__.py +39 -1
  178. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  179. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  180. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  181. esphome/components/he60r/he60r.h +0 -1
  182. esphome/components/heatpumpir/climate.py +2 -1
  183. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  184. esphome/components/heatpumpir/heatpumpir.h +1 -0
  185. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  186. esphome/components/host/__init__.py +3 -1
  187. esphome/components/host/helpers.cpp +57 -0
  188. esphome/components/http_request/__init__.py +19 -1
  189. esphome/components/http_request/http_request.h +1 -1
  190. esphome/components/http_request/http_request_arduino.cpp +0 -1
  191. esphome/components/http_request/http_request_arduino.h +1 -0
  192. esphome/components/http_request/http_request_idf.cpp +0 -1
  193. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  194. esphome/components/http_request/update/http_request_update.cpp +35 -16
  195. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  196. esphome/components/hydreon_rgxx/sensor.py +1 -1
  197. esphome/components/i2c/__init__.py +23 -11
  198. esphome/components/i2c/i2c_bus.h +8 -1
  199. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  200. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  201. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  202. esphome/components/i2c_device/i2c_device.h +0 -1
  203. esphome/components/i2s_audio/__init__.py +2 -10
  204. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  205. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  206. esphome/components/i2s_audio/speaker/__init__.py +1 -1
  207. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  208. esphome/components/iaqcore/iaqcore.h +0 -2
  209. esphome/components/image/__init__.py +123 -24
  210. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  211. esphome/components/ina219/ina219.cpp +7 -0
  212. esphome/components/ina219/ina219.h +1 -0
  213. esphome/components/ina260/ina260.h +0 -2
  214. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  215. esphome/components/inkplate6/display.py +15 -0
  216. esphome/components/inkplate6/inkplate.cpp +2 -2
  217. esphome/components/integration/integration_sensor.h +0 -1
  218. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  219. esphome/components/internal_temperature/sensor.py +0 -26
  220. esphome/components/interval/interval.h +0 -2
  221. esphome/components/json/__init__.py +1 -1
  222. esphome/components/json/json_util.cpp +56 -63
  223. esphome/components/ld2410/button/__init__.py +3 -3
  224. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  225. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  226. esphome/components/ld2410/ld2410.cpp +421 -268
  227. esphome/components/ld2410/ld2410.h +44 -146
  228. esphome/components/ld2410/number/__init__.py +2 -2
  229. esphome/components/ld2410/sensor.py +1 -1
  230. esphome/components/ld2410/switch/__init__.py +1 -1
  231. esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp +2 -2
  232. esphome/components/ld2420/button/reconfig_buttons.cpp +1 -1
  233. esphome/components/ld2420/ld2420.cpp +252 -147
  234. esphome/components/ld2420/ld2420.h +52 -126
  235. esphome/components/ld2420/number/__init__.py +2 -2
  236. esphome/components/ld2420/number/gate_config_number.cpp +1 -1
  237. esphome/components/ld2420/select/operating_mode_select.cpp +1 -1
  238. esphome/components/ld2420/sensor/__init__.py +6 -2
  239. esphome/components/ld2420/sensor/ld2420_sensor.cpp +2 -2
  240. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  241. esphome/components/ld2420/text_sensor/text_sensor.cpp +2 -2
  242. esphome/components/ld2450/button/__init__.py +3 -3
  243. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  244. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  245. esphome/components/ld2450/ld2450.cpp +384 -232
  246. esphome/components/ld2450/ld2450.h +60 -69
  247. esphome/components/ld2450/switch/__init__.py +1 -1
  248. esphome/components/ledc/ledc_output.cpp +1 -63
  249. esphome/components/libretiny/__init__.py +5 -3
  250. esphome/components/libretiny/const.py +5 -0
  251. esphome/components/libretiny/generate_components.py +1 -0
  252. esphome/components/libretiny/helpers.cpp +35 -0
  253. esphome/components/libretiny/lt_component.cpp +5 -3
  254. esphome/components/light/__init__.py +4 -2
  255. esphome/components/light/addressable_light.h +3 -3
  256. esphome/components/light/light_call.cpp +180 -243
  257. esphome/components/light/light_call.h +72 -20
  258. esphome/components/light/light_color_values.h +14 -14
  259. esphome/components/light/light_json_schema.cpp +17 -16
  260. esphome/components/light/light_state.h +15 -13
  261. esphome/components/light/transformers.h +2 -2
  262. esphome/components/ln882x/__init__.py +52 -0
  263. esphome/components/ln882x/boards.py +285 -0
  264. esphome/components/lock/__init__.py +5 -2
  265. esphome/components/logger/__init__.py +40 -3
  266. esphome/components/logger/logger.cpp +47 -12
  267. esphome/components/logger/logger.h +80 -49
  268. esphome/components/logger/logger_esp32.cpp +3 -3
  269. esphome/components/lps22/__init__.py +0 -0
  270. esphome/components/lps22/lps22.cpp +75 -0
  271. esphome/components/lps22/lps22.h +27 -0
  272. esphome/components/lps22/sensor.py +58 -0
  273. esphome/components/ltr390/ltr390.h +0 -1
  274. esphome/components/ltr501/ltr501.h +0 -1
  275. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  276. esphome/components/lvgl/__init__.py +1 -1
  277. esphome/components/lvgl/schemas.py +66 -6
  278. esphome/components/lvgl/styles.py +24 -16
  279. esphome/components/lvgl/widgets/__init__.py +12 -2
  280. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  281. esphome/components/lvgl/widgets/meter.py +20 -13
  282. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  283. esphome/components/max9611/max9611.h +0 -1
  284. esphome/components/mcp23016/__init__.py +1 -1
  285. esphome/components/mcp23xxx_base/__init__.py +1 -1
  286. esphome/components/mcp4461/__init__.py +1 -1
  287. esphome/components/mcp4461/output/__init__.py +3 -2
  288. esphome/components/mcp9600/mcp9600.h +0 -2
  289. esphome/components/md5/md5.cpp +3 -3
  290. esphome/components/md5/md5.h +1 -6
  291. esphome/components/mdns/__init__.py +22 -11
  292. esphome/components/media_player/__init__.py +4 -3
  293. esphome/components/micro_wake_word/__init__.py +1 -5
  294. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  295. esphome/components/microphone/microphone.cpp +7 -9
  296. esphome/components/microphone/microphone.h +0 -2
  297. esphome/components/mipi_spi/display.py +1 -0
  298. esphome/components/mmc5603/mmc5603.cpp +1 -1
  299. esphome/components/modbus/modbus.cpp +33 -15
  300. esphome/components/modbus/modbus.h +9 -0
  301. esphome/components/modbus_controller/__init__.py +42 -10
  302. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  303. esphome/components/modbus_controller/modbus_controller.h +61 -7
  304. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  305. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  306. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  307. esphome/components/mqtt/__init__.py +16 -0
  308. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +2 -1
  309. esphome/components/mqtt/mqtt_backend.h +2 -1
  310. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  311. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  312. esphome/components/mqtt/mqtt_binary_sensor.cpp +1 -0
  313. esphome/components/mqtt/mqtt_button.cpp +4 -1
  314. esphome/components/mqtt/mqtt_client.cpp +17 -9
  315. esphome/components/mqtt/mqtt_client.h +8 -3
  316. esphome/components/mqtt/mqtt_climate.cpp +6 -4
  317. esphome/components/mqtt/mqtt_component.cpp +3 -1
  318. esphome/components/mqtt/mqtt_cover.cpp +1 -0
  319. esphome/components/mqtt/mqtt_date.cpp +4 -3
  320. esphome/components/mqtt/mqtt_datetime.cpp +7 -6
  321. esphome/components/mqtt/mqtt_event.cpp +6 -3
  322. esphome/components/mqtt/mqtt_fan.cpp +1 -0
  323. esphome/components/mqtt/mqtt_light.cpp +8 -4
  324. esphome/components/mqtt/mqtt_lock.cpp +3 -1
  325. esphome/components/mqtt/mqtt_number.cpp +1 -0
  326. esphome/components/mqtt/mqtt_select.cpp +2 -1
  327. esphome/components/mqtt/mqtt_sensor.cpp +3 -1
  328. esphome/components/mqtt/mqtt_switch.cpp +3 -1
  329. esphome/components/mqtt/mqtt_text.cpp +1 -0
  330. esphome/components/mqtt/mqtt_text_sensor.cpp +3 -1
  331. esphome/components/mqtt/mqtt_time.cpp +4 -3
  332. esphome/components/mqtt/mqtt_update.cpp +1 -0
  333. esphome/components/mqtt/mqtt_valve.cpp +3 -1
  334. esphome/components/ms8607/ms8607.cpp +1 -1
  335. esphome/components/ms8607/ms8607.h +0 -1
  336. esphome/components/neopixelbus/light.py +4 -1
  337. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  338. esphome/components/network/__init__.py +4 -1
  339. esphome/components/network/ip_address.h +1 -0
  340. esphome/components/nextion/__init__.py +16 -0
  341. esphome/components/nextion/base_component.py +1 -0
  342. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  343. esphome/components/nextion/display.py +14 -4
  344. esphome/components/nextion/nextion.cpp +166 -101
  345. esphome/components/nextion/nextion.h +84 -53
  346. esphome/components/nextion/nextion_commands.cpp +11 -10
  347. esphome/components/nextion/nextion_component.cpp +28 -28
  348. esphome/components/nextion/nextion_component.h +53 -18
  349. esphome/components/nextion/nextion_component_base.h +3 -0
  350. esphome/components/nextion/nextion_upload.cpp +36 -0
  351. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  352. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  353. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  354. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  355. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  356. esphome/components/nfc/nfc.cpp +3 -22
  357. esphome/components/nfc/nfc.h +3 -3
  358. esphome/components/number/__init__.py +5 -2
  359. esphome/components/online_image/__init__.py +9 -1
  360. esphome/components/online_image/online_image.cpp +17 -7
  361. esphome/components/online_image/online_image.h +10 -2
  362. esphome/components/opentherm/opentherm.cpp +7 -12
  363. esphome/components/opentherm/output/output.cpp +1 -1
  364. esphome/components/openthread/__init__.py +47 -40
  365. esphome/components/openthread/const.py +1 -0
  366. esphome/components/openthread/openthread_esp.cpp +27 -5
  367. esphome/components/opt3001/__init__.py +0 -0
  368. esphome/components/opt3001/opt3001.cpp +122 -0
  369. esphome/components/opt3001/opt3001.h +27 -0
  370. esphome/components/opt3001/sensor.py +35 -0
  371. esphome/components/ota/__init__.py +17 -0
  372. esphome/components/ota/ota_backend.h +27 -1
  373. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  374. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  375. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  376. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  377. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  378. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  379. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  380. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  381. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  382. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  383. esphome/components/packages/__init__.py +5 -2
  384. esphome/components/packet_transport/binary_sensor.py +61 -4
  385. esphome/components/packet_transport/packet_transport.cpp +34 -1
  386. esphome/components/packet_transport/packet_transport.h +11 -5
  387. esphome/components/pcf8574/__init__.py +1 -1
  388. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  389. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  390. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  391. esphome/components/pmsa003i/pmsa003i.h +0 -1
  392. esphome/components/pmsx003/pmsx003.h +0 -1
  393. esphome/components/pn7150/pn7150.cpp +7 -7
  394. esphome/components/pn7150/pn7150.h +0 -1
  395. esphome/components/pn7160/pn7160.cpp +7 -7
  396. esphome/components/pn7160/pn7160.h +0 -1
  397. esphome/components/preferences/syncer.h +2 -0
  398. esphome/components/prometheus/prometheus_handler.h +1 -1
  399. esphome/components/psram/psram.cpp +0 -20
  400. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  401. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  402. esphome/components/pulse_width/pulse_width.h +0 -1
  403. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  404. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  405. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  406. esphome/components/qr_code/__init__.py +13 -10
  407. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  408. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  409. esphome/components/rc522/rc522.h +0 -1
  410. esphome/components/rdm6300/rdm6300.h +0 -2
  411. esphome/components/remote_base/__init__.py +7 -5
  412. esphome/components/remote_base/remote_base.cpp +24 -21
  413. esphome/components/remote_base/remote_base.h +3 -26
  414. esphome/components/remote_receiver/__init__.py +40 -46
  415. esphome/components/remote_receiver/remote_receiver.h +4 -18
  416. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  417. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  418. esphome/components/remote_transmitter/__init__.py +42 -43
  419. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  420. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  421. esphome/components/resistance/resistance_sensor.h +0 -1
  422. esphome/components/rp2040/__init__.py +2 -0
  423. esphome/components/rp2040/helpers.cpp +55 -0
  424. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  425. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  426. esphome/components/rtttl/__init__.py +4 -4
  427. esphome/components/rtttl/rtttl.cpp +10 -1
  428. esphome/components/ruuvitag/ruuvitag.h +0 -1
  429. esphome/components/safe_mode/safe_mode.cpp +2 -0
  430. esphome/components/safe_mode/safe_mode.h +4 -1
  431. esphome/components/scd30/scd30.h +0 -1
  432. esphome/components/scd30/sensor.py +2 -2
  433. esphome/components/scd4x/scd4x.cpp +61 -54
  434. esphome/components/scd4x/scd4x.h +17 -15
  435. esphome/components/scd4x/sensor.py +4 -4
  436. esphome/components/script/script.h +0 -2
  437. esphome/components/sdp3x/sensor.py +1 -1
  438. esphome/components/select/__init__.py +5 -2
  439. esphome/components/sen5x/sen5x.h +0 -1
  440. esphome/components/senseair/senseair.h +0 -1
  441. esphome/components/sensor/__init__.py +4 -2
  442. esphome/components/sensor/filter.cpp +1 -1
  443. esphome/components/sensor/sensor.cpp +12 -6
  444. esphome/components/sensor/sensor.h +13 -5
  445. esphome/components/servo/servo.cpp +2 -2
  446. esphome/components/servo/servo.h +0 -1
  447. esphome/components/sfa30/sfa30.h +0 -1
  448. esphome/components/sgp30/sgp30.h +0 -1
  449. esphome/components/sgp4x/sgp4x.h +0 -1
  450. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  451. esphome/components/sht4x/sht4x.h +0 -1
  452. esphome/components/sm300d2/sm300d2.h +0 -2
  453. esphome/components/smt100/sensor.py +8 -4
  454. esphome/components/smt100/smt100.cpp +5 -5
  455. esphome/components/smt100/smt100.h +3 -3
  456. esphome/components/sn74hc595/__init__.py +1 -1
  457. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  458. esphome/components/sntp/sntp_component.cpp +9 -3
  459. esphome/components/sntp/time.py +2 -0
  460. esphome/components/socket/__init__.py +17 -0
  461. esphome/components/spi/__init__.py +27 -6
  462. esphome/components/spi/spi.cpp +3 -2
  463. esphome/components/spi/spi.h +9 -3
  464. esphome/components/spi/spi_arduino.cpp +3 -5
  465. esphome/components/spi/spi_esp_idf.cpp +40 -21
  466. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  467. esphome/components/sps30/sps30.h +0 -1
  468. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  469. esphome/components/st7701s/st7701s.cpp +0 -4
  470. esphome/components/status/status_binary_sensor.h +0 -2
  471. esphome/components/substitutions/__init__.py +81 -21
  472. esphome/components/substitutions/jinja.py +99 -0
  473. esphome/components/sun/sun.cpp +3 -4
  474. esphome/components/switch/__init__.py +5 -2
  475. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  476. esphome/components/sx126x/__init__.py +317 -0
  477. esphome/components/sx126x/automation.h +62 -0
  478. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  479. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  480. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  481. esphome/components/sx126x/sx126x.cpp +523 -0
  482. esphome/components/sx126x/sx126x.h +140 -0
  483. esphome/components/sx126x/sx126x_reg.h +163 -0
  484. esphome/components/sx127x/__init__.py +325 -0
  485. esphome/components/sx127x/automation.h +62 -0
  486. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  487. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  488. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  489. esphome/components/sx127x/sx127x.cpp +498 -0
  490. esphome/components/sx127x/sx127x.h +128 -0
  491. esphome/components/sx127x/sx127x_reg.h +295 -0
  492. esphome/components/syslog/esphome_syslog.cpp +5 -3
  493. esphome/components/syslog/esphome_syslog.h +1 -1
  494. esphome/components/tca9555/__init__.py +1 -1
  495. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  496. esphome/components/text/__init__.py +5 -2
  497. esphome/components/text_sensor/__init__.py +5 -2
  498. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  499. esphome/components/thermostat/thermostat_climate.h +43 -39
  500. esphome/components/time/__init__.py +16 -2
  501. esphome/components/time/real_time_clock.cpp +4 -0
  502. esphome/components/time/real_time_clock.h +5 -1
  503. esphome/components/tlc5971/tlc5971.cpp +4 -1
  504. esphome/components/tmp1075/tmp1075.h +0 -2
  505. esphome/components/tof10120/tof10120_sensor.h +0 -1
  506. esphome/components/tormatic/tormatic_cover.h +0 -1
  507. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  508. esphome/components/tsl2591/tsl2591.cpp +1 -1
  509. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  510. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  511. esphome/components/tx20/tx20.cpp +2 -2
  512. esphome/components/uart/__init__.py +18 -0
  513. esphome/components/uart/uart_component_esp_idf.cpp +1 -5
  514. esphome/components/update/__init__.py +5 -2
  515. esphome/components/update/update_entity.h +8 -0
  516. esphome/components/usb_host/__init__.py +5 -2
  517. esphome/components/usb_host/usb_host_client.cpp +10 -10
  518. esphome/components/usb_uart/cp210x.cpp +1 -1
  519. esphome/components/usb_uart/usb_uart.cpp +41 -44
  520. esphome/components/usb_uart/usb_uart.h +4 -3
  521. esphome/components/valve/__init__.py +5 -2
  522. esphome/components/vbus/vbus.h +0 -1
  523. esphome/components/veml3235/veml3235.h +0 -1
  524. esphome/components/veml7700/veml7700.h +0 -1
  525. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  526. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  527. esphome/components/watchdog/watchdog.cpp +0 -4
  528. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  529. esphome/components/web_server/__init__.py +34 -19
  530. esphome/components/web_server/ota/__init__.py +32 -0
  531. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  532. esphome/components/web_server/ota/ota_web_server.h +26 -0
  533. esphome/components/web_server/web_server.cpp +324 -439
  534. esphome/components/web_server/web_server.h +33 -23
  535. esphome/components/web_server/web_server_v1.cpp +4 -5
  536. esphome/components/web_server_base/__init__.py +5 -2
  537. esphome/components/web_server_base/web_server_base.cpp +2 -94
  538. esphome/components/web_server_base/web_server_base.h +5 -25
  539. esphome/components/web_server_idf/multipart.cpp +254 -0
  540. esphome/components/web_server_idf/multipart.h +86 -0
  541. esphome/components/web_server_idf/utils.cpp +32 -0
  542. esphome/components/web_server_idf/utils.h +10 -0
  543. esphome/components/web_server_idf/web_server_idf.cpp +164 -16
  544. esphome/components/web_server_idf/web_server_idf.h +11 -10
  545. esphome/components/wiegand/wiegand.cpp +2 -2
  546. esphome/components/wifi/__init__.py +18 -0
  547. esphome/components/wifi/wifi_component.cpp +17 -22
  548. esphome/components/wifi/wifi_component.h +27 -23
  549. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  550. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  551. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  552. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  553. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  554. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  555. esphome/components/wireguard/__init__.py +2 -11
  556. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  557. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  558. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  559. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  560. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  561. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  562. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  563. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  564. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  565. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  566. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  567. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  568. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  569. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  570. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  571. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  572. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  573. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  574. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  575. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  576. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  577. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  578. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  579. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  580. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  581. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  582. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  583. esphome/components/zyaura/zyaura.h +0 -1
  584. esphome/config.py +88 -22
  585. esphome/config_helpers.py +74 -1
  586. esphome/config_validation.py +12 -1
  587. esphome/const.py +65 -10
  588. esphome/core/__init__.py +18 -2
  589. esphome/core/application.cpp +169 -10
  590. esphome/core/application.h +145 -165
  591. esphome/core/area.h +19 -0
  592. esphome/core/automation.h +58 -9
  593. esphome/core/color.cpp +3 -5
  594. esphome/core/color.h +16 -16
  595. esphome/core/component.cpp +156 -22
  596. esphome/core/component.h +98 -4
  597. esphome/core/component_iterator.cpp +11 -9
  598. esphome/core/component_iterator.h +12 -10
  599. esphome/core/config.py +155 -6
  600. esphome/core/controller.cpp +4 -2
  601. esphome/core/controller.h +1 -1
  602. esphome/core/datatypes.h +2 -2
  603. esphome/core/defines.h +17 -2
  604. esphome/core/device.h +20 -0
  605. esphome/core/entity_base.cpp +20 -15
  606. esphome/core/entity_base.h +76 -0
  607. esphome/core/entity_helpers.py +168 -1
  608. esphome/core/event_pool.h +81 -0
  609. esphome/core/helpers.cpp +75 -230
  610. esphome/core/helpers.h +165 -105
  611. esphome/core/lock_free_queue.h +151 -0
  612. esphome/core/log.cpp +2 -2
  613. esphome/core/log.h +2 -0
  614. esphome/core/optional.h +5 -0
  615. esphome/core/ring_buffer.cpp +2 -2
  616. esphome/core/scheduler.cpp +275 -103
  617. esphome/core/scheduler.h +154 -17
  618. esphome/core/time.cpp +5 -5
  619. esphome/core/time.h +5 -5
  620. esphome/cpp_generator.py +17 -0
  621. esphome/cpp_helpers.py +0 -22
  622. esphome/cpp_types.py +3 -1
  623. esphome/dashboard/entries.py +1 -1
  624. esphome/dashboard/util/text.py +5 -21
  625. esphome/dashboard/web_server.py +9 -1
  626. esphome/helpers.py +47 -0
  627. esphome/loader.py +15 -1
  628. esphome/pins.py +14 -8
  629. esphome/platformio_api.py +2 -0
  630. esphome/wizard.py +17 -4
  631. esphome/writer.py +44 -3
  632. esphome/yaml_util.py +0 -2
  633. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
  634. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/RECORD +639 -580
  635. esphome/components/api/api_pb2_size.h +0 -361
  636. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  637. esphome/components/esp32_ble/queue.h +0 -85
  638. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  639. esphome/components/esp32_hall/esp32_hall.h +0 -23
  640. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  641. esphome/components/ld2410/button/reset_button.cpp +0 -9
  642. esphome/components/ld2450/button/reset_button.cpp +0 -9
  643. esphome/components/openthread/tlv.py +0 -65
  644. /esphome/{dashboard/enum.py → enum.py} +0 -0
  645. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/WHEEL +0 -0
  646. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
  647. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
  648. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/top_level.txt +0 -0
@@ -18,52 +18,48 @@ namespace usb_uart {
18
18
  */
19
19
  static optional<CdcEps> get_cdc(const usb_config_desc_t *config_desc, uint8_t intf_idx) {
20
20
  int conf_offset, ep_offset;
21
- const usb_ep_desc_t *notify_ep{}, *in_ep{}, *out_ep{};
22
- uint8_t interface_number = 0;
23
- // look for an interface with one interrupt endpoint (notify), and an interface with two bulk endpoints (data in/out)
21
+ // look for an interface with an interrupt endpoint (notify), and one with two bulk endpoints (data in/out)
22
+ CdcEps eps{};
23
+ eps.bulk_interface_number = 0xFF;
24
24
  for (;;) {
25
- auto intf_desc = usb_parse_interface_descriptor(config_desc, intf_idx++, 0, &conf_offset);
25
+ const auto *intf_desc = usb_parse_interface_descriptor(config_desc, intf_idx++, 0, &conf_offset);
26
26
  if (!intf_desc) {
27
27
  ESP_LOGE(TAG, "usb_parse_interface_descriptor failed");
28
28
  return nullopt;
29
29
  }
30
- if (intf_desc->bNumEndpoints == 1) {
30
+ ESP_LOGD(TAG, "intf_desc: bInterfaceClass=%02X, bInterfaceSubClass=%02X, bInterfaceProtocol=%02X, bNumEndpoints=%d",
31
+ intf_desc->bInterfaceClass, intf_desc->bInterfaceSubClass, intf_desc->bInterfaceProtocol,
32
+ intf_desc->bNumEndpoints);
33
+ for (uint8_t i = 0; i != intf_desc->bNumEndpoints; i++) {
31
34
  ep_offset = conf_offset;
32
- notify_ep = usb_parse_endpoint_descriptor_by_index(intf_desc, 0, config_desc->wTotalLength, &ep_offset);
33
- if (!notify_ep) {
34
- ESP_LOGE(TAG, "notify_ep: usb_parse_endpoint_descriptor_by_index failed");
35
+ const auto *ep = usb_parse_endpoint_descriptor_by_index(intf_desc, i, config_desc->wTotalLength, &ep_offset);
36
+ if (!ep) {
37
+ ESP_LOGE(TAG, "Ran out of interfaces at %d before finding all endpoints", i);
35
38
  return nullopt;
36
39
  }
37
- if (notify_ep->bmAttributes != USB_BM_ATTRIBUTES_XFER_INT)
38
- notify_ep = nullptr;
39
- } else if (USB_CLASS_CDC_DATA && intf_desc->bNumEndpoints == 2) {
40
- interface_number = intf_desc->bInterfaceNumber;
41
- ep_offset = conf_offset;
42
- out_ep = usb_parse_endpoint_descriptor_by_index(intf_desc, 0, config_desc->wTotalLength, &ep_offset);
43
- if (!out_ep) {
44
- ESP_LOGE(TAG, "out_ep: usb_parse_endpoint_descriptor_by_index failed");
45
- return nullopt;
46
- }
47
- if (out_ep->bmAttributes != USB_BM_ATTRIBUTES_XFER_BULK)
48
- out_ep = nullptr;
49
- ep_offset = conf_offset;
50
- in_ep = usb_parse_endpoint_descriptor_by_index(intf_desc, 1, config_desc->wTotalLength, &ep_offset);
51
- if (!in_ep) {
52
- ESP_LOGE(TAG, "in_ep: usb_parse_endpoint_descriptor_by_index failed");
53
- return nullopt;
40
+ ESP_LOGD(TAG, "ep: bEndpointAddress=%02X, bmAttributes=%02X", ep->bEndpointAddress, ep->bmAttributes);
41
+ if (ep->bmAttributes == USB_BM_ATTRIBUTES_XFER_INT) {
42
+ eps.notify_ep = ep;
43
+ eps.interrupt_interface_number = intf_desc->bInterfaceNumber;
44
+ } else if (ep->bmAttributes == USB_BM_ATTRIBUTES_XFER_BULK && ep->bEndpointAddress & usb_host::USB_DIR_IN &&
45
+ (eps.bulk_interface_number == 0xFF || eps.bulk_interface_number == intf_desc->bInterfaceNumber)) {
46
+ eps.in_ep = ep;
47
+ eps.bulk_interface_number = intf_desc->bInterfaceNumber;
48
+ } else if (ep->bmAttributes == USB_BM_ATTRIBUTES_XFER_BULK && !(ep->bEndpointAddress & usb_host::USB_DIR_IN) &&
49
+ (eps.bulk_interface_number == 0xFF || eps.bulk_interface_number == intf_desc->bInterfaceNumber)) {
50
+ eps.out_ep = ep;
51
+ eps.bulk_interface_number = intf_desc->bInterfaceNumber;
52
+ } else {
53
+ ESP_LOGE(TAG, "Unexpected endpoint attributes: %02X", ep->bmAttributes);
54
+ continue;
54
55
  }
55
- if (in_ep->bmAttributes != USB_BM_ATTRIBUTES_XFER_BULK)
56
- in_ep = nullptr;
57
56
  }
58
- if (in_ep != nullptr && out_ep != nullptr && notify_ep != nullptr)
59
- break;
57
+ if (eps.in_ep != nullptr && eps.out_ep != nullptr && eps.notify_ep != nullptr)
58
+ return eps;
60
59
  }
61
- if (in_ep->bEndpointAddress & usb_host::USB_DIR_IN)
62
- return CdcEps{notify_ep, in_ep, out_ep, interface_number};
63
- return CdcEps{notify_ep, out_ep, in_ep, interface_number};
64
60
  }
65
61
 
66
- std::vector<CdcEps> USBUartTypeCdcAcm::parse_descriptors_(usb_device_handle_t dev_hdl) {
62
+ std::vector<CdcEps> USBUartTypeCdcAcm::parse_descriptors(usb_device_handle_t dev_hdl) {
67
63
  const usb_config_desc_t *config_desc;
68
64
  const usb_device_desc_t *device_desc;
69
65
  int desc_offset = 0;
@@ -78,7 +74,7 @@ std::vector<CdcEps> USBUartTypeCdcAcm::parse_descriptors_(usb_device_handle_t de
78
74
  ESP_LOGE(TAG, "get_active_config_descriptor failed");
79
75
  return {};
80
76
  }
81
- if (device_desc->bDeviceClass == USB_CLASS_COMM) {
77
+ if (device_desc->bDeviceClass == USB_CLASS_COMM || device_desc->bDeviceClass == USB_CLASS_VENDOR_SPEC) {
82
78
  // single CDC-ACM device
83
79
  if (auto eps = get_cdc(config_desc, 0)) {
84
80
  ESP_LOGV(TAG, "Found CDC-ACM device");
@@ -194,7 +190,7 @@ void USBUartComponent::start_input(USBUartChannel *channel) {
194
190
  if (!channel->initialised_ || channel->input_started_ ||
195
191
  channel->input_buffer_.get_free_space() < channel->cdc_dev_.in_ep->wMaxPacketSize)
196
192
  return;
197
- auto ep = channel->cdc_dev_.in_ep;
193
+ const auto *ep = channel->cdc_dev_.in_ep;
198
194
  auto callback = [this, channel](const usb_host::TransferStatus &status) {
199
195
  ESP_LOGV(TAG, "Transfer result: length: %u; status %X", status.data_len, status.error_code);
200
196
  if (!status.success) {
@@ -227,7 +223,7 @@ void USBUartComponent::start_output(USBUartChannel *channel) {
227
223
  if (channel->output_buffer_.is_empty()) {
228
224
  return;
229
225
  }
230
- auto ep = channel->cdc_dev_.out_ep;
226
+ const auto *ep = channel->cdc_dev_.out_ep;
231
227
  auto callback = [this, channel](const usb_host::TransferStatus &status) {
232
228
  ESP_LOGV(TAG, "Output Transfer result: length: %u; status %X", status.data_len, status.error_code);
233
229
  channel->output_started_ = false;
@@ -259,15 +255,15 @@ static void fix_mps(const usb_ep_desc_t *ep) {
259
255
  }
260
256
  }
261
257
  void USBUartTypeCdcAcm::on_connected() {
262
- auto cdc_devs = this->parse_descriptors_(this->device_handle_);
258
+ auto cdc_devs = this->parse_descriptors(this->device_handle_);
263
259
  if (cdc_devs.empty()) {
264
260
  this->status_set_error("No CDC-ACM device found");
265
261
  this->disconnect();
266
262
  return;
267
263
  }
268
264
  ESP_LOGD(TAG, "Found %zu CDC-ACM devices", cdc_devs.size());
269
- auto i = 0;
270
- for (auto channel : this->channels_) {
265
+ size_t i = 0;
266
+ for (auto *channel : this->channels_) {
271
267
  if (i == cdc_devs.size()) {
272
268
  ESP_LOGE(TAG, "No configuration found for channel %d", channel->index_);
273
269
  this->status_set_warning("No configuration found for channel");
@@ -277,10 +273,11 @@ void USBUartTypeCdcAcm::on_connected() {
277
273
  fix_mps(channel->cdc_dev_.in_ep);
278
274
  fix_mps(channel->cdc_dev_.out_ep);
279
275
  channel->initialised_ = true;
280
- auto err = usb_host_interface_claim(this->handle_, this->device_handle_, channel->cdc_dev_.interface_number, 0);
276
+ auto err =
277
+ usb_host_interface_claim(this->handle_, this->device_handle_, channel->cdc_dev_.bulk_interface_number, 0);
281
278
  if (err != ESP_OK) {
282
279
  ESP_LOGE(TAG, "usb_host_interface_claim failed: %s, channel=%d, intf=%d", esp_err_to_name(err), channel->index_,
283
- channel->cdc_dev_.interface_number);
280
+ channel->cdc_dev_.bulk_interface_number);
284
281
  this->status_set_error("usb_host_interface_claim failed");
285
282
  this->disconnect();
286
283
  return;
@@ -290,7 +287,7 @@ void USBUartTypeCdcAcm::on_connected() {
290
287
  }
291
288
 
292
289
  void USBUartTypeCdcAcm::on_disconnected() {
293
- for (auto channel : this->channels_) {
290
+ for (auto *channel : this->channels_) {
294
291
  if (channel->cdc_dev_.in_ep != nullptr) {
295
292
  usb_host_endpoint_halt(this->device_handle_, channel->cdc_dev_.in_ep->bEndpointAddress);
296
293
  usb_host_endpoint_flush(this->device_handle_, channel->cdc_dev_.in_ep->bEndpointAddress);
@@ -303,7 +300,7 @@ void USBUartTypeCdcAcm::on_disconnected() {
303
300
  usb_host_endpoint_halt(this->device_handle_, channel->cdc_dev_.notify_ep->bEndpointAddress);
304
301
  usb_host_endpoint_flush(this->device_handle_, channel->cdc_dev_.notify_ep->bEndpointAddress);
305
302
  }
306
- usb_host_interface_release(this->handle_, this->device_handle_, channel->cdc_dev_.interface_number);
303
+ usb_host_interface_release(this->handle_, this->device_handle_, channel->cdc_dev_.bulk_interface_number);
307
304
  channel->initialised_ = false;
308
305
  channel->input_started_ = false;
309
306
  channel->output_started_ = false;
@@ -314,7 +311,7 @@ void USBUartTypeCdcAcm::on_disconnected() {
314
311
  }
315
312
 
316
313
  void USBUartTypeCdcAcm::enable_channels() {
317
- for (auto channel : this->channels_) {
314
+ for (auto *channel : this->channels_) {
318
315
  if (!channel->initialised_)
319
316
  continue;
320
317
  channel->input_started_ = false;
@@ -25,7 +25,8 @@ struct CdcEps {
25
25
  const usb_ep_desc_t *notify_ep;
26
26
  const usb_ep_desc_t *in_ep;
27
27
  const usb_ep_desc_t *out_ep;
28
- uint8_t interface_number;
28
+ uint8_t bulk_interface_number;
29
+ uint8_t interrupt_interface_number;
29
30
  };
30
31
 
31
32
  enum UARTParityOptions {
@@ -123,7 +124,7 @@ class USBUartTypeCdcAcm : public USBUartComponent {
123
124
  USBUartTypeCdcAcm(uint16_t vid, uint16_t pid) : USBUartComponent(vid, pid) {}
124
125
 
125
126
  protected:
126
- virtual std::vector<CdcEps> parse_descriptors_(usb_device_handle_t dev_hdl);
127
+ virtual std::vector<CdcEps> parse_descriptors(usb_device_handle_t dev_hdl);
127
128
  void on_connected() override;
128
129
  virtual void enable_channels();
129
130
  void on_disconnected() override;
@@ -134,7 +135,7 @@ class USBUartTypeCP210X : public USBUartTypeCdcAcm {
134
135
  USBUartTypeCP210X(uint16_t vid, uint16_t pid) : USBUartTypeCdcAcm(vid, pid) {}
135
136
 
136
137
  protected:
137
- std::vector<CdcEps> parse_descriptors_(usb_device_handle_t dev_hdl) override;
138
+ std::vector<CdcEps> parse_descriptors(usb_device_handle_t dev_hdl) override;
138
139
  void enable_channels() override;
139
140
  };
140
141
  class USBUartTypeCH34X : public USBUartTypeCdcAcm {
@@ -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)
@@ -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")