esphome 2025.5.1__py3-none-any.whl → 2025.6.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (720) hide show
  1. esphome/__main__.py +20 -14
  2. esphome/components/a4988/a4988.cpp +1 -1
  3. esphome/components/absolute_humidity/absolute_humidity.cpp +6 -4
  4. esphome/components/ac_dimmer/ac_dimmer.cpp +4 -2
  5. esphome/components/adc/adc_sensor_esp32.cpp +5 -3
  6. esphome/components/adc/adc_sensor_esp8266.cpp +5 -3
  7. esphome/components/adc/adc_sensor_libretiny.cpp +5 -3
  8. esphome/components/adc/adc_sensor_rp2040.cpp +5 -3
  9. esphome/components/adc128s102/adc128s102.cpp +1 -1
  10. esphome/components/ade7880/ade7880.cpp +28 -17
  11. esphome/components/ade7953_base/ade7953_base.cpp +12 -9
  12. esphome/components/ade7953_i2c/ade7953_i2c.cpp +1 -1
  13. esphome/components/ade7953_spi/ade7953_spi.cpp +1 -1
  14. esphome/components/ads1115/ads1115.cpp +3 -5
  15. esphome/components/ads1118/ads1118.cpp +2 -1
  16. esphome/components/ags10/ags10.cpp +3 -2
  17. esphome/components/aht10/aht10.cpp +27 -29
  18. esphome/components/aic3204/aic3204.cpp +2 -2
  19. esphome/components/alarm_control_panel/__init__.py +1 -0
  20. esphome/components/am2315c/am2315c.cpp +2 -2
  21. esphome/components/am2320/am2320.cpp +2 -2
  22. esphome/components/am43/am43_base.h +1 -1
  23. esphome/components/am43/cover/am43_cover.cpp +4 -2
  24. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +4 -2
  25. esphome/components/apds9306/apds9306.cpp +8 -5
  26. esphome/components/apds9960/apds9960.cpp +2 -2
  27. esphome/components/api/__init__.py +5 -0
  28. esphome/components/api/api_connection.cpp +712 -358
  29. esphome/components/api/api_connection.h +343 -284
  30. esphome/components/api/api_frame_helper.cpp +349 -344
  31. esphome/components/api/api_frame_helper.h +121 -94
  32. esphome/components/api/api_pb2.cpp +2 -0
  33. esphome/components/api/api_pb2.h +637 -1
  34. esphome/components/api/api_pb2_service.cpp +12 -688
  35. esphome/components/api/api_pb2_service.h +53 -207
  36. esphome/components/api/api_server.cpp +71 -29
  37. esphome/components/api/api_server.h +9 -0
  38. esphome/components/api/client.py +5 -2
  39. esphome/components/api/homeassistant_service.h +1 -1
  40. esphome/components/api/list_entities.cpp +1 -1
  41. esphome/components/api/proto.cpp +1 -0
  42. esphome/components/api/proto.h +4 -3
  43. esphome/components/api/subscribe_state.cpp +8 -16
  44. esphome/components/as3935/as3935.cpp +3 -3
  45. esphome/components/as5600/as5600.cpp +9 -7
  46. esphome/components/as7341/as7341.cpp +7 -5
  47. esphome/components/at581x/at581x.cpp +13 -10
  48. esphome/components/atm90e26/atm90e26.cpp +2 -2
  49. esphome/components/atm90e32/atm90e32.cpp +3 -3
  50. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +5 -3
  51. esphome/components/bang_bang/bang_bang_climate.cpp +8 -5
  52. esphome/components/bedjet/bedjet_hub.cpp +6 -4
  53. esphome/components/beken_spi_led_strip/led_strip.cpp +11 -7
  54. esphome/components/bh1750/bh1750.cpp +2 -2
  55. esphome/components/binary_sensor/__init__.py +1 -0
  56. esphome/components/binary_sensor/automation.cpp +1 -2
  57. esphome/components/bl0906/bl0906.cpp +1 -1
  58. esphome/components/bl0942/bl0942.cpp +11 -8
  59. esphome/components/bl0942/sensor.py +1 -1
  60. esphome/components/ble_client/__init__.py +5 -1
  61. esphome/components/ble_client/output/ble_binary_output.cpp +6 -3
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +9 -6
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +8 -5
  64. esphome/components/bluetooth_proxy/__init__.py +5 -1
  65. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -5
  66. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -14
  67. esphome/components/bme280_base/bme280_base.cpp +3 -3
  68. esphome/components/bme680/bme680.cpp +3 -3
  69. esphome/components/bme680/sensor.py +2 -2
  70. esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
  71. esphome/components/bme680_bsec/sensor.py +7 -3
  72. esphome/components/bme68x_bsec2/__init__.py +6 -5
  73. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
  74. esphome/components/bme68x_bsec2/sensor.py +4 -4
  75. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
  76. esphome/components/bmi160/bmi160.cpp +11 -11
  77. esphome/components/bmp085/bmp085.cpp +2 -2
  78. esphome/components/bmp280_base/bmp280_base.cpp +3 -3
  79. esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
  80. esphome/components/bmp581/bmp581.cpp +33 -27
  81. esphome/components/bp1658cj/bp1658cj.cpp +5 -3
  82. esphome/components/bp5758d/bp5758d.cpp +1 -1
  83. esphome/components/button/__init__.py +1 -0
  84. esphome/components/canbus/canbus.cpp +1 -1
  85. esphome/components/cap1188/cap1188.cpp +6 -4
  86. esphome/components/captive_portal/captive_portal.cpp +1 -1
  87. esphome/components/ccs811/ccs811.cpp +3 -2
  88. esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
  89. esphome/components/ch422g/ch422g.cpp +2 -2
  90. esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
  91. esphome/components/climate/__init__.py +1 -0
  92. esphome/components/climate/climate.cpp +12 -7
  93. esphome/components/climate/climate.h +1 -1
  94. esphome/components/climate_ir/climate_ir.cpp +7 -4
  95. esphome/components/cm1106/__init__.py +1 -0
  96. esphome/components/cm1106/cm1106.cpp +112 -0
  97. esphome/components/cm1106/cm1106.h +40 -0
  98. esphome/components/cm1106/sensor.py +72 -0
  99. esphome/components/const/__init__.py +1 -0
  100. esphome/components/cover/__init__.py +1 -0
  101. esphome/components/cs5460a/cs5460a.cpp +16 -11
  102. esphome/components/cse7761/cse7761.cpp +2 -2
  103. esphome/components/cse7766/cse7766.cpp +0 -5
  104. esphome/components/cse7766/cse7766.h +5 -1
  105. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
  106. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
  107. esphome/components/current_based/current_based_cover.cpp +4 -2
  108. esphome/components/dac7678/dac7678_output.cpp +4 -4
  109. esphome/components/dallas_temp/dallas_temp.cpp +2 -3
  110. esphome/components/daly_bms/daly_bms.cpp +2 -1
  111. esphome/components/dashboard_import/__init__.py +1 -2
  112. esphome/components/datetime/__init__.py +3 -1
  113. esphome/components/debug/debug_component.cpp +1 -5
  114. esphome/components/debug/debug_component.h +1 -1
  115. esphome/components/debug/debug_esp32.cpp +4 -2
  116. esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
  117. esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
  118. esphome/components/demo/__init__.py +206 -0
  119. esphome/components/demo/demo_alarm_control_panel.h +65 -0
  120. esphome/components/demo/demo_button.h +15 -0
  121. esphome/components/demo/demo_date.h +34 -0
  122. esphome/components/demo/demo_datetime.h +40 -0
  123. esphome/components/demo/demo_lock.h +17 -0
  124. esphome/components/demo/demo_select.h +15 -0
  125. esphome/components/demo/demo_text.h +18 -0
  126. esphome/components/demo/demo_time.h +34 -0
  127. esphome/components/demo/demo_valve.h +54 -0
  128. esphome/components/dfrobot_sen0395/commands.cpp +3 -3
  129. esphome/components/dht/dht.cpp +29 -50
  130. esphome/components/dht12/dht12.cpp +2 -2
  131. esphome/components/display/display.h +5 -3
  132. esphome/components/dps310/dps310.cpp +7 -5
  133. esphome/components/ds1307/ds1307.cpp +2 -2
  134. esphome/components/dsmr/dsmr.cpp +5 -3
  135. esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
  136. esphome/components/duty_time/duty_time_sensor.cpp +5 -3
  137. esphome/components/ee895/ee895.cpp +3 -3
  138. esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
  139. esphome/components/emc2101/emc2101.cpp +11 -9
  140. esphome/components/ens160_base/ens160_base.cpp +2 -2
  141. esphome/components/ens210/ens210.cpp +2 -2
  142. esphome/components/es7210/es7210.cpp +6 -4
  143. esphome/components/es7243e/es7243e.cpp +1 -1
  144. esphome/components/es8156/es8156.cpp +1 -1
  145. esphome/components/es8311/es8311.cpp +8 -6
  146. esphome/components/es8388/__init__.py +0 -0
  147. esphome/components/es8388/audio_dac.py +26 -0
  148. esphome/components/es8388/es8388.cpp +289 -0
  149. esphome/components/es8388/es8388.h +81 -0
  150. esphome/components/es8388/es8388_const.h +83 -0
  151. esphome/components/es8388/select/__init__.py +47 -0
  152. esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
  153. esphome/components/es8388/select/adc_input_mic_select.h +15 -0
  154. esphome/components/es8388/select/dac_output_select.cpp +12 -0
  155. esphome/components/es8388/select/dac_output_select.h +15 -0
  156. esphome/components/esp32/__init__.py +88 -20
  157. esphome/components/esp32/boards.py +208 -125
  158. esphome/components/esp32/const.py +6 -0
  159. esphome/components/esp32/gpio.py +14 -1
  160. esphome/components/esp32/gpio_esp32_c5.py +45 -0
  161. esphome/components/esp32/gpio_esp32_p4.py +43 -0
  162. esphome/components/esp32/preferences.cpp +7 -7
  163. esphome/components/esp32_ble/__init__.py +115 -0
  164. esphome/components/esp32_ble/ble.cpp +11 -9
  165. esphome/components/esp32_ble/ble_uuid.h +1 -1
  166. esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
  167. esphome/components/esp32_ble_server/__init__.py +4 -1
  168. esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
  169. esphome/components/esp32_ble_server/ble_server.h +0 -1
  170. esphome/components/esp32_ble_tracker/__init__.py +6 -2
  171. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +12 -9
  172. esphome/components/esp32_camera/esp32_camera.cpp +35 -27
  173. esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
  174. esphome/components/esp32_dac/esp32_dac.cpp +2 -2
  175. esphome/components/esp32_improv/__init__.py +5 -1
  176. esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
  177. esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
  178. esphome/components/esp32_rmt_led_strip/light.py +5 -1
  179. esphome/components/esp32_touch/esp32_touch.cpp +12 -8
  180. esphome/components/esp8266/gpio.cpp +10 -1
  181. esphome/components/esp8266/preferences.cpp +6 -6
  182. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  183. esphome/components/esp_ldo/__init__.py +91 -0
  184. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  185. esphome/components/esp_ldo/esp_ldo.h +43 -0
  186. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  187. esphome/components/ethernet/ethernet_component.cpp +38 -26
  188. esphome/components/ethernet/ethernet_component.h +1 -1
  189. esphome/components/event/__init__.py +1 -0
  190. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  191. esphome/components/ezo/ezo.cpp +1 -1
  192. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  193. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  194. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  195. esphome/components/fan/__init__.py +1 -0
  196. esphome/components/fan/fan.cpp +4 -2
  197. esphome/components/fastled_base/fastled_light.cpp +7 -5
  198. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  199. esphome/components/fs3000/fs3000.cpp +1 -1
  200. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  201. esphome/components/ft63x6/ft63x6.cpp +5 -3
  202. esphome/components/gcja5/gcja5.cpp +0 -12
  203. esphome/components/gcja5/gcja5.h +8 -3
  204. esphome/components/gdk101/gdk101.cpp +2 -2
  205. esphome/components/globals/globals_component.h +13 -10
  206. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  207. esphome/components/gp8403/gp8403.cpp +4 -2
  208. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  209. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  210. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  211. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  212. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  213. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  214. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  215. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  216. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  217. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  218. esphome/components/haier/haier_base.cpp +2 -2
  219. esphome/components/haier/hon_climate.cpp +13 -6
  220. esphome/components/havells_solar/havells_solar.cpp +5 -2
  221. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  222. esphome/components/hdc1080/hdc1080.cpp +2 -2
  223. esphome/components/he60r/he60r.cpp +4 -2
  224. esphome/components/hlw8012/hlw8012.cpp +6 -4
  225. esphome/components/hm3301/hm3301.cpp +2 -2
  226. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  227. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  228. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  229. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  230. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  231. esphome/components/hte501/hte501.cpp +3 -2
  232. esphome/components/http_request/__init__.py +2 -2
  233. esphome/components/http_request/http_request.cpp +7 -5
  234. esphome/components/http_request/http_request_idf.cpp +4 -2
  235. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  236. esphome/components/htu21d/htu21d.cpp +2 -2
  237. esphome/components/htu31d/htu31d.cpp +2 -2
  238. esphome/components/hx711/hx711.cpp +2 -2
  239. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  240. esphome/components/hyt271/hyt271.cpp +2 -2
  241. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  242. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  243. esphome/components/i2s_audio/__init__.py +2 -0
  244. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  245. esphome/components/i2s_audio/i2s_audio.h +1 -1
  246. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  247. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  248. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +54 -64
  249. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -0
  250. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
  251. esphome/components/iaqcore/iaqcore.cpp +3 -3
  252. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  253. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  254. esphome/components/image/image.cpp +1 -0
  255. esphome/components/ina219/ina219.cpp +2 -2
  256. esphome/components/ina226/ina226.cpp +8 -5
  257. esphome/components/ina260/ina260.cpp +1 -1
  258. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  259. esphome/components/ina3221/ina3221.cpp +2 -2
  260. esphome/components/inkplate6/display.py +12 -2
  261. esphome/components/inkplate6/inkplate.cpp +13 -9
  262. esphome/components/inkplate6/inkplate.h +7 -6
  263. esphome/components/integration/integration_sensor.cpp +1 -1
  264. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  265. esphome/components/json/json_util.cpp +4 -5
  266. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  267. esphome/components/key_collector/key_collector.cpp +4 -2
  268. esphome/components/kmeteriso/kmeteriso.cpp +2 -1
  269. esphome/components/kuntze/kuntze.cpp +4 -2
  270. esphome/components/lc709203f/__init__.py +1 -0
  271. esphome/components/lc709203f/lc709203f.cpp +299 -0
  272. esphome/components/lc709203f/lc709203f.h +55 -0
  273. esphome/components/lc709203f/sensor.py +93 -0
  274. esphome/components/lcd_base/lcd_display.cpp +2 -2
  275. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  276. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  277. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  278. esphome/components/ld2410/ld2410.cpp +6 -7
  279. esphome/components/ld2420/ld2420.cpp +9 -7
  280. esphome/components/ld2450/ld2450.cpp +6 -4
  281. esphome/components/ld2450/sensor.py +2 -2
  282. esphome/components/ledc/ledc_output.cpp +32 -28
  283. esphome/components/libretiny/const.py +1 -1
  284. esphome/components/libretiny/preferences.cpp +6 -7
  285. esphome/components/light/__init__.py +2 -1
  286. esphome/components/light/esp_hsv_color.h +1 -1
  287. esphome/components/light/light_state.cpp +9 -5
  288. esphome/components/light/light_transformer.h +1 -1
  289. esphome/components/lightwaverf/LwTx.cpp +1 -1
  290. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  291. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  292. esphome/components/lock/__init__.py +1 -0
  293. esphome/components/lock/lock.h +1 -1
  294. esphome/components/logger/__init__.py +6 -0
  295. esphome/components/logger/logger.cpp +9 -5
  296. esphome/components/logger/logger.h +4 -4
  297. esphome/components/logger/logger_esp32.cpp +5 -5
  298. esphome/components/ltr390/ltr390.cpp +8 -5
  299. esphome/components/ltr501/ltr501.cpp +19 -14
  300. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  301. esphome/components/lvgl/__init__.py +2 -2
  302. esphome/components/lvgl/automation.py +5 -4
  303. esphome/components/lvgl/defines.py +0 -2
  304. esphome/components/lvgl/lv_validation.py +1 -3
  305. esphome/components/lvgl/lvcode.py +7 -8
  306. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  307. esphome/components/lvgl/schemas.py +22 -23
  308. esphome/components/lvgl/trigger.py +8 -3
  309. esphome/components/lvgl/widgets/__init__.py +2 -2
  310. esphome/components/lvgl/widgets/canvas.py +9 -3
  311. esphome/components/lvgl/widgets/line.py +2 -1
  312. esphome/components/lvgl/widgets/tabview.py +7 -0
  313. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  314. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  315. esphome/components/max17043/max17043.cpp +2 -2
  316. esphome/components/max31855/max31855.cpp +2 -1
  317. esphome/components/max31856/max31856.cpp +9 -11
  318. esphome/components/max31865/max31865.cpp +6 -4
  319. esphome/components/max44009/max44009.cpp +2 -2
  320. esphome/components/max6675/max6675.cpp +1 -1
  321. esphome/components/max6956/max6956.cpp +5 -3
  322. esphome/components/max7219/max7219.cpp +8 -6
  323. esphome/components/max7219digit/automation.h +52 -0
  324. esphome/components/max7219digit/display.py +93 -1
  325. esphome/components/max7219digit/max7219digit.cpp +16 -13
  326. esphome/components/max9611/max9611.cpp +9 -6
  327. esphome/components/mcp23008/mcp23008.cpp +1 -1
  328. esphome/components/mcp23016/mcp23016.cpp +1 -1
  329. esphome/components/mcp23017/mcp23017.cpp +1 -1
  330. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  331. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  332. esphome/components/mcp3008/mcp3008.cpp +1 -1
  333. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  334. esphome/components/mcp3204/mcp3204.cpp +1 -1
  335. esphome/components/mcp4461/mcp4461.cpp +2 -2
  336. esphome/components/mcp4725/mcp4725.cpp +2 -2
  337. esphome/components/mcp4728/mcp4728.cpp +2 -2
  338. esphome/components/mcp9600/mcp9600.cpp +1 -1
  339. esphome/components/mcp9808/mcp9808.cpp +4 -4
  340. esphome/components/mdns/mdns_component.cpp +8 -2
  341. esphome/components/mdns/mdns_component.h +3 -1
  342. esphome/components/mdns/mdns_esp32.cpp +2 -2
  343. esphome/components/media_player/__init__.py +1 -0
  344. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  345. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  346. esphome/components/micronova/micronova.h +2 -2
  347. esphome/components/mics_4514/mics_4514.cpp +2 -2
  348. esphome/components/midea/air_conditioner.cpp +7 -5
  349. esphome/components/midea_ir/midea_ir.cpp +1 -1
  350. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  351. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  352. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  353. esphome/components/mlx90614/mlx90614.cpp +4 -3
  354. esphome/components/mmc5603/mmc5603.cpp +2 -2
  355. esphome/components/mmc5983/mmc5983.cpp +1 -1
  356. esphome/components/modbus/modbus.cpp +7 -5
  357. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  358. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  359. esphome/components/modbus_controller/switch/__init__.py +6 -2
  360. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  361. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  362. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  363. esphome/components/mpr121/mpr121.cpp +2 -2
  364. esphome/components/mpu6050/mpu6050.cpp +6 -6
  365. esphome/components/mpu6886/mpu6886.cpp +6 -6
  366. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  367. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  368. esphome/components/mqtt/mqtt_client.cpp +31 -24
  369. esphome/components/mqtt/mqtt_component.cpp +2 -2
  370. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  371. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  372. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  373. esphome/components/ms5611/ms5611.cpp +2 -2
  374. esphome/components/ms8607/ms8607.cpp +2 -2
  375. esphome/components/msa3xx/msa3xx.cpp +16 -12
  376. esphome/components/my9231/my9231.cpp +7 -5
  377. esphome/components/nau7802/nau7802.cpp +6 -4
  378. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  379. esphome/components/network/ip_address.h +1 -1
  380. esphome/components/network/util.cpp +13 -0
  381. esphome/components/nextion/base_component.py +2 -0
  382. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +2 -3
  383. esphome/components/nextion/display.py +34 -22
  384. esphome/components/nextion/nextion.cpp +182 -143
  385. esphome/components/nextion/nextion.h +36 -0
  386. esphome/components/nextion/nextion_commands.cpp +3 -3
  387. esphome/components/nextion/nextion_upload_arduino.cpp +58 -61
  388. esphome/components/nextion/nextion_upload_idf.cpp +69 -72
  389. esphome/components/nextion/sensor/nextion_sensor.cpp +4 -4
  390. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  391. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +2 -2
  392. esphome/components/nfc/nci_message.h +1 -1
  393. esphome/components/nfc/ndef_record.h +1 -1
  394. esphome/components/nfc/ndef_record_text.h +1 -1
  395. esphome/components/nfc/ndef_record_uri.h +1 -1
  396. esphome/components/nfc/nfc.h +1 -1
  397. esphome/components/nfc/nfc_tag.h +1 -1
  398. esphome/components/noblex/noblex.cpp +1 -1
  399. esphome/components/npi19/npi19.cpp +5 -7
  400. esphome/components/number/__init__.py +11 -0
  401. esphome/components/online_image/__init__.py +13 -1
  402. esphome/components/online_image/online_image.cpp +26 -4
  403. esphome/components/online_image/online_image.h +21 -4
  404. esphome/components/opentherm/generate.py +3 -3
  405. esphome/components/opentherm/hub.cpp +11 -7
  406. esphome/components/opentherm/number/number.cpp +5 -3
  407. esphome/components/opentherm/opentherm.h +1 -1
  408. esphome/components/opentherm/schema.py +13 -13
  409. esphome/components/opentherm/validate.py +1 -1
  410. esphome/components/openthread/__init__.py +146 -0
  411. esphome/components/openthread/const.py +10 -0
  412. esphome/components/openthread/openthread.cpp +206 -0
  413. esphome/components/openthread/openthread.h +68 -0
  414. esphome/components/openthread/openthread_esp.cpp +164 -0
  415. esphome/components/openthread/tlv.py +58 -0
  416. esphome/components/openthread_info/__init__.py +0 -0
  417. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  418. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  419. esphome/components/openthread_info/text_sensor.py +105 -0
  420. esphome/components/output/float_output.cpp +1 -1
  421. esphome/components/output/switch/output_switch.cpp +1 -1
  422. esphome/components/packet_transport/packet_transport.cpp +6 -4
  423. esphome/components/pca6416a/pca6416a.cpp +2 -2
  424. esphome/components/pca9554/pca9554.cpp +6 -4
  425. esphome/components/pca9685/pca9685_output.cpp +12 -8
  426. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  427. esphome/components/pcf85063/pcf85063.cpp +2 -2
  428. esphome/components/pcf8563/pcf8563.cpp +2 -2
  429. esphome/components/pcf8574/pcf8574.cpp +2 -2
  430. esphome/components/pid/pid_climate.cpp +8 -5
  431. esphome/components/pid/pid_climate.h +1 -1
  432. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  433. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  434. esphome/components/pipsolar/pipsolar.cpp +3 -3
  435. esphome/components/pm1006/pm1006.cpp +3 -7
  436. esphome/components/pm1006/pm1006.h +4 -1
  437. esphome/components/pm2005/pm2005.cpp +12 -13
  438. esphome/components/pm2005/sensor.py +1 -1
  439. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  440. esphome/components/pmsx003/pmsx003.cpp +0 -4
  441. esphome/components/pmsx003/pmsx003.h +5 -2
  442. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  443. esphome/components/pmwcs3/pmwcs3.h +0 -1
  444. esphome/components/pn532/pn532.cpp +7 -7
  445. esphome/components/pn532/pn532.h +1 -1
  446. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  447. esphome/components/pn7150/pn7150.cpp +4 -4
  448. esphome/components/pn7160/pn7160.cpp +4 -4
  449. esphome/components/power_supply/power_supply.cpp +6 -4
  450. esphome/components/power_supply/power_supply.h +1 -1
  451. esphome/components/psram/__init__.py +59 -35
  452. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  453. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  454. esphome/components/pylontech/pylontech.cpp +2 -2
  455. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  456. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  457. esphome/components/pzemac/pzemac.cpp +4 -2
  458. esphome/components/pzemdc/pzemdc.cpp +4 -2
  459. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  460. esphome/components/qmp6988/qmp6988.cpp +2 -2
  461. esphome/components/qmp6988/qmp6988.h +1 -1
  462. esphome/components/qr_code/qr_code.cpp +5 -3
  463. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  464. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  465. esphome/components/rc522/rc522.cpp +5 -5
  466. esphome/components/rdm6300/rdm6300.cpp +1 -0
  467. esphome/components/remote_receiver/__init__.py +10 -2
  468. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  469. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  470. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  471. esphome/components/remote_transmitter/__init__.py +10 -2
  472. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  473. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  474. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  475. esphome/components/resistance/resistance_sensor.cpp +6 -3
  476. esphome/components/restart/button/restart_button.cpp +1 -1
  477. esphome/components/restart/switch/restart_switch.cpp +1 -1
  478. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  479. esphome/components/rp2040/__init__.py +7 -0
  480. esphome/components/rp2040/core.cpp +8 -1
  481. esphome/components/rp2040/gpio.cpp +26 -9
  482. esphome/components/rp2040/preferences.cpp +3 -3
  483. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  484. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  485. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  486. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  487. esphome/components/rtttl/rtttl.cpp +11 -9
  488. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  489. esphome/components/safe_mode/safe_mode.cpp +9 -8
  490. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  491. esphome/components/scd30/scd30.cpp +11 -8
  492. esphome/components/scd4x/scd4x.cpp +12 -8
  493. esphome/components/sdl/display.py +40 -0
  494. esphome/components/sdl/sdl_esphome.cpp +2 -2
  495. esphome/components/sdl/sdl_esphome.h +8 -0
  496. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  497. esphome/components/sdp3x/sdp3x.cpp +11 -11
  498. esphome/components/sds011/sds011.cpp +5 -6
  499. esphome/components/sds011/sds011.h +4 -1
  500. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  501. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  502. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  503. esphome/components/selec_meter/selec_meter.cpp +5 -2
  504. esphome/components/select/__init__.py +1 -0
  505. esphome/components/sen0321/sen0321.cpp +2 -2
  506. esphome/components/sen21231/sen21231.cpp +1 -1
  507. esphome/components/sen5x/sen5x.cpp +10 -7
  508. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  509. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  510. esphome/components/sensor/__init__.py +11 -1
  511. esphome/components/sensor/filter.h +1 -1
  512. esphome/components/sensor/sensor.h +9 -5
  513. esphome/components/servo/servo.cpp +12 -9
  514. esphome/components/servo/servo.h +1 -1
  515. esphome/components/sfa30/sfa30.cpp +1 -1
  516. esphome/components/sgp30/sgp30.cpp +10 -8
  517. esphome/components/sgp4x/sgp4x.cpp +49 -61
  518. esphome/components/sgp4x/sgp4x.h +0 -1
  519. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  520. esphome/components/sht3xd/sht3xd.cpp +1 -1
  521. esphome/components/sht4x/sht4x.cpp +2 -2
  522. esphome/components/shtcx/shtcx.cpp +13 -16
  523. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  524. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  525. esphome/components/sim800l/sim800l.cpp +2 -2
  526. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  527. esphome/components/sm16716/sm16716.cpp +1 -1
  528. esphome/components/sm2135/sm2135.cpp +1 -1
  529. esphome/components/sm2235/sm2235.cpp +5 -3
  530. esphome/components/sm2335/sm2335.cpp +5 -3
  531. esphome/components/sml/sml.cpp +1 -1
  532. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  533. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  534. esphome/components/sntp/sntp_component.cpp +1 -1
  535. esphome/components/socket/__init__.py +2 -0
  536. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  537. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  538. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  539. esphome/components/socket/socket.cpp +31 -0
  540. esphome/components/socket/socket.h +27 -1
  541. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  542. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  543. esphome/components/sound_level/sound_level.cpp +4 -2
  544. esphome/components/speaker/media_player/__init__.py +3 -0
  545. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  546. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  547. esphome/components/spi/__init__.py +10 -2
  548. esphome/components/spi/spi.cpp +4 -4
  549. esphome/components/spi_device/spi_device.cpp +1 -2
  550. esphome/components/sprinkler/sprinkler.cpp +9 -6
  551. esphome/components/sps30/sps30.cpp +16 -15
  552. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  553. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  554. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  555. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  556. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  557. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  558. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  559. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  560. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  561. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  562. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  563. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  564. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  565. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  566. esphome/components/st7567_base/st7567_base.cpp +3 -3
  567. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  568. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  569. esphome/components/st7701s/st7701s.cpp +4 -2
  570. esphome/components/st7735/st7735.cpp +3 -3
  571. esphome/components/st7789v/st7789v.cpp +10 -7
  572. esphome/components/st7920/st7920.cpp +6 -4
  573. esphome/components/statsd/statsd.cpp +9 -5
  574. esphome/components/status_led/light/status_led_light.cpp +1 -1
  575. esphome/components/status_led/status_led.cpp +1 -1
  576. esphome/components/stepper/stepper.h +5 -3
  577. esphome/components/sts3x/sts3x.cpp +2 -2
  578. esphome/components/switch/__init__.py +1 -0
  579. esphome/components/switch/switch.cpp +18 -12
  580. esphome/components/switch/switch.h +1 -1
  581. esphome/components/sx1509/__init__.py +53 -20
  582. esphome/components/sx1509/sx1509.cpp +29 -5
  583. esphome/components/sx1509/sx1509.h +9 -1
  584. esphome/components/t6615/t6615.cpp +1 -0
  585. esphome/components/tc74/tc74.cpp +1 -1
  586. esphome/components/tca9548a/tca9548a.cpp +1 -1
  587. esphome/components/tca9555/tca9555.cpp +2 -2
  588. esphome/components/tcs34725/tcs34725.cpp +4 -4
  589. esphome/components/tee501/tee501.cpp +3 -2
  590. esphome/components/tem3200/tem3200.cpp +5 -6
  591. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  592. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +38 -12
  593. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +3 -1
  594. esphome/components/template/cover/template_cover.cpp +1 -1
  595. esphome/components/template/select/template_select.cpp +6 -4
  596. esphome/components/template/text/template_text.cpp +2 -3
  597. esphome/components/template/valve/template_valve.cpp +5 -3
  598. esphome/components/text/__init__.py +10 -11
  599. esphome/components/text_sensor/__init__.py +1 -0
  600. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  601. esphome/components/time/__init__.py +1 -2
  602. esphome/components/time_based/time_based_cover.cpp +4 -2
  603. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  604. esphome/components/tm1621/tm1621.cpp +3 -3
  605. esphome/components/tm1637/tm1637.cpp +9 -7
  606. esphome/components/tm1638/tm1638.cpp +7 -5
  607. esphome/components/tm1651/tm1651.cpp +2 -2
  608. esphome/components/tmp102/tmp102.cpp +1 -3
  609. esphome/components/tmp102/tmp102.h +0 -3
  610. esphome/components/tmp1075/tmp1075.cpp +12 -9
  611. esphome/components/tmp117/tmp117.cpp +2 -2
  612. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  613. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  614. esphome/components/tsl2561/tsl2561.cpp +7 -5
  615. esphome/components/tsl2591/tsl2591.cpp +25 -27
  616. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  617. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  618. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  619. esphome/components/tuya/select/tuya_select.cpp +5 -3
  620. esphome/components/tx20/tx20.cpp +3 -3
  621. esphome/components/uart/__init__.py +4 -5
  622. esphome/components/uart/button/uart_button.cpp +1 -1
  623. esphome/components/uart/switch/uart_switch.cpp +2 -2
  624. esphome/components/uart/uart.cpp +2 -2
  625. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  626. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  627. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  628. esphome/components/uart/uart_component_host.cpp +11 -8
  629. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  630. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  631. esphome/components/udp/udp_component.cpp +9 -5
  632. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  633. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  634. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  635. esphome/components/update/__init__.py +1 -0
  636. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  637. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  638. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  639. esphome/components/usb_host/__init__.py +64 -0
  640. esphome/components/usb_host/usb_host.h +116 -0
  641. esphome/components/usb_host/usb_host_client.cpp +394 -0
  642. esphome/components/usb_host/usb_host_component.cpp +35 -0
  643. esphome/components/usb_uart/__init__.py +134 -0
  644. esphome/components/usb_uart/ch34x.cpp +80 -0
  645. esphome/components/usb_uart/cp210x.cpp +126 -0
  646. esphome/components/usb_uart/usb_uart.cpp +328 -0
  647. esphome/components/usb_uart/usb_uart.h +151 -0
  648. esphome/components/valve/__init__.py +1 -0
  649. esphome/components/veml3235/veml3235.cpp +13 -9
  650. esphome/components/veml7700/veml7700.cpp +10 -6
  651. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  652. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  653. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  654. esphome/components/web_server/server_index_v2.h +632 -630
  655. esphome/components/web_server/server_index_v3.h +411 -409
  656. esphome/components/web_server/web_server.cpp +5 -3
  657. esphome/components/web_server_base/web_server_base.cpp +1 -1
  658. esphome/components/web_server_idf/utils.cpp +1 -1
  659. esphome/components/web_server_idf/web_server_idf.cpp +1 -1
  660. esphome/components/weikai/__init__.py +2 -0
  661. esphome/components/weikai/weikai.cpp +23 -21
  662. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  663. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  664. esphome/components/wiegand/wiegand.cpp +1 -1
  665. esphome/components/wifi/wifi_component.cpp +50 -37
  666. esphome/components/wifi/wifi_component.h +7 -4
  667. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  668. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  669. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  670. esphome/components/wireguard/wireguard.cpp +21 -21
  671. esphome/components/wl_134/text_sensor.py +1 -2
  672. esphome/components/wled/wled_light_effect.cpp +1 -1
  673. esphome/components/x9c/x9c.cpp +5 -3
  674. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  675. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  676. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  677. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  678. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  679. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  680. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  681. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  682. esphome/components/xl9535/xl9535.cpp +2 -2
  683. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  684. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  685. esphome/config.py +3 -2
  686. esphome/config_validation.py +46 -17
  687. esphome/const.py +10 -1
  688. esphome/core/__init__.py +37 -18
  689. esphome/core/application.cpp +188 -5
  690. esphome/core/application.h +110 -0
  691. esphome/core/component.h +13 -0
  692. esphome/core/config.py +12 -0
  693. esphome/core/defines.h +10 -2
  694. esphome/core/hal.h +5 -0
  695. esphome/core/helpers.cpp +1 -1
  696. esphome/core/helpers.h +4 -4
  697. esphome/core/log.h +2 -0
  698. esphome/core/log_const_en.h +4 -0
  699. esphome/core/scheduler.cpp +2 -2
  700. esphome/coroutine.py +3 -4
  701. esphome/cpp_generator.py +32 -32
  702. esphome/dashboard/core.py +2 -2
  703. esphome/dashboard/web_server.py +2 -2
  704. esphome/git.py +4 -4
  705. esphome/helpers.py +5 -6
  706. esphome/loader.py +8 -7
  707. esphome/log.py +7 -1
  708. esphome/platformio_api.py +2 -3
  709. esphome/storage_json.py +13 -5
  710. esphome/types.py +12 -13
  711. esphome/util.py +1 -2
  712. esphome/writer.py +5 -3
  713. esphome/yaml_util.py +6 -1
  714. esphome/zeroconf.py +1 -1
  715. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/METADATA +12 -11
  716. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/RECORD +720 -667
  717. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/WHEEL +1 -1
  718. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/entry_points.txt +0 -0
  719. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/licenses/LICENSE +0 -0
  720. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/top_level.txt +0 -0
@@ -7,7 +7,7 @@ namespace ufire_ec {
7
7
  static const char *const TAG = "ufire_ec";
8
8
 
9
9
  void UFireECComponent::setup() {
10
- ESP_LOGCONFIG(TAG, "Setting up uFire_ec...");
10
+ ESP_LOGCONFIG(TAG, "Running setup");
11
11
 
12
12
  uint8_t version;
13
13
  if (!this->read_byte(REGISTER_VERSION, &version) && version != 0xFF) {
@@ -110,8 +110,10 @@ void UFireECComponent::dump_config() {
110
110
  LOG_SENSOR(" ", "EC Sensor", this->ec_sensor_)
111
111
  LOG_SENSOR(" ", "Temperature Sensor", this->temperature_sensor_)
112
112
  LOG_SENSOR(" ", "Temperature Sensor external", this->temperature_sensor_external_)
113
- ESP_LOGCONFIG(TAG, " Temperature Compensation: %f", this->temperature_compensation_);
114
- ESP_LOGCONFIG(TAG, " Temperature Coefficient: %f", this->temperature_coefficient_);
113
+ ESP_LOGCONFIG(TAG,
114
+ " Temperature Compensation: %f\n"
115
+ " Temperature Coefficient: %f",
116
+ this->temperature_compensation_, this->temperature_coefficient_);
115
117
  }
116
118
 
117
119
  } // namespace ufire_ec
@@ -9,7 +9,7 @@ namespace ufire_ise {
9
9
  static const char *const TAG = "ufire_ise";
10
10
 
11
11
  void UFireISEComponent::setup() {
12
- ESP_LOGCONFIG(TAG, "Setting up uFire_ise...");
12
+ ESP_LOGCONFIG(TAG, "Running setup");
13
13
 
14
14
  uint8_t version;
15
15
  if (!this->read_byte(REGISTER_VERSION, &version) && version != 0xFF) {
@@ -8,7 +8,7 @@ namespace ultrasonic {
8
8
  static const char *const TAG = "ultrasonic.sensor";
9
9
 
10
10
  void UltrasonicSensorComponent::setup() {
11
- ESP_LOGCONFIG(TAG, "Setting up Ultrasonic Sensor...");
11
+ ESP_LOGCONFIG(TAG, "Running setup");
12
12
  this->trigger_pin_->setup();
13
13
  this->trigger_pin_->digital_write(false);
14
14
  this->echo_pin_->setup();
@@ -45,8 +45,10 @@ void UltrasonicSensorComponent::dump_config() {
45
45
  LOG_SENSOR("", "Ultrasonic Sensor", this);
46
46
  LOG_PIN(" Echo Pin: ", this->echo_pin_);
47
47
  LOG_PIN(" Trigger Pin: ", this->trigger_pin_);
48
- ESP_LOGCONFIG(TAG, " Pulse time: %" PRIu32 " µs", this->pulse_time_us_);
49
- ESP_LOGCONFIG(TAG, " Timeout: %" PRIu32 " µs", this->timeout_us_);
48
+ ESP_LOGCONFIG(TAG,
49
+ " Pulse time: %" PRIu32 " µs\n"
50
+ " Timeout: %" PRIu32 " µs",
51
+ this->pulse_time_us_, this->timeout_us_);
50
52
  LOG_UPDATE_INTERVAL(this);
51
53
  }
52
54
  float UltrasonicSensorComponent::us_to_m(uint32_t us) {
@@ -111,6 +111,7 @@ async def register_update(var, config):
111
111
  if not CORE.has_id(config[CONF_ID]):
112
112
  var = cg.Pvariable(config[CONF_ID], var)
113
113
  cg.add(cg.App.register_update(var))
114
+ CORE.register_platform_component("update", var)
114
115
  await setup_update_core_(var, config)
115
116
 
116
117
 
@@ -1,7 +1,7 @@
1
1
  #include "uponor_smatrix_climate.h"
2
+ #include "esphome/core/application.h"
2
3
  #include "esphome/core/helpers.h"
3
4
  #include "esphome/core/log.h"
4
- #include "esphome/core/application.h"
5
5
 
6
6
  namespace esphome {
7
7
  namespace uponor_smatrix {
@@ -7,8 +7,10 @@ namespace uponor_smatrix {
7
7
  static const char *const TAG = "uponor_smatrix.sensor";
8
8
 
9
9
  void UponorSmatrixSensor::dump_config() {
10
- ESP_LOGCONFIG(TAG, "Uponor Smatrix Sensor");
11
- ESP_LOGCONFIG(TAG, " Device address: 0x%04X", this->address_);
10
+ ESP_LOGCONFIG(TAG,
11
+ "Uponor Smatrix Sensor\n"
12
+ " Device address: 0x%04X",
13
+ this->address_);
12
14
  LOG_SENSOR(" ", "Temperature", this->temperature_sensor_);
13
15
  LOG_SENSOR(" ", "External Temperature", this->external_temperature_sensor_);
14
16
  LOG_SENSOR(" ", "Humidity", this->humidity_sensor_);
@@ -1,6 +1,7 @@
1
1
  #include "uponor_smatrix.h"
2
- #include "esphome/core/log.h"
3
2
  #include "esphome/core/application.h"
3
+ #include "esphome/core/helpers.h"
4
+ #include "esphome/core/log.h"
4
5
 
5
6
  namespace esphome {
6
7
  namespace uponor_smatrix {
@@ -0,0 +1,64 @@
1
+ import esphome.codegen as cg
2
+ from esphome.components.esp32 import (
3
+ VARIANT_ESP32S2,
4
+ VARIANT_ESP32S3,
5
+ add_idf_sdkconfig_option,
6
+ only_on_variant,
7
+ )
8
+ import esphome.config_validation as cv
9
+ from esphome.const import CONF_ID
10
+ from esphome.cpp_types import Component
11
+
12
+ AUTO_LOAD = ["bytebuffer"]
13
+ CODEOWNERS = ["@clydebarrow"]
14
+ DEPENDENCIES = ["esp32"]
15
+ usb_host_ns = cg.esphome_ns.namespace("usb_host")
16
+ USBHost = usb_host_ns.class_("USBHost", Component)
17
+ USBClient = usb_host_ns.class_("USBClient", Component)
18
+
19
+ CONF_DEVICES = "devices"
20
+ CONF_VID = "vid"
21
+ CONF_PID = "pid"
22
+
23
+
24
+ def usb_device_schema(cls=USBClient, vid: int = None, pid: [int] = None) -> cv.Schema:
25
+ schema = cv.COMPONENT_SCHEMA.extend(
26
+ {
27
+ cv.GenerateID(): cv.declare_id(cls),
28
+ }
29
+ )
30
+ if vid:
31
+ schema = schema.extend({cv.Optional(CONF_VID, default=vid): cv.hex_uint16_t})
32
+ else:
33
+ schema = schema.extend({cv.Required(CONF_VID): cv.hex_uint16_t})
34
+ if pid:
35
+ schema = schema.extend({cv.Optional(CONF_PID, default=pid): cv.hex_uint16_t})
36
+ else:
37
+ schema = schema.extend({cv.Required(CONF_PID): cv.hex_uint16_t})
38
+ return schema
39
+
40
+
41
+ CONFIG_SCHEMA = cv.All(
42
+ cv.COMPONENT_SCHEMA.extend(
43
+ {
44
+ cv.GenerateID(): cv.declare_id(USBHost),
45
+ cv.Optional(CONF_DEVICES): cv.ensure_list(usb_device_schema()),
46
+ }
47
+ ),
48
+ cv.only_with_esp_idf,
49
+ only_on_variant(supported=[VARIANT_ESP32S2, VARIANT_ESP32S3]),
50
+ )
51
+
52
+
53
+ async def register_usb_client(config):
54
+ var = cg.new_Pvariable(config[CONF_ID], config[CONF_VID], config[CONF_PID])
55
+ await cg.register_component(var, config)
56
+ return var
57
+
58
+
59
+ async def to_code(config):
60
+ add_idf_sdkconfig_option("CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE", 1024)
61
+ var = cg.new_Pvariable(config[CONF_ID])
62
+ await cg.register_component(var, config)
63
+ for device in config.get(CONF_DEVICES) or ():
64
+ await register_usb_client(device)
@@ -0,0 +1,116 @@
1
+ #pragma once
2
+
3
+ // Should not be needed, but it's required to pass CI clang-tidy checks
4
+ #if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
5
+ #include "esphome/core/component.h"
6
+ #include <vector>
7
+ #include "usb/usb_host.h"
8
+
9
+ #include <list>
10
+
11
+ namespace esphome {
12
+ namespace usb_host {
13
+
14
+ static const char *const TAG = "usb_host";
15
+
16
+ // constants for setup packet type
17
+ static const uint8_t USB_RECIP_DEVICE = 0;
18
+ static const uint8_t USB_RECIP_INTERFACE = 1;
19
+ static const uint8_t USB_RECIP_ENDPOINT = 2;
20
+ static const uint8_t USB_TYPE_STANDARD = 0 << 5;
21
+ static const uint8_t USB_TYPE_CLASS = 1 << 5;
22
+ static const uint8_t USB_TYPE_VENDOR = 2 << 5;
23
+ static const uint8_t USB_DIR_MASK = 1 << 7;
24
+ static const uint8_t USB_DIR_IN = 1 << 7;
25
+ static const uint8_t USB_DIR_OUT = 0;
26
+ static const size_t SETUP_PACKET_SIZE = 8;
27
+
28
+ static const size_t MAX_REQUESTS = 16; // maximum number of outstanding requests possible.
29
+
30
+ // used to report a transfer status
31
+ struct TransferStatus {
32
+ bool success;
33
+ uint16_t error_code;
34
+ uint8_t *data;
35
+ size_t data_len;
36
+ uint8_t endpoint;
37
+ void *user_data;
38
+ };
39
+
40
+ using transfer_cb_t = std::function<void(const TransferStatus &)>;
41
+
42
+ class USBClient;
43
+
44
+ // struct used to capture all data needed for a transfer
45
+ struct TransferRequest {
46
+ usb_transfer_t *transfer;
47
+ transfer_cb_t callback;
48
+ TransferStatus status;
49
+ USBClient *client;
50
+ };
51
+
52
+ // callback function type.
53
+
54
+ enum ClientState {
55
+ USB_CLIENT_INIT = 0,
56
+ USB_CLIENT_OPEN,
57
+ USB_CLIENT_CLOSE,
58
+ USB_CLIENT_GET_DESC,
59
+ USB_CLIENT_GET_INFO,
60
+ USB_CLIENT_CONNECTED,
61
+ };
62
+ class USBClient : public Component {
63
+ friend class USBHost;
64
+
65
+ public:
66
+ USBClient(uint16_t vid, uint16_t pid) : vid_(vid), pid_(pid) { init_pool(); }
67
+
68
+ void init_pool() {
69
+ this->trq_pool_.clear();
70
+ for (size_t i = 0; i != MAX_REQUESTS; i++)
71
+ this->trq_pool_.push_back(&this->requests_[i]);
72
+ }
73
+ void setup() override;
74
+ void loop() override;
75
+ // setup must happen after the host bus has been setup
76
+ float get_setup_priority() const override { return setup_priority::IO; }
77
+ void on_opened(uint8_t addr);
78
+ void on_removed(usb_device_handle_t handle);
79
+ void control_transfer_callback(const usb_transfer_t *xfer) const;
80
+ void transfer_in(uint8_t ep_address, const transfer_cb_t &callback, uint16_t length);
81
+ void transfer_out(uint8_t ep_address, const transfer_cb_t &callback, const uint8_t *data, uint16_t length);
82
+ void dump_config() override;
83
+ void release_trq(TransferRequest *trq);
84
+ bool control_transfer(uint8_t type, uint8_t request, uint16_t value, uint16_t index, const transfer_cb_t &callback,
85
+ const std::vector<uint8_t> &data = {});
86
+
87
+ protected:
88
+ bool register_();
89
+ TransferRequest *get_trq_();
90
+ virtual void disconnect();
91
+ virtual void on_connected() {}
92
+ virtual void on_disconnected() { this->init_pool(); }
93
+
94
+ usb_host_client_handle_t handle_{};
95
+ usb_device_handle_t device_handle_{};
96
+ int device_addr_{-1};
97
+ int state_{USB_CLIENT_INIT};
98
+ uint16_t vid_{};
99
+ uint16_t pid_{};
100
+ std::list<TransferRequest *> trq_pool_{};
101
+ TransferRequest requests_[MAX_REQUESTS]{};
102
+ };
103
+ class USBHost : public Component {
104
+ public:
105
+ float get_setup_priority() const override { return setup_priority::BUS; }
106
+ void loop() override;
107
+ void setup() override;
108
+
109
+ protected:
110
+ std::vector<USBClient *> clients_{};
111
+ };
112
+
113
+ } // namespace usb_host
114
+ } // namespace esphome
115
+
116
+ #endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
@@ -0,0 +1,394 @@
1
+ // Should not be needed, but it's required to pass CI clang-tidy checks
2
+ #if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
3
+ #include "usb_host.h"
4
+ #include "esphome/core/log.h"
5
+ #include "esphome/core/hal.h"
6
+ #include "esphome/components/bytebuffer/bytebuffer.h"
7
+
8
+ #include <cinttypes>
9
+ #include <cstring>
10
+ namespace esphome {
11
+ namespace usb_host {
12
+
13
+ #pragma GCC diagnostic ignored "-Wparentheses"
14
+
15
+ using namespace bytebuffer;
16
+
17
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
18
+ static void print_ep_desc(const usb_ep_desc_t *ep_desc) {
19
+ const char *ep_type_str;
20
+ int type = ep_desc->bmAttributes & USB_BM_ATTRIBUTES_XFERTYPE_MASK;
21
+
22
+ switch (type) {
23
+ case USB_BM_ATTRIBUTES_XFER_CONTROL:
24
+ ep_type_str = "CTRL";
25
+ break;
26
+ case USB_BM_ATTRIBUTES_XFER_ISOC:
27
+ ep_type_str = "ISOC";
28
+ break;
29
+ case USB_BM_ATTRIBUTES_XFER_BULK:
30
+ ep_type_str = "BULK";
31
+ break;
32
+ case USB_BM_ATTRIBUTES_XFER_INT:
33
+ ep_type_str = "INT";
34
+ break;
35
+ default:
36
+ ep_type_str = NULL;
37
+ break;
38
+ }
39
+
40
+ ESP_LOGV(TAG, "\t\t*** Endpoint descriptor ***");
41
+ ESP_LOGV(TAG, "\t\tbLength %d", ep_desc->bLength);
42
+ ESP_LOGV(TAG, "\t\tbDescriptorType %d", ep_desc->bDescriptorType);
43
+ ESP_LOGV(TAG, "\t\tbEndpointAddress 0x%x\tEP %d %s", ep_desc->bEndpointAddress, USB_EP_DESC_GET_EP_NUM(ep_desc),
44
+ USB_EP_DESC_GET_EP_DIR(ep_desc) ? "IN" : "OUT");
45
+ ESP_LOGV(TAG, "\t\tbmAttributes 0x%x\t%s", ep_desc->bmAttributes, ep_type_str);
46
+ ESP_LOGV(TAG, "\t\twMaxPacketSize %d", ep_desc->wMaxPacketSize);
47
+ ESP_LOGV(TAG, "\t\tbInterval %d", ep_desc->bInterval);
48
+ }
49
+
50
+ static void usbh_print_intf_desc(const usb_intf_desc_t *intf_desc) {
51
+ ESP_LOGV(TAG, "\t*** Interface descriptor ***");
52
+ ESP_LOGV(TAG, "\tbLength %d", intf_desc->bLength);
53
+ ESP_LOGV(TAG, "\tbDescriptorType %d", intf_desc->bDescriptorType);
54
+ ESP_LOGV(TAG, "\tbInterfaceNumber %d", intf_desc->bInterfaceNumber);
55
+ ESP_LOGV(TAG, "\tbAlternateSetting %d", intf_desc->bAlternateSetting);
56
+ ESP_LOGV(TAG, "\tbNumEndpoints %d", intf_desc->bNumEndpoints);
57
+ ESP_LOGV(TAG, "\tbInterfaceClass 0x%x", intf_desc->bInterfaceProtocol);
58
+ ESP_LOGV(TAG, "\tiInterface %d", intf_desc->iInterface);
59
+ }
60
+
61
+ static void usbh_print_cfg_desc(const usb_config_desc_t *cfg_desc) {
62
+ ESP_LOGV(TAG, "*** Configuration descriptor ***");
63
+ ESP_LOGV(TAG, "bLength %d", cfg_desc->bLength);
64
+ ESP_LOGV(TAG, "bDescriptorType %d", cfg_desc->bDescriptorType);
65
+ ESP_LOGV(TAG, "wTotalLength %d", cfg_desc->wTotalLength);
66
+ ESP_LOGV(TAG, "bNumInterfaces %d", cfg_desc->bNumInterfaces);
67
+ ESP_LOGV(TAG, "bConfigurationValue %d", cfg_desc->bConfigurationValue);
68
+ ESP_LOGV(TAG, "iConfiguration %d", cfg_desc->iConfiguration);
69
+ ESP_LOGV(TAG, "bmAttributes 0x%x", cfg_desc->bmAttributes);
70
+ ESP_LOGV(TAG, "bMaxPower %dmA", cfg_desc->bMaxPower * 2);
71
+ }
72
+
73
+ void usb_client_print_device_descriptor(const usb_device_desc_t *devc_desc) {
74
+ if (devc_desc == NULL) {
75
+ return;
76
+ }
77
+
78
+ ESP_LOGV(TAG, "*** Device descriptor ***");
79
+ ESP_LOGV(TAG, "bLength %d", devc_desc->bLength);
80
+ ESP_LOGV(TAG, "bDescriptorType %d", devc_desc->bDescriptorType);
81
+ ESP_LOGV(TAG, "bcdUSB %d.%d0", ((devc_desc->bcdUSB >> 8) & 0xF), ((devc_desc->bcdUSB >> 4) & 0xF));
82
+ ESP_LOGV(TAG, "bDeviceClass 0x%x", devc_desc->bDeviceClass);
83
+ ESP_LOGV(TAG, "bDeviceSubClass 0x%x", devc_desc->bDeviceSubClass);
84
+ ESP_LOGV(TAG, "bDeviceProtocol 0x%x", devc_desc->bDeviceProtocol);
85
+ ESP_LOGV(TAG, "bMaxPacketSize0 %d", devc_desc->bMaxPacketSize0);
86
+ ESP_LOGV(TAG, "idVendor 0x%x", devc_desc->idVendor);
87
+ ESP_LOGV(TAG, "idProduct 0x%x", devc_desc->idProduct);
88
+ ESP_LOGV(TAG, "bcdDevice %d.%d0", ((devc_desc->bcdDevice >> 8) & 0xF), ((devc_desc->bcdDevice >> 4) & 0xF));
89
+ ESP_LOGV(TAG, "iManufacturer %d", devc_desc->iManufacturer);
90
+ ESP_LOGV(TAG, "iProduct %d", devc_desc->iProduct);
91
+ ESP_LOGV(TAG, "iSerialNumber %d", devc_desc->iSerialNumber);
92
+ ESP_LOGV(TAG, "bNumConfigurations %d", devc_desc->bNumConfigurations);
93
+ }
94
+
95
+ void usb_client_print_config_descriptor(const usb_config_desc_t *cfg_desc,
96
+ print_class_descriptor_cb class_specific_cb) {
97
+ if (cfg_desc == nullptr) {
98
+ return;
99
+ }
100
+
101
+ int offset = 0;
102
+ uint16_t w_total_length = cfg_desc->wTotalLength;
103
+ const usb_standard_desc_t *next_desc = (const usb_standard_desc_t *) cfg_desc;
104
+
105
+ do {
106
+ switch (next_desc->bDescriptorType) {
107
+ case USB_W_VALUE_DT_CONFIG:
108
+ usbh_print_cfg_desc((const usb_config_desc_t *) next_desc);
109
+ break;
110
+ case USB_W_VALUE_DT_INTERFACE:
111
+ usbh_print_intf_desc((const usb_intf_desc_t *) next_desc);
112
+ break;
113
+ case USB_W_VALUE_DT_ENDPOINT:
114
+ print_ep_desc((const usb_ep_desc_t *) next_desc);
115
+ break;
116
+ default:
117
+ if (class_specific_cb) {
118
+ class_specific_cb(next_desc);
119
+ }
120
+ break;
121
+ }
122
+
123
+ next_desc = usb_parse_next_descriptor(next_desc, w_total_length, &offset);
124
+
125
+ } while (next_desc != NULL);
126
+ }
127
+ #endif
128
+ static std::string get_descriptor_string(const usb_str_desc_t *desc) {
129
+ char buffer[256];
130
+ if (desc == nullptr)
131
+ return "(unknown)";
132
+ char *p = buffer;
133
+ for (size_t i = 0; i != desc->bLength / 2; i++) {
134
+ auto c = desc->wData[i];
135
+ if (c < 0x100)
136
+ *p++ = static_cast<char>(c);
137
+ }
138
+ *p = '\0';
139
+ return {buffer};
140
+ }
141
+
142
+ static void client_event_cb(const usb_host_client_event_msg_t *event_msg, void *ptr) {
143
+ auto *client = static_cast<USBClient *>(ptr);
144
+ switch (event_msg->event) {
145
+ case USB_HOST_CLIENT_EVENT_NEW_DEV: {
146
+ auto addr = event_msg->new_dev.address;
147
+ ESP_LOGD(TAG, "New device %d", event_msg->new_dev.address);
148
+ client->on_opened(addr);
149
+ break;
150
+ }
151
+ case USB_HOST_CLIENT_EVENT_DEV_GONE: {
152
+ client->on_removed(event_msg->dev_gone.dev_hdl);
153
+ ESP_LOGD(TAG, "Device gone %d", event_msg->new_dev.address);
154
+ break;
155
+ }
156
+ default:
157
+ ESP_LOGD(TAG, "Unknown event %d", event_msg->event);
158
+ break;
159
+ }
160
+ }
161
+ void USBClient::setup() {
162
+ usb_host_client_config_t config{.is_synchronous = false,
163
+ .max_num_event_msg = 5,
164
+ .async = {.client_event_callback = client_event_cb, .callback_arg = this}};
165
+ auto err = usb_host_client_register(&config, &this->handle_);
166
+ if (err != ESP_OK) {
167
+ ESP_LOGE(TAG, "client register failed: %s", esp_err_to_name(err));
168
+ this->status_set_error("Client register failed");
169
+ this->mark_failed();
170
+ return;
171
+ }
172
+ for (auto trq : this->trq_pool_) {
173
+ usb_host_transfer_alloc(64, 0, &trq->transfer);
174
+ trq->client = this;
175
+ }
176
+ ESP_LOGCONFIG(TAG, "client setup complete");
177
+ }
178
+
179
+ void USBClient::loop() {
180
+ switch (this->state_) {
181
+ case USB_CLIENT_OPEN: {
182
+ int err;
183
+ ESP_LOGD(TAG, "Open device %d", this->device_addr_);
184
+ err = usb_host_device_open(this->handle_, this->device_addr_, &this->device_handle_);
185
+ if (err != ESP_OK) {
186
+ ESP_LOGW(TAG, "Device open failed: %s", esp_err_to_name(err));
187
+ this->state_ = USB_CLIENT_INIT;
188
+ break;
189
+ }
190
+ ESP_LOGD(TAG, "Get descriptor device %d", this->device_addr_);
191
+ const usb_device_desc_t *desc;
192
+ err = usb_host_get_device_descriptor(this->device_handle_, &desc);
193
+ if (err != ESP_OK) {
194
+ ESP_LOGW(TAG, "Device get_desc failed: %s", esp_err_to_name(err));
195
+ this->disconnect();
196
+ } else {
197
+ ESP_LOGD(TAG, "Device descriptor: vid %X pid %X", desc->idVendor, desc->idProduct);
198
+ if (desc->idVendor == this->vid_ && desc->idProduct == this->pid_ || this->vid_ == 0 && this->pid_ == 0) {
199
+ usb_device_info_t dev_info;
200
+ if ((err = usb_host_device_info(this->device_handle_, &dev_info)) != ESP_OK) {
201
+ ESP_LOGW(TAG, "Device info failed: %s", esp_err_to_name(err));
202
+ this->disconnect();
203
+ break;
204
+ }
205
+ this->state_ = USB_CLIENT_CONNECTED;
206
+ ESP_LOGD(TAG, "Device connected: Manuf: %s; Prod: %s; Serial: %s",
207
+ get_descriptor_string(dev_info.str_desc_manufacturer).c_str(),
208
+ get_descriptor_string(dev_info.str_desc_product).c_str(),
209
+ get_descriptor_string(dev_info.str_desc_serial_num).c_str());
210
+
211
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
212
+ const usb_device_desc_t *device_desc;
213
+ err = usb_host_get_device_descriptor(this->device_handle_, &device_desc);
214
+ if (err == ESP_OK)
215
+ usb_client_print_device_descriptor(device_desc);
216
+ const usb_config_desc_t *config_desc;
217
+ err = usb_host_get_active_config_descriptor(this->device_handle_, &config_desc);
218
+ if (err == ESP_OK)
219
+ usb_client_print_config_descriptor(config_desc, nullptr);
220
+ #endif
221
+ this->on_connected();
222
+ } else {
223
+ ESP_LOGD(TAG, "Not our device, closing");
224
+ this->disconnect();
225
+ }
226
+ }
227
+ break;
228
+ }
229
+
230
+ default:
231
+ usb_host_client_handle_events(this->handle_, 0);
232
+ break;
233
+ }
234
+ }
235
+
236
+ void USBClient::on_opened(uint8_t addr) {
237
+ if (this->state_ == USB_CLIENT_INIT) {
238
+ this->device_addr_ = addr;
239
+ this->state_ = USB_CLIENT_OPEN;
240
+ }
241
+ }
242
+ void USBClient::on_removed(usb_device_handle_t handle) {
243
+ if (this->device_handle_ == handle) {
244
+ this->disconnect();
245
+ }
246
+ }
247
+
248
+ static void control_callback(const usb_transfer_t *xfer) {
249
+ auto *trq = static_cast<TransferRequest *>(xfer->context);
250
+ trq->status.error_code = xfer->status;
251
+ trq->status.success = xfer->status == USB_TRANSFER_STATUS_COMPLETED;
252
+ trq->status.endpoint = xfer->bEndpointAddress;
253
+ trq->status.data = xfer->data_buffer;
254
+ trq->status.data_len = xfer->actual_num_bytes;
255
+ if (trq->callback != nullptr)
256
+ trq->callback(trq->status);
257
+ trq->client->release_trq(trq);
258
+ }
259
+
260
+ TransferRequest *USBClient::get_trq_() {
261
+ if (this->trq_pool_.empty()) {
262
+ ESP_LOGE(TAG, "Too many requests queued");
263
+ return nullptr;
264
+ }
265
+ auto *trq = this->trq_pool_.front();
266
+ this->trq_pool_.pop_front();
267
+ trq->client = this;
268
+ trq->transfer->context = trq;
269
+ trq->transfer->device_handle = this->device_handle_;
270
+ return trq;
271
+ }
272
+ void USBClient::disconnect() {
273
+ this->on_disconnected();
274
+ auto err = usb_host_device_close(this->handle_, this->device_handle_);
275
+ if (err != ESP_OK) {
276
+ ESP_LOGE(TAG, "Device close failed: %s", esp_err_to_name(err));
277
+ }
278
+ this->state_ = USB_CLIENT_INIT;
279
+ this->device_handle_ = nullptr;
280
+ this->device_addr_ = -1;
281
+ }
282
+
283
+ bool USBClient::control_transfer(uint8_t type, uint8_t request, uint16_t value, uint16_t index,
284
+ const transfer_cb_t &callback, const std::vector<uint8_t> &data) {
285
+ auto *trq = this->get_trq_();
286
+ if (trq == nullptr)
287
+ return false;
288
+ auto length = data.size();
289
+ if (length > sizeof(trq->transfer->data_buffer_size) - SETUP_PACKET_SIZE) {
290
+ ESP_LOGE(TAG, "Control transfer data size too large: %u > %u", length,
291
+ sizeof(trq->transfer->data_buffer_size) - sizeof(usb_setup_packet_t));
292
+ this->release_trq(trq);
293
+ return false;
294
+ }
295
+ auto control_packet = ByteBuffer(SETUP_PACKET_SIZE, LITTLE);
296
+ control_packet.put_uint8(type);
297
+ control_packet.put_uint8(request);
298
+ control_packet.put_uint16(value);
299
+ control_packet.put_uint16(index);
300
+ control_packet.put_uint16(length);
301
+ memcpy(trq->transfer->data_buffer, control_packet.get_data().data(), SETUP_PACKET_SIZE);
302
+ if (length != 0 && !(type & USB_DIR_IN)) {
303
+ memcpy(trq->transfer->data_buffer + SETUP_PACKET_SIZE, data.data(), length);
304
+ }
305
+ trq->callback = callback;
306
+ trq->transfer->bEndpointAddress = type & USB_DIR_MASK;
307
+ trq->transfer->num_bytes = static_cast<int>(length + SETUP_PACKET_SIZE);
308
+ trq->transfer->callback = reinterpret_cast<usb_transfer_cb_t>(control_callback);
309
+ auto err = usb_host_transfer_submit_control(this->handle_, trq->transfer);
310
+ if (err != ESP_OK) {
311
+ ESP_LOGE(TAG, "Failed to submit control transfer, err=%s", esp_err_to_name(err));
312
+ this->release_trq(trq);
313
+ return false;
314
+ }
315
+ return true;
316
+ }
317
+
318
+ static void transfer_callback(usb_transfer_t *xfer) {
319
+ auto *trq = static_cast<TransferRequest *>(xfer->context);
320
+ trq->status.error_code = xfer->status;
321
+ trq->status.success = xfer->status == USB_TRANSFER_STATUS_COMPLETED;
322
+ trq->status.endpoint = xfer->bEndpointAddress;
323
+ trq->status.data = xfer->data_buffer;
324
+ trq->status.data_len = xfer->actual_num_bytes;
325
+ if (trq->callback != nullptr)
326
+ trq->callback(trq->status);
327
+ trq->client->release_trq(trq);
328
+ }
329
+ /**
330
+ * Performs a transfer input operation.
331
+ *
332
+ * @param ep_address The endpoint address.
333
+ * @param callback The callback function to be called when the transfer is complete.
334
+ * @param length The length of the data to be transferred.
335
+ *
336
+ * @throws None.
337
+ */
338
+ void USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, uint16_t length) {
339
+ auto trq = this->get_trq_();
340
+ if (trq == nullptr) {
341
+ ESP_LOGE(TAG, "Too many requests queued");
342
+ return;
343
+ }
344
+ trq->callback = callback;
345
+ trq->transfer->callback = transfer_callback;
346
+ trq->transfer->bEndpointAddress = ep_address | USB_DIR_IN;
347
+ trq->transfer->num_bytes = length;
348
+ auto err = usb_host_transfer_submit(trq->transfer);
349
+ if (err != ESP_OK) {
350
+ ESP_LOGE(TAG, "Failed to submit transfer, address=%x, length=%d, err=%x", ep_address, length, err);
351
+ this->release_trq(trq);
352
+ this->disconnect();
353
+ }
354
+ }
355
+
356
+ /**
357
+ * Performs an output transfer operation.
358
+ *
359
+ * @param ep_address The endpoint address.
360
+ * @param callback The callback function to be called when the transfer is complete.
361
+ * @param data The data to be transferred.
362
+ * @param length The length of the data to be transferred.
363
+ *
364
+ * @throws None.
365
+ */
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_();
368
+ if (trq == nullptr) {
369
+ ESP_LOGE(TAG, "Too many requests queued");
370
+ return;
371
+ }
372
+ trq->callback = callback;
373
+ trq->transfer->callback = transfer_callback;
374
+ trq->transfer->bEndpointAddress = ep_address | USB_DIR_OUT;
375
+ trq->transfer->num_bytes = length;
376
+ memcpy(trq->transfer->data_buffer, data, length);
377
+ auto err = usb_host_transfer_submit(trq->transfer);
378
+ if (err != ESP_OK) {
379
+ ESP_LOGE(TAG, "Failed to submit transfer, address=%x, length=%d, err=%x", ep_address, length, err);
380
+ this->release_trq(trq);
381
+ }
382
+ }
383
+ void USBClient::dump_config() {
384
+ ESP_LOGCONFIG(TAG,
385
+ "USBClient\n"
386
+ " Vendor id %04X\n"
387
+ " Product id %04X",
388
+ this->vid_, this->pid_);
389
+ }
390
+ void USBClient::release_trq(TransferRequest *trq) { this->trq_pool_.push_back(trq); }
391
+
392
+ } // namespace usb_host
393
+ } // namespace esphome
394
+ #endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3