esphome 2025.3.2__py3-none-any.whl → 2025.4.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 (700) hide show
  1. esphome/__main__.py +29 -7
  2. esphome/components/a01nyub/sensor.py +2 -2
  3. esphome/components/a02yyuw/sensor.py +2 -2
  4. esphome/components/a4988/stepper.py +1 -2
  5. esphome/components/absolute_humidity/sensor.py +3 -3
  6. esphome/components/ac_dimmer/output.py +3 -3
  7. esphome/components/adalight/__init__.py +2 -2
  8. esphome/components/adc128s102/__init__.py +1 -1
  9. esphome/components/adc128s102/sensor/__init__.py +3 -3
  10. esphome/components/addressable_light/display.py +5 -5
  11. esphome/components/ade7880/sensor.py +2 -2
  12. esphome/components/ade7953_base/__init__.py +10 -10
  13. esphome/components/ade7953_i2c/sensor.py +1 -2
  14. esphome/components/ade7953_spi/sensor.py +1 -2
  15. esphome/components/ads1115/__init__.py +1 -1
  16. esphome/components/ads1115/sensor/__init__.py +4 -3
  17. esphome/components/ads1118/__init__.py +1 -1
  18. esphome/components/ads1118/sensor/__init__.py +5 -4
  19. esphome/components/ags10/sensor.py +9 -9
  20. esphome/components/aht10/sensor.py +2 -2
  21. esphome/components/airthings_ble/__init__.py +1 -1
  22. esphome/components/airthings_wave_base/__init__.py +2 -3
  23. esphome/components/airthings_wave_mini/sensor.py +2 -5
  24. esphome/components/airthings_wave_plus/sensor.py +8 -9
  25. esphome/components/alpha3/sensor.py +5 -5
  26. esphome/components/am2315c/sensor.py +1 -1
  27. esphome/components/am2320/sensor.py +1 -1
  28. esphome/components/am43/cover/__init__.py +1 -1
  29. esphome/components/am43/sensor/__init__.py +3 -3
  30. esphome/components/analog_threshold/binary_sensor.py +2 -5
  31. esphome/components/anova/climate.py +1 -1
  32. esphome/components/apds9306/sensor.py +1 -1
  33. esphome/components/apds9960/__init__.py +1 -1
  34. esphome/components/apds9960/binary_sensor.py +2 -1
  35. esphome/components/apds9960/sensor.py +3 -2
  36. esphome/components/api/api_frame_helper.cpp +21 -1
  37. esphome/components/as3935/__init__.py +3 -3
  38. esphome/components/as3935/binary_sensor.py +2 -1
  39. esphome/components/as3935/sensor.py +4 -3
  40. esphome/components/as3935_i2c/__init__.py +1 -1
  41. esphome/components/as3935_spi/__init__.py +1 -1
  42. esphome/components/as5600/__init__.py +2 -2
  43. esphome/components/as5600/sensor/__init__.py +10 -9
  44. esphome/components/as7341/sensor.py +1 -2
  45. esphome/components/at581x/__init__.py +4 -8
  46. esphome/components/at581x/switch/__init__.py +2 -4
  47. esphome/components/atc_mithermometer/sensor.py +3 -3
  48. esphome/components/b_parasite/sensor.py +2 -2
  49. esphome/components/ballu/climate.py +1 -1
  50. esphome/components/bang_bang/climate.py +2 -2
  51. esphome/components/bedjet/__init__.py +2 -6
  52. esphome/components/bedjet/climate/__init__.py +3 -6
  53. esphome/components/bedjet/fan/__init__.py +4 -9
  54. esphome/components/bedjet/sensor/__init__.py +3 -6
  55. esphome/components/beken_spi_led_strip/light.py +2 -2
  56. esphome/components/bh1750/sensor.py +2 -6
  57. esphome/components/binary/fan/__init__.py +2 -1
  58. esphome/components/binary/light/__init__.py +3 -2
  59. esphome/components/binary_sensor_map/sensor.py +5 -6
  60. esphome/components/bl0939/sensor.py +1 -1
  61. esphome/components/bl0940/sensor.py +3 -3
  62. esphome/components/ble_client/__init__.py +3 -2
  63. esphome/components/ble_client/sensor/__init__.py +1 -1
  64. esphome/components/ble_client/text_sensor/__init__.py +1 -1
  65. esphome/components/bluetooth_proxy/__init__.py +35 -23
  66. esphome/components/bme280_base/__init__.py +1 -1
  67. esphome/components/bme280_i2c/sensor.py +3 -2
  68. esphome/components/bme280_spi/sensor.py +3 -2
  69. esphome/components/bme680/sensor.py +4 -4
  70. esphome/components/bme680_bsec/__init__.py +1 -1
  71. esphome/components/bme680_bsec/sensor.py +3 -6
  72. esphome/components/bme680_bsec/text_sensor.py +3 -2
  73. esphome/components/bmi160/sensor.py +6 -6
  74. esphome/components/bmp085/sensor.py +1 -1
  75. esphome/components/bmp280_base/__init__.py +1 -1
  76. esphome/components/bmp280_i2c/sensor.py +3 -2
  77. esphome/components/bmp280_spi/sensor.py +3 -2
  78. esphome/components/bmp3xx_base/__init__.py +1 -1
  79. esphome/components/bmp3xx_i2c/sensor.py +2 -1
  80. esphome/components/bmp3xx_spi/sensor.py +2 -1
  81. esphome/components/bmp581/sensor.py +2 -1
  82. esphome/components/bp1658cj/__init__.py +2 -6
  83. esphome/components/bp1658cj/output.py +2 -1
  84. esphome/components/bp5758d/__init__.py +2 -6
  85. esphome/components/bp5758d/output.py +3 -2
  86. esphome/components/canbus/__init__.py +13 -2
  87. esphome/components/canbus/canbus.cpp +7 -1
  88. esphome/components/cap1188/__init__.py +2 -2
  89. esphome/components/cap1188/binary_sensor.py +3 -2
  90. esphome/components/captive_portal/__init__.py +3 -3
  91. esphome/components/ccs811/sensor.py +10 -10
  92. esphome/components/cd74hc4067/__init__.py +2 -5
  93. esphome/components/cd74hc4067/sensor.py +6 -5
  94. esphome/components/climate_ir/__init__.py +2 -2
  95. esphome/components/climate_ir_lg/climate.py +1 -1
  96. esphome/components/color/__init__.py +1 -2
  97. esphome/components/color_temperature/light.py +2 -2
  98. esphome/components/combination/sensor.py +1 -1
  99. esphome/components/coolix/climate.py +1 -1
  100. esphome/components/copy/binary_sensor/__init__.py +1 -1
  101. esphome/components/copy/button/__init__.py +1 -1
  102. esphome/components/copy/cover/__init__.py +1 -1
  103. esphome/components/copy/fan/__init__.py +2 -7
  104. esphome/components/copy/lock/__init__.py +2 -7
  105. esphome/components/copy/number/__init__.py +1 -1
  106. esphome/components/copy/select/__init__.py +2 -7
  107. esphome/components/copy/sensor/__init__.py +2 -2
  108. esphome/components/copy/switch/__init__.py +1 -1
  109. esphome/components/copy/text/__init__.py +2 -7
  110. esphome/components/copy/text_sensor/__init__.py +2 -6
  111. esphome/components/cs5460a/sensor.py +7 -7
  112. esphome/components/cse7761/sensor.py +2 -2
  113. esphome/components/cse7766/sensor.py +1 -1
  114. esphome/components/cst226/touchscreen/__init__.py +3 -4
  115. esphome/components/ct_clamp/sensor.py +1 -1
  116. esphome/components/current_based/cover.py +3 -4
  117. esphome/components/cwww/light.py +3 -3
  118. esphome/components/dac7678/__init__.py +1 -1
  119. esphome/components/dac7678/output.py +2 -1
  120. esphome/components/daikin/climate.py +1 -1
  121. esphome/components/daikin_arc/climate.py +1 -1
  122. esphome/components/daikin_brc/climate.py +1 -1
  123. esphome/components/dallas_temp/sensor.py +1 -1
  124. esphome/components/daly_bms/__init__.py +2 -2
  125. esphome/components/daly_bms/binary_sensor.py +3 -2
  126. esphome/components/daly_bms/sensor.py +14 -13
  127. esphome/components/daly_bms/text_sensor.py +3 -2
  128. esphome/components/dashboard_import/__init__.py +5 -5
  129. esphome/components/debug/sensor.py +7 -6
  130. esphome/components/debug/text_sensor.py +1 -1
  131. esphome/components/deep_sleep/__init__.py +12 -13
  132. esphome/components/delonghi/climate.py +1 -1
  133. esphome/components/demo/__init__.py +1 -1
  134. esphome/components/dfplayer/__init__.py +3 -3
  135. esphome/components/dfrobot_sen0395/__init__.py +3 -3
  136. esphome/components/dfrobot_sen0395/binary_sensor.py +2 -1
  137. esphome/components/dfrobot_sen0395/switch/__init__.py +2 -3
  138. esphome/components/dht/sensor.py +4 -5
  139. esphome/components/dht12/sensor.py +3 -3
  140. esphome/components/display/display.cpp +2 -2
  141. esphome/components/dps310/sensor.py +3 -3
  142. esphome/components/ds1307/time.py +2 -3
  143. esphome/components/dsmr/__init__.py +3 -7
  144. esphome/components/dsmr/sensor.py +5 -4
  145. esphome/components/dsmr/text_sensor.py +3 -2
  146. esphome/components/duty_cycle/sensor.py +3 -8
  147. esphome/components/duty_time/sensor.py +7 -7
  148. esphome/components/e131/__init__.py +3 -3
  149. esphome/components/ee895/sensor.py +5 -5
  150. esphome/components/ektf2232/touchscreen/__init__.py +2 -3
  151. esphome/components/emc2101/__init__.py +1 -1
  152. esphome/components/emc2101/output/__init__.py +3 -2
  153. esphome/components/emc2101/sensor/__init__.py +4 -3
  154. esphome/components/emmeti/climate.py +1 -1
  155. esphome/components/endstop/cover.py +3 -3
  156. esphome/components/ens160_base/__init__.py +1 -1
  157. esphome/components/ens160_i2c/sensor.py +2 -1
  158. esphome/components/ens160_spi/sensor.py +2 -1
  159. esphome/components/ens210/sensor.py +1 -1
  160. esphome/components/esp32/__init__.py +10 -0
  161. esphome/components/esp32_ble_tracker/__init__.py +135 -51
  162. esphome/components/esp32_camera/__init__.py +7 -8
  163. esphome/components/esp32_camera_web_server/__init__.py +2 -2
  164. esphome/components/esp32_can/canbus.py +21 -0
  165. esphome/components/esp32_can/esp32_can.cpp +1 -1
  166. esphome/components/esp32_can/esp32_can.h +4 -0
  167. esphome/components/esp32_dac/output.py +2 -2
  168. esphome/components/esp32_hall/sensor.py +2 -6
  169. esphome/components/esp32_touch/__init__.py +7 -7
  170. esphome/components/esp32_touch/binary_sensor.py +4 -7
  171. esphome/components/esp8266_pwm/output.py +3 -8
  172. esphome/components/ethernet/__init__.py +1 -0
  173. esphome/components/ethernet/ethernet_component.cpp +1 -1
  174. esphome/components/ethernet_info/ethernet_info_text_sensor.h +1 -0
  175. esphome/components/exposure_notifications/__init__.py +2 -2
  176. esphome/components/external_components/__init__.py +1 -1
  177. esphome/components/ezo/sensor.py +2 -2
  178. esphome/components/ezo_pmp/__init__.py +4 -4
  179. esphome/components/ezo_pmp/binary_sensor.py +4 -4
  180. esphome/components/ezo_pmp/sensor.py +4 -5
  181. esphome/components/ezo_pmp/text_sensor.py +2 -6
  182. esphome/components/factory_reset/button/__init__.py +2 -1
  183. esphome/components/factory_reset/switch/__init__.py +3 -2
  184. esphome/components/fastled_base/__init__.py +3 -3
  185. esphome/components/fastled_clockless/light.py +2 -2
  186. esphome/components/fastled_spi/light.py +2 -2
  187. esphome/components/feedback/cover.py +3 -3
  188. esphome/components/fingerprint_grow/__init__.py +5 -6
  189. esphome/components/fingerprint_grow/binary_sensor.py +2 -1
  190. esphome/components/fingerprint_grow/sensor.py +2 -1
  191. esphome/components/fs3000/sensor.py +2 -6
  192. esphome/components/ft5x06/touchscreen/__init__.py +2 -2
  193. esphome/components/ft63x6/touchscreen.py +2 -3
  194. esphome/components/fujitsu_general/climate.py +1 -1
  195. esphome/components/gcja5/sensor.py +4 -4
  196. esphome/components/gdk101/__init__.py +1 -1
  197. esphome/components/gdk101/binary_sensor.py +2 -1
  198. esphome/components/gdk101/sensor.py +5 -4
  199. esphome/components/globals/__init__.py +1 -2
  200. esphome/components/gp2y1010au0f/sensor.py +3 -3
  201. esphome/components/gp8403/__init__.py +1 -2
  202. esphome/components/gp8403/output/__init__.py +3 -4
  203. esphome/components/gpio/binary_sensor/__init__.py +3 -2
  204. esphome/components/gpio/one_wire/__init__.py +3 -2
  205. esphome/components/gpio/output/__init__.py +3 -2
  206. esphome/components/gpio/switch/__init__.py +3 -2
  207. esphome/components/gps/__init__.py +4 -5
  208. esphome/components/gps/time/__init__.py +3 -2
  209. esphome/components/graph/__init__.py +12 -12
  210. esphome/components/grove_tb6612fng/__init__.py +5 -6
  211. esphome/components/growatt_solar/sensor.py +1 -1
  212. esphome/components/gt911/binary_sensor/__init__.py +2 -2
  213. esphome/components/haier/binary_sensor/__init__.py +4 -10
  214. esphome/components/haier/button/__init__.py +3 -6
  215. esphome/components/haier/sensor/__init__.py +4 -6
  216. esphome/components/haier/switch/__init__.py +4 -7
  217. esphome/components/haier/text_sensor/__init__.py +4 -9
  218. esphome/components/havells_solar/sensor.py +1 -1
  219. esphome/components/hbridge/fan/__init__.py +6 -6
  220. esphome/components/hbridge/light/__init__.py +2 -1
  221. esphome/components/hdc1080/sensor.py +1 -1
  222. esphome/components/he60r/cover.py +2 -6
  223. esphome/components/heatpumpir/climate.py +1 -1
  224. esphome/components/hitachi_ac344/climate.py +1 -1
  225. esphome/components/hitachi_ac424/climate.py +1 -1
  226. esphome/components/hlw8012/sensor.py +6 -6
  227. esphome/components/hm3301/sensor.py +3 -3
  228. esphome/components/hmc5883l/sensor.py +4 -4
  229. esphome/components/homeassistant/time/__init__.py +2 -1
  230. esphome/components/honeywell_hih_i2c/sensor.py +3 -3
  231. esphome/components/honeywellabp/sensor.py +1 -2
  232. esphome/components/honeywellabp2_i2c/sensor.py +1 -2
  233. esphome/components/host/time/__init__.py +2 -2
  234. esphome/components/hrxl_maxsonar_wr/sensor.py +1 -1
  235. esphome/components/hte501/sensor.py +3 -3
  236. esphome/components/http_request/ota/__init__.py +5 -9
  237. esphome/components/http_request/update/__init__.py +3 -7
  238. esphome/components/htu21d/sensor.py +6 -6
  239. esphome/components/htu31d/sensor.py +1 -1
  240. esphome/components/hx711/sensor.py +3 -8
  241. esphome/components/hydreon_rgxx/binary_sensor.py +3 -7
  242. esphome/components/hydreon_rgxx/sensor.py +4 -4
  243. esphome/components/hyt271/sensor.py +1 -1
  244. esphome/components/i2c_device/__init__.py +1 -1
  245. esphome/components/i2s_audio/media_player/__init__.py +6 -8
  246. esphome/components/iaqcore/sensor.py +2 -2
  247. esphome/components/ina219/sensor.py +2 -2
  248. esphome/components/ina226/sensor.py +4 -4
  249. esphome/components/ina260/sensor.py +4 -4
  250. esphome/components/ina2xx_base/__init__.py +2 -2
  251. esphome/components/ina2xx_i2c/sensor.py +1 -1
  252. esphome/components/ina2xx_spi/sensor.py +1 -1
  253. esphome/components/ina3221/sensor.py +3 -3
  254. esphome/components/inkbird_ibsth1_mini/sensor.py +2 -2
  255. esphome/components/inkplate6/display.py +2 -2
  256. esphome/components/integration/sensor.py +4 -4
  257. esphome/components/internal_temperature/sensor.py +5 -7
  258. esphome/components/interval/__init__.py +1 -1
  259. esphome/components/jsn_sr04t/sensor.py +3 -3
  260. esphome/components/kamstrup_kmp/sensor.py +1 -1
  261. esphome/components/key_collector/__init__.py +2 -2
  262. esphome/components/kmeteriso/sensor.py +2 -2
  263. esphome/components/kuntze/sensor.py +5 -5
  264. esphome/components/lcd_base/__init__.py +2 -2
  265. esphome/components/lcd_gpio/display.py +4 -4
  266. esphome/components/lcd_menu/__init__.py +3 -7
  267. esphome/components/lcd_pcf8574/display.py +1 -1
  268. esphome/components/ld2410/__init__.py +4 -4
  269. esphome/components/ld2410/binary_sensor.py +5 -4
  270. esphome/components/ld2410/button/__init__.py +3 -2
  271. esphome/components/ld2410/number/__init__.py +5 -4
  272. esphome/components/ld2410/select/__init__.py +4 -3
  273. esphome/components/ld2410/sensor.py +6 -5
  274. esphome/components/ld2410/switch/__init__.py +2 -1
  275. esphome/components/ld2410/text_sensor.py +3 -2
  276. esphome/components/ld2420/__init__.py +1 -1
  277. esphome/components/ld2420/binary_sensor/__init__.py +4 -3
  278. esphome/components/ld2420/button/__init__.py +3 -2
  279. esphome/components/ld2420/number/__init__.py +3 -2
  280. esphome/components/ld2420/select/__init__.py +1 -0
  281. esphome/components/ld2420/sensor/__init__.py +3 -2
  282. esphome/components/ld2420/text_sensor/__init__.py +2 -6
  283. esphome/components/ld2450/__init__.py +2 -5
  284. esphome/components/ledc/output.py +3 -3
  285. esphome/components/libretiny/text_sensor.py +1 -1
  286. esphome/components/libretiny_pwm/output.py +3 -7
  287. esphome/components/lightwaverf/__init__.py +6 -8
  288. esphome/components/lilygo_t5_47/touchscreen/__init__.py +2 -3
  289. esphome/components/ltr390/sensor.py +1 -1
  290. esphome/components/ltr501/sensor.py +2 -2
  291. esphome/components/ltr_als_ps/sensor.py +2 -2
  292. esphome/components/lvgl/__init__.py +9 -12
  293. esphome/components/lvgl/automation.py +1 -1
  294. esphome/components/lvgl/defines.py +5 -2
  295. esphome/components/lvgl/lv_validation.py +17 -9
  296. esphome/components/lvgl/lvcode.py +9 -8
  297. esphome/components/lvgl/lvgl_esphome.h +19 -0
  298. esphome/components/lvgl/schemas.py +67 -18
  299. esphome/components/lvgl/styles.py +42 -11
  300. esphome/components/lvgl/switch/__init__.py +13 -8
  301. esphome/components/lvgl/switch/lvgl_switch.h +5 -16
  302. esphome/components/lvgl/trigger.py +10 -1
  303. esphome/components/lvgl/widgets/__init__.py +1 -2
  304. esphome/components/lvgl/widgets/canvas.py +403 -0
  305. esphome/components/lvgl/widgets/line.py +22 -32
  306. esphome/components/m5stack_8angle/__init__.py +1 -2
  307. esphome/components/m5stack_8angle/binary_sensor/__init__.py +2 -3
  308. esphome/components/m5stack_8angle/light/__init__.py +2 -4
  309. esphome/components/m5stack_8angle/sensor/__init__.py +2 -4
  310. esphome/components/matrix_keypad/binary_sensor/__init__.py +4 -3
  311. esphome/components/max31855/sensor.py +1 -1
  312. esphome/components/max31865/sensor.py +1 -1
  313. esphome/components/max44009/sensor.py +1 -1
  314. esphome/components/max6675/sensor.py +1 -1
  315. esphome/components/max6956/__init__.py +5 -5
  316. esphome/components/max6956/output/__init__.py +4 -3
  317. esphome/components/max7219/display.py +1 -1
  318. esphome/components/max7219digit/display.py +1 -1
  319. esphome/components/max9611/sensor.py +10 -10
  320. esphome/components/mcp23008/__init__.py +1 -1
  321. esphome/components/mcp23016/__init__.py +4 -4
  322. esphome/components/mcp23017/__init__.py +1 -1
  323. esphome/components/mcp23s08/__init__.py +1 -1
  324. esphome/components/mcp23s17/__init__.py +1 -1
  325. esphome/components/mcp23xxx_base/__init__.py +4 -4
  326. esphome/components/mcp2515/canbus.py +2 -2
  327. esphome/components/mcp3008/__init__.py +1 -1
  328. esphome/components/mcp3008/sensor/__init__.py +4 -4
  329. esphome/components/mcp3204/__init__.py +1 -1
  330. esphome/components/mcp3204/sensor/__init__.py +3 -2
  331. esphome/components/mcp4461/__init__.py +42 -0
  332. esphome/components/mcp4461/mcp4461.cpp +618 -0
  333. esphome/components/mcp4461/mcp4461.h +171 -0
  334. esphome/components/mcp4461/output/__init__.py +60 -0
  335. esphome/components/mcp4461/output/mcp4461_output.cpp +73 -0
  336. esphome/components/mcp4461/output/mcp4461_output.h +49 -0
  337. esphome/components/mcp4725/output.py +2 -2
  338. esphome/components/mcp4728/__init__.py +1 -1
  339. esphome/components/mcp4728/output/__init__.py +4 -3
  340. esphome/components/mcp47a1/output.py +2 -2
  341. esphome/components/mcp9808/sensor.py +1 -1
  342. esphome/components/mdns/__init__.py +1 -1
  343. esphome/components/mhz19/sensor.py +4 -4
  344. esphome/components/micronova/__init__.py +3 -5
  345. esphome/components/micronova/button/__init__.py +5 -5
  346. esphome/components/micronova/number/__init__.py +6 -10
  347. esphome/components/micronova/sensor/__init__.py +6 -6
  348. esphome/components/micronova/switch/__init__.py +6 -8
  349. esphome/components/micronova/text_sensor/__init__.py +5 -5
  350. esphome/components/microphone/__init__.py +2 -4
  351. esphome/components/midea/climate.py +6 -10
  352. esphome/components/midea_ir/climate.py +1 -1
  353. esphome/components/mitsubishi/climate.py +1 -1
  354. esphome/components/mlx90614/sensor.py +1 -1
  355. esphome/components/mmc5603/sensor.py +4 -4
  356. esphome/components/mmc5983/sensor.py +1 -1
  357. esphome/components/modbus/__init__.py +5 -9
  358. esphome/components/modbus_controller/__init__.py +1 -1
  359. esphome/components/monochromatic/light.py +2 -2
  360. esphome/components/mopeka_ble/__init__.py +1 -1
  361. esphome/components/mopeka_pro_check/sensor.py +12 -12
  362. esphome/components/mopeka_std_check/sensor.py +8 -8
  363. esphome/components/mpl3115a2/sensor.py +1 -1
  364. esphome/components/mpr121/__init__.py +3 -3
  365. esphome/components/mpr121/binary_sensor/__init__.py +5 -4
  366. esphome/components/mpu6050/sensor.py +4 -4
  367. esphome/components/mpu6886/sensor.py +4 -4
  368. esphome/components/mqtt_subscribe/sensor/__init__.py +3 -5
  369. esphome/components/mqtt_subscribe/text_sensor/__init__.py +1 -1
  370. esphome/components/ms5611/sensor.py +2 -2
  371. esphome/components/ms8607/sensor.py +1 -1
  372. esphome/components/my9231/__init__.py +1 -1
  373. esphome/components/my9231/output.py +2 -1
  374. esphome/components/nau7802/nau7802.cpp +0 -4
  375. esphome/components/nau7802/nau7802.h +0 -2
  376. esphome/components/neopixelbus/_methods.py +11 -9
  377. esphome/components/neopixelbus/light.py +11 -18
  378. esphome/components/nextion/binary_sensor/__init__.py +6 -14
  379. esphome/components/nextion/sensor/__init__.py +7 -10
  380. esphome/components/nextion/switch/__init__.py +3 -5
  381. esphome/components/nextion/text_sensor/__init__.py +3 -7
  382. esphome/components/noblex/climate.py +1 -1
  383. esphome/components/ntc/sensor.py +1 -1
  384. esphome/components/opentherm/__init__.py +6 -6
  385. esphome/components/opentherm/input.py +2 -1
  386. esphome/components/opentherm/number/__init__.py +5 -4
  387. esphome/components/opentherm/output/__init__.py +3 -2
  388. esphome/components/opentherm/schema.py +7 -7
  389. esphome/components/opentherm/switch/__init__.py +3 -2
  390. esphome/components/opentherm/validate.py +1 -1
  391. esphome/components/output/__init__.py +2 -3
  392. esphome/components/output/button/__init__.py +3 -2
  393. esphome/components/output/lock/__init__.py +2 -1
  394. esphome/components/output/switch/__init__.py +2 -1
  395. esphome/components/partition/light.py +4 -4
  396. esphome/components/pca6416a/__init__.py +4 -4
  397. esphome/components/pca9554/__init__.py +4 -4
  398. esphome/components/pca9685/__init__.py +2 -2
  399. esphome/components/pca9685/output.py +2 -1
  400. esphome/components/pcf85063/time.py +2 -3
  401. esphome/components/pcf8563/time.py +2 -2
  402. esphome/components/pcf8574/__init__.py +4 -4
  403. esphome/components/pid/climate.py +2 -2
  404. esphome/components/pid/sensor/__init__.py +4 -8
  405. esphome/components/pipsolar/__init__.py +1 -1
  406. esphome/components/pipsolar/binary_sensor/__init__.py +2 -2
  407. esphome/components/pipsolar/output/__init__.py +4 -3
  408. esphome/components/pipsolar/sensor/__init__.py +5 -4
  409. esphome/components/pipsolar/switch/__init__.py +2 -1
  410. esphome/components/pipsolar/text_sensor/__init__.py +2 -1
  411. esphome/components/pm1006/sensor.py +2 -2
  412. esphome/components/pmsa003i/sensor.py +4 -4
  413. esphome/components/pmsx003/sensor.py +10 -11
  414. esphome/components/pmwcs3/sensor.py +5 -5
  415. esphome/components/pn532/__init__.py +3 -3
  416. esphome/components/pn532_i2c/__init__.py +1 -1
  417. esphome/components/pn532_spi/__init__.py +1 -1
  418. esphome/components/pn7150/__init__.py +2 -2
  419. esphome/components/pn7150_i2c/__init__.py +1 -1
  420. esphome/components/pn7160/__init__.py +2 -2
  421. esphome/components/pn7160_i2c/__init__.py +1 -1
  422. esphome/components/pn7160_spi/__init__.py +1 -1
  423. esphome/components/power_supply/__init__.py +1 -1
  424. esphome/components/prometheus/__init__.py +3 -8
  425. esphome/components/psram/__init__.py +75 -11
  426. esphome/components/psram/psram.cpp +18 -7
  427. esphome/components/pulse_counter/sensor.py +4 -4
  428. esphome/components/pulse_meter/sensor.py +3 -3
  429. esphome/components/pulse_width/sensor.py +3 -8
  430. esphome/components/pvvx_mithermometer/display/__init__.py +1 -1
  431. esphome/components/pvvx_mithermometer/sensor.py +3 -3
  432. esphome/components/pylontech/__init__.py +1 -0
  433. esphome/components/pylontech/sensor/__init__.py +8 -13
  434. esphome/components/pylontech/text_sensor/__init__.py +2 -7
  435. esphome/components/pzem004t/sensor.py +3 -3
  436. esphome/components/pzemac/sensor.py +9 -9
  437. esphome/components/pzemdc/sensor.py +6 -6
  438. esphome/components/qmc5883l/sensor.py +5 -5
  439. esphome/components/qmp6988/sensor.py +3 -3
  440. esphome/components/qr_code/__init__.py +1 -1
  441. esphome/components/qspi_dbi/display.py +1 -1
  442. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  443. esphome/components/qspi_dbi/qspi_dbi.h +1 -1
  444. esphome/components/qwiic_pir/binary_sensor.py +2 -5
  445. esphome/components/radon_eye_ble/__init__.py +1 -1
  446. esphome/components/radon_eye_rd200/sensor.py +3 -4
  447. esphome/components/rc522/__init__.py +3 -3
  448. esphome/components/rc522_i2c/__init__.py +1 -1
  449. esphome/components/rc522_spi/__init__.py +1 -1
  450. esphome/components/rdm6300/__init__.py +2 -2
  451. esphome/components/rdm6300/binary_sensor.py +2 -1
  452. esphome/components/resistance/sensor.py +2 -2
  453. esphome/components/restart/button/__init__.py +1 -1
  454. esphome/components/restart/switch/__init__.py +2 -5
  455. esphome/components/rf_bridge/__init__.py +3 -3
  456. esphome/components/rgb/light.py +2 -2
  457. esphome/components/rgbct/light.py +3 -3
  458. esphome/components/rgbw/light.py +2 -2
  459. esphome/components/rgbww/light.py +4 -4
  460. esphome/components/rotary_encoder/sensor.py +8 -8
  461. esphome/components/rp2040_pio/__init__.py +0 -1
  462. esphome/components/rp2040_pio_led_strip/light.py +2 -4
  463. esphome/components/rp2040_pwm/output.py +3 -7
  464. esphome/components/rtttl/__init__.py +6 -6
  465. esphome/components/ruuvi_ble/__init__.py +1 -1
  466. esphome/components/ruuvitag/sensor.py +15 -15
  467. esphome/components/safe_mode/__init__.py +2 -3
  468. esphome/components/safe_mode/button/__init__.py +3 -2
  469. esphome/components/safe_mode/switch/__init__.py +4 -7
  470. esphome/components/scd30/sensor.py +5 -6
  471. esphome/components/scd4x/sensor.py +6 -8
  472. esphome/components/script/__init__.py +2 -2
  473. esphome/components/sdl/display.py +3 -3
  474. esphome/components/sdl/touchscreen/__init__.py +2 -2
  475. esphome/components/sdm_meter/sensor.py +3 -3
  476. esphome/components/sdp3x/sensor.py +1 -2
  477. esphome/components/sds011/sensor.py +4 -4
  478. esphome/components/seeed_mr24hpc1/__init__.py +1 -1
  479. esphome/components/seeed_mr24hpc1/binary_sensor.py +2 -5
  480. esphome/components/seeed_mr24hpc1/button/__init__.py +1 -0
  481. esphome/components/seeed_mr24hpc1/number/__init__.py +2 -4
  482. esphome/components/seeed_mr24hpc1/select/__init__.py +2 -3
  483. esphome/components/seeed_mr24hpc1/sensor.py +1 -0
  484. esphome/components/seeed_mr24hpc1/switch/__init__.py +2 -4
  485. esphome/components/seeed_mr24hpc1/text_sensor.py +1 -0
  486. esphome/components/seeed_mr60bha2/binary_sensor.py +2 -4
  487. esphome/components/seeed_mr60bha2/sensor.py +1 -1
  488. esphome/components/seeed_mr60fda2/button/__init__.py +1 -1
  489. esphome/components/seeed_mr60fda2/select/__init__.py +0 -1
  490. esphome/components/selec_meter/sensor.py +1 -1
  491. esphome/components/sen0321/sensor.py +2 -2
  492. esphome/components/sen21231/sensor.py +1 -1
  493. esphome/components/senseair/sensor.py +3 -3
  494. esphome/components/sensirion_common/__init__.py +0 -2
  495. esphome/components/servo/__init__.py +3 -3
  496. esphome/components/sfa30/sensor.py +4 -5
  497. esphome/components/sgp4x/sensor.py +2 -2
  498. esphome/components/shelly_dimmer/light.py +16 -16
  499. esphome/components/sht3xd/sensor.py +1 -1
  500. esphome/components/sht4x/sensor.py +6 -6
  501. esphome/components/shtcx/sensor.py +1 -1
  502. esphome/components/shutdown/button/__init__.py +2 -6
  503. esphome/components/shutdown/switch/__init__.py +2 -5
  504. esphome/components/sigma_delta_output/output.py +2 -7
  505. esphome/components/sim800l/__init__.py +3 -7
  506. esphome/components/sim800l/binary_sensor.py +3 -5
  507. esphome/components/sim800l/sensor.py +2 -1
  508. esphome/components/slow_pwm/output.py +4 -5
  509. esphome/components/sm10bit_base/__init__.py +2 -6
  510. esphome/components/sm16716/__init__.py +1 -1
  511. esphome/components/sm16716/output.py +2 -1
  512. esphome/components/sm2135/__init__.py +2 -6
  513. esphome/components/sm2135/output.py +2 -1
  514. esphome/components/sm2235/__init__.py +1 -1
  515. esphome/components/sm2235/output.py +2 -1
  516. esphome/components/sm2335/__init__.py +1 -1
  517. esphome/components/sm2335/output.py +2 -1
  518. esphome/components/sm300d2/sensor.py +13 -13
  519. esphome/components/sml/__init__.py +1 -1
  520. esphome/components/sml/sensor/__init__.py +1 -1
  521. esphome/components/sml/text_sensor/__init__.py +1 -1
  522. esphome/components/smt100/sensor.py +5 -6
  523. esphome/components/sn74hc165/__init__.py +5 -5
  524. esphome/components/sn74hc595/__init__.py +5 -5
  525. esphome/components/socket/__init__.py +1 -1
  526. esphome/components/sonoff_d1/light.py +2 -6
  527. esphome/components/speaker/media_player/speaker_media_player.cpp +47 -12
  528. esphome/components/speed/fan/__init__.py +2 -2
  529. esphome/components/spi/__init__.py +45 -36
  530. esphome/components/spi/spi.h +1 -0
  531. esphome/components/spi/spi_esp_idf.cpp +13 -5
  532. esphome/components/sprinkler/__init__.py +4 -5
  533. esphome/components/sps30/sensor.py +8 -8
  534. esphome/components/ssd1306_i2c/display.py +2 -2
  535. esphome/components/ssd1322_base/__init__.py +2 -2
  536. esphome/components/ssd1325_base/__init__.py +2 -2
  537. esphome/components/ssd1327_base/__init__.py +2 -2
  538. esphome/components/ssd1327_i2c/display.py +1 -1
  539. esphome/components/ssd1331_base/__init__.py +2 -2
  540. esphome/components/ssd1351_base/__init__.py +2 -2
  541. esphome/components/st7567_base/__init__.py +4 -4
  542. esphome/components/st7567_i2c/display.py +1 -1
  543. esphome/components/st7920/display.py +2 -2
  544. esphome/components/statsd/__init__.py +3 -3
  545. esphome/components/status/binary_sensor.py +2 -5
  546. esphome/components/status_led/__init__.py +1 -1
  547. esphome/components/status_led/light/__init__.py +2 -1
  548. esphome/components/stepper/__init__.py +2 -2
  549. esphome/components/sts3x/sensor.py +1 -1
  550. esphome/components/substitutions/__init__.py +2 -2
  551. esphome/components/sun/__init__.py +4 -4
  552. esphome/components/sun/sensor/__init__.py +4 -7
  553. esphome/components/sun/text_sensor/__init__.py +5 -4
  554. esphome/components/sun_gtil2/__init__.py +1 -1
  555. esphome/components/sun_gtil2/sensor.py +7 -6
  556. esphome/components/sun_gtil2/text_sensor.py +3 -2
  557. esphome/components/sx1509/__init__.py +5 -5
  558. esphome/components/sx1509/binary_sensor/__init__.py +3 -3
  559. esphome/components/sx1509/output/__init__.py +4 -3
  560. esphome/components/t6615/sensor.py +1 -1
  561. esphome/components/tca9548a/__init__.py +1 -1
  562. esphome/components/tcl112/climate.py +1 -1
  563. esphome/components/tcs34725/sensor.py +4 -4
  564. esphome/components/tee501/sensor.py +1 -1
  565. esphome/components/teleinfo/__init__.py +1 -1
  566. esphome/components/teleinfo/sensor/__init__.py +1 -7
  567. esphome/components/teleinfo/text_sensor/__init__.py +1 -1
  568. esphome/components/tem3200/sensor.py +1 -2
  569. esphome/components/template/alarm_control_panel/__init__.py +3 -10
  570. esphome/components/template/cover/__init__.py +4 -3
  571. esphome/components/template/datetime/__init__.py +8 -9
  572. esphome/components/template/event/__init__.py +2 -5
  573. esphome/components/template/fan/__init__.py +2 -6
  574. esphome/components/template/lock/__init__.py +3 -2
  575. esphome/components/template/number/__init__.py +3 -2
  576. esphome/components/template/output/__init__.py +4 -3
  577. esphome/components/template/select/__init__.py +3 -2
  578. esphome/components/template/sensor/__init__.py +4 -7
  579. esphome/components/template/switch/__init__.py +3 -2
  580. esphome/components/template/text/__init__.py +4 -3
  581. esphome/components/template/text_sensor/__init__.py +3 -2
  582. esphome/components/template/valve/__init__.py +3 -2
  583. esphome/components/time/real_time_clock.cpp +0 -4
  584. esphome/components/time/real_time_clock.h +4 -3
  585. esphome/components/time_based/cover.py +3 -3
  586. esphome/components/tlc59208f/__init__.py +1 -1
  587. esphome/components/tlc59208f/output.py +2 -1
  588. esphome/components/tlc5947/__init__.py +1 -1
  589. esphome/components/tlc5947/output/__init__.py +2 -1
  590. esphome/components/tlc5971/__init__.py +2 -8
  591. esphome/components/tlc5971/output/__init__.py +2 -1
  592. esphome/components/tm1621/display.py +3 -3
  593. esphome/components/tm1637/binary_sensor.py +1 -1
  594. esphome/components/tm1637/display.py +3 -3
  595. esphome/components/tm1651/__init__.py +4 -4
  596. esphome/components/tmp102/sensor.py +1 -1
  597. esphome/components/tmp1075/sensor.py +2 -2
  598. esphome/components/tmp117/sensor.py +1 -1
  599. esphome/components/tof10120/sensor.py +2 -2
  600. esphome/components/tormatic/cover.py +2 -6
  601. esphome/components/toshiba/climate.py +1 -1
  602. esphome/components/total_daily_energy/sensor.py +4 -4
  603. esphome/components/tsl2561/sensor.py +1 -1
  604. esphome/components/tsl2591/sensor.py +9 -9
  605. esphome/components/tt21100/binary_sensor/__init__.py +2 -2
  606. esphome/components/tt21100/touchscreen/__init__.py +2 -3
  607. esphome/components/ttp229_bsf/__init__.py +2 -2
  608. esphome/components/ttp229_bsf/binary_sensor.py +3 -2
  609. esphome/components/ttp229_lsf/__init__.py +1 -1
  610. esphome/components/ttp229_lsf/binary_sensor.py +3 -2
  611. esphome/components/tuya/__init__.py +3 -5
  612. esphome/components/tuya/binary_sensor/__init__.py +2 -2
  613. esphome/components/tuya/climate/__init__.py +6 -5
  614. esphome/components/tuya/cover/__init__.py +5 -4
  615. esphome/components/tuya/fan/__init__.py +3 -2
  616. esphome/components/tuya/light/__init__.py +9 -8
  617. esphome/components/tuya/number/__init__.py +6 -5
  618. esphome/components/tuya/select/__init__.py +4 -3
  619. esphome/components/tuya/sensor/__init__.py +3 -2
  620. esphome/components/tuya/switch/__init__.py +3 -2
  621. esphome/components/tuya/text_sensor/__init__.py +3 -2
  622. esphome/components/tx20/sensor.py +6 -6
  623. esphome/components/uart/__init__.py +20 -19
  624. esphome/components/uart/button/__init__.py +2 -1
  625. esphome/components/uart/switch/__init__.py +2 -1
  626. esphome/components/ufire_ise/sensor.py +2 -2
  627. esphome/components/uln2003/stepper.py +2 -2
  628. esphome/components/ultrasonic/sensor.py +4 -4
  629. esphome/components/uponor_smatrix/__init__.py +2 -6
  630. esphome/components/uponor_smatrix/climate/__init__.py +3 -3
  631. esphome/components/vbus/__init__.py +1 -1
  632. esphome/components/vbus/binary_sensor/__init__.py +7 -6
  633. esphome/components/vbus/sensor/__init__.py +7 -6
  634. esphome/components/veml3235/sensor.py +1 -1
  635. esphome/components/veml7700/sensor.py +1 -1
  636. esphome/components/version/text_sensor.py +2 -6
  637. esphome/components/vl53l0x/sensor.py +6 -6
  638. esphome/components/web_server_base/__init__.py +2 -2
  639. esphome/components/web_server_idf/__init__.py +1 -1
  640. esphome/components/weikai/__init__.py +1 -1
  641. esphome/components/whirlpool/climate.py +1 -1
  642. esphome/components/whynter/climate.py +1 -1
  643. esphome/components/wireguard/binary_sensor.py +1 -1
  644. esphome/components/wireguard/sensor.py +2 -5
  645. esphome/components/wireguard/text_sensor.py +2 -5
  646. esphome/components/wk2132_i2c/__init__.py +1 -1
  647. esphome/components/wk2132_spi/__init__.py +1 -2
  648. esphome/components/wk2168_i2c/__init__.py +3 -8
  649. esphome/components/wk2168_spi/__init__.py +3 -8
  650. esphome/components/wk2204_i2c/__init__.py +1 -1
  651. esphome/components/wk2204_spi/__init__.py +1 -1
  652. esphome/components/wk2212_i2c/__init__.py +3 -8
  653. esphome/components/wk2212_spi/__init__.py +3 -8
  654. esphome/components/wl_134/text_sensor.py +2 -4
  655. esphome/components/wled/__init__.py +2 -2
  656. esphome/components/x9c/output.py +4 -4
  657. esphome/components/xgzp68xx/sensor.py +5 -5
  658. esphome/components/xiaomi_ble/__init__.py +1 -1
  659. esphome/components/xiaomi_cgd1/sensor.py +3 -3
  660. esphome/components/xiaomi_cgdk2/sensor.py +3 -3
  661. esphome/components/xiaomi_cgg1/sensor.py +2 -2
  662. esphome/components/xiaomi_cgpr1/binary_sensor.py +6 -6
  663. esphome/components/xiaomi_gcls002/sensor.py +7 -7
  664. esphome/components/xiaomi_hhccjcy01/sensor.py +9 -9
  665. esphome/components/xiaomi_hhccjcy10/sensor.py +9 -9
  666. esphome/components/xiaomi_hhccpot002/sensor.py +7 -7
  667. esphome/components/xiaomi_jqjcy01ym/sensor.py +6 -6
  668. esphome/components/xiaomi_lywsd02/sensor.py +4 -4
  669. esphome/components/xiaomi_lywsd02mmc/sensor.py +5 -5
  670. esphome/components/xiaomi_lywsd03mmc/sensor.py +6 -6
  671. esphome/components/xiaomi_lywsdcgq/sensor.py +5 -5
  672. esphome/components/xiaomi_mhoc303/sensor.py +4 -4
  673. esphome/components/xiaomi_mhoc401/sensor.py +6 -6
  674. esphome/components/xiaomi_miscale/sensor.py +6 -6
  675. esphome/components/xiaomi_mjyd02yla/binary_sensor.py +8 -8
  676. esphome/components/xiaomi_mue4094rt/binary_sensor.py +2 -7
  677. esphome/components/xiaomi_rtcgq02lm/__init__.py +2 -3
  678. esphome/components/xiaomi_rtcgq02lm/binary_sensor.py +3 -3
  679. esphome/components/xiaomi_rtcgq02lm/sensor.py +3 -3
  680. esphome/components/xiaomi_wx08zm/binary_sensor.py +2 -3
  681. esphome/components/xl9535/__init__.py +2 -2
  682. esphome/components/yashima/climate.py +1 -1
  683. esphome/components/zhlt01/climate.py +1 -1
  684. esphome/components/zio_ultrasonic/sensor.py +2 -5
  685. esphome/components/zyaura/sensor.py +7 -7
  686. esphome/const.py +3 -1
  687. esphome/core/component.cpp +3 -1
  688. esphome/core/component.h +15 -2
  689. esphome/core/config.py +4 -0
  690. esphome/core/defines.h +21 -0
  691. esphome/core/helpers.cpp +6 -7
  692. esphome/core/scheduler.cpp +34 -67
  693. esphome/core/scheduler.h +7 -17
  694. esphome/dashboard/status/mqtt.py +0 -2
  695. {esphome-2025.3.2.dist-info → esphome-2025.4.0b1.dist-info}/METADATA +45 -44
  696. {esphome-2025.3.2.dist-info → esphome-2025.4.0b1.dist-info}/RECORD +700 -693
  697. {esphome-2025.3.2.dist-info → esphome-2025.4.0b1.dist-info}/WHEEL +1 -1
  698. {esphome-2025.3.2.dist-info → esphome-2025.4.0b1.dist-info}/entry_points.txt +0 -0
  699. {esphome-2025.3.2.dist-info → esphome-2025.4.0b1.dist-info/licenses}/LICENSE +0 -0
  700. {esphome-2025.3.2.dist-info → esphome-2025.4.0b1.dist-info}/top_level.txt +0 -0
@@ -1,21 +1,43 @@
1
+ import logging
2
+
1
3
  import esphome.codegen as cg
4
+ from esphome.components.esp32 import (
5
+ CONF_ENABLE_IDF_EXPERIMENTAL_FEATURES,
6
+ VARIANT_ESP32,
7
+ add_idf_sdkconfig_option,
8
+ get_esp32_variant,
9
+ only_on_variant,
10
+ )
11
+ from esphome.components.esp32.const import VARIANT_ESP32S2, VARIANT_ESP32S3
2
12
  import esphome.config_validation as cv
3
- from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant
4
- from esphome.core import CORE
5
13
  from esphome.const import (
14
+ CONF_ADVANCED,
15
+ CONF_FRAMEWORK,
6
16
  CONF_ID,
7
17
  CONF_MODE,
8
18
  CONF_SPEED,
19
+ PLATFORM_ESP32,
9
20
  )
21
+ from esphome.core import CORE
22
+ import esphome.final_validate as fv
10
23
 
11
24
  CODEOWNERS = ["@esphome/core"]
12
25
 
26
+ DEPENDENCIES = [PLATFORM_ESP32]
27
+
28
+ _LOGGER = logging.getLogger(__name__)
29
+
13
30
  psram_ns = cg.esphome_ns.namespace("psram")
14
31
  PsramComponent = psram_ns.class_("PsramComponent", cg.Component)
15
32
 
33
+ TYPE_QUAD = "quad"
34
+ TYPE_OCTAL = "octal"
35
+
36
+ CONF_ENABLE_ECC = "enable_ecc"
37
+
16
38
  SPIRAM_MODES = {
17
- "quad": "CONFIG_SPIRAM_MODE_QUAD",
18
- "octal": "CONFIG_SPIRAM_MODE_OCT",
39
+ TYPE_QUAD: "CONFIG_SPIRAM_MODE_QUAD",
40
+ TYPE_OCTAL: "CONFIG_SPIRAM_MODE_OCT",
19
41
  }
20
42
 
21
43
  SPIRAM_SPEEDS = {
@@ -24,21 +46,57 @@ SPIRAM_SPEEDS = {
24
46
  120e6: "CONFIG_SPIRAM_SPEED_120M",
25
47
  }
26
48
 
49
+
50
+ def validate_psram_mode(config):
51
+ if config[CONF_MODE] == TYPE_OCTAL and config[CONF_SPEED] == 120e6:
52
+ esp32_config = fv.full_config.get()[PLATFORM_ESP32]
53
+ if (
54
+ esp32_config[CONF_FRAMEWORK]
55
+ .get(CONF_ADVANCED, {})
56
+ .get(CONF_ENABLE_IDF_EXPERIMENTAL_FEATURES)
57
+ ):
58
+ _LOGGER.warning(
59
+ "120MHz PSRAM in octal mode is an experimental feature - use at your own risk"
60
+ )
61
+ else:
62
+ raise cv.Invalid("PSRAM 120MHz is not supported in octal mode")
63
+ if config[CONF_MODE] != TYPE_OCTAL and config[CONF_ENABLE_ECC]:
64
+ raise cv.Invalid("ECC is only available in octal mode.")
65
+ if config[CONF_MODE] == TYPE_OCTAL:
66
+ variant = get_esp32_variant()
67
+ if variant != VARIANT_ESP32S3:
68
+ raise cv.Invalid(
69
+ f"Octal PSRAM is only supported on ESP32-S3, not {variant}"
70
+ )
71
+ return config
72
+
73
+
27
74
  CONFIG_SCHEMA = cv.All(
28
75
  cv.Schema(
29
76
  {
30
77
  cv.GenerateID(): cv.declare_id(PsramComponent),
31
- cv.Optional(CONF_MODE): cv.enum(SPIRAM_MODES, lower=True),
32
- cv.Optional(CONF_SPEED): cv.All(cv.frequency, cv.one_of(*SPIRAM_SPEEDS)),
78
+ cv.Optional(CONF_MODE, default=TYPE_QUAD): cv.enum(
79
+ SPIRAM_MODES, lower=True
80
+ ),
81
+ cv.Optional(CONF_ENABLE_ECC, default=False): cv.boolean,
82
+ cv.Optional(CONF_SPEED, default=40e6): cv.All(
83
+ cv.frequency, cv.one_of(*SPIRAM_SPEEDS)
84
+ ),
33
85
  }
34
86
  ),
35
- cv.only_on_esp32,
87
+ only_on_variant(
88
+ supported=[VARIANT_ESP32, VARIANT_ESP32S3, VARIANT_ESP32S2],
89
+ ),
36
90
  )
37
91
 
92
+ FINAL_VALIDATE_SCHEMA = validate_psram_mode
93
+
38
94
 
39
95
  async def to_code(config):
40
96
  if CORE.using_arduino:
41
97
  cg.add_build_flag("-DBOARD_HAS_PSRAM")
98
+ if config[CONF_MODE] == TYPE_OCTAL:
99
+ cg.add_platformio_option("board_build.arduino.memory_type", "qio_opi")
42
100
 
43
101
  if CORE.using_esp_idf:
44
102
  add_idf_sdkconfig_option(
@@ -49,10 +107,16 @@ async def to_code(config):
49
107
  add_idf_sdkconfig_option("CONFIG_SPIRAM_USE_CAPS_ALLOC", True)
50
108
  add_idf_sdkconfig_option("CONFIG_SPIRAM_IGNORE_NOTFOUND", True)
51
109
 
52
- if CONF_MODE in config:
53
- add_idf_sdkconfig_option(f"{SPIRAM_MODES[config[CONF_MODE]]}", True)
54
- if CONF_SPEED in config:
55
- add_idf_sdkconfig_option(f"{SPIRAM_SPEEDS[config[CONF_SPEED]]}", True)
110
+ add_idf_sdkconfig_option(f"{SPIRAM_MODES[config[CONF_MODE]]}", True)
111
+ add_idf_sdkconfig_option(f"{SPIRAM_SPEEDS[config[CONF_SPEED]]}", True)
112
+ if config[CONF_MODE] == TYPE_OCTAL and config[CONF_SPEED] == 120e6:
113
+ add_idf_sdkconfig_option("CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240", True)
114
+ # This works only on IDF 5.4.x but does no harm on earlier versions
115
+ add_idf_sdkconfig_option(
116
+ "CONFIG_SPIRAM_TIMING_TUNING_POINT_VIA_TEMPERATURE_SENSOR", True
117
+ )
118
+ if config[CONF_ENABLE_ECC]:
119
+ add_idf_sdkconfig_option("CONFIG_SPIRAM_ECC_ENABLE", True)
56
120
 
57
121
  cg.add_define("USE_PSRAM")
58
122
 
@@ -1,25 +1,36 @@
1
- #include "psram.h"
2
1
 
3
2
  #ifdef USE_ESP32
3
+ #include "psram.h"
4
+ #ifdef USE_ESP_IDF
5
+ #include <esp_psram.h>
6
+ #endif // USE_ESP_IDF
4
7
 
5
8
  #include "esphome/core/log.h"
6
9
 
7
10
  #include <esp_heap_caps.h>
8
- #include <esp_idf_version.h>
9
11
 
10
12
  namespace esphome {
11
13
  namespace psram {
12
-
13
14
  static const char *const TAG = "psram";
14
15
 
15
16
  void PsramComponent::dump_config() {
17
+ ESP_LOGCONFIG(TAG, "PSRAM:");
18
+ #ifdef USE_ESP_IDF
19
+ bool available = esp_psram_is_initialized();
20
+
21
+ ESP_LOGCONFIG(TAG, " Available: %s", YESNO(available));
22
+ if (available) {
23
+ ESP_LOGCONFIG(TAG, " Size: %zu KB", esp_psram_get_size() / 1024);
24
+ #if CONFIG_SPIRAM_ECC_ENABLE
25
+ ESP_LOGCONFIG(TAG, " ECC enabled: YES");
26
+ #endif
27
+ }
28
+ #else
16
29
  // Technically this can be false if the PSRAM is full, but heap_caps_get_total_size() isn't always available, and it's
17
30
  // very unlikely for the PSRAM to be full.
18
31
  bool available = heap_caps_get_free_size(MALLOC_CAP_SPIRAM) > 0;
19
-
20
- ESP_LOGCONFIG(TAG, "PSRAM:");
21
32
  ESP_LOGCONFIG(TAG, " Available: %s", YESNO(available));
22
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 1, 0)
33
+
23
34
  if (available) {
24
35
  const size_t psram_total_size_bytes = heap_caps_get_total_size(MALLOC_CAP_SPIRAM);
25
36
  const float psram_total_size_kb = psram_total_size_bytes / 1024.0f;
@@ -30,7 +41,7 @@ void PsramComponent::dump_config() {
30
41
  ESP_LOGCONFIG(TAG, " Size: %zu bytes", psram_total_size_bytes);
31
42
  }
32
43
  }
33
- #endif
44
+ #endif // USE_ESP_IDF
34
45
  }
35
46
 
36
47
  } // namespace psram
@@ -1,22 +1,22 @@
1
- import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
1
  from esphome import automation, pins
2
+ import esphome.codegen as cg
4
3
  from esphome.components import sensor
4
+ import esphome.config_validation as cv
5
5
  from esphome.const import (
6
6
  CONF_COUNT_MODE,
7
7
  CONF_FALLING_EDGE,
8
8
  CONF_ID,
9
9
  CONF_INTERNAL_FILTER,
10
+ CONF_NUMBER,
10
11
  CONF_PIN,
11
12
  CONF_RISING_EDGE,
12
- CONF_NUMBER,
13
13
  CONF_TOTAL,
14
14
  CONF_VALUE,
15
15
  ICON_PULSE,
16
16
  STATE_CLASS_MEASUREMENT,
17
17
  STATE_CLASS_TOTAL_INCREASING,
18
- UNIT_PULSES_PER_MINUTE,
19
18
  UNIT_PULSES,
19
+ UNIT_PULSES_PER_MINUTE,
20
20
  )
21
21
  from esphome.core import CORE
22
22
 
@@ -1,13 +1,13 @@
1
- import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
1
  from esphome import automation, pins
2
+ import esphome.codegen as cg
4
3
  from esphome.components import sensor
4
+ import esphome.config_validation as cv
5
5
  from esphome.const import (
6
6
  CONF_ID,
7
7
  CONF_INTERNAL_FILTER,
8
8
  CONF_INTERNAL_FILTER_MODE,
9
- CONF_PIN,
10
9
  CONF_NUMBER,
10
+ CONF_PIN,
11
11
  CONF_TIMEOUT,
12
12
  CONF_TOTAL,
13
13
  CONF_VALUE,
@@ -1,13 +1,8 @@
1
- import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
1
  from esphome import pins
2
+ import esphome.codegen as cg
4
3
  from esphome.components import sensor
5
- from esphome.const import (
6
- CONF_PIN,
7
- STATE_CLASS_MEASUREMENT,
8
- UNIT_SECOND,
9
- ICON_TIMER,
10
- )
4
+ import esphome.config_validation as cv
5
+ from esphome.const import CONF_PIN, ICON_TIMER, STATE_CLASS_MEASUREMENT, UNIT_SECOND
11
6
 
12
7
  pulse_width_ns = cg.esphome_ns.namespace("pulse_width")
13
8
 
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import ble_client, display, time
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_AUTO_CLEAR_ENABLED,
6
6
  CONF_DISCONNECT_DELAY,
@@ -1,14 +1,14 @@
1
1
  import esphome.codegen as cg
2
+ from esphome.components import esp32_ble_tracker, sensor
2
3
  import esphome.config_validation as cv
3
- from esphome.components import sensor, esp32_ble_tracker
4
4
  from esphome.const import (
5
5
  CONF_BATTERY_LEVEL,
6
6
  CONF_BATTERY_VOLTAGE,
7
- CONF_MAC_ADDRESS,
8
7
  CONF_HUMIDITY,
8
+ CONF_ID,
9
+ CONF_MAC_ADDRESS,
9
10
  CONF_SIGNAL_STRENGTH,
10
11
  CONF_TEMPERATURE,
11
- CONF_ID,
12
12
  DEVICE_CLASS_BATTERY,
13
13
  DEVICE_CLASS_HUMIDITY,
14
14
  DEVICE_CLASS_SIGNAL_STRENGTH,
@@ -1,4 +1,5 @@
1
1
  import logging
2
+
2
3
  import esphome.codegen as cg
3
4
  from esphome.components import uart
4
5
  import esphome.config_validation as cv
@@ -1,27 +1,22 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import sensor
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
- CONF_VOLTAGE,
6
5
  CONF_CURRENT,
6
+ CONF_ID,
7
7
  CONF_TEMPERATURE,
8
- UNIT_VOLT,
9
- UNIT_AMPERE,
10
- DEVICE_CLASS_VOLTAGE,
8
+ CONF_VOLTAGE,
9
+ DEVICE_CLASS_BATTERY,
11
10
  DEVICE_CLASS_CURRENT,
12
11
  DEVICE_CLASS_TEMPERATURE,
13
- DEVICE_CLASS_BATTERY,
12
+ DEVICE_CLASS_VOLTAGE,
13
+ UNIT_AMPERE,
14
14
  UNIT_CELSIUS,
15
15
  UNIT_PERCENT,
16
- CONF_ID,
16
+ UNIT_VOLT,
17
17
  )
18
18
 
19
- from .. import (
20
- CONF_PYLONTECH_ID,
21
- PYLONTECH_COMPONENT_SCHEMA,
22
- CONF_BATTERY,
23
- pylontech_ns,
24
- )
19
+ from .. import CONF_BATTERY, CONF_PYLONTECH_ID, PYLONTECH_COMPONENT_SCHEMA, pylontech_ns
25
20
 
26
21
  PylontechSensor = pylontech_ns.class_("PylontechSensor", cg.Component)
27
22
 
@@ -1,14 +1,9 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import text_sensor
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import CONF_ID
5
5
 
6
- from .. import (
7
- CONF_PYLONTECH_ID,
8
- PYLONTECH_COMPONENT_SCHEMA,
9
- CONF_BATTERY,
10
- pylontech_ns,
11
- )
6
+ from .. import CONF_BATTERY, CONF_PYLONTECH_ID, PYLONTECH_COMPONENT_SCHEMA, pylontech_ns
12
7
 
13
8
  PylontechTextSensor = pylontech_ns.class_("PylontechTextSensor", cg.Component)
14
9
 
@@ -1,20 +1,20 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import sensor, uart
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_CURRENT,
6
+ CONF_ENERGY,
6
7
  CONF_ID,
7
8
  CONF_POWER,
8
9
  CONF_VOLTAGE,
9
- CONF_ENERGY,
10
10
  DEVICE_CLASS_CURRENT,
11
11
  DEVICE_CLASS_ENERGY,
12
12
  DEVICE_CLASS_POWER,
13
13
  DEVICE_CLASS_VOLTAGE,
14
14
  STATE_CLASS_MEASUREMENT,
15
15
  STATE_CLASS_TOTAL_INCREASING,
16
- UNIT_VOLT,
17
16
  UNIT_AMPERE,
17
+ UNIT_VOLT,
18
18
  UNIT_WATT,
19
19
  UNIT_WATT_HOURS,
20
20
  )
@@ -1,27 +1,27 @@
1
- import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
1
  from esphome import automation
4
2
  from esphome.automation import maybe_simple_id
5
- from esphome.components import sensor, modbus
3
+ import esphome.codegen as cg
4
+ from esphome.components import modbus, sensor
5
+ import esphome.config_validation as cv
6
6
  from esphome.const import (
7
7
  CONF_CURRENT,
8
8
  CONF_ENERGY,
9
+ CONF_FREQUENCY,
9
10
  CONF_ID,
10
11
  CONF_POWER,
11
- CONF_VOLTAGE,
12
- CONF_FREQUENCY,
13
12
  CONF_POWER_FACTOR,
14
- DEVICE_CLASS_POWER_FACTOR,
15
- DEVICE_CLASS_VOLTAGE,
13
+ CONF_VOLTAGE,
16
14
  DEVICE_CLASS_CURRENT,
17
- DEVICE_CLASS_POWER,
18
15
  DEVICE_CLASS_ENERGY,
16
+ DEVICE_CLASS_POWER,
17
+ DEVICE_CLASS_POWER_FACTOR,
18
+ DEVICE_CLASS_VOLTAGE,
19
19
  ICON_CURRENT_AC,
20
20
  STATE_CLASS_MEASUREMENT,
21
21
  STATE_CLASS_TOTAL_INCREASING,
22
+ UNIT_AMPERE,
22
23
  UNIT_HERTZ,
23
24
  UNIT_VOLT,
24
- UNIT_AMPERE,
25
25
  UNIT_WATT,
26
26
  UNIT_WATT_HOURS,
27
27
  )
@@ -1,13 +1,13 @@
1
- import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
1
  from esphome import automation
4
2
  from esphome.automation import maybe_simple_id
5
- from esphome.components import sensor, modbus
3
+ import esphome.codegen as cg
4
+ from esphome.components import modbus, sensor
5
+ import esphome.config_validation as cv
6
6
  from esphome.const import (
7
7
  CONF_CURRENT,
8
+ CONF_ENERGY,
8
9
  CONF_ID,
9
10
  CONF_POWER,
10
- CONF_ENERGY,
11
11
  CONF_VOLTAGE,
12
12
  DEVICE_CLASS_CURRENT,
13
13
  DEVICE_CLASS_ENERGY,
@@ -15,10 +15,10 @@ from esphome.const import (
15
15
  DEVICE_CLASS_VOLTAGE,
16
16
  STATE_CLASS_MEASUREMENT,
17
17
  STATE_CLASS_TOTAL_INCREASING,
18
- UNIT_VOLT,
19
18
  UNIT_AMPERE,
20
- UNIT_WATT,
21
19
  UNIT_KILOWATT_HOURS,
20
+ UNIT_VOLT,
21
+ UNIT_WATT,
22
22
  )
23
23
 
24
24
  AUTO_LOAD = ["modbus"]
@@ -1,24 +1,24 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import i2c, sensor
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_ADDRESS,
6
6
  CONF_FIELD_STRENGTH_X,
7
7
  CONF_FIELD_STRENGTH_Y,
8
8
  CONF_FIELD_STRENGTH_Z,
9
9
  CONF_HEADING,
10
- CONF_TEMPERATURE,
11
10
  CONF_ID,
12
11
  CONF_OVERSAMPLING,
13
12
  CONF_RANGE,
13
+ CONF_TEMPERATURE,
14
+ CONF_UPDATE_INTERVAL,
14
15
  DEVICE_CLASS_TEMPERATURE,
15
16
  ICON_MAGNET,
17
+ ICON_SCREEN_ROTATION,
16
18
  STATE_CLASS_MEASUREMENT,
17
- UNIT_MICROTESLA,
18
19
  UNIT_CELSIUS,
19
20
  UNIT_DEGREES,
20
- ICON_SCREEN_ROTATION,
21
- CONF_UPDATE_INTERVAL,
21
+ UNIT_MICROTESLA,
22
22
  )
23
23
 
24
24
  DEPENDENCIES = ["i2c"]
@@ -1,8 +1,10 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import i2c, sensor
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_ID,
6
+ CONF_IIR_FILTER,
7
+ CONF_OVERSAMPLING,
6
8
  CONF_PRESSURE,
7
9
  CONF_TEMPERATURE,
8
10
  DEVICE_CLASS_PRESSURE,
@@ -10,8 +12,6 @@ from esphome.const import (
10
12
  STATE_CLASS_MEASUREMENT,
11
13
  UNIT_CELSIUS,
12
14
  UNIT_HECTOPASCAL,
13
- CONF_IIR_FILTER,
14
- CONF_OVERSAMPLING,
15
15
  )
16
16
 
17
17
  DEPENDENCIES = ["i2c"]
@@ -1,5 +1,5 @@
1
- import esphome.config_validation as cv
2
1
  import esphome.codegen as cg
2
+ import esphome.config_validation as cv
3
3
  from esphome.const import CONF_ID, CONF_VALUE
4
4
 
5
5
  CONF_SCALE = "scale"
@@ -113,7 +113,7 @@ BASE_SCHEMA = display.FULL_DISPLAY_SCHEMA.extend(
113
113
  cs_pin_required=False,
114
114
  default_mode="MODE0",
115
115
  default_data_rate=10e6,
116
- quad=True,
116
+ mode=spi.TYPE_QUAD,
117
117
  )
118
118
  )
119
119
  )
@@ -1,4 +1,4 @@
1
- #ifdef USE_ESP_IDF
1
+ #if defined(USE_ESP_IDF) && defined(USE_ESP32_VARIANT_ESP32S3)
2
2
  #include "qspi_dbi.h"
3
3
  #include "esphome/core/log.h"
4
4
 
@@ -3,7 +3,7 @@
3
3
  //
4
4
  #pragma once
5
5
 
6
- #ifdef USE_ESP_IDF
6
+ #if defined(USE_ESP_IDF) && defined(USE_ESP32_VARIANT_ESP32S3)
7
7
  #include "esphome/components/spi/spi.h"
8
8
  #include "esphome/components/display/display.h"
9
9
  #include "esphome/components/display/display_buffer.h"
@@ -1,11 +1,8 @@
1
1
  from esphome import core
2
2
  import esphome.codegen as cg
3
+ from esphome.components import binary_sensor, i2c
3
4
  import esphome.config_validation as cv
4
- from esphome.components import i2c, binary_sensor
5
- from esphome.const import (
6
- CONF_DEBOUNCE,
7
- DEVICE_CLASS_MOTION,
8
- )
5
+ from esphome.const import CONF_DEBOUNCE, DEVICE_CLASS_MOTION
9
6
 
10
7
  DEPENDENCIES = ["i2c"]
11
8
  CODEOWNERS = ["@kahrendt"]
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import esp32_ble_tracker
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import CONF_ID
5
5
 
6
6
  DEPENDENCIES = ["esp32_ble_tracker"]
@@ -1,14 +1,13 @@
1
1
  import esphome.codegen as cg
2
+ from esphome.components import ble_client, sensor
2
3
  import esphome.config_validation as cv
3
- from esphome.components import sensor, ble_client
4
-
5
4
  from esphome.const import (
6
- STATE_CLASS_MEASUREMENT,
7
- UNIT_BECQUEREL_PER_CUBIC_METER,
8
5
  CONF_ID,
9
6
  CONF_RADON,
10
7
  CONF_RADON_LONG_TERM,
11
8
  ICON_RADIOACTIVE,
9
+ STATE_CLASS_MEASUREMENT,
10
+ UNIT_BECQUEREL_PER_CUBIC_METER,
12
11
  )
13
12
 
14
13
  DEPENDENCIES = ["ble_client"]
@@ -1,12 +1,12 @@
1
- import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
1
  from esphome import automation, pins
2
+ import esphome.codegen as cg
4
3
  from esphome.components import i2c
4
+ import esphome.config_validation as cv
5
5
  from esphome.const import (
6
6
  CONF_ON_TAG,
7
7
  CONF_ON_TAG_REMOVED,
8
- CONF_TRIGGER_ID,
9
8
  CONF_RESET_PIN,
9
+ CONF_TRIGGER_ID,
10
10
  )
11
11
 
12
12
  CODEOWNERS = ["@glmnet"]
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import i2c, rc522
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import CONF_ID
5
5
 
6
6
  CODEOWNERS = ["@glmnet"]
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
+ from esphome.components import rc522, spi
2
3
  import esphome.config_validation as cv
3
- from esphome.components import spi, rc522
4
4
  from esphome.const import CONF_ID
5
5
 
6
6
  CODEOWNERS = ["@glmnet"]
@@ -1,7 +1,7 @@
1
- import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
1
  from esphome import automation
2
+ import esphome.codegen as cg
4
3
  from esphome.components import uart
4
+ import esphome.config_validation as cv
5
5
  from esphome.const import CONF_ID, CONF_ON_TAG, CONF_TRIGGER_ID
6
6
 
7
7
  DEPENDENCIES = ["uart"]
@@ -1,7 +1,8 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import binary_sensor, rdm6300
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import CONF_UID
5
+
5
6
  from . import rdm6300_ns
6
7
 
7
8
  DEPENDENCIES = ["rdm6300"]
@@ -1,12 +1,12 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import sensor
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_REFERENCE_VOLTAGE,
6
6
  CONF_SENSOR,
7
+ ICON_FLASH,
7
8
  STATE_CLASS_MEASUREMENT,
8
9
  UNIT_OHM,
9
- ICON_FLASH,
10
10
  )
11
11
 
12
12
  resistance_ns = cg.esphome_ns.namespace("resistance")
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import button
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_ID,
6
6
  DEVICE_CLASS_RESTART,
@@ -1,10 +1,7 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import switch
4
- from esphome.const import (
5
- ENTITY_CATEGORY_CONFIG,
6
- ICON_RESTART,
7
- )
3
+ import esphome.config_validation as cv
4
+ from esphome.const import ENTITY_CATEGORY_CONFIG, ICON_RESTART
8
5
 
9
6
  restart_ns = cg.esphome_ns.namespace("restart")
10
7
  RestartSwitch = restart_ns.class_("RestartSwitch", switch.Switch, cg.Component)
@@ -1,9 +1,10 @@
1
- import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
1
  from esphome import automation
2
+ import esphome.codegen as cg
4
3
  from esphome.components import uart
4
+ import esphome.config_validation as cv
5
5
  from esphome.const import (
6
6
  CONF_CODE,
7
+ CONF_DURATION,
7
8
  CONF_HIGH,
8
9
  CONF_ID,
9
10
  CONF_LENGTH,
@@ -12,7 +13,6 @@ from esphome.const import (
12
13
  CONF_RAW,
13
14
  CONF_SYNC,
14
15
  CONF_TRIGGER_ID,
15
- CONF_DURATION,
16
16
  )
17
17
 
18
18
  DEPENDENCIES = ["uart"]