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
@@ -268,7 +268,19 @@ def validate_tz(value: str) -> str:
268
268
 
269
269
  TIME_SCHEMA = cv.Schema(
270
270
  {
271
- cv.Optional(CONF_TIMEZONE, default=detect_tz): validate_tz,
271
+ cv.SplitDefault(
272
+ CONF_TIMEZONE,
273
+ esp8266=detect_tz,
274
+ esp32=detect_tz,
275
+ rp2040=detect_tz,
276
+ bk72xx=detect_tz,
277
+ rtl87xx=detect_tz,
278
+ ln882x=detect_tz,
279
+ host=detect_tz,
280
+ ): cv.All(
281
+ cv.only_with_framework(["arduino", "esp-idf", "host"]),
282
+ validate_tz,
283
+ ),
272
284
  cv.Optional(CONF_ON_TIME): automation.validate_automation(
273
285
  {
274
286
  cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CronTrigger),
@@ -293,7 +305,9 @@ TIME_SCHEMA = cv.Schema(
293
305
 
294
306
 
295
307
  async def setup_time_core_(time_var, config):
296
- cg.add(time_var.set_timezone(config[CONF_TIMEZONE]))
308
+ if timezone := config.get(CONF_TIMEZONE):
309
+ cg.add(time_var.set_timezone(timezone))
310
+ cg.add_define("USE_TIME_TIMEZONE")
297
311
 
298
312
  for conf in config.get(CONF_ON_TIME, []):
299
313
  trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], time_var)
@@ -35,8 +35,10 @@ void RealTimeClock::synchronize_epoch_(uint32_t epoch) {
35
35
  ret = settimeofday(&timev, nullptr);
36
36
  }
37
37
 
38
+ #ifdef USE_TIME_TIMEZONE
38
39
  // Move timezone back to local timezone.
39
40
  this->apply_timezone_();
41
+ #endif
40
42
 
41
43
  if (ret != 0) {
42
44
  ESP_LOGW(TAG, "setimeofday() failed with code %d", ret);
@@ -49,10 +51,12 @@ void RealTimeClock::synchronize_epoch_(uint32_t epoch) {
49
51
  this->time_sync_callback_.call();
50
52
  }
51
53
 
54
+ #ifdef USE_TIME_TIMEZONE
52
55
  void RealTimeClock::apply_timezone_() {
53
56
  setenv("TZ", this->timezone_.c_str(), 1);
54
57
  tzset();
55
58
  }
59
+ #endif
56
60
 
57
61
  } // namespace time
58
62
  } // namespace esphome
@@ -20,6 +20,7 @@ class RealTimeClock : public PollingComponent {
20
20
  public:
21
21
  explicit RealTimeClock();
22
22
 
23
+ #ifdef USE_TIME_TIMEZONE
23
24
  /// Set the time zone.
24
25
  void set_timezone(const std::string &tz) {
25
26
  this->timezone_ = tz;
@@ -28,6 +29,7 @@ class RealTimeClock : public PollingComponent {
28
29
 
29
30
  /// Get the time zone currently in use.
30
31
  std::string get_timezone() { return this->timezone_; }
32
+ #endif
31
33
 
32
34
  /// Get the time in the currently defined timezone.
33
35
  ESPTime now() { return ESPTime::from_epoch_local(this->timestamp_now()); }
@@ -38,7 +40,7 @@ class RealTimeClock : public PollingComponent {
38
40
  /// Get the current time as the UTC epoch since January 1st 1970.
39
41
  time_t timestamp_now() { return ::time(nullptr); }
40
42
 
41
- void add_on_time_sync_callback(std::function<void()> callback) {
43
+ void add_on_time_sync_callback(std::function<void()> &&callback) {
42
44
  this->time_sync_callback_.add(std::move(callback));
43
45
  };
44
46
 
@@ -46,8 +48,10 @@ class RealTimeClock : public PollingComponent {
46
48
  /// Report a unix epoch as current time.
47
49
  void synchronize_epoch_(uint32_t epoch);
48
50
 
51
+ #ifdef USE_TIME_TIMEZONE
49
52
  std::string timezone_{};
50
53
  void apply_timezone_();
54
+ #endif
51
55
 
52
56
  CallbackManager<void()> time_sync_callback_;
53
57
  };
@@ -24,8 +24,10 @@ void TLC5971::dump_config() {
24
24
  }
25
25
 
26
26
  void TLC5971::loop() {
27
- if (!this->update_)
27
+ if (!this->update_) {
28
+ this->disable_loop();
28
29
  return;
30
+ }
29
31
 
30
32
  uint32_t command;
31
33
 
@@ -93,6 +95,7 @@ void TLC5971::set_channel_value(uint16_t channel, uint16_t value) {
93
95
  return;
94
96
  if (this->pwm_amounts_[channel] != value) {
95
97
  this->update_ = true;
98
+ this->enable_loop();
96
99
  }
97
100
  this->pwm_amounts_[channel] = value;
98
101
  }
@@ -58,8 +58,6 @@ class TMP1075Sensor : public PollingComponent, public sensor::Sensor, public i2c
58
58
  void setup() override;
59
59
  void update() override;
60
60
 
61
- float get_setup_priority() const override { return setup_priority::DATA; }
62
-
63
61
  void dump_config() override;
64
62
 
65
63
  // Call write_config() after calling any of these to send the new config to
@@ -12,7 +12,6 @@ class TOF10120Sensor : public sensor::Sensor, public PollingComponent, public i2
12
12
  void setup() override;
13
13
 
14
14
  void dump_config() override;
15
- float get_setup_priority() const override { return setup_priority::DATA; }
16
15
  void update() override;
17
16
  };
18
17
  } // namespace tof10120
@@ -16,7 +16,6 @@ class Tormatic : public cover::Cover, public uart::UARTDevice, public PollingCom
16
16
  void loop() override;
17
17
  void update() override;
18
18
  void dump_config() override;
19
- float get_setup_priority() const override { return setup_priority::DATA; };
20
19
 
21
20
  void set_open_duration(uint32_t duration) { this->open_duration_ = duration; }
22
21
  void set_close_duration(uint32_t duration) { this->close_duration_ = duration; }
@@ -23,7 +23,6 @@ class TotalDailyEnergy : public sensor::Sensor, public Component {
23
23
  void set_method(TotalDailyEnergyMethod method) { method_ = method; }
24
24
  void setup() override;
25
25
  void dump_config() override;
26
- float get_setup_priority() const override { return setup_priority::DATA; }
27
26
  void loop() override;
28
27
 
29
28
  void publish_state_and_save(float state);
@@ -232,7 +232,7 @@ void TSL2591Component::set_integration_time_and_gain(TSL2591IntegrationTime inte
232
232
  this->integration_time_ = integration_time;
233
233
  this->gain_ = gain;
234
234
  if (!this->write_byte(TSL2591_COMMAND_BIT | TSL2591_REGISTER_CONTROL,
235
- this->integration_time_ | this->gain_)) { // NOLINT
235
+ static_cast<uint8_t>(this->integration_time_) | static_cast<uint8_t>(this->gain_))) {
236
236
  ESP_LOGE(TAG, "I2C write failed");
237
237
  }
238
238
  // The ADC values can be confused if gain or integration time are changed in the middle of a cycle.
@@ -25,7 +25,6 @@ class TTP229BSFComponent : public Component {
25
25
  void register_channel(TTP229BSFChannel *channel) { this->channels_.push_back(channel); }
26
26
  void setup() override;
27
27
  void dump_config() override;
28
- float get_setup_priority() const override { return setup_priority::DATA; }
29
28
  void loop() override {
30
29
  // check datavalid if sdo is high
31
30
  if (!this->sdo_pin_->digital_read()) {
@@ -23,7 +23,6 @@ class TTP229LSFComponent : public Component, public i2c::I2CDevice {
23
23
  void register_channel(TTP229Channel *channel) { this->channels_.push_back(channel); }
24
24
  void setup() override;
25
25
  void dump_config() override;
26
- float get_setup_priority() const override { return setup_priority::DATA; }
27
26
  void loop() override;
28
27
 
29
28
  protected:
@@ -152,7 +152,7 @@ void IRAM_ATTR Tx20ComponentStore::gpio_intr(Tx20ComponentStore *arg) {
152
152
  }
153
153
  arg->buffer[arg->buffer_index] = 1;
154
154
  arg->start_time = now;
155
- arg->buffer_index++;
155
+ arg->buffer_index++; // NOLINT(clang-diagnostic-deprecated-volatile)
156
156
  return;
157
157
  }
158
158
  const uint32_t delay = now - arg->start_time;
@@ -183,7 +183,7 @@ void IRAM_ATTR Tx20ComponentStore::gpio_intr(Tx20ComponentStore *arg) {
183
183
  }
184
184
  arg->spent_time += delay;
185
185
  arg->start_time = now;
186
- arg->buffer_index++;
186
+ arg->buffer_index++; // NOLINT(clang-diagnostic-deprecated-volatile)
187
187
  }
188
188
  void IRAM_ATTR Tx20ComponentStore::reset() {
189
189
  tx20_available = false;
@@ -2,6 +2,7 @@ import re
2
2
 
3
3
  from esphome import automation, pins
4
4
  import esphome.codegen as cg
5
+ from esphome.config_helpers import filter_source_files_from_platform
5
6
  import esphome.config_validation as cv
6
7
  from esphome.const import (
7
8
  CONF_AFTER,
@@ -27,6 +28,7 @@ from esphome.const import (
27
28
  CONF_TX_PIN,
28
29
  CONF_UART_ID,
29
30
  PLATFORM_HOST,
31
+ PlatformFramework,
30
32
  )
31
33
  from esphome.core import CORE
32
34
  import esphome.final_validate as fv
@@ -438,3 +440,19 @@ async def uart_write_to_code(config, action_id, template_arg, args):
438
440
  else:
439
441
  cg.add(var.set_data_static(data))
440
442
  return var
443
+
444
+
445
+ FILTER_SOURCE_FILES = filter_source_files_from_platform(
446
+ {
447
+ "uart_component_esp32_arduino.cpp": {PlatformFramework.ESP32_ARDUINO},
448
+ "uart_component_esp_idf.cpp": {PlatformFramework.ESP32_IDF},
449
+ "uart_component_esp8266.cpp": {PlatformFramework.ESP8266_ARDUINO},
450
+ "uart_component_host.cpp": {PlatformFramework.HOST_NATIVE},
451
+ "uart_component_rp2040.cpp": {PlatformFramework.RP2040_ARDUINO},
452
+ "uart_component_libretiny.cpp": {
453
+ PlatformFramework.BK72XX_ARDUINO,
454
+ PlatformFramework.RTL87XX_ARDUINO,
455
+ PlatformFramework.LN882X_ARDUINO,
456
+ },
457
+ }
458
+ )
@@ -48,11 +48,7 @@ uart_config_t IDFUARTComponent::get_config_() {
48
48
  uart_config.parity = parity;
49
49
  uart_config.stop_bits = this->stop_bits_ == 1 ? UART_STOP_BITS_1 : UART_STOP_BITS_2;
50
50
  uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
51
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
52
51
  uart_config.source_clk = UART_SCLK_DEFAULT;
53
- #else
54
- uart_config.source_clk = UART_SCLK_APB;
55
- #endif
56
52
  uart_config.rx_flow_ctrl_thresh = 122;
57
53
 
58
54
  return uart_config;
@@ -15,8 +15,8 @@ from esphome.const import (
15
15
  ENTITY_CATEGORY_CONFIG,
16
16
  )
17
17
  from esphome.core import CORE, coroutine_with_priority
18
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
18
19
  from esphome.cpp_generator import MockObjClass
19
- from esphome.cpp_helpers import setup_entity
20
20
 
21
21
  CODEOWNERS = ["@jesserockz"]
22
22
  IS_PLATFORM_COMPONENT = True
@@ -58,6 +58,9 @@ _UPDATE_SCHEMA = (
58
58
  )
59
59
 
60
60
 
61
+ _UPDATE_SCHEMA.add_extra(entity_duplicate_validator("update"))
62
+
63
+
61
64
  def update_schema(
62
65
  class_: MockObjClass = cv.UNDEFINED,
63
66
  *,
@@ -87,7 +90,7 @@ UPDATE_SCHEMA.add_extra(cv.deprecated_schema_constant("update"))
87
90
 
88
91
 
89
92
  async def setup_update_core_(var, config):
90
- await setup_entity(var, config)
93
+ await setup_entity(var, config, "update")
91
94
 
92
95
  if device_class_config := config.get(CONF_DEVICE_CLASS):
93
96
  cg.add(var.set_device_class(device_class_config))
@@ -1,5 +1,6 @@
1
1
  #pragma once
2
2
 
3
+ #include <memory>
3
4
  #include "esphome/core/automation.h"
4
5
  #include "esphome/core/component.h"
5
6
  #include "esphome/core/entity_base.h"
@@ -38,12 +39,19 @@ class UpdateEntity : public EntityBase, public EntityBase_DeviceClass {
38
39
  const UpdateState &state = state_;
39
40
 
40
41
  void add_on_state_callback(std::function<void()> &&callback) { this->state_callback_.add(std::move(callback)); }
42
+ Trigger<const UpdateInfo &> *get_update_available_trigger() {
43
+ if (!update_available_trigger_) {
44
+ update_available_trigger_ = std::make_unique<Trigger<const UpdateInfo &>>();
45
+ }
46
+ return update_available_trigger_.get();
47
+ }
41
48
 
42
49
  protected:
43
50
  UpdateState state_{UPDATE_STATE_UNKNOWN};
44
51
  UpdateInfo update_info_;
45
52
 
46
53
  CallbackManager<void()> state_callback_{};
54
+ std::unique_ptr<Trigger<const UpdateInfo &>> update_available_trigger_{nullptr};
47
55
  };
48
56
 
49
57
  } // namespace update
@@ -6,7 +6,7 @@ from esphome.components.esp32 import (
6
6
  only_on_variant,
7
7
  )
8
8
  import esphome.config_validation as cv
9
- from esphome.const import CONF_ID
9
+ from esphome.const import CONF_DEVICES, CONF_ID
10
10
  from esphome.cpp_types import Component
11
11
 
12
12
  AUTO_LOAD = ["bytebuffer"]
@@ -16,9 +16,9 @@ usb_host_ns = cg.esphome_ns.namespace("usb_host")
16
16
  USBHost = usb_host_ns.class_("USBHost", Component)
17
17
  USBClient = usb_host_ns.class_("USBClient", Component)
18
18
 
19
- CONF_DEVICES = "devices"
20
19
  CONF_VID = "vid"
21
20
  CONF_PID = "pid"
21
+ CONF_ENABLE_HUBS = "enable_hubs"
22
22
 
23
23
 
24
24
  def usb_device_schema(cls=USBClient, vid: int = None, pid: [int] = None) -> cv.Schema:
@@ -42,6 +42,7 @@ CONFIG_SCHEMA = cv.All(
42
42
  cv.COMPONENT_SCHEMA.extend(
43
43
  {
44
44
  cv.GenerateID(): cv.declare_id(USBHost),
45
+ cv.Optional(CONF_ENABLE_HUBS, default=False): cv.boolean,
45
46
  cv.Optional(CONF_DEVICES): cv.ensure_list(usb_device_schema()),
46
47
  }
47
48
  ),
@@ -58,6 +59,8 @@ async def register_usb_client(config):
58
59
 
59
60
  async def to_code(config):
60
61
  add_idf_sdkconfig_option("CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE", 1024)
62
+ if config.get(CONF_ENABLE_HUBS):
63
+ add_idf_sdkconfig_option("CONFIG_USB_HOST_HUBS_SUPPORTED", True)
61
64
  var = cg.new_Pvariable(config[CONF_ID])
62
65
  await cg.register_component(var, config)
63
66
  for device in config.get(CONF_DEVICES) or ():
@@ -70,7 +70,7 @@ static void usbh_print_cfg_desc(const usb_config_desc_t *cfg_desc) {
70
70
  ESP_LOGV(TAG, "bMaxPower %dmA", cfg_desc->bMaxPower * 2);
71
71
  }
72
72
 
73
- void usb_client_print_device_descriptor(const usb_device_desc_t *devc_desc) {
73
+ static void usb_client_print_device_descriptor(const usb_device_desc_t *devc_desc) {
74
74
  if (devc_desc == NULL) {
75
75
  return;
76
76
  }
@@ -92,8 +92,8 @@ void usb_client_print_device_descriptor(const usb_device_desc_t *devc_desc) {
92
92
  ESP_LOGV(TAG, "bNumConfigurations %d", devc_desc->bNumConfigurations);
93
93
  }
94
94
 
95
- void usb_client_print_config_descriptor(const usb_config_desc_t *cfg_desc,
96
- print_class_descriptor_cb class_specific_cb) {
95
+ static void usb_client_print_config_descriptor(const usb_config_desc_t *cfg_desc,
96
+ print_class_descriptor_cb class_specific_cb) {
97
97
  if (cfg_desc == nullptr) {
98
98
  return;
99
99
  }
@@ -128,9 +128,9 @@ void usb_client_print_config_descriptor(const usb_config_desc_t *cfg_desc,
128
128
  static std::string get_descriptor_string(const usb_str_desc_t *desc) {
129
129
  char buffer[256];
130
130
  if (desc == nullptr)
131
- return "(unknown)";
131
+ return "(unspecified)";
132
132
  char *p = buffer;
133
- for (size_t i = 0; i != desc->bLength / 2; i++) {
133
+ for (int i = 0; i != desc->bLength / 2; i++) {
134
134
  auto c = desc->wData[i];
135
135
  if (c < 0x100)
136
136
  *p++ = static_cast<char>(c);
@@ -169,7 +169,7 @@ void USBClient::setup() {
169
169
  this->mark_failed();
170
170
  return;
171
171
  }
172
- for (auto trq : this->trq_pool_) {
172
+ for (auto *trq : this->trq_pool_) {
173
173
  usb_host_transfer_alloc(64, 0, &trq->transfer);
174
174
  trq->client = this;
175
175
  }
@@ -197,7 +197,8 @@ void USBClient::loop() {
197
197
  ESP_LOGD(TAG, "Device descriptor: vid %X pid %X", desc->idVendor, desc->idProduct);
198
198
  if (desc->idVendor == this->vid_ && desc->idProduct == this->pid_ || this->vid_ == 0 && this->pid_ == 0) {
199
199
  usb_device_info_t dev_info;
200
- if ((err = usb_host_device_info(this->device_handle_, &dev_info)) != ESP_OK) {
200
+ err = usb_host_device_info(this->device_handle_, &dev_info);
201
+ if (err != ESP_OK) {
201
202
  ESP_LOGW(TAG, "Device info failed: %s", esp_err_to_name(err));
202
203
  this->disconnect();
203
204
  break;
@@ -336,7 +337,7 @@ static void transfer_callback(usb_transfer_t *xfer) {
336
337
  * @throws None.
337
338
  */
338
339
  void USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, uint16_t length) {
339
- auto trq = this->get_trq_();
340
+ auto *trq = this->get_trq_();
340
341
  if (trq == nullptr) {
341
342
  ESP_LOGE(TAG, "Too many requests queued");
342
343
  return;
@@ -349,7 +350,6 @@ void USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, u
349
350
  if (err != ESP_OK) {
350
351
  ESP_LOGE(TAG, "Failed to submit transfer, address=%x, length=%d, err=%x", ep_address, length, err);
351
352
  this->release_trq(trq);
352
- this->disconnect();
353
353
  }
354
354
  }
355
355
 
@@ -364,7 +364,7 @@ void USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, u
364
364
  * @throws None.
365
365
  */
366
366
  void USBClient::transfer_out(uint8_t ep_address, const transfer_cb_t &callback, const uint8_t *data, uint16_t length) {
367
- auto trq = this->get_trq_();
367
+ auto *trq = this->get_trq_();
368
368
  if (trq == nullptr) {
369
369
  ESP_LOGE(TAG, "Too many requests queued");
370
370
  return;
@@ -43,7 +43,7 @@ static constexpr uint8_t SET_BAUDRATE = 0x1E; // Set the baud rate.
43
43
  static constexpr uint8_t SET_CHARS = 0x19; // Set special characters.
44
44
  static constexpr uint8_t VENDOR_SPECIFIC = 0xFF; // Vendor specific command.
45
45
 
46
- std::vector<CdcEps> USBUartTypeCP210X::parse_descriptors_(usb_device_handle_t dev_hdl) {
46
+ std::vector<CdcEps> USBUartTypeCP210X::parse_descriptors(usb_device_handle_t dev_hdl) {
47
47
  const usb_config_desc_t *config_desc;
48
48
  const usb_device_desc_t *device_desc;
49
49
  int conf_offset = 0, ep_offset;
@@ -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