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,6 +1,7 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import spi
3
- from ..ens160_base import to_code_base, cv, CONFIG_SCHEMA_BASE
3
+
4
+ from ..ens160_base import CONFIG_SCHEMA_BASE, cv, to_code_base
4
5
 
5
6
  AUTO_LOAD = ["ens160_base"]
6
7
  CODEOWNERS = ["@latonita"]
@@ -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, sensor
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_HUMIDITY,
6
6
  CONF_ID,
@@ -67,6 +67,7 @@ AUTO_LOAD = ["preferences"]
67
67
  IS_TARGET_PLATFORM = True
68
68
 
69
69
  CONF_RELEASE = "release"
70
+ CONF_ENABLE_IDF_EXPERIMENTAL_FEATURES = "enable_idf_experimental_features"
70
71
 
71
72
 
72
73
  def set_core_data(config):
@@ -273,6 +274,9 @@ SUPPORTED_PLATFORMIO_ESP_IDF_5X = [
273
274
  # pioarduino versions that don't require a release number
274
275
  # List based on https://github.com/pioarduino/esp-idf/releases
275
276
  SUPPORTED_PIOARDUINO_ESP_IDF_5X = [
277
+ cv.Version(5, 4, 1),
278
+ cv.Version(5, 4, 0),
279
+ cv.Version(5, 3, 2),
276
280
  cv.Version(5, 3, 1),
277
281
  cv.Version(5, 3, 0),
278
282
  cv.Version(5, 1, 5),
@@ -503,6 +507,7 @@ ESP_IDF_FRAMEWORK_SCHEMA = cv.All(
503
507
  CONF_IGNORE_EFUSE_CUSTOM_MAC, default=False
504
508
  ): cv.boolean,
505
509
  cv.Optional(CONF_IGNORE_EFUSE_MAC_CRC): cv.boolean,
510
+ cv.Optional(CONF_ENABLE_IDF_EXPERIMENTAL_FEATURES): cv.boolean,
506
511
  }
507
512
  ),
508
513
  cv.Optional(CONF_COMPONENTS, default=[]): cv.ensure_list(
@@ -642,6 +647,11 @@ async def to_code(config):
642
647
  add_idf_sdkconfig_option(
643
648
  "CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE", False
644
649
  )
650
+ if conf[CONF_ADVANCED].get(CONF_ENABLE_IDF_EXPERIMENTAL_FEATURES):
651
+ _LOGGER.warning(
652
+ "Using experimental features in ESP-IDF may result in unexpected failures."
653
+ )
654
+ add_idf_sdkconfig_option("CONFIG_IDF_EXPERIMENTAL_FEATURES", True)
645
655
 
646
656
  cg.add_define(
647
657
  "USE_ESP_IDF_VERSION_CODE",
@@ -1,3 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import MutableMapping
4
+ import logging
5
+ from typing import Any, Callable
6
+
1
7
  from esphome import automation
2
8
  import esphome.codegen as cg
3
9
  from esphome.components import esp32_ble
@@ -29,11 +35,21 @@ from esphome.core import CORE
29
35
  AUTO_LOAD = ["esp32_ble"]
30
36
  DEPENDENCIES = ["esp32"]
31
37
 
38
+ KEY_ESP32_BLE_TRACKER = "esp32_ble_tracker"
39
+ KEY_USED_CONNECTION_SLOTS = "used_connection_slots"
40
+
41
+ CONF_MAX_CONNECTIONS = "max_connections"
32
42
  CONF_ESP32_BLE_ID = "esp32_ble_id"
33
43
  CONF_SCAN_PARAMETERS = "scan_parameters"
34
44
  CONF_WINDOW = "window"
35
45
  CONF_CONTINUOUS = "continuous"
36
46
  CONF_ON_SCAN_END = "on_scan_end"
47
+
48
+ DEFAULT_MAX_CONNECTIONS = 3
49
+ IDF_MAX_CONNECTIONS = 9
50
+
51
+ _LOGGER = logging.getLogger(__name__)
52
+
37
53
  esp32_ble_tracker_ns = cg.esphome_ns.namespace("esp32_ble_tracker")
38
54
  ESP32BLETracker = esp32_ble_tracker_ns.class_(
39
55
  "ESP32BLETracker",
@@ -112,61 +128,126 @@ def as_reversed_hex_array(value):
112
128
  )
113
129
 
114
130
 
115
- CONFIG_SCHEMA = cv.Schema(
116
- {
117
- cv.GenerateID(): cv.declare_id(ESP32BLETracker),
118
- cv.GenerateID(esp32_ble.CONF_BLE_ID): cv.use_id(esp32_ble.ESP32BLE),
119
- cv.Optional(CONF_SCAN_PARAMETERS, default={}): cv.All(
120
- cv.Schema(
131
+ def max_connections() -> int:
132
+ return IDF_MAX_CONNECTIONS if CORE.using_esp_idf else DEFAULT_MAX_CONNECTIONS
133
+
134
+
135
+ def consume_connection_slots(
136
+ value: int, consumer: str
137
+ ) -> Callable[[MutableMapping], MutableMapping]:
138
+ def _consume_connection_slots(config: MutableMapping) -> MutableMapping:
139
+ data: dict[str, Any] = CORE.data.setdefault(KEY_ESP32_BLE_TRACKER, {})
140
+ slots: list[str] = data.setdefault(KEY_USED_CONNECTION_SLOTS, [])
141
+ slots.extend([consumer] * value)
142
+ return config
143
+
144
+ return _consume_connection_slots
145
+
146
+
147
+ CONFIG_SCHEMA = cv.All(
148
+ cv.Schema(
149
+ {
150
+ cv.GenerateID(): cv.declare_id(ESP32BLETracker),
151
+ cv.GenerateID(esp32_ble.CONF_BLE_ID): cv.use_id(esp32_ble.ESP32BLE),
152
+ cv.Optional(CONF_MAX_CONNECTIONS, default=DEFAULT_MAX_CONNECTIONS): cv.All(
153
+ cv.positive_int, cv.Range(min=0, max=max_connections())
154
+ ),
155
+ cv.Optional(CONF_SCAN_PARAMETERS, default={}): cv.All(
156
+ cv.Schema(
157
+ {
158
+ cv.Optional(
159
+ CONF_DURATION, default="5min"
160
+ ): cv.positive_time_period_seconds,
161
+ cv.Optional(
162
+ CONF_INTERVAL, default="320ms"
163
+ ): cv.positive_time_period_milliseconds,
164
+ cv.Optional(
165
+ CONF_WINDOW, default="30ms"
166
+ ): cv.positive_time_period_milliseconds,
167
+ cv.Optional(CONF_ACTIVE, default=True): cv.boolean,
168
+ cv.Optional(CONF_CONTINUOUS, default=True): cv.boolean,
169
+ }
170
+ ),
171
+ validate_scan_parameters,
172
+ ),
173
+ cv.Optional(CONF_ON_BLE_ADVERTISE): automation.validate_automation(
121
174
  {
122
- cv.Optional(
123
- CONF_DURATION, default="5min"
124
- ): cv.positive_time_period_seconds,
125
- cv.Optional(
126
- CONF_INTERVAL, default="320ms"
127
- ): cv.positive_time_period_milliseconds,
128
- cv.Optional(
129
- CONF_WINDOW, default="30ms"
130
- ): cv.positive_time_period_milliseconds,
131
- cv.Optional(CONF_ACTIVE, default=True): cv.boolean,
132
- cv.Optional(CONF_CONTINUOUS, default=True): cv.boolean,
175
+ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
176
+ ESPBTAdvertiseTrigger
177
+ ),
178
+ cv.Optional(CONF_MAC_ADDRESS): cv.ensure_list(cv.mac_address),
133
179
  }
134
180
  ),
135
- validate_scan_parameters,
136
- ),
137
- cv.Optional(CONF_ON_BLE_ADVERTISE): automation.validate_automation(
138
- {
139
- cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ESPBTAdvertiseTrigger),
140
- cv.Optional(CONF_MAC_ADDRESS): cv.ensure_list(cv.mac_address),
141
- }
142
- ),
143
- cv.Optional(CONF_ON_BLE_SERVICE_DATA_ADVERTISE): automation.validate_automation(
144
- {
145
- cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
146
- BLEServiceDataAdvertiseTrigger
147
- ),
148
- cv.Optional(CONF_MAC_ADDRESS): cv.mac_address,
149
- cv.Required(CONF_SERVICE_UUID): bt_uuid,
150
- }
151
- ),
152
- cv.Optional(
153
- CONF_ON_BLE_MANUFACTURER_DATA_ADVERTISE
154
- ): automation.validate_automation(
155
- {
156
- cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
157
- BLEManufacturerDataAdvertiseTrigger
158
- ),
159
- cv.Optional(CONF_MAC_ADDRESS): cv.mac_address,
160
- cv.Required(CONF_MANUFACTURER_ID): bt_uuid,
161
- }
162
- ),
163
- cv.Optional(CONF_ON_SCAN_END): automation.validate_automation(
164
- {cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(BLEEndOfScanTrigger)}
165
- ),
166
- }
167
- ).extend(cv.COMPONENT_SCHEMA)
181
+ cv.Optional(
182
+ CONF_ON_BLE_SERVICE_DATA_ADVERTISE
183
+ ): automation.validate_automation(
184
+ {
185
+ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
186
+ BLEServiceDataAdvertiseTrigger
187
+ ),
188
+ cv.Optional(CONF_MAC_ADDRESS): cv.mac_address,
189
+ cv.Required(CONF_SERVICE_UUID): bt_uuid,
190
+ }
191
+ ),
192
+ cv.Optional(
193
+ CONF_ON_BLE_MANUFACTURER_DATA_ADVERTISE
194
+ ): automation.validate_automation(
195
+ {
196
+ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
197
+ BLEManufacturerDataAdvertiseTrigger
198
+ ),
199
+ cv.Optional(CONF_MAC_ADDRESS): cv.mac_address,
200
+ cv.Required(CONF_MANUFACTURER_ID): bt_uuid,
201
+ }
202
+ ),
203
+ cv.Optional(CONF_ON_SCAN_END): automation.validate_automation(
204
+ {cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(BLEEndOfScanTrigger)}
205
+ ),
206
+ }
207
+ ).extend(cv.COMPONENT_SCHEMA),
208
+ )
209
+
168
210
 
169
- FINAL_VALIDATE_SCHEMA = esp32_ble.validate_variant
211
+ def validate_remaining_connections(config):
212
+ data: dict[str, Any] = CORE.data.get(KEY_ESP32_BLE_TRACKER, {})
213
+ slots: list[str] = data.get(KEY_USED_CONNECTION_SLOTS, [])
214
+ used_slots = len(slots)
215
+ if used_slots <= config[CONF_MAX_CONNECTIONS]:
216
+ return config
217
+ slot_users = ", ".join(slots)
218
+ hard_limit = max_connections()
219
+
220
+ if used_slots < hard_limit:
221
+ _LOGGER.warning(
222
+ "esp32_ble_tracker exceeded `%s`: components attempted to consume %d "
223
+ "connection slot(s) out of available configured maximum %d connection "
224
+ "slot(s); The system automatically increased `%s` to %d to match the "
225
+ "number of used connection slot(s) by components: %s.",
226
+ CONF_MAX_CONNECTIONS,
227
+ used_slots,
228
+ config[CONF_MAX_CONNECTIONS],
229
+ CONF_MAX_CONNECTIONS,
230
+ used_slots,
231
+ slot_users,
232
+ )
233
+ config[CONF_MAX_CONNECTIONS] = used_slots
234
+ return config
235
+
236
+ msg = (
237
+ f"esp32_ble_tracker exceeded `{CONF_MAX_CONNECTIONS}`: "
238
+ f"components attempted to consume {used_slots} connection slot(s) "
239
+ f"out of available configured maximum {config[CONF_MAX_CONNECTIONS]} "
240
+ f"connection slot(s); Decrease the number of BLE clients ({slot_users})"
241
+ )
242
+ if config[CONF_MAX_CONNECTIONS] < hard_limit:
243
+ msg += f" or increase {CONF_MAX_CONNECTIONS}` to {used_slots}"
244
+ msg += f" to stay under the {hard_limit} connection slot(s) limit."
245
+ raise cv.Invalid(msg)
246
+
247
+
248
+ FINAL_VALIDATE_SCHEMA = cv.All(
249
+ validate_remaining_connections, esp32_ble.validate_variant
250
+ )
170
251
 
171
252
  ESP_BLE_DEVICE_SCHEMA = cv.Schema(
172
253
  {
@@ -238,6 +319,9 @@ async def to_code(config):
238
319
  else:
239
320
  add_idf_sdkconfig_option("CONFIG_BTU_TASK_STACK_SIZE", 8192)
240
321
  add_idf_sdkconfig_option("CONFIG_BT_ACL_CONNECTIONS", 9)
322
+ add_idf_sdkconfig_option(
323
+ "CONFIG_BTDM_CTRL_BLE_MAX_CONN", config[CONF_MAX_CONNECTIONS]
324
+ )
241
325
  # CONFIG_BT_GATTC_NOTIF_REG_MAX controls the number of
242
326
  # max notifications in 5.x, setting CONFIG_BT_ACL_CONNECTIONS
243
327
  # is enough in 4.x
@@ -1,23 +1,22 @@
1
+ from esphome import automation, pins
1
2
  import esphome.codegen as cg
3
+ from esphome.components.esp32 import add_idf_component
2
4
  import esphome.config_validation as cv
3
- from esphome import automation
4
- from esphome import pins
5
5
  from esphome.const import (
6
+ CONF_BRIGHTNESS,
7
+ CONF_CONTRAST,
8
+ CONF_DATA_PINS,
6
9
  CONF_FREQUENCY,
7
10
  CONF_ID,
8
11
  CONF_PIN,
9
- CONF_SCL,
10
- CONF_SDA,
11
- CONF_DATA_PINS,
12
12
  CONF_RESET_PIN,
13
13
  CONF_RESOLUTION,
14
- CONF_BRIGHTNESS,
15
- CONF_CONTRAST,
14
+ CONF_SCL,
15
+ CONF_SDA,
16
16
  CONF_TRIGGER_ID,
17
17
  CONF_VSYNC_PIN,
18
18
  )
19
19
  from esphome.core import CORE
20
- from esphome.components.esp32 import add_idf_component
21
20
  from esphome.cpp_helpers import setup_entity
22
21
 
23
22
  DEPENDENCIES = ["esp32"]
@@ -1,6 +1,6 @@
1
- import esphome.config_validation as cv
2
1
  import esphome.codegen as cg
3
- from esphome.const import CONF_ID, CONF_PORT, CONF_MODE
2
+ import esphome.config_validation as cv
3
+ from esphome.const import CONF_ID, CONF_MODE, CONF_PORT
4
4
 
5
5
  CODEOWNERS = ["@ayufan"]
6
6
  DEPENDENCIES = ["esp32_camera"]
@@ -1,3 +1,5 @@
1
+ import math
2
+
1
3
  from esphome import pins
2
4
  import esphome.codegen as cg
3
5
  from esphome.components import canbus
@@ -23,6 +25,8 @@ from esphome.const import (
23
25
  CODEOWNERS = ["@Sympatron"]
24
26
  DEPENDENCIES = ["esp32"]
25
27
 
28
+ CONF_TX_ENQUEUE_TIMEOUT = "tx_enqueue_timeout"
29
+
26
30
  esp32_can_ns = cg.esphome_ns.namespace("esp32_can")
27
31
  esp32_can = esp32_can_ns.class_("ESP32Can", CanbusComponent)
28
32
 
@@ -84,10 +88,20 @@ CONFIG_SCHEMA = canbus.CANBUS_SCHEMA.extend(
84
88
  cv.Required(CONF_TX_PIN): pins.internal_gpio_output_pin_number,
85
89
  cv.Optional(CONF_RX_QUEUE_LEN): cv.uint32_t,
86
90
  cv.Optional(CONF_TX_QUEUE_LEN): cv.uint32_t,
91
+ cv.Optional(CONF_TX_ENQUEUE_TIMEOUT): cv.positive_time_period_milliseconds,
87
92
  }
88
93
  )
89
94
 
90
95
 
96
+ def get_default_tx_enqueue_timeout(bit_rate):
97
+ bit_rate_numeric = canbus.get_rate(bit_rate)
98
+ bits_per_packet = 140 # ~max CAN message length
99
+ ms_per_packet = bits_per_packet / bit_rate_numeric * 1000
100
+ return int(
101
+ max(min(math.ceil(10 * ms_per_packet), 1000), 1)
102
+ ) # ~10 packet lengths, min 1ms, max 1000ms
103
+
104
+
91
105
  async def to_code(config):
92
106
  var = cg.new_Pvariable(config[CONF_ID])
93
107
  await canbus.register_canbus(var, config)
@@ -98,3 +112,10 @@ async def to_code(config):
98
112
  cg.add(var.set_rx_queue_len(rx_queue_len))
99
113
  if (tx_queue_len := config.get(CONF_TX_QUEUE_LEN)) is not None:
100
114
  cg.add(var.set_tx_queue_len(tx_queue_len))
115
+
116
+ if CONF_TX_ENQUEUE_TIMEOUT in config:
117
+ tx_enqueue_timeout_ms = config[CONF_TX_ENQUEUE_TIMEOUT].total_milliseconds
118
+ else:
119
+ tx_enqueue_timeout_ms = get_default_tx_enqueue_timeout(config[CONF_BIT_RATE])
120
+
121
+ cg.add(var.set_tx_enqueue_timeout_ms(tx_enqueue_timeout_ms))
@@ -124,7 +124,7 @@ canbus::Error ESP32Can::send_message(struct canbus::CanFrame *frame) {
124
124
  memcpy(message.data, frame->data, frame->can_data_length_code);
125
125
  }
126
126
 
127
- if (twai_transmit(&message, pdMS_TO_TICKS(1000)) == ESP_OK) {
127
+ if (twai_transmit(&message, this->tx_enqueue_timeout_ticks_) == ESP_OK) {
128
128
  return canbus::ERROR_OK;
129
129
  } else {
130
130
  return canbus::ERROR_ALLTXBUSY;
@@ -14,6 +14,9 @@ class ESP32Can : public canbus::Canbus {
14
14
  void set_tx(int tx) { tx_ = tx; }
15
15
  void set_tx_queue_len(uint32_t tx_queue_len) { this->tx_queue_len_ = tx_queue_len; }
16
16
  void set_rx_queue_len(uint32_t rx_queue_len) { this->rx_queue_len_ = rx_queue_len; }
17
+ void set_tx_enqueue_timeout_ms(uint32_t tx_enqueue_timeout_ms) {
18
+ this->tx_enqueue_timeout_ticks_ = pdMS_TO_TICKS(tx_enqueue_timeout_ms);
19
+ }
17
20
  ESP32Can(){};
18
21
 
19
22
  protected:
@@ -23,6 +26,7 @@ class ESP32Can : public canbus::Canbus {
23
26
 
24
27
  int rx_{-1};
25
28
  int tx_{-1};
29
+ TickType_t tx_enqueue_timeout_ticks_{};
26
30
  optional<uint32_t> tx_queue_len_{};
27
31
  optional<uint32_t> rx_queue_len_{};
28
32
  };
@@ -1,9 +1,9 @@
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 output
5
4
  from esphome.components.esp32 import get_esp32_variant
6
5
  from esphome.components.esp32.const import VARIANT_ESP32, VARIANT_ESP32S2
6
+ import esphome.config_validation as cv
7
7
  from esphome.const import CONF_ID, CONF_NUMBER, CONF_PIN
8
8
 
9
9
  DEPENDENCIES = ["esp32"]
@@ -1,11 +1,7 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import sensor
4
- from esphome.const import (
5
- STATE_CLASS_MEASUREMENT,
6
- UNIT_MICROTESLA,
7
- ICON_MAGNET,
8
- )
3
+ import esphome.config_validation as cv
4
+ from esphome.const import ICON_MAGNET, STATE_CLASS_MEASUREMENT, UNIT_MICROTESLA
9
5
 
10
6
  DEPENDENCIES = ["esp32"]
11
7
 
@@ -1,4 +1,11 @@
1
1
  import esphome.codegen as cg
2
+ from esphome.components import esp32
3
+ from esphome.components.esp32 import get_esp32_variant, gpio
4
+ from esphome.components.esp32.const import (
5
+ VARIANT_ESP32,
6
+ VARIANT_ESP32S2,
7
+ VARIANT_ESP32S3,
8
+ )
2
9
  import esphome.config_validation as cv
3
10
  from esphome.const import (
4
11
  CONF_HIGH_VOLTAGE_REFERENCE,
@@ -11,13 +18,6 @@ from esphome.const import (
11
18
  CONF_VOLTAGE_ATTENUATION,
12
19
  )
13
20
  from esphome.core import TimePeriod
14
- from esphome.components import esp32
15
- from esphome.components.esp32 import get_esp32_variant, gpio
16
- from esphome.components.esp32.const import (
17
- VARIANT_ESP32,
18
- VARIANT_ESP32S2,
19
- VARIANT_ESP32S3,
20
- )
21
21
 
22
22
  AUTO_LOAD = ["binary_sensor"]
23
23
  DEPENDENCIES = ["esp32"]
@@ -1,12 +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 (
5
- CONF_PIN,
6
- CONF_THRESHOLD,
7
- CONF_ID,
8
- )
9
- from . import esp32_touch_ns, ESP32TouchComponent, validate_touch_pad
3
+ import esphome.config_validation as cv
4
+ from esphome.const import CONF_ID, CONF_PIN, CONF_THRESHOLD
5
+
6
+ from . import ESP32TouchComponent, esp32_touch_ns, validate_touch_pad
10
7
 
11
8
  DEPENDENCIES = ["esp32_touch", "esp32"]
12
9
 
@@ -1,13 +1,8 @@
1
- from esphome import pins, automation
1
+ from esphome import automation, pins
2
+ import esphome.codegen as cg
2
3
  from esphome.components import output
3
4
  import esphome.config_validation as cv
4
- import esphome.codegen as cg
5
- from esphome.const import (
6
- CONF_FREQUENCY,
7
- CONF_ID,
8
- CONF_NUMBER,
9
- CONF_PIN,
10
- )
5
+ from esphome.const import CONF_FREQUENCY, CONF_ID, CONF_NUMBER, CONF_PIN
11
6
 
12
7
  DEPENDENCIES = ["esp8266"]
13
8
 
@@ -1,4 +1,5 @@
1
1
  import logging
2
+
2
3
  from esphome import pins
3
4
  import esphome.codegen as cg
4
5
  from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant
@@ -580,7 +580,7 @@ void EthernetComponent::get_eth_mac_address_raw(uint8_t *mac) {
580
580
 
581
581
  std::string EthernetComponent::get_eth_mac_address_pretty() {
582
582
  uint8_t mac[6];
583
- get_mac_address_raw(mac);
583
+ get_eth_mac_address_raw(mac);
584
584
  return str_snprintf("%02X:%02X:%02X:%02X:%02X:%02X", 17, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
585
585
  }
586
586
 
@@ -62,6 +62,7 @@ class DNSAddressEthernetInfo : public PollingComponent, public text_sensor::Text
62
62
  class MACAddressEthernetInfo : public Component, public text_sensor::TextSensor {
63
63
  public:
64
64
  void setup() override { this->publish_state(ethernet::global_eth_component->get_eth_mac_address_pretty()); }
65
+ float get_setup_priority() const override { return setup_priority::ETHERNET; }
65
66
  std::string unique_id() override { return get_mac_address() + "-ethernetinfo-mac"; }
66
67
  void dump_config() override;
67
68
  };
@@ -1,7 +1,7 @@
1
- import esphome.codegen as cg
2
1
  from esphome import automation
3
- import esphome.config_validation as cv
2
+ import esphome.codegen as cg
4
3
  from esphome.components import esp32_ble_tracker
4
+ import esphome.config_validation as cv
5
5
  from esphome.const import CONF_TRIGGER_ID
6
6
 
7
7
  CODEOWNERS = ["@OttoWinter"]
@@ -1,8 +1,8 @@
1
1
  import logging
2
2
  from pathlib import Path
3
3
 
4
- import esphome.config_validation as cv
5
4
  from esphome import git, loader
5
+ import esphome.config_validation as cv
6
6
  from esphome.const import (
7
7
  CONF_COMPONENTS,
8
8
  CONF_EXTERNAL_COMPONENTS,
@@ -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 i2c, sensor
4
+ import esphome.config_validation as cv
5
5
  from esphome.const import CONF_ID, CONF_TRIGGER_ID
6
6
 
7
7
  CODEOWNERS = ["@ssieb"]
@@ -1,15 +1,15 @@
1
+ from esphome import automation
2
+ from esphome.automation import maybe_simple_id
1
3
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
4
  from esphome.components import i2c
5
+ import esphome.config_validation as cv
4
6
  from esphome.const import (
5
7
  CONF_ADDRESS,
6
8
  CONF_COMMAND,
7
- CONF_ID,
8
9
  CONF_DURATION,
10
+ CONF_ID,
9
11
  CONF_VOLUME,
10
12
  )
11
- from esphome import automation
12
- from esphome.automation import maybe_simple_id
13
13
 
14
14
  CODEOWNERS = ["@carlos-sarmiento"]
15
15
  DEPENDENCIES = ["i2c"]
@@ -1,11 +1,11 @@
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
  from esphome.const import (
5
- ENTITY_CATEGORY_NONE,
6
- DEVICE_CLASS_RUNNING,
7
- DEVICE_CLASS_EMPTY,
8
5
  CONF_ID,
6
+ DEVICE_CLASS_EMPTY,
7
+ DEVICE_CLASS_RUNNING,
8
+ ENTITY_CATEGORY_NONE,
9
9
  )
10
10
 
11
11
  from . import EzoPMP
@@ -1,20 +1,19 @@
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
- ENTITY_CATEGORY_DIAGNOSTIC,
6
- ENTITY_CATEGORY_NONE,
5
+ CONF_ID,
7
6
  DEVICE_CLASS_EMPTY,
8
7
  DEVICE_CLASS_VOLTAGE,
8
+ ENTITY_CATEGORY_DIAGNOSTIC,
9
+ ENTITY_CATEGORY_NONE,
9
10
  STATE_CLASS_MEASUREMENT,
10
11
  STATE_CLASS_NONE,
11
- CONF_ID,
12
12
  UNIT_VOLT,
13
13
  )
14
14
 
15
15
  from . import EzoPMP
16
16
 
17
-
18
17
  DEPENDENCIES = ["ezo_pmp"]
19
18
 
20
19
  CONF_CURRENT_VOLUME_DOSED = "current_volume_dosed"
@@ -1,11 +1,7 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import text_sensor
4
- from esphome.const import (
5
- ENTITY_CATEGORY_NONE,
6
- ENTITY_CATEGORY_DIAGNOSTIC,
7
- CONF_ID,
8
- )
3
+ import esphome.config_validation as cv
4
+ from esphome.const import CONF_ID, ENTITY_CATEGORY_DIAGNOSTIC, ENTITY_CATEGORY_NONE
9
5
 
10
6
  from . import EzoPMP
11
7
 
@@ -1,12 +1,13 @@
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,
7
7
  ENTITY_CATEGORY_CONFIG,
8
8
  ICON_RESTART_ALERT,
9
9
  )
10
+
10
11
  from .. import factory_reset_ns
11
12
 
12
13
  FactoryResetButton = factory_reset_ns.class_(
@@ -1,14 +1,15 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import switch
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
5
  CONF_ENTITY_CATEGORY,
6
+ CONF_ICON,
6
7
  CONF_ID,
7
8
  CONF_INVERTED,
8
- CONF_ICON,
9
9
  ENTITY_CATEGORY_CONFIG,
10
10
  ICON_RESTART_ALERT,
11
11
  )
12
+
12
13
  from .. import factory_reset_ns
13
14
 
14
15
  FactoryResetSwitch = factory_reset_ns.class_(
@@ -1,11 +1,11 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import light
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import (
5
- CONF_OUTPUT_ID,
5
+ CONF_MAX_REFRESH_RATE,
6
6
  CONF_NUM_LEDS,
7
+ CONF_OUTPUT_ID,
7
8
  CONF_RGB_ORDER,
8
- CONF_MAX_REFRESH_RATE,
9
9
  )
10
10
 
11
11
  CODEOWNERS = ["@OttoWinter"]