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
@@ -0,0 +1,403 @@
1
+ from esphome import automation, codegen as cg, config_validation as cv
2
+ from esphome.components.display_menu_base import CONF_LABEL
3
+ from esphome.const import CONF_COLOR, CONF_HEIGHT, CONF_ID, CONF_TEXT, CONF_WIDTH
4
+ from esphome.cpp_generator import Literal, MockObj
5
+
6
+ from ..automation import action_to_code
7
+ from ..defines import (
8
+ CONF_END_ANGLE,
9
+ CONF_MAIN,
10
+ CONF_OPA,
11
+ CONF_PIVOT_X,
12
+ CONF_PIVOT_Y,
13
+ CONF_POINTS,
14
+ CONF_SRC,
15
+ CONF_START_ANGLE,
16
+ CONF_X,
17
+ CONF_Y,
18
+ literal,
19
+ )
20
+ from ..lv_validation import (
21
+ lv_angle,
22
+ lv_bool,
23
+ lv_color,
24
+ lv_image,
25
+ lv_text,
26
+ opacity,
27
+ pixels,
28
+ size,
29
+ )
30
+ from ..lvcode import LocalVariable, lv, lv_assign
31
+ from ..schemas import STYLE_PROPS, STYLE_REMAP, TEXT_SCHEMA, point_schema
32
+ from ..types import LvType, ObjUpdateAction, WidgetType
33
+ from . import Widget, get_widgets
34
+ from .line import lv_point_t, process_coord
35
+
36
+ CONF_CANVAS = "canvas"
37
+ CONF_BUFFER_ID = "buffer_id"
38
+ CONF_MAX_WIDTH = "max_width"
39
+ CONF_TRANSPARENT = "transparent"
40
+ CONF_RADIUS = "radius"
41
+
42
+ lv_canvas_t = LvType("lv_canvas_t")
43
+
44
+
45
+ class CanvasType(WidgetType):
46
+ def __init__(self):
47
+ super().__init__(
48
+ CONF_CANVAS,
49
+ lv_canvas_t,
50
+ (CONF_MAIN,),
51
+ cv.Schema(
52
+ {
53
+ cv.Required(CONF_WIDTH): size,
54
+ cv.Required(CONF_HEIGHT): size,
55
+ cv.Optional(CONF_TRANSPARENT, default=False): cv.boolean,
56
+ }
57
+ ),
58
+ )
59
+
60
+ def get_uses(self):
61
+ return "img", CONF_LABEL
62
+
63
+ async def to_code(self, w: Widget, config):
64
+ width = config[CONF_WIDTH]
65
+ height = config[CONF_HEIGHT]
66
+ use_alpha = "_ALPHA" if config[CONF_TRANSPARENT] else ""
67
+ lv.canvas_set_buffer(
68
+ w.obj,
69
+ lv.custom_mem_alloc(
70
+ literal(f"LV_CANVAS_BUF_SIZE_TRUE_COLOR{use_alpha}({width}, {height})")
71
+ ),
72
+ width,
73
+ height,
74
+ literal(f"LV_IMG_CF_TRUE_COLOR{use_alpha}"),
75
+ )
76
+
77
+
78
+ canvas_spec = CanvasType()
79
+
80
+
81
+ @automation.register_action(
82
+ "lvgl.canvas.fill",
83
+ ObjUpdateAction,
84
+ cv.Schema(
85
+ {
86
+ cv.GenerateID(CONF_ID): cv.use_id(lv_canvas_t),
87
+ cv.Required(CONF_COLOR): lv_color,
88
+ cv.Optional(CONF_OPA, default="COVER"): opacity,
89
+ },
90
+ ),
91
+ )
92
+ async def canvas_fill(config, action_id, template_arg, args):
93
+ widget = await get_widgets(config)
94
+ color = await lv_color.process(config[CONF_COLOR])
95
+ opa = await opacity.process(config[CONF_OPA])
96
+
97
+ async def do_fill(w: Widget):
98
+ lv.canvas_fill_bg(w.obj, color, opa)
99
+
100
+ return await action_to_code(widget, do_fill, action_id, template_arg, args)
101
+
102
+
103
+ @automation.register_action(
104
+ "lvgl.canvas.set_pixels",
105
+ ObjUpdateAction,
106
+ cv.Schema(
107
+ {
108
+ cv.GenerateID(CONF_ID): cv.use_id(lv_canvas_t),
109
+ cv.Required(CONF_COLOR): lv_color,
110
+ cv.Optional(CONF_OPA): opacity,
111
+ cv.Required(CONF_POINTS): cv.ensure_list(point_schema),
112
+ },
113
+ ),
114
+ )
115
+ async def canvas_set_pixel(config, action_id, template_arg, args):
116
+ widget = await get_widgets(config)
117
+ color = await lv_color.process(config[CONF_COLOR])
118
+ opa = await opacity.process(config.get(CONF_OPA))
119
+ points = [
120
+ (
121
+ await pixels.process(p[CONF_X]),
122
+ await pixels.process(p[CONF_Y]),
123
+ )
124
+ for p in config[CONF_POINTS]
125
+ ]
126
+
127
+ async def do_set_pixels(w: Widget):
128
+ if isinstance(color, MockObj):
129
+ for point in points:
130
+ x, y = point
131
+ lv.canvas_set_px_color(w.obj, x, y, color)
132
+ else:
133
+ with LocalVariable("color", "lv_color_t", color, modifier="") as color_var:
134
+ for point in points:
135
+ x, y = point
136
+ lv.canvas_set_px_color(w.obj, x, y, color_var)
137
+ if opa:
138
+ if isinstance(opa, Literal):
139
+ for point in points:
140
+ x, y = point
141
+ lv.canvas_set_px_opa(w.obj, x, y, opa)
142
+ else:
143
+ with LocalVariable("opa", "lv_opa_t", opa, modifier="") as opa_var:
144
+ for point in points:
145
+ x, y = point
146
+ lv.canvas_set_px_opa(w.obj, x, y, opa_var)
147
+
148
+ return await action_to_code(widget, do_set_pixels, action_id, template_arg, args)
149
+
150
+
151
+ DRAW_SCHEMA = cv.Schema(
152
+ {
153
+ cv.GenerateID(CONF_ID): cv.use_id(lv_canvas_t),
154
+ cv.Required(CONF_X): pixels,
155
+ cv.Required(CONF_Y): pixels,
156
+ }
157
+ )
158
+ DRAW_OPA_SCHEMA = DRAW_SCHEMA.extend(
159
+ {
160
+ cv.Optional(CONF_OPA): opacity,
161
+ }
162
+ )
163
+
164
+
165
+ async def draw_to_code(config, dsc_type, props, do_draw, action_id, template_arg, args):
166
+ widget = await get_widgets(config)
167
+ x = await pixels.process(config.get(CONF_X))
168
+ y = await pixels.process(config.get(CONF_Y))
169
+
170
+ async def action_func(w: Widget):
171
+ with LocalVariable("dsc", f"lv_draw_{dsc_type}_dsc_t", modifier="") as dsc:
172
+ dsc_addr = literal(f"&{dsc}")
173
+ lv.call(f"draw_{dsc_type}_dsc_init", dsc_addr)
174
+ if CONF_OPA in config:
175
+ opa = await opacity.process(config[CONF_OPA])
176
+ lv_assign(dsc.opa, opa)
177
+ for prop, validator in props.items():
178
+ if prop in config:
179
+ value = await validator.process(config[prop])
180
+ mapped_prop = STYLE_REMAP.get(prop, prop)
181
+ lv_assign(getattr(dsc, mapped_prop), value)
182
+ await do_draw(w, x, y, dsc_addr)
183
+
184
+ return await action_to_code(widget, action_func, action_id, template_arg, args)
185
+
186
+
187
+ RECT_PROPS = {
188
+ p: STYLE_PROPS[p]
189
+ for p in (
190
+ "radius",
191
+ "bg_opa",
192
+ "bg_color",
193
+ "bg_grad",
194
+ "border_color",
195
+ "border_width",
196
+ "border_opa",
197
+ "outline_color",
198
+ "outline_width",
199
+ "outline_pad",
200
+ "outline_opa",
201
+ "shadow_color",
202
+ "shadow_width",
203
+ "shadow_ofs_x",
204
+ "shadow_ofs_y",
205
+ "shadow_spread",
206
+ "shadow_opa",
207
+ )
208
+ }
209
+
210
+
211
+ @automation.register_action(
212
+ "lvgl.canvas.draw_rectangle",
213
+ ObjUpdateAction,
214
+ DRAW_SCHEMA.extend(
215
+ {
216
+ cv.Required(CONF_WIDTH): cv.templatable(cv.int_),
217
+ cv.Required(CONF_HEIGHT): cv.templatable(cv.int_),
218
+ },
219
+ ).extend({cv.Optional(prop): STYLE_PROPS[prop] for prop in RECT_PROPS}),
220
+ )
221
+ async def canvas_draw_rect(config, action_id, template_arg, args):
222
+ width = await pixels.process(config[CONF_WIDTH])
223
+ height = await pixels.process(config[CONF_HEIGHT])
224
+
225
+ async def do_draw_rect(w: Widget, x, y, dsc_addr):
226
+ lv.canvas_draw_rect(w.obj, x, y, width, height, dsc_addr)
227
+
228
+ return await draw_to_code(
229
+ config, "rect", RECT_PROPS, do_draw_rect, action_id, template_arg, args
230
+ )
231
+
232
+
233
+ TEXT_PROPS = {
234
+ p: STYLE_PROPS[f"text_{p}"]
235
+ for p in (
236
+ "font",
237
+ "color",
238
+ # "sel_color",
239
+ # "sel_bg_color",
240
+ "line_space",
241
+ "letter_space",
242
+ "align",
243
+ "decor",
244
+ )
245
+ }
246
+
247
+
248
+ @automation.register_action(
249
+ "lvgl.canvas.draw_text",
250
+ ObjUpdateAction,
251
+ TEXT_SCHEMA.extend(DRAW_OPA_SCHEMA)
252
+ .extend(
253
+ {
254
+ cv.Required(CONF_MAX_WIDTH): cv.templatable(cv.int_),
255
+ },
256
+ )
257
+ .extend({cv.Optional(prop): STYLE_PROPS[f"text_{prop}"] for prop in TEXT_PROPS}),
258
+ )
259
+ async def canvas_draw_text(config, action_id, template_arg, args):
260
+ text = await lv_text.process(config[CONF_TEXT])
261
+ max_width = await pixels.process(config[CONF_MAX_WIDTH])
262
+
263
+ async def do_draw_text(w: Widget, x, y, dsc_addr):
264
+ lv.canvas_draw_text(w.obj, x, y, max_width, dsc_addr, text)
265
+
266
+ return await draw_to_code(
267
+ config, "label", TEXT_PROPS, do_draw_text, action_id, template_arg, args
268
+ )
269
+
270
+
271
+ IMG_PROPS = {
272
+ "angle": STYLE_PROPS["transform_angle"],
273
+ "zoom": STYLE_PROPS["transform_zoom"],
274
+ "recolor": STYLE_PROPS["image_recolor"],
275
+ "recolor_opa": STYLE_PROPS["image_recolor_opa"],
276
+ "opa": STYLE_PROPS["opa"],
277
+ }
278
+
279
+
280
+ @automation.register_action(
281
+ "lvgl.canvas.draw_image",
282
+ ObjUpdateAction,
283
+ DRAW_OPA_SCHEMA.extend(
284
+ {
285
+ cv.Required(CONF_SRC): lv_image,
286
+ cv.Optional(CONF_PIVOT_X, default=0): pixels,
287
+ cv.Optional(CONF_PIVOT_Y, default=0): pixels,
288
+ },
289
+ ).extend({cv.Optional(prop): validator for prop, validator in IMG_PROPS.items()}),
290
+ )
291
+ async def canvas_draw_image(config, action_id, template_arg, args):
292
+ src = await lv_image.process(config[CONF_SRC])
293
+ pivot_x = await pixels.process(config[CONF_PIVOT_X])
294
+ pivot_y = await pixels.process(config[CONF_PIVOT_Y])
295
+
296
+ async def do_draw_image(w: Widget, x, y, dsc_addr):
297
+ dsc = MockObj(f"(*{dsc_addr})")
298
+ if pivot_x or pivot_y:
299
+ # pylint :disable=no-member
300
+ lv_assign(dsc.pivot, literal(f"{{{pivot_x}, {pivot_y}}}"))
301
+ lv.canvas_draw_img(w.obj, x, y, src, dsc_addr)
302
+
303
+ return await draw_to_code(
304
+ config, "img", IMG_PROPS, do_draw_image, action_id, template_arg, args
305
+ )
306
+
307
+
308
+ LINE_PROPS = {
309
+ "width": STYLE_PROPS["line_width"],
310
+ "color": STYLE_PROPS["line_color"],
311
+ "dash-width": STYLE_PROPS["line_dash_width"],
312
+ "dash-gap": STYLE_PROPS["line_dash_gap"],
313
+ "round_start": lv_bool,
314
+ "round_end": lv_bool,
315
+ }
316
+
317
+
318
+ @automation.register_action(
319
+ "lvgl.canvas.draw_line",
320
+ ObjUpdateAction,
321
+ cv.Schema(
322
+ {
323
+ cv.GenerateID(CONF_ID): cv.use_id(lv_canvas_t),
324
+ cv.Optional(CONF_OPA): opacity,
325
+ cv.Required(CONF_POINTS): cv.ensure_list(point_schema),
326
+ },
327
+ ).extend({cv.Optional(prop): validator for prop, validator in LINE_PROPS.items()}),
328
+ )
329
+ async def canvas_draw_line(config, action_id, template_arg, args):
330
+ points = [
331
+ [await process_coord(p[CONF_X]), await process_coord(p[CONF_Y])]
332
+ for p in config[CONF_POINTS]
333
+ ]
334
+
335
+ async def do_draw_line(w: Widget, x, y, dsc_addr):
336
+ with LocalVariable(
337
+ "points", cg.std_vector.template(lv_point_t), points, modifier=""
338
+ ) as points_var:
339
+ lv.canvas_draw_line(w.obj, points_var.data(), points_var.size(), dsc_addr)
340
+
341
+ return await draw_to_code(
342
+ config, "line", LINE_PROPS, do_draw_line, action_id, template_arg, args
343
+ )
344
+
345
+
346
+ @automation.register_action(
347
+ "lvgl.canvas.draw_polygon",
348
+ ObjUpdateAction,
349
+ cv.Schema(
350
+ {
351
+ cv.GenerateID(CONF_ID): cv.use_id(lv_canvas_t),
352
+ cv.Required(CONF_POINTS): cv.ensure_list(point_schema),
353
+ },
354
+ ).extend({cv.Optional(prop): STYLE_PROPS[prop] for prop in RECT_PROPS}),
355
+ )
356
+ async def canvas_draw_polygon(config, action_id, template_arg, args):
357
+ points = [
358
+ [await process_coord(p[CONF_X]), await process_coord(p[CONF_Y])]
359
+ for p in config[CONF_POINTS]
360
+ ]
361
+
362
+ async def do_draw_polygon(w: Widget, x, y, dsc_addr):
363
+ with LocalVariable(
364
+ "points", cg.std_vector.template(lv_point_t), points, modifier=""
365
+ ) as points_var:
366
+ lv.canvas_draw_polygon(
367
+ w.obj, points_var.data(), points_var.size(), dsc_addr
368
+ )
369
+
370
+ return await draw_to_code(
371
+ config, "rect", RECT_PROPS, do_draw_polygon, action_id, template_arg, args
372
+ )
373
+
374
+
375
+ ARC_PROPS = {
376
+ "width": STYLE_PROPS["arc_width"],
377
+ "color": STYLE_PROPS["arc_color"],
378
+ "rounded": STYLE_PROPS["arc_rounded"],
379
+ }
380
+
381
+
382
+ @automation.register_action(
383
+ "lvgl.canvas.draw_arc",
384
+ ObjUpdateAction,
385
+ DRAW_OPA_SCHEMA.extend(
386
+ {
387
+ cv.Required(CONF_RADIUS): pixels,
388
+ cv.Required(CONF_START_ANGLE): lv_angle,
389
+ cv.Required(CONF_END_ANGLE): lv_angle,
390
+ }
391
+ ).extend({cv.Optional(prop): validator for prop, validator in ARC_PROPS.items()}),
392
+ )
393
+ async def canvas_draw_arc(config, action_id, template_arg, args):
394
+ radius = await size.process(config[CONF_RADIUS])
395
+ start_angle = await lv_angle.process(config[CONF_START_ANGLE])
396
+ end_angle = await lv_angle.process(config[CONF_END_ANGLE])
397
+
398
+ async def do_draw_arc(w: Widget, x, y, dsc_addr):
399
+ lv.canvas_draw_arc(w.obj, x, y, radius, start_angle, end_angle, dsc_addr)
400
+
401
+ return await draw_to_code(
402
+ config, "arc", ARC_PROPS, do_draw_arc, action_id, template_arg, args
403
+ )
@@ -1,11 +1,11 @@
1
- import functools
2
-
3
1
  import esphome.codegen as cg
4
2
  import esphome.config_validation as cv
3
+ from esphome.core import Lambda
5
4
 
6
- from ..defines import CONF_MAIN
7
- from ..lvcode import lv
8
- from ..types import LvType
5
+ from ..defines import CONF_MAIN, CONF_X, CONF_Y, call_lambda
6
+ from ..lvcode import lv_add
7
+ from ..schemas import point_schema
8
+ from ..types import LvCompound, LvType
9
9
  from . import Widget, WidgetType
10
10
 
11
11
  CONF_LINE = "line"
@@ -15,47 +15,37 @@ CONF_POINT_LIST_ID = "point_list_id"
15
15
  lv_point_t = cg.global_ns.struct("lv_point_t")
16
16
 
17
17
 
18
- def point_list(il):
19
- il = cv.string(il)
20
- nl = il.replace(" ", "").split(",")
21
- return [int(n) for n in nl]
22
-
23
-
24
- def cv_point_list(value):
25
- if not isinstance(value, list):
26
- raise cv.Invalid("List of points required")
27
- values = [point_list(v) for v in value]
28
- if not functools.reduce(lambda f, v: f and len(v) == 2, values, True):
29
- raise cv.Invalid("Points must be a list of x,y integer pairs")
30
- return values
31
-
32
-
33
18
  LINE_SCHEMA = {
34
- cv.Required(CONF_POINTS): cv_point_list,
35
- cv.GenerateID(CONF_POINT_LIST_ID): cv.declare_id(lv_point_t),
19
+ cv.Required(CONF_POINTS): cv.ensure_list(point_schema),
36
20
  }
37
21
 
38
- LINE_MODIFY_SCHEMA = {
39
- cv.Optional(CONF_POINTS): cv_point_list,
40
- cv.GenerateID(CONF_POINT_LIST_ID): cv.declare_id(lv_point_t),
41
- }
22
+
23
+ async def process_coord(coord):
24
+ if isinstance(coord, Lambda):
25
+ coord = call_lambda(
26
+ await cg.process_lambda(coord, [], return_type="lv_coord_t")
27
+ )
28
+ if not coord.endswith("()"):
29
+ coord = f"static_cast<lv_coord_t>({coord})"
30
+ return cg.RawExpression(coord)
31
+ return cg.safe_exp(coord)
42
32
 
43
33
 
44
34
  class LineType(WidgetType):
45
35
  def __init__(self):
46
36
  super().__init__(
47
37
  CONF_LINE,
48
- LvType("lv_line_t"),
38
+ LvType("LvLineType", parents=(LvCompound,)),
49
39
  (CONF_MAIN,),
50
40
  LINE_SCHEMA,
51
- modify_schema=LINE_MODIFY_SCHEMA,
52
41
  )
53
42
 
54
43
  async def to_code(self, w: Widget, config):
55
- """For a line object, create and add the points"""
56
- if data := config.get(CONF_POINTS):
57
- points = cg.static_const_array(config[CONF_POINT_LIST_ID], data)
58
- lv.line_set_points(w.obj, points, len(data))
44
+ points = [
45
+ [await process_coord(p[CONF_X]), await process_coord(p[CONF_Y])]
46
+ for p in config[CONF_POINTS]
47
+ ]
48
+ lv_add(w.var.set_points(points))
59
49
 
60
50
 
61
51
  line_spec = LineType()
@@ -1,9 +1,8 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import i2c
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import CONF_ID
5
5
 
6
-
7
6
  DEPENDENCIES = ["i2c"]
8
7
  CODEOWNERS = ["@rnauber"]
9
8
  MULTI_CONF = True
@@ -1,9 +1,8 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import binary_sensor
3
+ import esphome.config_validation as cv
4
4
 
5
- from .. import M5Stack8AngleComponent, m5stack_8angle_ns, CONF_M5STACK_8ANGLE_ID
6
-
5
+ from .. import CONF_M5STACK_8ANGLE_ID, M5Stack8AngleComponent, m5stack_8angle_ns
7
6
 
8
7
  M5Stack8AngleSwitchBinarySensor = m5stack_8angle_ns.class_(
9
8
  "M5Stack8AngleSwitchBinarySensor",
@@ -1,11 +1,9 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import light
4
-
3
+ import esphome.config_validation as cv
5
4
  from esphome.const import CONF_OUTPUT_ID
6
5
 
7
- from .. import M5Stack8AngleComponent, m5stack_8angle_ns, CONF_M5STACK_8ANGLE_ID
8
-
6
+ from .. import CONF_M5STACK_8ANGLE_ID, M5Stack8AngleComponent, m5stack_8angle_ns
9
7
 
10
8
  M5Stack8AngleLightsComponent = m5stack_8angle_ns.class_(
11
9
  "M5Stack8AngleLightOutput",
@@ -1,7 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import sensor
4
-
3
+ import esphome.config_validation as cv
5
4
  from esphome.const import (
6
5
  CONF_BIT_DEPTH,
7
6
  CONF_CHANNEL,
@@ -11,13 +10,12 @@ from esphome.const import (
11
10
  )
12
11
 
13
12
  from .. import (
13
+ CONF_M5STACK_8ANGLE_ID,
14
14
  AnalogBits,
15
15
  M5Stack8AngleComponent,
16
16
  m5stack_8angle_ns,
17
- CONF_M5STACK_8ANGLE_ID,
18
17
  )
19
18
 
20
-
21
19
  M5Stack8AngleKnobSensor = m5stack_8angle_ns.class_(
22
20
  "M5Stack8AngleKnobSensor",
23
21
  sensor.Sensor,
@@ -1,8 +1,9 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import binary_sensor
4
- from esphome.const import CONF_ID, CONF_KEY, CONF_ROW, CONF_COL
5
- from .. import MatrixKeypad, matrix_keypad_ns, CONF_KEYPAD_ID
3
+ import esphome.config_validation as cv
4
+ from esphome.const import CONF_COL, CONF_ID, CONF_KEY, CONF_ROW
5
+
6
+ from .. import CONF_KEYPAD_ID, MatrixKeypad, matrix_keypad_ns
6
7
 
7
8
  DEPENDENCIES = ["matrix_keypad"]
8
9
 
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import sensor, spi
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_REFERENCE_TEMPERATURE,
6
6
  DEVICE_CLASS_TEMPERATURE,
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import sensor, spi
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_MAINS_FILTER,
6
6
  CONF_REFERENCE_RESISTANCE,
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
+ from esphome.components import i2c, sensor
2
3
  import esphome.config_validation as cv
3
- from esphome.components import sensor, i2c
4
4
  from esphome.const import (
5
5
  CONF_ID,
6
6
  CONF_MODE,
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import sensor, spi
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  DEVICE_CLASS_TEMPERATURE,
6
6
  STATE_CLASS_MEASUREMENT,
@@ -1,13 +1,13 @@
1
+ from esphome import automation, pins
1
2
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
- from esphome import pins, automation
4
3
  from esphome.components import i2c
4
+ import esphome.config_validation as cv
5
5
  from esphome.const import (
6
6
  CONF_ID,
7
- CONF_NUMBER,
8
- CONF_MODE,
9
- CONF_INVERTED,
10
7
  CONF_INPUT,
8
+ CONF_INVERTED,
9
+ CONF_MODE,
10
+ CONF_NUMBER,
11
11
  CONF_OUTPUT,
12
12
  CONF_PULLUP,
13
13
  )
@@ -1,8 +1,9 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import output
4
- from esphome.const import CONF_PIN, CONF_ID
5
- from .. import MAX6956, max6956_ns, CONF_MAX6956
3
+ import esphome.config_validation as cv
4
+ from esphome.const import CONF_ID, CONF_PIN
5
+
6
+ from .. import CONF_MAX6956, MAX6956, max6956_ns
6
7
 
7
8
  DEPENDENCIES = ["max6956"]
8
9
 
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import display, spi
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import CONF_ID, CONF_INTENSITY, CONF_LAMBDA, CONF_NUM_CHIPS
5
5
 
6
6
  DEPENDENCIES = ["spi"]
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import display, spi
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import CONF_ID, CONF_INTENSITY, CONF_LAMBDA, CONF_NUM_CHIPS
5
5
 
6
6
  CODEOWNERS = ["@rspaargaren"]
@@ -1,23 +1,23 @@
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
- CONF_ID,
6
- CONF_SHUNT_RESISTANCE,
7
- CONF_GAIN,
8
- CONF_VOLTAGE,
9
5
  CONF_CURRENT,
6
+ CONF_GAIN,
7
+ CONF_ID,
10
8
  CONF_POWER,
9
+ CONF_SHUNT_RESISTANCE,
11
10
  CONF_TEMPERATURE,
12
- UNIT_VOLT,
13
- UNIT_AMPERE,
14
- UNIT_WATT,
15
- UNIT_CELSIUS,
16
- DEVICE_CLASS_VOLTAGE,
11
+ CONF_VOLTAGE,
17
12
  DEVICE_CLASS_CURRENT,
18
13
  DEVICE_CLASS_POWER,
19
14
  DEVICE_CLASS_TEMPERATURE,
15
+ DEVICE_CLASS_VOLTAGE,
20
16
  STATE_CLASS_MEASUREMENT,
17
+ UNIT_AMPERE,
18
+ UNIT_CELSIUS,
19
+ UNIT_VOLT,
20
+ UNIT_WATT,
21
21
  )
22
22
 
23
23
  DEPENDENCIES = ["i2c"]
@@ -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, mcp23x08_base, mcp23xxx_base
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import CONF_ID
5
5
 
6
6
  AUTO_LOAD = ["mcp23x08_base"]