esphome 2025.5.2__py3-none-any.whl → 2025.6.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 (746) 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 +753 -379
  29. esphome/components/api/api_connection.h +341 -283
  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 +3 -0
  33. esphome/components/api/api_pb2.h +702 -227
  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 -4
  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 +5 -4
  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 +18 -16
  67. esphome/components/bluetooth_proxy/bluetooth_proxy.h +1 -1
  68. esphome/components/bme280_base/bme280_base.cpp +5 -6
  69. esphome/components/bme680/bme680.cpp +3 -3
  70. esphome/components/bme680/sensor.py +2 -2
  71. esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
  72. esphome/components/bme680_bsec/sensor.py +7 -3
  73. esphome/components/bme68x_bsec2/__init__.py +6 -5
  74. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
  75. esphome/components/bme68x_bsec2/sensor.py +4 -4
  76. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
  77. esphome/components/bmi160/bmi160.cpp +11 -11
  78. esphome/components/bmp085/bmp085.cpp +2 -2
  79. esphome/components/bmp280_base/bmp280_base.cpp +3 -3
  80. esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
  81. esphome/components/bmp581/bmp581.cpp +33 -27
  82. esphome/components/bp1658cj/bp1658cj.cpp +5 -3
  83. esphome/components/bp5758d/bp5758d.cpp +1 -1
  84. esphome/components/button/__init__.py +1 -0
  85. esphome/components/canbus/canbus.cpp +1 -1
  86. esphome/components/cap1188/cap1188.cpp +6 -4
  87. esphome/components/captive_portal/captive_portal.cpp +1 -1
  88. esphome/components/ccs811/ccs811.cpp +3 -2
  89. esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
  90. esphome/components/ch422g/ch422g.cpp +2 -2
  91. esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
  92. esphome/components/climate/__init__.py +1 -0
  93. esphome/components/climate/climate.cpp +12 -7
  94. esphome/components/climate/climate.h +1 -1
  95. esphome/components/climate_ir/climate_ir.cpp +7 -4
  96. esphome/components/cm1106/__init__.py +1 -0
  97. esphome/components/cm1106/cm1106.cpp +112 -0
  98. esphome/components/cm1106/cm1106.h +40 -0
  99. esphome/components/cm1106/sensor.py +72 -0
  100. esphome/components/const/__init__.py +1 -0
  101. esphome/components/cover/__init__.py +1 -0
  102. esphome/components/cs5460a/cs5460a.cpp +16 -11
  103. esphome/components/cse7761/cse7761.cpp +2 -2
  104. esphome/components/cse7766/cse7766.cpp +0 -5
  105. esphome/components/cse7766/cse7766.h +5 -1
  106. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
  107. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
  108. esphome/components/current_based/current_based_cover.cpp +4 -2
  109. esphome/components/dac7678/dac7678_output.cpp +4 -4
  110. esphome/components/dallas_temp/dallas_temp.cpp +2 -3
  111. esphome/components/daly_bms/daly_bms.cpp +2 -1
  112. esphome/components/dashboard_import/__init__.py +1 -2
  113. esphome/components/datetime/__init__.py +3 -1
  114. esphome/components/datetime/date_entity.cpp +5 -5
  115. esphome/components/datetime/datetime_base.h +0 -5
  116. esphome/components/datetime/datetime_entity.cpp +8 -8
  117. esphome/components/datetime/time_entity.cpp +4 -4
  118. esphome/components/debug/debug_component.cpp +1 -1
  119. esphome/components/debug/debug_component.h +1 -1
  120. esphome/components/debug/debug_esp32.cpp +4 -2
  121. esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
  122. esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
  123. esphome/components/demo/__init__.py +206 -0
  124. esphome/components/demo/demo_alarm_control_panel.h +65 -0
  125. esphome/components/demo/demo_button.h +15 -0
  126. esphome/components/demo/demo_date.h +34 -0
  127. esphome/components/demo/demo_datetime.h +40 -0
  128. esphome/components/demo/demo_lock.h +17 -0
  129. esphome/components/demo/demo_select.h +15 -0
  130. esphome/components/demo/demo_text.h +18 -0
  131. esphome/components/demo/demo_time.h +34 -0
  132. esphome/components/demo/demo_valve.h +54 -0
  133. esphome/components/dfrobot_sen0395/commands.cpp +3 -3
  134. esphome/components/dht/dht.cpp +29 -50
  135. esphome/components/dht12/dht12.cpp +2 -2
  136. esphome/components/display/display.h +5 -3
  137. esphome/components/dps310/dps310.cpp +7 -5
  138. esphome/components/ds1307/ds1307.cpp +2 -2
  139. esphome/components/dsmr/dsmr.cpp +5 -3
  140. esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
  141. esphome/components/duty_time/duty_time_sensor.cpp +5 -3
  142. esphome/components/ee895/ee895.cpp +3 -3
  143. esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
  144. esphome/components/emc2101/emc2101.cpp +11 -9
  145. esphome/components/ens160_base/ens160_base.cpp +2 -2
  146. esphome/components/ens210/ens210.cpp +2 -2
  147. esphome/components/es7210/es7210.cpp +6 -4
  148. esphome/components/es7243e/es7243e.cpp +1 -1
  149. esphome/components/es8156/es8156.cpp +1 -1
  150. esphome/components/es8311/es8311.cpp +8 -6
  151. esphome/components/es8388/__init__.py +0 -0
  152. esphome/components/es8388/audio_dac.py +26 -0
  153. esphome/components/es8388/es8388.cpp +289 -0
  154. esphome/components/es8388/es8388.h +81 -0
  155. esphome/components/es8388/es8388_const.h +83 -0
  156. esphome/components/es8388/select/__init__.py +47 -0
  157. esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
  158. esphome/components/es8388/select/adc_input_mic_select.h +15 -0
  159. esphome/components/es8388/select/dac_output_select.cpp +12 -0
  160. esphome/components/es8388/select/dac_output_select.h +15 -0
  161. esphome/components/esp32/__init__.py +118 -23
  162. esphome/components/esp32/boards.py +208 -125
  163. esphome/components/esp32/const.py +6 -0
  164. esphome/components/esp32/gpio.py +14 -1
  165. esphome/components/esp32/gpio_esp32_c5.py +45 -0
  166. esphome/components/esp32/gpio_esp32_p4.py +43 -0
  167. esphome/components/esp32/preferences.cpp +7 -7
  168. esphome/components/esp32_ble/__init__.py +115 -0
  169. esphome/components/esp32_ble/ble.cpp +101 -54
  170. esphome/components/esp32_ble/ble.h +24 -5
  171. esphome/components/esp32_ble/ble_event.h +172 -32
  172. esphome/components/esp32_ble/ble_scan_result.h +24 -0
  173. esphome/components/esp32_ble/ble_uuid.h +1 -1
  174. esphome/components/esp32_ble/queue.h +53 -27
  175. esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
  176. esphome/components/esp32_ble_server/__init__.py +4 -1
  177. esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
  178. esphome/components/esp32_ble_server/ble_server.h +0 -1
  179. esphome/components/esp32_ble_tracker/__init__.py +7 -2
  180. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +107 -75
  181. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +16 -16
  182. esphome/components/esp32_camera/esp32_camera.cpp +35 -27
  183. esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
  184. esphome/components/esp32_dac/esp32_dac.cpp +2 -2
  185. esphome/components/esp32_improv/__init__.py +5 -1
  186. esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
  187. esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
  188. esphome/components/esp32_rmt_led_strip/light.py +5 -1
  189. esphome/components/esp32_touch/esp32_touch.cpp +12 -8
  190. esphome/components/esp8266/preferences.cpp +6 -6
  191. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  192. esphome/components/esp_ldo/__init__.py +91 -0
  193. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  194. esphome/components/esp_ldo/esp_ldo.h +43 -0
  195. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  196. esphome/components/ethernet/ethernet_component.cpp +38 -26
  197. esphome/components/ethernet/ethernet_component.h +1 -1
  198. esphome/components/event/__init__.py +1 -0
  199. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  200. esphome/components/ezo/ezo.cpp +1 -1
  201. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  202. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  203. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  204. esphome/components/fan/__init__.py +1 -0
  205. esphome/components/fan/fan.cpp +30 -19
  206. esphome/components/fastled_base/fastled_light.cpp +7 -5
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  208. esphome/components/fs3000/fs3000.cpp +1 -1
  209. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  210. esphome/components/ft63x6/ft63x6.cpp +5 -3
  211. esphome/components/gcja5/gcja5.cpp +0 -12
  212. esphome/components/gcja5/gcja5.h +8 -3
  213. esphome/components/gdk101/gdk101.cpp +2 -2
  214. esphome/components/globals/globals_component.h +13 -10
  215. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  216. esphome/components/gp8403/gp8403.cpp +4 -2
  217. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  218. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  219. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  220. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  221. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  222. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  223. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  224. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  225. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  227. esphome/components/haier/haier_base.cpp +2 -2
  228. esphome/components/haier/hon_climate.cpp +13 -6
  229. esphome/components/havells_solar/havells_solar.cpp +5 -2
  230. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  231. esphome/components/hdc1080/hdc1080.cpp +2 -2
  232. esphome/components/he60r/he60r.cpp +4 -2
  233. esphome/components/hlw8012/hlw8012.cpp +6 -4
  234. esphome/components/hm3301/hm3301.cpp +2 -2
  235. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  236. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  237. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  238. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  239. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  240. esphome/components/hte501/hte501.cpp +3 -2
  241. esphome/components/http_request/__init__.py +2 -2
  242. esphome/components/http_request/http_request.cpp +7 -5
  243. esphome/components/http_request/http_request_idf.cpp +4 -2
  244. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  245. esphome/components/htu21d/htu21d.cpp +2 -2
  246. esphome/components/htu31d/htu31d.cpp +2 -2
  247. esphome/components/hx711/hx711.cpp +2 -2
  248. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  249. esphome/components/hyt271/hyt271.cpp +2 -2
  250. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  251. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  252. esphome/components/i2s_audio/__init__.py +2 -0
  253. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  254. esphome/components/i2s_audio/i2s_audio.h +1 -1
  255. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  256. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  257. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +13 -10
  258. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
  259. esphome/components/iaqcore/iaqcore.cpp +3 -3
  260. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  261. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  262. esphome/components/image/image.cpp +1 -0
  263. esphome/components/ina219/ina219.cpp +2 -2
  264. esphome/components/ina226/ina226.cpp +8 -5
  265. esphome/components/ina260/ina260.cpp +1 -1
  266. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  267. esphome/components/ina3221/ina3221.cpp +2 -2
  268. esphome/components/inkplate6/display.py +12 -2
  269. esphome/components/inkplate6/inkplate.cpp +13 -9
  270. esphome/components/inkplate6/inkplate.h +7 -6
  271. esphome/components/integration/integration_sensor.cpp +1 -1
  272. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  273. esphome/components/json/json_util.cpp +4 -5
  274. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  275. esphome/components/key_collector/key_collector.cpp +4 -2
  276. esphome/components/kmeteriso/kmeteriso.cpp +4 -4
  277. esphome/components/kuntze/kuntze.cpp +4 -2
  278. esphome/components/lc709203f/__init__.py +1 -0
  279. esphome/components/lc709203f/lc709203f.cpp +299 -0
  280. esphome/components/lc709203f/lc709203f.h +55 -0
  281. esphome/components/lc709203f/sensor.py +93 -0
  282. esphome/components/lcd_base/lcd_display.cpp +2 -2
  283. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  284. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  285. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  286. esphome/components/ld2410/ld2410.cpp +6 -7
  287. esphome/components/ld2420/ld2420.cpp +9 -7
  288. esphome/components/ld2450/ld2450.cpp +6 -4
  289. esphome/components/ld2450/sensor.py +2 -2
  290. esphome/components/ledc/ledc_output.cpp +32 -28
  291. esphome/components/libretiny/const.py +1 -1
  292. esphome/components/libretiny/preferences.cpp +6 -7
  293. esphome/components/light/__init__.py +2 -1
  294. esphome/components/light/esp_hsv_color.h +1 -1
  295. esphome/components/light/light_state.cpp +9 -5
  296. esphome/components/light/light_transformer.h +1 -1
  297. esphome/components/lightwaverf/LwTx.cpp +1 -1
  298. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  299. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  300. esphome/components/lock/__init__.py +1 -0
  301. esphome/components/lock/lock.h +1 -1
  302. esphome/components/logger/__init__.py +6 -0
  303. esphome/components/logger/logger.cpp +11 -20
  304. esphome/components/logger/logger.h +1 -2
  305. esphome/components/logger/logger_esp32.cpp +5 -5
  306. esphome/components/ltr390/ltr390.cpp +8 -5
  307. esphome/components/ltr501/ltr501.cpp +19 -14
  308. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  309. esphome/components/lvgl/__init__.py +2 -2
  310. esphome/components/lvgl/automation.py +5 -4
  311. esphome/components/lvgl/defines.py +0 -2
  312. esphome/components/lvgl/lv_validation.py +1 -3
  313. esphome/components/lvgl/lvcode.py +7 -8
  314. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  315. esphome/components/lvgl/schemas.py +22 -23
  316. esphome/components/lvgl/trigger.py +8 -3
  317. esphome/components/lvgl/widgets/__init__.py +2 -2
  318. esphome/components/lvgl/widgets/canvas.py +9 -3
  319. esphome/components/lvgl/widgets/line.py +2 -1
  320. esphome/components/lvgl/widgets/tabview.py +7 -0
  321. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  322. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  323. esphome/components/max17043/max17043.cpp +2 -2
  324. esphome/components/max31855/max31855.cpp +2 -1
  325. esphome/components/max31856/max31856.cpp +9 -11
  326. esphome/components/max31865/max31865.cpp +6 -4
  327. esphome/components/max44009/max44009.cpp +2 -2
  328. esphome/components/max6675/max6675.cpp +1 -1
  329. esphome/components/max6956/max6956.cpp +5 -3
  330. esphome/components/max7219/max7219.cpp +8 -6
  331. esphome/components/max7219digit/automation.h +52 -0
  332. esphome/components/max7219digit/display.py +93 -1
  333. esphome/components/max7219digit/max7219digit.cpp +16 -13
  334. esphome/components/max9611/max9611.cpp +9 -6
  335. esphome/components/mcp23008/mcp23008.cpp +1 -1
  336. esphome/components/mcp23016/mcp23016.cpp +1 -1
  337. esphome/components/mcp23017/mcp23017.cpp +1 -1
  338. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  339. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  340. esphome/components/mcp3008/mcp3008.cpp +1 -1
  341. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  342. esphome/components/mcp3204/mcp3204.cpp +1 -1
  343. esphome/components/mcp4461/mcp4461.cpp +2 -2
  344. esphome/components/mcp4725/mcp4725.cpp +2 -2
  345. esphome/components/mcp4728/mcp4728.cpp +2 -2
  346. esphome/components/mcp9600/mcp9600.cpp +1 -1
  347. esphome/components/mcp9808/mcp9808.cpp +4 -4
  348. esphome/components/mdns/mdns_component.cpp +8 -2
  349. esphome/components/mdns/mdns_component.h +3 -1
  350. esphome/components/mdns/mdns_esp32.cpp +2 -2
  351. esphome/components/media_player/__init__.py +1 -0
  352. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  353. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  354. esphome/components/micronova/micronova.h +2 -2
  355. esphome/components/mics_4514/mics_4514.cpp +2 -2
  356. esphome/components/midea/air_conditioner.cpp +7 -5
  357. esphome/components/midea_ir/midea_ir.cpp +1 -1
  358. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  359. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  360. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  361. esphome/components/mlx90614/mlx90614.cpp +4 -3
  362. esphome/components/mmc5603/mmc5603.cpp +2 -2
  363. esphome/components/mmc5983/mmc5983.cpp +1 -1
  364. esphome/components/modbus/modbus.cpp +7 -5
  365. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  366. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  367. esphome/components/modbus_controller/switch/__init__.py +6 -2
  368. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  369. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  370. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  371. esphome/components/mpr121/mpr121.cpp +2 -2
  372. esphome/components/mpu6050/mpu6050.cpp +6 -6
  373. esphome/components/mpu6886/mpu6886.cpp +6 -6
  374. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  375. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  376. esphome/components/mqtt/mqtt_client.cpp +31 -24
  377. esphome/components/mqtt/mqtt_component.cpp +3 -3
  378. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  379. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  380. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  381. esphome/components/ms5611/ms5611.cpp +2 -2
  382. esphome/components/ms8607/ms8607.cpp +2 -2
  383. esphome/components/msa3xx/msa3xx.cpp +16 -12
  384. esphome/components/my9231/my9231.cpp +7 -5
  385. esphome/components/nau7802/nau7802.cpp +6 -4
  386. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  387. esphome/components/network/ip_address.h +1 -1
  388. esphome/components/network/util.cpp +13 -0
  389. esphome/components/nextion/base_component.py +2 -0
  390. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +3 -4
  391. esphome/components/nextion/display.py +34 -22
  392. esphome/components/nextion/nextion.cpp +182 -143
  393. esphome/components/nextion/nextion.h +36 -0
  394. esphome/components/nextion/nextion_commands.cpp +3 -3
  395. esphome/components/nextion/nextion_upload_arduino.cpp +69 -69
  396. esphome/components/nextion/nextion_upload_idf.cpp +79 -80
  397. esphome/components/nextion/sensor/nextion_sensor.cpp +5 -5
  398. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  399. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +3 -3
  400. esphome/components/nfc/nci_message.h +1 -1
  401. esphome/components/nfc/ndef_record.h +1 -1
  402. esphome/components/nfc/ndef_record_text.h +1 -1
  403. esphome/components/nfc/ndef_record_uri.h +1 -1
  404. esphome/components/nfc/nfc.h +1 -1
  405. esphome/components/nfc/nfc_tag.h +1 -1
  406. esphome/components/noblex/noblex.cpp +1 -1
  407. esphome/components/npi19/npi19.cpp +5 -7
  408. esphome/components/number/__init__.py +11 -0
  409. esphome/components/number/number.cpp +1 -1
  410. esphome/components/number/number.h +0 -4
  411. esphome/components/online_image/__init__.py +13 -1
  412. esphome/components/online_image/online_image.cpp +26 -4
  413. esphome/components/online_image/online_image.h +21 -4
  414. esphome/components/opentherm/generate.py +3 -3
  415. esphome/components/opentherm/hub.cpp +11 -7
  416. esphome/components/opentherm/number/number.cpp +5 -3
  417. esphome/components/opentherm/opentherm.h +1 -1
  418. esphome/components/opentherm/schema.py +13 -13
  419. esphome/components/opentherm/validate.py +1 -1
  420. esphome/components/openthread/__init__.py +146 -0
  421. esphome/components/openthread/const.py +10 -0
  422. esphome/components/openthread/openthread.cpp +206 -0
  423. esphome/components/openthread/openthread.h +68 -0
  424. esphome/components/openthread/openthread_esp.cpp +164 -0
  425. esphome/components/openthread/tlv.py +58 -0
  426. esphome/components/openthread_info/__init__.py +0 -0
  427. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  428. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  429. esphome/components/openthread_info/text_sensor.py +105 -0
  430. esphome/components/output/float_output.cpp +1 -1
  431. esphome/components/output/switch/output_switch.cpp +1 -1
  432. esphome/components/packet_transport/packet_transport.cpp +6 -4
  433. esphome/components/pca6416a/pca6416a.cpp +2 -2
  434. esphome/components/pca9554/pca9554.cpp +6 -4
  435. esphome/components/pca9685/pca9685_output.cpp +12 -8
  436. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  437. esphome/components/pcf85063/pcf85063.cpp +2 -2
  438. esphome/components/pcf8563/pcf8563.cpp +2 -2
  439. esphome/components/pcf8574/pcf8574.cpp +2 -2
  440. esphome/components/pid/pid_climate.cpp +8 -5
  441. esphome/components/pid/pid_climate.h +1 -1
  442. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  443. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  444. esphome/components/pipsolar/pipsolar.cpp +3 -3
  445. esphome/components/pm1006/pm1006.cpp +3 -7
  446. esphome/components/pm1006/pm1006.h +4 -1
  447. esphome/components/pm2005/pm2005.cpp +12 -13
  448. esphome/components/pm2005/sensor.py +1 -1
  449. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  450. esphome/components/pmsx003/pmsx003.cpp +0 -4
  451. esphome/components/pmsx003/pmsx003.h +5 -2
  452. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  453. esphome/components/pmwcs3/pmwcs3.h +0 -1
  454. esphome/components/pn532/pn532.cpp +7 -7
  455. esphome/components/pn532/pn532.h +1 -1
  456. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  457. esphome/components/pn7150/pn7150.cpp +4 -4
  458. esphome/components/pn7160/pn7160.cpp +4 -4
  459. esphome/components/power_supply/power_supply.cpp +6 -4
  460. esphome/components/power_supply/power_supply.h +1 -1
  461. esphome/components/prometheus/__init__.py +0 -1
  462. esphome/components/psram/__init__.py +59 -35
  463. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  464. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  465. esphome/components/pylontech/pylontech.cpp +2 -2
  466. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  467. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  468. esphome/components/pzemac/pzemac.cpp +4 -2
  469. esphome/components/pzemdc/pzemdc.cpp +4 -2
  470. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  471. esphome/components/qmp6988/qmp6988.cpp +2 -2
  472. esphome/components/qmp6988/qmp6988.h +1 -1
  473. esphome/components/qr_code/qr_code.cpp +5 -3
  474. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  475. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  476. esphome/components/rc522/rc522.cpp +5 -5
  477. esphome/components/rdm6300/rdm6300.cpp +1 -0
  478. esphome/components/remote_receiver/__init__.py +10 -2
  479. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  480. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  481. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  482. esphome/components/remote_transmitter/__init__.py +10 -2
  483. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  484. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  485. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  486. esphome/components/resistance/resistance_sensor.cpp +6 -3
  487. esphome/components/restart/button/restart_button.cpp +1 -1
  488. esphome/components/restart/switch/restart_switch.cpp +1 -1
  489. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  490. esphome/components/rp2040/__init__.py +7 -0
  491. esphome/components/rp2040/core.cpp +8 -1
  492. esphome/components/rp2040/preferences.cpp +3 -3
  493. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  494. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  495. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  496. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  497. esphome/components/rtttl/rtttl.cpp +11 -9
  498. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  499. esphome/components/safe_mode/safe_mode.cpp +9 -8
  500. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  501. esphome/components/scd30/scd30.cpp +11 -8
  502. esphome/components/scd4x/scd4x.cpp +12 -8
  503. esphome/components/sdl/display.py +40 -0
  504. esphome/components/sdl/sdl_esphome.cpp +2 -2
  505. esphome/components/sdl/sdl_esphome.h +8 -0
  506. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  507. esphome/components/sdp3x/sdp3x.cpp +11 -11
  508. esphome/components/sds011/sds011.cpp +5 -6
  509. esphome/components/sds011/sds011.h +4 -1
  510. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  511. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  512. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  513. esphome/components/selec_meter/selec_meter.cpp +5 -2
  514. esphome/components/select/__init__.py +1 -0
  515. esphome/components/select/select.cpp +1 -1
  516. esphome/components/select/select.h +0 -4
  517. esphome/components/sen0321/sen0321.cpp +2 -2
  518. esphome/components/sen21231/sen21231.cpp +1 -1
  519. esphome/components/sen5x/sen5x.cpp +10 -7
  520. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  521. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  522. esphome/components/sensor/__init__.py +11 -1
  523. esphome/components/sensor/filter.h +1 -1
  524. esphome/components/sensor/sensor.cpp +8 -4
  525. esphome/components/sensor/sensor.h +12 -11
  526. esphome/components/servo/servo.cpp +12 -9
  527. esphome/components/servo/servo.h +1 -1
  528. esphome/components/sfa30/sfa30.cpp +1 -1
  529. esphome/components/sgp30/sgp30.cpp +10 -8
  530. esphome/components/sgp4x/sgp4x.cpp +49 -61
  531. esphome/components/sgp4x/sgp4x.h +0 -1
  532. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  533. esphome/components/sht3xd/sht3xd.cpp +1 -1
  534. esphome/components/sht4x/sht4x.cpp +2 -2
  535. esphome/components/shtcx/shtcx.cpp +13 -16
  536. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  537. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  538. esphome/components/sim800l/sim800l.cpp +2 -2
  539. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  540. esphome/components/sm16716/sm16716.cpp +1 -1
  541. esphome/components/sm2135/sm2135.cpp +1 -1
  542. esphome/components/sm2235/sm2235.cpp +5 -3
  543. esphome/components/sm2335/sm2335.cpp +5 -3
  544. esphome/components/sml/sml.cpp +1 -1
  545. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  546. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  547. esphome/components/sntp/sntp_component.cpp +1 -1
  548. esphome/components/socket/__init__.py +2 -0
  549. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  550. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  551. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  552. esphome/components/socket/socket.cpp +31 -0
  553. esphome/components/socket/socket.h +27 -1
  554. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  555. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  556. esphome/components/sound_level/sound_level.cpp +4 -2
  557. esphome/components/speaker/media_player/__init__.py +3 -0
  558. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  559. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  560. esphome/components/spi/__init__.py +10 -2
  561. esphome/components/spi/spi.cpp +4 -4
  562. esphome/components/spi_device/spi_device.cpp +1 -2
  563. esphome/components/sprinkler/sprinkler.cpp +9 -6
  564. esphome/components/sps30/sps30.cpp +16 -15
  565. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  566. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  567. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  568. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  569. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  570. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  571. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  572. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  573. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  574. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  575. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  576. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  577. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  578. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  579. esphome/components/st7567_base/st7567_base.cpp +3 -3
  580. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  581. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  582. esphome/components/st7701s/st7701s.cpp +4 -2
  583. esphome/components/st7735/st7735.cpp +3 -3
  584. esphome/components/st7789v/st7789v.cpp +10 -7
  585. esphome/components/st7920/st7920.cpp +6 -4
  586. esphome/components/statsd/statsd.cpp +9 -5
  587. esphome/components/status_led/light/status_led_light.cpp +3 -3
  588. esphome/components/status_led/light/status_led_light.h +1 -1
  589. esphome/components/status_led/status_led.cpp +1 -1
  590. esphome/components/stepper/stepper.h +5 -3
  591. esphome/components/sts3x/sts3x.cpp +2 -2
  592. esphome/components/switch/__init__.py +1 -0
  593. esphome/components/switch/switch.cpp +18 -12
  594. esphome/components/switch/switch.h +1 -1
  595. esphome/components/sx1509/__init__.py +53 -20
  596. esphome/components/sx1509/sx1509.cpp +29 -5
  597. esphome/components/sx1509/sx1509.h +9 -1
  598. esphome/components/t6615/t6615.cpp +1 -0
  599. esphome/components/tc74/tc74.cpp +1 -1
  600. esphome/components/tca9548a/tca9548a.cpp +1 -1
  601. esphome/components/tca9555/tca9555.cpp +2 -2
  602. esphome/components/tcs34725/tcs34725.cpp +4 -4
  603. esphome/components/tee501/tee501.cpp +3 -2
  604. esphome/components/tem3200/tem3200.cpp +5 -6
  605. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  606. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +43 -12
  607. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +4 -1
  608. esphome/components/template/cover/template_cover.cpp +1 -1
  609. esphome/components/template/select/template_select.cpp +6 -4
  610. esphome/components/template/text/template_text.cpp +2 -3
  611. esphome/components/template/valve/template_valve.cpp +5 -3
  612. esphome/components/text/__init__.py +10 -11
  613. esphome/components/text/text.cpp +1 -1
  614. esphome/components/text/text.h +0 -4
  615. esphome/components/text_sensor/__init__.py +1 -0
  616. esphome/components/text_sensor/text_sensor.cpp +8 -4
  617. esphome/components/text_sensor/text_sensor.h +6 -6
  618. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  619. esphome/components/time/__init__.py +1 -2
  620. esphome/components/time_based/time_based_cover.cpp +4 -2
  621. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  622. esphome/components/tm1621/tm1621.cpp +3 -3
  623. esphome/components/tm1637/tm1637.cpp +9 -7
  624. esphome/components/tm1638/tm1638.cpp +7 -5
  625. esphome/components/tm1651/tm1651.cpp +2 -2
  626. esphome/components/tmp102/tmp102.cpp +1 -3
  627. esphome/components/tmp102/tmp102.h +0 -3
  628. esphome/components/tmp1075/tmp1075.cpp +12 -9
  629. esphome/components/tmp117/tmp117.cpp +2 -2
  630. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  631. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  632. esphome/components/tsl2561/tsl2561.cpp +7 -5
  633. esphome/components/tsl2591/tsl2591.cpp +25 -27
  634. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  635. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  636. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  637. esphome/components/tuya/select/tuya_select.cpp +5 -3
  638. esphome/components/tx20/tx20.cpp +3 -3
  639. esphome/components/uart/__init__.py +4 -5
  640. esphome/components/uart/button/uart_button.cpp +1 -1
  641. esphome/components/uart/switch/uart_switch.cpp +2 -2
  642. esphome/components/uart/uart.cpp +2 -2
  643. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  644. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  645. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  646. esphome/components/uart/uart_component_host.cpp +11 -8
  647. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  648. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  649. esphome/components/udp/udp_component.cpp +9 -5
  650. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  651. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  652. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  653. esphome/components/update/__init__.py +1 -0
  654. esphome/components/update/update_entity.cpp +1 -1
  655. esphome/components/update/update_entity.h +0 -3
  656. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  657. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  658. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  659. esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp +1 -1
  660. esphome/components/usb_host/__init__.py +64 -0
  661. esphome/components/usb_host/usb_host.h +116 -0
  662. esphome/components/usb_host/usb_host_client.cpp +394 -0
  663. esphome/components/usb_host/usb_host_component.cpp +35 -0
  664. esphome/components/usb_uart/__init__.py +134 -0
  665. esphome/components/usb_uart/ch34x.cpp +80 -0
  666. esphome/components/usb_uart/cp210x.cpp +126 -0
  667. esphome/components/usb_uart/usb_uart.cpp +328 -0
  668. esphome/components/usb_uart/usb_uart.h +151 -0
  669. esphome/components/valve/__init__.py +1 -0
  670. esphome/components/veml3235/veml3235.cpp +13 -9
  671. esphome/components/veml7700/veml7700.cpp +10 -6
  672. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  673. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  674. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  675. esphome/components/web_server/server_index_v2.h +632 -630
  676. esphome/components/web_server/server_index_v3.h +411 -409
  677. esphome/components/web_server/web_server.cpp +5 -3
  678. esphome/components/web_server_base/web_server_base.cpp +1 -1
  679. esphome/components/web_server_idf/__init__.py +0 -2
  680. esphome/components/web_server_idf/utils.cpp +1 -1
  681. esphome/components/web_server_idf/web_server_idf.cpp +7 -3
  682. esphome/components/web_server_idf/web_server_idf.h +7 -0
  683. esphome/components/weikai/__init__.py +2 -0
  684. esphome/components/weikai/weikai.cpp +24 -22
  685. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  686. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  687. esphome/components/wiegand/wiegand.cpp +1 -1
  688. esphome/components/wifi/wifi_component.cpp +50 -37
  689. esphome/components/wifi/wifi_component.h +7 -4
  690. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  691. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  692. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  693. esphome/components/wireguard/wireguard.cpp +21 -21
  694. esphome/components/wl_134/text_sensor.py +1 -2
  695. esphome/components/wled/wled_light_effect.cpp +1 -1
  696. esphome/components/x9c/x9c.cpp +5 -3
  697. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  698. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  699. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  700. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  701. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  702. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  703. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  704. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  705. esphome/components/xl9535/xl9535.cpp +2 -2
  706. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  707. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  708. esphome/config.py +3 -2
  709. esphome/config_validation.py +46 -17
  710. esphome/const.py +10 -1
  711. esphome/core/__init__.py +37 -18
  712. esphome/core/application.cpp +197 -8
  713. esphome/core/application.h +116 -6
  714. esphome/core/component.cpp +36 -15
  715. esphome/core/component.h +43 -13
  716. esphome/core/config.py +12 -0
  717. esphome/core/defines.h +10 -2
  718. esphome/core/entity_base.cpp +4 -16
  719. esphome/core/entity_base.h +27 -13
  720. esphome/core/helpers.cpp +1 -1
  721. esphome/core/helpers.h +5 -5
  722. esphome/core/log.h +2 -0
  723. esphome/core/log_const_en.h +4 -0
  724. esphome/core/scheduler.cpp +2 -2
  725. esphome/coroutine.py +3 -4
  726. esphome/cpp_generator.py +32 -32
  727. esphome/dashboard/core.py +2 -2
  728. esphome/dashboard/web_server.py +2 -2
  729. esphome/git.py +4 -4
  730. esphome/helpers.py +5 -6
  731. esphome/loader.py +8 -7
  732. esphome/log.py +7 -1
  733. esphome/platformio_api.py +2 -3
  734. esphome/storage_json.py +13 -5
  735. esphome/types.py +12 -13
  736. esphome/util.py +1 -2
  737. esphome/wizard.py +0 -16
  738. esphome/writer.py +5 -3
  739. esphome/yaml_util.py +6 -1
  740. esphome/zeroconf.py +1 -1
  741. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/METADATA +12 -11
  742. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/RECORD +746 -692
  743. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/WHEEL +1 -1
  744. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/entry_points.txt +0 -0
  745. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/licenses/LICENSE +0 -0
  746. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/top_level.txt +0 -0
@@ -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
@@ -0,0 +1,35 @@
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 <cinttypes>
5
+ #include "esphome/core/log.h"
6
+
7
+ namespace esphome {
8
+ namespace usb_host {
9
+
10
+ void USBHost::setup() {
11
+ ESP_LOGCONFIG(TAG, "Setup starts");
12
+ usb_host_config_t config{};
13
+
14
+ if (usb_host_install(&config) != ESP_OK) {
15
+ this->status_set_error("usb_host_install failed");
16
+ this->mark_failed();
17
+ return;
18
+ }
19
+ }
20
+ void USBHost::loop() {
21
+ int err;
22
+ uint32_t event_flags;
23
+ err = usb_host_lib_handle_events(0, &event_flags);
24
+ if (err != ESP_OK && err != ESP_ERR_TIMEOUT) {
25
+ ESP_LOGD(TAG, "lib_handle_events failed failed: %s", esp_err_to_name(err));
26
+ }
27
+ if (event_flags != 0) {
28
+ ESP_LOGD(TAG, "Event flags %" PRIu32 "X", event_flags);
29
+ }
30
+ }
31
+
32
+ } // namespace usb_host
33
+ } // namespace esphome
34
+
35
+ #endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
@@ -0,0 +1,134 @@
1
+ import esphome.codegen as cg
2
+ from esphome.components.uart import (
3
+ CONF_DATA_BITS,
4
+ CONF_PARITY,
5
+ CONF_STOP_BITS,
6
+ UARTComponent,
7
+ )
8
+ from esphome.components.usb_host import register_usb_client, usb_device_schema
9
+ import esphome.config_validation as cv
10
+ from esphome.const import (
11
+ CONF_BAUD_RATE,
12
+ CONF_BUFFER_SIZE,
13
+ CONF_CHANNELS,
14
+ CONF_DEBUG,
15
+ CONF_DUMMY_RECEIVER,
16
+ CONF_ID,
17
+ )
18
+ from esphome.cpp_types import Component
19
+
20
+ AUTO_LOAD = ["uart", "usb_host", "bytebuffer"]
21
+ CODEOWNERS = ["@clydebarrow"]
22
+
23
+ usb_uart_ns = cg.esphome_ns.namespace("usb_uart")
24
+ USBUartComponent = usb_uart_ns.class_("USBUartComponent", Component)
25
+ USBUartChannel = usb_uart_ns.class_("USBUartChannel", UARTComponent)
26
+
27
+
28
+ UARTParityOptions = usb_uart_ns.enum("UARTParityOptions")
29
+ UART_PARITY_OPTIONS = {
30
+ "NONE": UARTParityOptions.UART_CONFIG_PARITY_NONE,
31
+ "EVEN": UARTParityOptions.UART_CONFIG_PARITY_EVEN,
32
+ "ODD": UARTParityOptions.UART_CONFIG_PARITY_ODD,
33
+ "MARK": UARTParityOptions.UART_CONFIG_PARITY_MARK,
34
+ "SPACE": UARTParityOptions.UART_CONFIG_PARITY_SPACE,
35
+ }
36
+
37
+ UARTStopBitsOptions = usb_uart_ns.enum("UARTStopBitsOptions")
38
+ UART_STOP_BITS_OPTIONS = {
39
+ "1": UARTStopBitsOptions.UART_CONFIG_STOP_BITS_1,
40
+ "1.5": UARTStopBitsOptions.UART_CONFIG_STOP_BITS_1_5,
41
+ "2": UARTStopBitsOptions.UART_CONFIG_STOP_BITS_2,
42
+ }
43
+
44
+ DEFAULT_BAUD_RATE = 9600
45
+
46
+
47
+ class Type:
48
+ def __init__(self, name, vid, pid, cls, max_channels=1, baud_rate_required=True):
49
+ self.name = name
50
+ cls = cls or name
51
+ self.vid = vid
52
+ self.pid = pid
53
+ self.cls = usb_uart_ns.class_(f"USBUartType{cls}", USBUartComponent)
54
+ self.max_channels = max_channels
55
+ self.baud_rate_required = baud_rate_required
56
+
57
+
58
+ uart_types = (
59
+ Type("CH34X", 0x1A86, 0x55D5, "CH34X", 3),
60
+ Type("CH340", 0x1A86, 0x7523, "CH34X", 1),
61
+ Type("ESP_JTAG", 0x303A, 0x1001, "CdcAcm", 1, baud_rate_required=False),
62
+ Type("STM32_VCP", 0x0483, 0x5740, "CdcAcm", 1, baud_rate_required=False),
63
+ Type("CDC_ACM", 0, 0, "CdcAcm", 1, baud_rate_required=False),
64
+ Type("CP210X", 0x10C4, 0xEA60, "CP210X", 3),
65
+ )
66
+
67
+
68
+ def channel_schema(channels, baud_rate_required):
69
+ return cv.Schema(
70
+ {
71
+ cv.Required(CONF_CHANNELS): cv.All(
72
+ cv.ensure_list(
73
+ cv.Schema(
74
+ {
75
+ cv.GenerateID(): cv.declare_id(USBUartChannel),
76
+ cv.Optional(CONF_BUFFER_SIZE, default=256): cv.int_range(
77
+ min=64, max=8192
78
+ ),
79
+ (
80
+ cv.Required(CONF_BAUD_RATE)
81
+ if baud_rate_required
82
+ else cv.Optional(
83
+ CONF_BAUD_RATE, default=DEFAULT_BAUD_RATE
84
+ )
85
+ ): cv.int_range(min=300, max=1000000),
86
+ cv.Optional(CONF_STOP_BITS, default="1"): cv.enum(
87
+ UART_STOP_BITS_OPTIONS, upper=True
88
+ ),
89
+ cv.Optional(CONF_PARITY, default="NONE"): cv.enum(
90
+ UART_PARITY_OPTIONS, upper=True
91
+ ),
92
+ cv.Optional(CONF_DATA_BITS, default=8): cv.int_range(
93
+ min=5, max=8
94
+ ),
95
+ cv.Optional(CONF_DUMMY_RECEIVER, default=False): cv.boolean,
96
+ cv.Optional(CONF_DEBUG, default=False): cv.boolean,
97
+ }
98
+ )
99
+ ),
100
+ cv.Length(max=channels),
101
+ )
102
+ }
103
+ )
104
+
105
+
106
+ CONFIG_SCHEMA = cv.ensure_list(
107
+ cv.typed_schema(
108
+ {
109
+ it.name: usb_device_schema(it.cls, it.vid, it.pid).extend(
110
+ channel_schema(it.max_channels, it.baud_rate_required)
111
+ )
112
+ for it in uart_types
113
+ },
114
+ upper=True,
115
+ )
116
+ )
117
+
118
+
119
+ async def to_code(config):
120
+ for device in config:
121
+ var = await register_usb_client(device)
122
+ for index, channel in enumerate(device[CONF_CHANNELS]):
123
+ chvar = cg.new_Pvariable(channel[CONF_ID], index, channel[CONF_BUFFER_SIZE])
124
+ await cg.register_parented(chvar, var)
125
+ cg.add(chvar.set_rx_buffer_size(channel[CONF_BUFFER_SIZE]))
126
+ cg.add(chvar.set_stop_bits(channel[CONF_STOP_BITS]))
127
+ cg.add(chvar.set_data_bits(channel[CONF_DATA_BITS]))
128
+ cg.add(chvar.set_parity(channel[CONF_PARITY]))
129
+ cg.add(chvar.set_baud_rate(channel[CONF_BAUD_RATE]))
130
+ cg.add(chvar.set_dummy_receiver(channel[CONF_DUMMY_RECEIVER]))
131
+ cg.add(chvar.set_debug(channel[CONF_DEBUG]))
132
+ cg.add(var.add_channel(chvar))
133
+ if channel[CONF_DEBUG]:
134
+ cg.add_define("USE_UART_DEBUGGER")