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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (720) hide show
  1. esphome/__main__.py +20 -14
  2. esphome/components/a4988/a4988.cpp +1 -1
  3. esphome/components/absolute_humidity/absolute_humidity.cpp +6 -4
  4. esphome/components/ac_dimmer/ac_dimmer.cpp +4 -2
  5. esphome/components/adc/adc_sensor_esp32.cpp +5 -3
  6. esphome/components/adc/adc_sensor_esp8266.cpp +5 -3
  7. esphome/components/adc/adc_sensor_libretiny.cpp +5 -3
  8. esphome/components/adc/adc_sensor_rp2040.cpp +5 -3
  9. esphome/components/adc128s102/adc128s102.cpp +1 -1
  10. esphome/components/ade7880/ade7880.cpp +28 -17
  11. esphome/components/ade7953_base/ade7953_base.cpp +12 -9
  12. esphome/components/ade7953_i2c/ade7953_i2c.cpp +1 -1
  13. esphome/components/ade7953_spi/ade7953_spi.cpp +1 -1
  14. esphome/components/ads1115/ads1115.cpp +3 -5
  15. esphome/components/ads1118/ads1118.cpp +2 -1
  16. esphome/components/ags10/ags10.cpp +3 -2
  17. esphome/components/aht10/aht10.cpp +27 -29
  18. esphome/components/aic3204/aic3204.cpp +2 -2
  19. esphome/components/alarm_control_panel/__init__.py +1 -0
  20. esphome/components/am2315c/am2315c.cpp +2 -2
  21. esphome/components/am2320/am2320.cpp +2 -2
  22. esphome/components/am43/am43_base.h +1 -1
  23. esphome/components/am43/cover/am43_cover.cpp +4 -2
  24. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +4 -2
  25. esphome/components/apds9306/apds9306.cpp +8 -5
  26. esphome/components/apds9960/apds9960.cpp +2 -2
  27. esphome/components/api/__init__.py +5 -0
  28. esphome/components/api/api_connection.cpp +712 -358
  29. esphome/components/api/api_connection.h +343 -284
  30. esphome/components/api/api_frame_helper.cpp +349 -344
  31. esphome/components/api/api_frame_helper.h +121 -94
  32. esphome/components/api/api_pb2.cpp +2 -0
  33. esphome/components/api/api_pb2.h +637 -1
  34. esphome/components/api/api_pb2_service.cpp +12 -688
  35. esphome/components/api/api_pb2_service.h +53 -207
  36. esphome/components/api/api_server.cpp +71 -29
  37. esphome/components/api/api_server.h +9 -0
  38. esphome/components/api/client.py +5 -2
  39. esphome/components/api/homeassistant_service.h +1 -1
  40. esphome/components/api/list_entities.cpp +1 -1
  41. esphome/components/api/proto.cpp +1 -0
  42. esphome/components/api/proto.h +4 -3
  43. esphome/components/api/subscribe_state.cpp +8 -16
  44. esphome/components/as3935/as3935.cpp +3 -3
  45. esphome/components/as5600/as5600.cpp +9 -7
  46. esphome/components/as7341/as7341.cpp +7 -5
  47. esphome/components/at581x/at581x.cpp +13 -10
  48. esphome/components/atm90e26/atm90e26.cpp +2 -2
  49. esphome/components/atm90e32/atm90e32.cpp +3 -3
  50. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +5 -3
  51. esphome/components/bang_bang/bang_bang_climate.cpp +8 -5
  52. esphome/components/bedjet/bedjet_hub.cpp +6 -4
  53. esphome/components/beken_spi_led_strip/led_strip.cpp +11 -7
  54. esphome/components/bh1750/bh1750.cpp +2 -2
  55. esphome/components/binary_sensor/__init__.py +1 -0
  56. esphome/components/binary_sensor/automation.cpp +1 -2
  57. esphome/components/bl0906/bl0906.cpp +1 -1
  58. esphome/components/bl0942/bl0942.cpp +11 -8
  59. esphome/components/bl0942/sensor.py +1 -1
  60. esphome/components/ble_client/__init__.py +5 -1
  61. esphome/components/ble_client/output/ble_binary_output.cpp +6 -3
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +9 -6
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +8 -5
  64. esphome/components/bluetooth_proxy/__init__.py +5 -1
  65. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -5
  66. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -14
  67. esphome/components/bme280_base/bme280_base.cpp +3 -3
  68. esphome/components/bme680/bme680.cpp +3 -3
  69. esphome/components/bme680/sensor.py +2 -2
  70. esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
  71. esphome/components/bme680_bsec/sensor.py +7 -3
  72. esphome/components/bme68x_bsec2/__init__.py +6 -5
  73. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
  74. esphome/components/bme68x_bsec2/sensor.py +4 -4
  75. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
  76. esphome/components/bmi160/bmi160.cpp +11 -11
  77. esphome/components/bmp085/bmp085.cpp +2 -2
  78. esphome/components/bmp280_base/bmp280_base.cpp +3 -3
  79. esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
  80. esphome/components/bmp581/bmp581.cpp +33 -27
  81. esphome/components/bp1658cj/bp1658cj.cpp +5 -3
  82. esphome/components/bp5758d/bp5758d.cpp +1 -1
  83. esphome/components/button/__init__.py +1 -0
  84. esphome/components/canbus/canbus.cpp +1 -1
  85. esphome/components/cap1188/cap1188.cpp +6 -4
  86. esphome/components/captive_portal/captive_portal.cpp +1 -1
  87. esphome/components/ccs811/ccs811.cpp +3 -2
  88. esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
  89. esphome/components/ch422g/ch422g.cpp +2 -2
  90. esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
  91. esphome/components/climate/__init__.py +1 -0
  92. esphome/components/climate/climate.cpp +12 -7
  93. esphome/components/climate/climate.h +1 -1
  94. esphome/components/climate_ir/climate_ir.cpp +7 -4
  95. esphome/components/cm1106/__init__.py +1 -0
  96. esphome/components/cm1106/cm1106.cpp +112 -0
  97. esphome/components/cm1106/cm1106.h +40 -0
  98. esphome/components/cm1106/sensor.py +72 -0
  99. esphome/components/const/__init__.py +1 -0
  100. esphome/components/cover/__init__.py +1 -0
  101. esphome/components/cs5460a/cs5460a.cpp +16 -11
  102. esphome/components/cse7761/cse7761.cpp +2 -2
  103. esphome/components/cse7766/cse7766.cpp +0 -5
  104. esphome/components/cse7766/cse7766.h +5 -1
  105. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
  106. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
  107. esphome/components/current_based/current_based_cover.cpp +4 -2
  108. esphome/components/dac7678/dac7678_output.cpp +4 -4
  109. esphome/components/dallas_temp/dallas_temp.cpp +2 -3
  110. esphome/components/daly_bms/daly_bms.cpp +2 -1
  111. esphome/components/dashboard_import/__init__.py +1 -2
  112. esphome/components/datetime/__init__.py +3 -1
  113. esphome/components/debug/debug_component.cpp +1 -5
  114. esphome/components/debug/debug_component.h +1 -1
  115. esphome/components/debug/debug_esp32.cpp +4 -2
  116. esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
  117. esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
  118. esphome/components/demo/__init__.py +206 -0
  119. esphome/components/demo/demo_alarm_control_panel.h +65 -0
  120. esphome/components/demo/demo_button.h +15 -0
  121. esphome/components/demo/demo_date.h +34 -0
  122. esphome/components/demo/demo_datetime.h +40 -0
  123. esphome/components/demo/demo_lock.h +17 -0
  124. esphome/components/demo/demo_select.h +15 -0
  125. esphome/components/demo/demo_text.h +18 -0
  126. esphome/components/demo/demo_time.h +34 -0
  127. esphome/components/demo/demo_valve.h +54 -0
  128. esphome/components/dfrobot_sen0395/commands.cpp +3 -3
  129. esphome/components/dht/dht.cpp +29 -50
  130. esphome/components/dht12/dht12.cpp +2 -2
  131. esphome/components/display/display.h +5 -3
  132. esphome/components/dps310/dps310.cpp +7 -5
  133. esphome/components/ds1307/ds1307.cpp +2 -2
  134. esphome/components/dsmr/dsmr.cpp +5 -3
  135. esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
  136. esphome/components/duty_time/duty_time_sensor.cpp +5 -3
  137. esphome/components/ee895/ee895.cpp +3 -3
  138. esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
  139. esphome/components/emc2101/emc2101.cpp +11 -9
  140. esphome/components/ens160_base/ens160_base.cpp +2 -2
  141. esphome/components/ens210/ens210.cpp +2 -2
  142. esphome/components/es7210/es7210.cpp +6 -4
  143. esphome/components/es7243e/es7243e.cpp +1 -1
  144. esphome/components/es8156/es8156.cpp +1 -1
  145. esphome/components/es8311/es8311.cpp +8 -6
  146. esphome/components/es8388/__init__.py +0 -0
  147. esphome/components/es8388/audio_dac.py +26 -0
  148. esphome/components/es8388/es8388.cpp +289 -0
  149. esphome/components/es8388/es8388.h +81 -0
  150. esphome/components/es8388/es8388_const.h +83 -0
  151. esphome/components/es8388/select/__init__.py +47 -0
  152. esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
  153. esphome/components/es8388/select/adc_input_mic_select.h +15 -0
  154. esphome/components/es8388/select/dac_output_select.cpp +12 -0
  155. esphome/components/es8388/select/dac_output_select.h +15 -0
  156. esphome/components/esp32/__init__.py +88 -20
  157. esphome/components/esp32/boards.py +208 -125
  158. esphome/components/esp32/const.py +6 -0
  159. esphome/components/esp32/gpio.py +14 -1
  160. esphome/components/esp32/gpio_esp32_c5.py +45 -0
  161. esphome/components/esp32/gpio_esp32_p4.py +43 -0
  162. esphome/components/esp32/preferences.cpp +7 -7
  163. esphome/components/esp32_ble/__init__.py +115 -0
  164. esphome/components/esp32_ble/ble.cpp +11 -9
  165. esphome/components/esp32_ble/ble_uuid.h +1 -1
  166. esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
  167. esphome/components/esp32_ble_server/__init__.py +4 -1
  168. esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
  169. esphome/components/esp32_ble_server/ble_server.h +0 -1
  170. esphome/components/esp32_ble_tracker/__init__.py +6 -2
  171. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +12 -9
  172. esphome/components/esp32_camera/esp32_camera.cpp +35 -27
  173. esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
  174. esphome/components/esp32_dac/esp32_dac.cpp +2 -2
  175. esphome/components/esp32_improv/__init__.py +5 -1
  176. esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
  177. esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
  178. esphome/components/esp32_rmt_led_strip/light.py +5 -1
  179. esphome/components/esp32_touch/esp32_touch.cpp +12 -8
  180. esphome/components/esp8266/gpio.cpp +10 -1
  181. esphome/components/esp8266/preferences.cpp +6 -6
  182. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  183. esphome/components/esp_ldo/__init__.py +91 -0
  184. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  185. esphome/components/esp_ldo/esp_ldo.h +43 -0
  186. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  187. esphome/components/ethernet/ethernet_component.cpp +38 -26
  188. esphome/components/ethernet/ethernet_component.h +1 -1
  189. esphome/components/event/__init__.py +1 -0
  190. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  191. esphome/components/ezo/ezo.cpp +1 -1
  192. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  193. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  194. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  195. esphome/components/fan/__init__.py +1 -0
  196. esphome/components/fan/fan.cpp +4 -2
  197. esphome/components/fastled_base/fastled_light.cpp +7 -5
  198. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  199. esphome/components/fs3000/fs3000.cpp +1 -1
  200. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  201. esphome/components/ft63x6/ft63x6.cpp +5 -3
  202. esphome/components/gcja5/gcja5.cpp +0 -12
  203. esphome/components/gcja5/gcja5.h +8 -3
  204. esphome/components/gdk101/gdk101.cpp +2 -2
  205. esphome/components/globals/globals_component.h +13 -10
  206. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  207. esphome/components/gp8403/gp8403.cpp +4 -2
  208. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  209. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  210. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  211. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  212. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  213. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  214. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  215. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  216. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  217. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  218. esphome/components/haier/haier_base.cpp +2 -2
  219. esphome/components/haier/hon_climate.cpp +13 -6
  220. esphome/components/havells_solar/havells_solar.cpp +5 -2
  221. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  222. esphome/components/hdc1080/hdc1080.cpp +2 -2
  223. esphome/components/he60r/he60r.cpp +4 -2
  224. esphome/components/hlw8012/hlw8012.cpp +6 -4
  225. esphome/components/hm3301/hm3301.cpp +2 -2
  226. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  227. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  228. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  229. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  230. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  231. esphome/components/hte501/hte501.cpp +3 -2
  232. esphome/components/http_request/__init__.py +2 -2
  233. esphome/components/http_request/http_request.cpp +7 -5
  234. esphome/components/http_request/http_request_idf.cpp +4 -2
  235. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  236. esphome/components/htu21d/htu21d.cpp +2 -2
  237. esphome/components/htu31d/htu31d.cpp +2 -2
  238. esphome/components/hx711/hx711.cpp +2 -2
  239. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  240. esphome/components/hyt271/hyt271.cpp +2 -2
  241. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  242. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  243. esphome/components/i2s_audio/__init__.py +2 -0
  244. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  245. esphome/components/i2s_audio/i2s_audio.h +1 -1
  246. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  247. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  248. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +54 -64
  249. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -0
  250. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
  251. esphome/components/iaqcore/iaqcore.cpp +3 -3
  252. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  253. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  254. esphome/components/image/image.cpp +1 -0
  255. esphome/components/ina219/ina219.cpp +2 -2
  256. esphome/components/ina226/ina226.cpp +8 -5
  257. esphome/components/ina260/ina260.cpp +1 -1
  258. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  259. esphome/components/ina3221/ina3221.cpp +2 -2
  260. esphome/components/inkplate6/display.py +12 -2
  261. esphome/components/inkplate6/inkplate.cpp +13 -9
  262. esphome/components/inkplate6/inkplate.h +7 -6
  263. esphome/components/integration/integration_sensor.cpp +1 -1
  264. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  265. esphome/components/json/json_util.cpp +4 -5
  266. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  267. esphome/components/key_collector/key_collector.cpp +4 -2
  268. esphome/components/kmeteriso/kmeteriso.cpp +2 -1
  269. esphome/components/kuntze/kuntze.cpp +4 -2
  270. esphome/components/lc709203f/__init__.py +1 -0
  271. esphome/components/lc709203f/lc709203f.cpp +299 -0
  272. esphome/components/lc709203f/lc709203f.h +55 -0
  273. esphome/components/lc709203f/sensor.py +93 -0
  274. esphome/components/lcd_base/lcd_display.cpp +2 -2
  275. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  276. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  277. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  278. esphome/components/ld2410/ld2410.cpp +6 -7
  279. esphome/components/ld2420/ld2420.cpp +9 -7
  280. esphome/components/ld2450/ld2450.cpp +6 -4
  281. esphome/components/ld2450/sensor.py +2 -2
  282. esphome/components/ledc/ledc_output.cpp +32 -28
  283. esphome/components/libretiny/const.py +1 -1
  284. esphome/components/libretiny/preferences.cpp +6 -7
  285. esphome/components/light/__init__.py +2 -1
  286. esphome/components/light/esp_hsv_color.h +1 -1
  287. esphome/components/light/light_state.cpp +9 -5
  288. esphome/components/light/light_transformer.h +1 -1
  289. esphome/components/lightwaverf/LwTx.cpp +1 -1
  290. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  291. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  292. esphome/components/lock/__init__.py +1 -0
  293. esphome/components/lock/lock.h +1 -1
  294. esphome/components/logger/__init__.py +6 -0
  295. esphome/components/logger/logger.cpp +9 -5
  296. esphome/components/logger/logger.h +4 -4
  297. esphome/components/logger/logger_esp32.cpp +5 -5
  298. esphome/components/ltr390/ltr390.cpp +8 -5
  299. esphome/components/ltr501/ltr501.cpp +19 -14
  300. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  301. esphome/components/lvgl/__init__.py +2 -2
  302. esphome/components/lvgl/automation.py +5 -4
  303. esphome/components/lvgl/defines.py +0 -2
  304. esphome/components/lvgl/lv_validation.py +1 -3
  305. esphome/components/lvgl/lvcode.py +7 -8
  306. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  307. esphome/components/lvgl/schemas.py +22 -23
  308. esphome/components/lvgl/trigger.py +8 -3
  309. esphome/components/lvgl/widgets/__init__.py +2 -2
  310. esphome/components/lvgl/widgets/canvas.py +9 -3
  311. esphome/components/lvgl/widgets/line.py +2 -1
  312. esphome/components/lvgl/widgets/tabview.py +7 -0
  313. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  314. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  315. esphome/components/max17043/max17043.cpp +2 -2
  316. esphome/components/max31855/max31855.cpp +2 -1
  317. esphome/components/max31856/max31856.cpp +9 -11
  318. esphome/components/max31865/max31865.cpp +6 -4
  319. esphome/components/max44009/max44009.cpp +2 -2
  320. esphome/components/max6675/max6675.cpp +1 -1
  321. esphome/components/max6956/max6956.cpp +5 -3
  322. esphome/components/max7219/max7219.cpp +8 -6
  323. esphome/components/max7219digit/automation.h +52 -0
  324. esphome/components/max7219digit/display.py +93 -1
  325. esphome/components/max7219digit/max7219digit.cpp +16 -13
  326. esphome/components/max9611/max9611.cpp +9 -6
  327. esphome/components/mcp23008/mcp23008.cpp +1 -1
  328. esphome/components/mcp23016/mcp23016.cpp +1 -1
  329. esphome/components/mcp23017/mcp23017.cpp +1 -1
  330. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  331. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  332. esphome/components/mcp3008/mcp3008.cpp +1 -1
  333. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  334. esphome/components/mcp3204/mcp3204.cpp +1 -1
  335. esphome/components/mcp4461/mcp4461.cpp +2 -2
  336. esphome/components/mcp4725/mcp4725.cpp +2 -2
  337. esphome/components/mcp4728/mcp4728.cpp +2 -2
  338. esphome/components/mcp9600/mcp9600.cpp +1 -1
  339. esphome/components/mcp9808/mcp9808.cpp +4 -4
  340. esphome/components/mdns/mdns_component.cpp +8 -2
  341. esphome/components/mdns/mdns_component.h +3 -1
  342. esphome/components/mdns/mdns_esp32.cpp +2 -2
  343. esphome/components/media_player/__init__.py +1 -0
  344. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  345. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  346. esphome/components/micronova/micronova.h +2 -2
  347. esphome/components/mics_4514/mics_4514.cpp +2 -2
  348. esphome/components/midea/air_conditioner.cpp +7 -5
  349. esphome/components/midea_ir/midea_ir.cpp +1 -1
  350. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  351. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  352. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  353. esphome/components/mlx90614/mlx90614.cpp +4 -3
  354. esphome/components/mmc5603/mmc5603.cpp +2 -2
  355. esphome/components/mmc5983/mmc5983.cpp +1 -1
  356. esphome/components/modbus/modbus.cpp +7 -5
  357. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  358. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  359. esphome/components/modbus_controller/switch/__init__.py +6 -2
  360. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  361. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  362. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  363. esphome/components/mpr121/mpr121.cpp +2 -2
  364. esphome/components/mpu6050/mpu6050.cpp +6 -6
  365. esphome/components/mpu6886/mpu6886.cpp +6 -6
  366. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  367. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  368. esphome/components/mqtt/mqtt_client.cpp +31 -24
  369. esphome/components/mqtt/mqtt_component.cpp +2 -2
  370. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  371. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  372. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  373. esphome/components/ms5611/ms5611.cpp +2 -2
  374. esphome/components/ms8607/ms8607.cpp +2 -2
  375. esphome/components/msa3xx/msa3xx.cpp +16 -12
  376. esphome/components/my9231/my9231.cpp +7 -5
  377. esphome/components/nau7802/nau7802.cpp +6 -4
  378. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  379. esphome/components/network/ip_address.h +1 -1
  380. esphome/components/network/util.cpp +13 -0
  381. esphome/components/nextion/base_component.py +2 -0
  382. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +2 -3
  383. esphome/components/nextion/display.py +34 -22
  384. esphome/components/nextion/nextion.cpp +182 -143
  385. esphome/components/nextion/nextion.h +36 -0
  386. esphome/components/nextion/nextion_commands.cpp +3 -3
  387. esphome/components/nextion/nextion_upload_arduino.cpp +58 -61
  388. esphome/components/nextion/nextion_upload_idf.cpp +69 -72
  389. esphome/components/nextion/sensor/nextion_sensor.cpp +4 -4
  390. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  391. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +2 -2
  392. esphome/components/nfc/nci_message.h +1 -1
  393. esphome/components/nfc/ndef_record.h +1 -1
  394. esphome/components/nfc/ndef_record_text.h +1 -1
  395. esphome/components/nfc/ndef_record_uri.h +1 -1
  396. esphome/components/nfc/nfc.h +1 -1
  397. esphome/components/nfc/nfc_tag.h +1 -1
  398. esphome/components/noblex/noblex.cpp +1 -1
  399. esphome/components/npi19/npi19.cpp +5 -7
  400. esphome/components/number/__init__.py +11 -0
  401. esphome/components/online_image/__init__.py +13 -1
  402. esphome/components/online_image/online_image.cpp +26 -4
  403. esphome/components/online_image/online_image.h +21 -4
  404. esphome/components/opentherm/generate.py +3 -3
  405. esphome/components/opentherm/hub.cpp +11 -7
  406. esphome/components/opentherm/number/number.cpp +5 -3
  407. esphome/components/opentherm/opentherm.h +1 -1
  408. esphome/components/opentherm/schema.py +13 -13
  409. esphome/components/opentherm/validate.py +1 -1
  410. esphome/components/openthread/__init__.py +146 -0
  411. esphome/components/openthread/const.py +10 -0
  412. esphome/components/openthread/openthread.cpp +206 -0
  413. esphome/components/openthread/openthread.h +68 -0
  414. esphome/components/openthread/openthread_esp.cpp +164 -0
  415. esphome/components/openthread/tlv.py +58 -0
  416. esphome/components/openthread_info/__init__.py +0 -0
  417. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  418. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  419. esphome/components/openthread_info/text_sensor.py +105 -0
  420. esphome/components/output/float_output.cpp +1 -1
  421. esphome/components/output/switch/output_switch.cpp +1 -1
  422. esphome/components/packet_transport/packet_transport.cpp +6 -4
  423. esphome/components/pca6416a/pca6416a.cpp +2 -2
  424. esphome/components/pca9554/pca9554.cpp +6 -4
  425. esphome/components/pca9685/pca9685_output.cpp +12 -8
  426. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  427. esphome/components/pcf85063/pcf85063.cpp +2 -2
  428. esphome/components/pcf8563/pcf8563.cpp +2 -2
  429. esphome/components/pcf8574/pcf8574.cpp +2 -2
  430. esphome/components/pid/pid_climate.cpp +8 -5
  431. esphome/components/pid/pid_climate.h +1 -1
  432. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  433. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  434. esphome/components/pipsolar/pipsolar.cpp +3 -3
  435. esphome/components/pm1006/pm1006.cpp +3 -7
  436. esphome/components/pm1006/pm1006.h +4 -1
  437. esphome/components/pm2005/pm2005.cpp +12 -13
  438. esphome/components/pm2005/sensor.py +1 -1
  439. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  440. esphome/components/pmsx003/pmsx003.cpp +0 -4
  441. esphome/components/pmsx003/pmsx003.h +5 -2
  442. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  443. esphome/components/pmwcs3/pmwcs3.h +0 -1
  444. esphome/components/pn532/pn532.cpp +7 -7
  445. esphome/components/pn532/pn532.h +1 -1
  446. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  447. esphome/components/pn7150/pn7150.cpp +4 -4
  448. esphome/components/pn7160/pn7160.cpp +4 -4
  449. esphome/components/power_supply/power_supply.cpp +6 -4
  450. esphome/components/power_supply/power_supply.h +1 -1
  451. esphome/components/psram/__init__.py +59 -35
  452. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  453. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  454. esphome/components/pylontech/pylontech.cpp +2 -2
  455. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  456. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  457. esphome/components/pzemac/pzemac.cpp +4 -2
  458. esphome/components/pzemdc/pzemdc.cpp +4 -2
  459. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  460. esphome/components/qmp6988/qmp6988.cpp +2 -2
  461. esphome/components/qmp6988/qmp6988.h +1 -1
  462. esphome/components/qr_code/qr_code.cpp +5 -3
  463. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  464. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  465. esphome/components/rc522/rc522.cpp +5 -5
  466. esphome/components/rdm6300/rdm6300.cpp +1 -0
  467. esphome/components/remote_receiver/__init__.py +10 -2
  468. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  469. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  470. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  471. esphome/components/remote_transmitter/__init__.py +10 -2
  472. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  473. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  474. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  475. esphome/components/resistance/resistance_sensor.cpp +6 -3
  476. esphome/components/restart/button/restart_button.cpp +1 -1
  477. esphome/components/restart/switch/restart_switch.cpp +1 -1
  478. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  479. esphome/components/rp2040/__init__.py +7 -0
  480. esphome/components/rp2040/core.cpp +8 -1
  481. esphome/components/rp2040/gpio.cpp +26 -9
  482. esphome/components/rp2040/preferences.cpp +3 -3
  483. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  484. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  485. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  486. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  487. esphome/components/rtttl/rtttl.cpp +11 -9
  488. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  489. esphome/components/safe_mode/safe_mode.cpp +9 -8
  490. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  491. esphome/components/scd30/scd30.cpp +11 -8
  492. esphome/components/scd4x/scd4x.cpp +12 -8
  493. esphome/components/sdl/display.py +40 -0
  494. esphome/components/sdl/sdl_esphome.cpp +2 -2
  495. esphome/components/sdl/sdl_esphome.h +8 -0
  496. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  497. esphome/components/sdp3x/sdp3x.cpp +11 -11
  498. esphome/components/sds011/sds011.cpp +5 -6
  499. esphome/components/sds011/sds011.h +4 -1
  500. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  501. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  502. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  503. esphome/components/selec_meter/selec_meter.cpp +5 -2
  504. esphome/components/select/__init__.py +1 -0
  505. esphome/components/sen0321/sen0321.cpp +2 -2
  506. esphome/components/sen21231/sen21231.cpp +1 -1
  507. esphome/components/sen5x/sen5x.cpp +10 -7
  508. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  509. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  510. esphome/components/sensor/__init__.py +11 -1
  511. esphome/components/sensor/filter.h +1 -1
  512. esphome/components/sensor/sensor.h +9 -5
  513. esphome/components/servo/servo.cpp +12 -9
  514. esphome/components/servo/servo.h +1 -1
  515. esphome/components/sfa30/sfa30.cpp +1 -1
  516. esphome/components/sgp30/sgp30.cpp +10 -8
  517. esphome/components/sgp4x/sgp4x.cpp +49 -61
  518. esphome/components/sgp4x/sgp4x.h +0 -1
  519. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  520. esphome/components/sht3xd/sht3xd.cpp +1 -1
  521. esphome/components/sht4x/sht4x.cpp +2 -2
  522. esphome/components/shtcx/shtcx.cpp +13 -16
  523. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  524. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  525. esphome/components/sim800l/sim800l.cpp +2 -2
  526. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  527. esphome/components/sm16716/sm16716.cpp +1 -1
  528. esphome/components/sm2135/sm2135.cpp +1 -1
  529. esphome/components/sm2235/sm2235.cpp +5 -3
  530. esphome/components/sm2335/sm2335.cpp +5 -3
  531. esphome/components/sml/sml.cpp +1 -1
  532. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  533. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  534. esphome/components/sntp/sntp_component.cpp +1 -1
  535. esphome/components/socket/__init__.py +2 -0
  536. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  537. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  538. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  539. esphome/components/socket/socket.cpp +31 -0
  540. esphome/components/socket/socket.h +27 -1
  541. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  542. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  543. esphome/components/sound_level/sound_level.cpp +4 -2
  544. esphome/components/speaker/media_player/__init__.py +3 -0
  545. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  546. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  547. esphome/components/spi/__init__.py +10 -2
  548. esphome/components/spi/spi.cpp +4 -4
  549. esphome/components/spi_device/spi_device.cpp +1 -2
  550. esphome/components/sprinkler/sprinkler.cpp +9 -6
  551. esphome/components/sps30/sps30.cpp +16 -15
  552. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  553. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  554. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  555. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  556. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  557. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  558. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  559. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  560. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  561. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  562. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  563. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  564. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  565. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  566. esphome/components/st7567_base/st7567_base.cpp +3 -3
  567. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  568. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  569. esphome/components/st7701s/st7701s.cpp +4 -2
  570. esphome/components/st7735/st7735.cpp +3 -3
  571. esphome/components/st7789v/st7789v.cpp +10 -7
  572. esphome/components/st7920/st7920.cpp +6 -4
  573. esphome/components/statsd/statsd.cpp +9 -5
  574. esphome/components/status_led/light/status_led_light.cpp +1 -1
  575. esphome/components/status_led/status_led.cpp +1 -1
  576. esphome/components/stepper/stepper.h +5 -3
  577. esphome/components/sts3x/sts3x.cpp +2 -2
  578. esphome/components/switch/__init__.py +1 -0
  579. esphome/components/switch/switch.cpp +18 -12
  580. esphome/components/switch/switch.h +1 -1
  581. esphome/components/sx1509/__init__.py +53 -20
  582. esphome/components/sx1509/sx1509.cpp +29 -5
  583. esphome/components/sx1509/sx1509.h +9 -1
  584. esphome/components/t6615/t6615.cpp +1 -0
  585. esphome/components/tc74/tc74.cpp +1 -1
  586. esphome/components/tca9548a/tca9548a.cpp +1 -1
  587. esphome/components/tca9555/tca9555.cpp +2 -2
  588. esphome/components/tcs34725/tcs34725.cpp +4 -4
  589. esphome/components/tee501/tee501.cpp +3 -2
  590. esphome/components/tem3200/tem3200.cpp +5 -6
  591. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  592. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +38 -12
  593. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +3 -1
  594. esphome/components/template/cover/template_cover.cpp +1 -1
  595. esphome/components/template/select/template_select.cpp +6 -4
  596. esphome/components/template/text/template_text.cpp +2 -3
  597. esphome/components/template/valve/template_valve.cpp +5 -3
  598. esphome/components/text/__init__.py +10 -11
  599. esphome/components/text_sensor/__init__.py +1 -0
  600. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  601. esphome/components/time/__init__.py +1 -2
  602. esphome/components/time_based/time_based_cover.cpp +4 -2
  603. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  604. esphome/components/tm1621/tm1621.cpp +3 -3
  605. esphome/components/tm1637/tm1637.cpp +9 -7
  606. esphome/components/tm1638/tm1638.cpp +7 -5
  607. esphome/components/tm1651/tm1651.cpp +2 -2
  608. esphome/components/tmp102/tmp102.cpp +1 -3
  609. esphome/components/tmp102/tmp102.h +0 -3
  610. esphome/components/tmp1075/tmp1075.cpp +12 -9
  611. esphome/components/tmp117/tmp117.cpp +2 -2
  612. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  613. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  614. esphome/components/tsl2561/tsl2561.cpp +7 -5
  615. esphome/components/tsl2591/tsl2591.cpp +25 -27
  616. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  617. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  618. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  619. esphome/components/tuya/select/tuya_select.cpp +5 -3
  620. esphome/components/tx20/tx20.cpp +3 -3
  621. esphome/components/uart/__init__.py +4 -5
  622. esphome/components/uart/button/uart_button.cpp +1 -1
  623. esphome/components/uart/switch/uart_switch.cpp +2 -2
  624. esphome/components/uart/uart.cpp +2 -2
  625. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  626. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  627. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  628. esphome/components/uart/uart_component_host.cpp +11 -8
  629. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  630. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  631. esphome/components/udp/udp_component.cpp +9 -5
  632. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  633. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  634. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  635. esphome/components/update/__init__.py +1 -0
  636. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  637. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  638. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  639. esphome/components/usb_host/__init__.py +64 -0
  640. esphome/components/usb_host/usb_host.h +116 -0
  641. esphome/components/usb_host/usb_host_client.cpp +394 -0
  642. esphome/components/usb_host/usb_host_component.cpp +35 -0
  643. esphome/components/usb_uart/__init__.py +134 -0
  644. esphome/components/usb_uart/ch34x.cpp +80 -0
  645. esphome/components/usb_uart/cp210x.cpp +126 -0
  646. esphome/components/usb_uart/usb_uart.cpp +328 -0
  647. esphome/components/usb_uart/usb_uart.h +151 -0
  648. esphome/components/valve/__init__.py +1 -0
  649. esphome/components/veml3235/veml3235.cpp +13 -9
  650. esphome/components/veml7700/veml7700.cpp +10 -6
  651. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  652. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  653. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  654. esphome/components/web_server/server_index_v2.h +632 -630
  655. esphome/components/web_server/server_index_v3.h +411 -409
  656. esphome/components/web_server/web_server.cpp +5 -3
  657. esphome/components/web_server_base/web_server_base.cpp +1 -1
  658. esphome/components/web_server_idf/utils.cpp +1 -1
  659. esphome/components/web_server_idf/web_server_idf.cpp +1 -1
  660. esphome/components/weikai/__init__.py +2 -0
  661. esphome/components/weikai/weikai.cpp +23 -21
  662. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  663. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  664. esphome/components/wiegand/wiegand.cpp +1 -1
  665. esphome/components/wifi/wifi_component.cpp +50 -37
  666. esphome/components/wifi/wifi_component.h +7 -4
  667. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  668. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  669. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  670. esphome/components/wireguard/wireguard.cpp +21 -21
  671. esphome/components/wl_134/text_sensor.py +1 -2
  672. esphome/components/wled/wled_light_effect.cpp +1 -1
  673. esphome/components/x9c/x9c.cpp +5 -3
  674. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  675. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  676. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  677. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  678. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  679. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  680. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  681. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  682. esphome/components/xl9535/xl9535.cpp +2 -2
  683. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  684. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  685. esphome/config.py +3 -2
  686. esphome/config_validation.py +46 -17
  687. esphome/const.py +10 -1
  688. esphome/core/__init__.py +37 -18
  689. esphome/core/application.cpp +188 -5
  690. esphome/core/application.h +110 -0
  691. esphome/core/component.h +13 -0
  692. esphome/core/config.py +12 -0
  693. esphome/core/defines.h +10 -2
  694. esphome/core/hal.h +5 -0
  695. esphome/core/helpers.cpp +1 -1
  696. esphome/core/helpers.h +4 -4
  697. esphome/core/log.h +2 -0
  698. esphome/core/log_const_en.h +4 -0
  699. esphome/core/scheduler.cpp +2 -2
  700. esphome/coroutine.py +3 -4
  701. esphome/cpp_generator.py +32 -32
  702. esphome/dashboard/core.py +2 -2
  703. esphome/dashboard/web_server.py +2 -2
  704. esphome/git.py +4 -4
  705. esphome/helpers.py +5 -6
  706. esphome/loader.py +8 -7
  707. esphome/log.py +7 -1
  708. esphome/platformio_api.py +2 -3
  709. esphome/storage_json.py +13 -5
  710. esphome/types.py +12 -13
  711. esphome/util.py +1 -2
  712. esphome/writer.py +5 -3
  713. esphome/yaml_util.py +6 -1
  714. esphome/zeroconf.py +1 -1
  715. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/METADATA +12 -11
  716. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/RECORD +720 -667
  717. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/WHEEL +1 -1
  718. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/entry_points.txt +0 -0
  719. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/licenses/LICENSE +0 -0
  720. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/top_level.txt +0 -0
esphome/core/helpers.h CHANGED
@@ -192,15 +192,15 @@ bool random_bytes(uint8_t *data, size_t len);
192
192
  constexpr uint16_t encode_uint16(uint8_t msb, uint8_t lsb) {
193
193
  return (static_cast<uint16_t>(msb) << 8) | (static_cast<uint16_t>(lsb));
194
194
  }
195
+ /// Encode a 24-bit value given three bytes in most to least significant byte order.
196
+ constexpr uint32_t encode_uint24(uint8_t byte1, uint8_t byte2, uint8_t byte3) {
197
+ return (static_cast<uint32_t>(byte1) << 16) | (static_cast<uint32_t>(byte2) << 8) | (static_cast<uint32_t>(byte3));
198
+ }
195
199
  /// Encode a 32-bit value given four bytes in most to least significant byte order.
196
200
  constexpr uint32_t encode_uint32(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint8_t byte4) {
197
201
  return (static_cast<uint32_t>(byte1) << 24) | (static_cast<uint32_t>(byte2) << 16) |
198
202
  (static_cast<uint32_t>(byte3) << 8) | (static_cast<uint32_t>(byte4));
199
203
  }
200
- /// Encode a 24-bit value given three bytes in most to least significant byte order.
201
- constexpr uint32_t encode_uint24(uint8_t byte1, uint8_t byte2, uint8_t byte3) {
202
- return ((static_cast<uint32_t>(byte1) << 16) | (static_cast<uint32_t>(byte2) << 8) | (static_cast<uint32_t>(byte3)));
203
- }
204
204
 
205
205
  /// Encode a value from its constituent bytes (from most to least significant) in an array with length sizeof(T).
206
206
  template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0>
esphome/core/log.h CHANGED
@@ -1,5 +1,7 @@
1
1
  #pragma once
2
2
 
3
+ #include "log_const_en.h"
4
+
3
5
  #include <cassert>
4
6
  #include <cstdarg>
5
7
  // for PRIu32 and friends
@@ -0,0 +1,4 @@
1
+ #pragma once
2
+
3
+ #define ESP_LOG_MSG_COMM_FAIL "Communication failed"
4
+ #define ESP_LOG_MSG_COMM_FAIL_FOR "Communication failed for '%s'"
@@ -2,9 +2,9 @@
2
2
 
3
3
  #include "application.h"
4
4
  #include "esphome/core/defines.h"
5
- #include "esphome/core/log.h"
6
- #include "esphome/core/helpers.h"
7
5
  #include "esphome/core/hal.h"
6
+ #include "esphome/core/helpers.h"
7
+ #include "esphome/core/log.h"
8
8
  #include <algorithm>
9
9
  #include <cinttypes>
10
10
 
esphome/coroutine.py CHANGED
@@ -42,14 +42,13 @@ Here everything is combined in `yield` expressions. You await other coroutines u
42
42
  the last `yield` expression defines what is returned.
43
43
  """
44
44
 
45
- import collections
46
- from collections.abc import Awaitable, Generator, Iterator
45
+ from collections.abc import Awaitable, Callable, Generator, Iterator
47
46
  import functools
48
47
  import heapq
49
48
  import inspect
50
49
  import logging
51
50
  import types
52
- from typing import Any, Callable
51
+ from typing import Any
53
52
 
54
53
  _LOGGER = logging.getLogger(__name__)
55
54
 
@@ -126,7 +125,7 @@ def _flatten_generator(gen: Generator[Any, Any, Any]):
126
125
  ret = to_send if e.value is None else e.value
127
126
  return ret
128
127
 
129
- if isinstance(val, collections.abc.Awaitable):
128
+ if isinstance(val, Awaitable):
130
129
  # yielded object that is awaitable (like `yield some_new_style_method()`)
131
130
  # yield from __await__() like actual coroutines would.
132
131
  to_send = yield from val.__await__()
esphome/cpp_generator.py CHANGED
@@ -1,9 +1,9 @@
1
1
  import abc
2
- from collections.abc import Sequence
2
+ from collections.abc import Callable, Sequence
3
3
  import inspect
4
4
  import math
5
5
  import re
6
- from typing import Any, Callable, Optional, Union
6
+ from typing import Any
7
7
 
8
8
  from esphome.core import (
9
9
  CORE,
@@ -35,19 +35,19 @@ class Expression(abc.ABC):
35
35
  """
36
36
 
37
37
 
38
- SafeExpType = Union[
39
- Expression,
40
- bool,
41
- str,
42
- str,
43
- int,
44
- float,
45
- TimePeriod,
46
- type[bool],
47
- type[int],
48
- type[float],
49
- Sequence[Any],
50
- ]
38
+ SafeExpType = (
39
+ Expression
40
+ | bool
41
+ | str
42
+ | str
43
+ | int
44
+ | float
45
+ | TimePeriod
46
+ | type[bool]
47
+ | type[int]
48
+ | type[float]
49
+ | Sequence[Any]
50
+ )
51
51
 
52
52
 
53
53
  class RawExpression(Expression):
@@ -90,7 +90,7 @@ class VariableDeclarationExpression(Expression):
90
90
  class ExpressionList(Expression):
91
91
  __slots__ = ("args",)
92
92
 
93
- def __init__(self, *args: Optional[SafeExpType]):
93
+ def __init__(self, *args: SafeExpType | None):
94
94
  # Remove every None on end
95
95
  args = list(args)
96
96
  while args and args[-1] is None:
@@ -139,7 +139,7 @@ class CallExpression(Expression):
139
139
  class StructInitializer(Expression):
140
140
  __slots__ = ("base", "args")
141
141
 
142
- def __init__(self, base: Expression, *args: tuple[str, Optional[SafeExpType]]):
142
+ def __init__(self, base: Expression, *args: tuple[str, SafeExpType | None]):
143
143
  self.base = base
144
144
  # TODO: args is always a Tuple, is this check required?
145
145
  if not isinstance(args, OrderedDict):
@@ -197,9 +197,7 @@ class ParameterExpression(Expression):
197
197
  class ParameterListExpression(Expression):
198
198
  __slots__ = ("parameters",)
199
199
 
200
- def __init__(
201
- self, *parameters: Union[ParameterExpression, tuple[SafeExpType, str]]
202
- ):
200
+ def __init__(self, *parameters: ParameterExpression | tuple[SafeExpType, str]):
203
201
  self.parameters = []
204
202
  for parameter in parameters:
205
203
  if not isinstance(parameter, ParameterExpression):
@@ -362,7 +360,7 @@ def safe_exp(obj: SafeExpType) -> Expression:
362
360
  return IntLiteral(int(obj.total_seconds))
363
361
  if isinstance(obj, TimePeriodMinutes):
364
362
  return IntLiteral(int(obj.total_minutes))
365
- if isinstance(obj, (tuple, list)):
363
+ if isinstance(obj, tuple | list):
366
364
  return ArrayInitializer(*[safe_exp(o) for o in obj])
367
365
  if obj is bool:
368
366
  return bool_
@@ -418,7 +416,9 @@ class LineComment(Statement):
418
416
  self.value = value
419
417
 
420
418
  def __str__(self):
421
- parts = re.sub(r"\\\s*\n", r"<cont>\n", self.value, re.MULTILINE).split("\n")
419
+ parts = re.sub(r"\\\s*\n", r"<cont>\n", self.value, flags=re.MULTILINE).split(
420
+ "\n"
421
+ )
422
422
  parts = [f"// {x}" for x in parts]
423
423
  return "\n".join(parts)
424
424
 
@@ -461,7 +461,7 @@ def static_const_array(id_, rhs) -> "MockObj":
461
461
  return obj
462
462
 
463
463
 
464
- def statement(expression: Union[Expression, Statement]) -> Statement:
464
+ def statement(expression: Expression | Statement) -> Statement:
465
465
  """Convert expression into a statement unless is already a statement."""
466
466
  if isinstance(expression, Statement):
467
467
  return expression
@@ -579,21 +579,21 @@ def new_Pvariable(id_: ID, *args: SafeExpType) -> Pvariable:
579
579
  return Pvariable(id_, rhs)
580
580
 
581
581
 
582
- def add(expression: Union[Expression, Statement]):
582
+ def add(expression: Expression | Statement, prepend: bool = False):
583
583
  """Add an expression to the codegen section.
584
584
 
585
585
  After this is called, the given given expression will
586
586
  show up in the setup() function after this has been called.
587
587
  """
588
- CORE.add(expression)
588
+ CORE.add(expression, prepend)
589
589
 
590
590
 
591
- def add_global(expression: Union[SafeExpType, Statement], prepend: bool = False):
591
+ def add_global(expression: SafeExpType | Statement, prepend: bool = False):
592
592
  """Add an expression to the codegen global storage (above setup())."""
593
593
  CORE.add_global(expression, prepend)
594
594
 
595
595
 
596
- def add_library(name: str, version: Optional[str], repository: Optional[str] = None):
596
+ def add_library(name: str, version: str | None, repository: str | None = None):
597
597
  """Add a library to the codegen library storage.
598
598
 
599
599
  :param name: The name of the library (for example 'AsyncTCP')
@@ -619,7 +619,7 @@ def add_define(name: str, value: SafeExpType = None):
619
619
  CORE.add_define(Define(name, safe_exp(value)))
620
620
 
621
621
 
622
- def add_platformio_option(key: str, value: Union[str, list[str]]):
622
+ def add_platformio_option(key: str, value: str | list[str]):
623
623
  CORE.add_platformio_option(key, value)
624
624
 
625
625
 
@@ -654,7 +654,7 @@ async def process_lambda(
654
654
  parameters: list[tuple[SafeExpType, str]],
655
655
  capture: str = "=",
656
656
  return_type: SafeExpType = None,
657
- ) -> Union[LambdaExpression, None]:
657
+ ) -> LambdaExpression | None:
658
658
  """Process the given lambda value into a LambdaExpression.
659
659
 
660
660
  This is a coroutine because lambdas can depend on other IDs,
@@ -711,8 +711,8 @@ def is_template(value):
711
711
  async def templatable(
712
712
  value: Any,
713
713
  args: list[tuple[SafeExpType, str]],
714
- output_type: Optional[SafeExpType],
715
- to_exp: Union[Callable, dict] = None,
714
+ output_type: SafeExpType | None,
715
+ to_exp: Callable | dict = None,
716
716
  ):
717
717
  """Generate code for a templatable config option.
718
718
 
@@ -821,7 +821,7 @@ class MockObj(Expression):
821
821
  assert self.op == "::"
822
822
  return MockObj(f"using namespace {self.base}")
823
823
 
824
- def __getitem__(self, item: Union[str, Expression]) -> "MockObj":
824
+ def __getitem__(self, item: str | Expression) -> "MockObj":
825
825
  next_op = "."
826
826
  if isinstance(item, str) and item.startswith("P"):
827
827
  item = item[1:]
esphome/dashboard/core.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
- from collections.abc import Coroutine
4
+ from collections.abc import Callable, Coroutine
5
5
  import contextlib
6
6
  from dataclasses import dataclass
7
7
  from functools import partial
@@ -9,7 +9,7 @@ import json
9
9
  import logging
10
10
  from pathlib import Path
11
11
  import threading
12
- from typing import Any, Callable
12
+ from typing import Any
13
13
 
14
14
  from esphome.storage_json import ignored_devices_storage_path
15
15
 
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import base64
5
- from collections.abc import Iterable
5
+ from collections.abc import Callable, Iterable
6
6
  import datetime
7
7
  import functools
8
8
  import gzip
@@ -17,7 +17,7 @@ import shutil
17
17
  import subprocess
18
18
  import threading
19
19
  import time
20
- from typing import TYPE_CHECKING, Any, Callable, TypeVar
20
+ from typing import TYPE_CHECKING, Any, TypeVar
21
21
  from urllib.parse import urlparse
22
22
 
23
23
  import tornado
esphome/git.py CHANGED
@@ -1,3 +1,4 @@
1
+ from collections.abc import Callable
1
2
  from dataclasses import dataclass
2
3
  from datetime import datetime
3
4
  import hashlib
@@ -5,7 +6,6 @@ import logging
5
6
  from pathlib import Path
6
7
  import re
7
8
  import subprocess
8
- from typing import Callable, Optional
9
9
  import urllib.parse
10
10
 
11
11
  import esphome.config_validation as cv
@@ -45,12 +45,12 @@ def clone_or_update(
45
45
  *,
46
46
  url: str,
47
47
  ref: str = None,
48
- refresh: Optional[TimePeriodSeconds],
48
+ refresh: TimePeriodSeconds | None,
49
49
  domain: str,
50
50
  username: str = None,
51
51
  password: str = None,
52
- submodules: Optional[list[str]] = None,
53
- ) -> tuple[Path, Optional[Callable[[], None]]]:
52
+ submodules: list[str] | None = None,
53
+ ) -> tuple[Path, Callable[[], None] | None]:
54
54
  key = f"{url}@{ref}"
55
55
 
56
56
  if username is not None and password is not None:
esphome/helpers.py CHANGED
@@ -7,7 +7,6 @@ from pathlib import Path
7
7
  import platform
8
8
  import re
9
9
  import tempfile
10
- from typing import Union
11
10
  from urllib.parse import urlparse
12
11
 
13
12
  _LOGGER = logging.getLogger(__name__)
@@ -219,8 +218,8 @@ def sort_ip_addresses(address_list: list[str]) -> list[str]:
219
218
  int,
220
219
  int,
221
220
  int,
222
- Union[str, None],
223
- Union[tuple[str, int], tuple[str, int, int, int]],
221
+ str | None,
222
+ tuple[str, int] | tuple[str, int, int, int],
224
223
  ]
225
224
  ] = []
226
225
  for addr in address_list:
@@ -282,7 +281,7 @@ def read_file(path):
282
281
  raise EsphomeError(f"Error reading file {path}: {err}") from err
283
282
 
284
283
 
285
- def _write_file(path: Union[Path, str], text: Union[str, bytes]):
284
+ def _write_file(path: Path | str, text: str | bytes):
286
285
  """Atomically writes `text` to the given path.
287
286
 
288
287
  Automatically creates all parent directories.
@@ -315,7 +314,7 @@ def _write_file(path: Union[Path, str], text: Union[str, bytes]):
315
314
  _LOGGER.error("Write file cleanup failed: %s", err)
316
315
 
317
316
 
318
- def write_file(path: Union[Path, str], text: str):
317
+ def write_file(path: Path | str, text: str):
319
318
  try:
320
319
  _write_file(path, text)
321
320
  except OSError as err:
@@ -324,7 +323,7 @@ def write_file(path: Union[Path, str], text: str):
324
323
  raise EsphomeError(f"Could not write file at {path}") from err
325
324
 
326
325
 
327
- def write_file_if_changed(path: Union[Path, str], text: str) -> bool:
326
+ def write_file_if_changed(path: Path | str, text: str) -> bool:
328
327
  """Write text to the given path, but not if the contents match already.
329
328
 
330
329
  Returns true if the file was changed.
esphome/loader.py CHANGED
@@ -1,3 +1,4 @@
1
+ from collections.abc import Callable
1
2
  from contextlib import AbstractContextManager
2
3
  from dataclasses import dataclass
3
4
  import importlib
@@ -8,7 +9,7 @@ import logging
8
9
  from pathlib import Path
9
10
  import sys
10
11
  from types import ModuleType
11
- from typing import Any, Callable, Optional
12
+ from typing import Any
12
13
 
13
14
  from esphome.const import SOURCE_FILE_EXTENSIONS
14
15
  from esphome.core import CORE
@@ -57,7 +58,7 @@ class ComponentManifest:
57
58
  return getattr(self.module, "IS_TARGET_PLATFORM", False)
58
59
 
59
60
  @property
60
- def config_schema(self) -> Optional[Any]:
61
+ def config_schema(self) -> Any | None:
61
62
  return getattr(self.module, "CONFIG_SCHEMA", None)
62
63
 
63
64
  @property
@@ -69,7 +70,7 @@ class ComponentManifest:
69
70
  return getattr(self.module, "MULTI_CONF_NO_DEFAULT", False)
70
71
 
71
72
  @property
72
- def to_code(self) -> Optional[Callable[[Any], None]]:
73
+ def to_code(self) -> Callable[[Any], None] | None:
73
74
  return getattr(self.module, "to_code", None)
74
75
 
75
76
  @property
@@ -96,7 +97,7 @@ class ComponentManifest:
96
97
  return getattr(self.module, "INSTANCE_TYPE", None)
97
98
 
98
99
  @property
99
- def final_validate_schema(self) -> Optional[Callable[[ConfigType], None]]:
100
+ def final_validate_schema(self) -> Callable[[ConfigType], None] | None:
100
101
  """Components can declare a `FINAL_VALIDATE_SCHEMA` cv.Schema that gets called
101
102
  after the main validation. In that function checks across components can be made.
102
103
 
@@ -129,7 +130,7 @@ class ComponentManifest:
129
130
 
130
131
  class ComponentMetaFinder(importlib.abc.MetaPathFinder):
131
132
  def __init__(
132
- self, components_path: Path, allowed_components: Optional[list[str]] = None
133
+ self, components_path: Path, allowed_components: list[str] | None = None
133
134
  ) -> None:
134
135
  self._allowed_components = allowed_components
135
136
  self._finders = []
@@ -140,7 +141,7 @@ class ComponentMetaFinder(importlib.abc.MetaPathFinder):
140
141
  continue
141
142
  self._finders.append(finder)
142
143
 
143
- def find_spec(self, fullname: str, path: Optional[list[str]], target=None):
144
+ def find_spec(self, fullname: str, path: list[str] | None, target=None):
144
145
  if not fullname.startswith("esphome.components."):
145
146
  return None
146
147
  parts = fullname.split(".")
@@ -167,7 +168,7 @@ def clear_component_meta_finders():
167
168
 
168
169
 
169
170
  def install_meta_finder(
170
- components_path: Path, allowed_components: Optional[list[str]] = None
171
+ components_path: Path, allowed_components: list[str] | None = None
171
172
  ):
172
173
  sys.meta_path.insert(0, ComponentMetaFinder(components_path, allowed_components))
173
174
 
esphome/log.py CHANGED
@@ -59,7 +59,13 @@ class ESPHomeLogFormatter(logging.Formatter):
59
59
  "ERROR": AnsiFore.RED.value,
60
60
  "CRITICAL": AnsiFore.RED.value,
61
61
  }.get(record.levelname, "")
62
- return f"{prefix}{formatted}{AnsiStyle.RESET_ALL.value}"
62
+ message = f"{prefix}{formatted}{AnsiStyle.RESET_ALL.value}"
63
+ if CORE.dashboard:
64
+ try:
65
+ message = message.replace("\033", "\\033")
66
+ except UnicodeEncodeError:
67
+ pass
68
+ return message
63
69
 
64
70
 
65
71
  def setup_log(
esphome/platformio_api.py CHANGED
@@ -5,7 +5,6 @@ import os
5
5
  from pathlib import Path
6
6
  import re
7
7
  import subprocess
8
- from typing import Union
9
8
 
10
9
  from esphome.const import CONF_COMPILE_PROCESS_LIMIT, CONF_ESPHOME, KEY_CORE
11
10
  from esphome.core import CORE, EsphomeError
@@ -73,7 +72,7 @@ FILTER_PLATFORMIO_LINES = [
73
72
  ]
74
73
 
75
74
 
76
- def run_platformio_cli(*args, **kwargs) -> Union[str, int]:
75
+ def run_platformio_cli(*args, **kwargs) -> str | int:
77
76
  os.environ["PLATFORMIO_FORCE_COLOR"] = "true"
78
77
  os.environ["PLATFORMIO_BUILD_DIR"] = os.path.abspath(CORE.relative_pioenvs_path())
79
78
  os.environ.setdefault(
@@ -93,7 +92,7 @@ def run_platformio_cli(*args, **kwargs) -> Union[str, int]:
93
92
  return run_external_command(platformio.__main__.main, *cmd, **kwargs)
94
93
 
95
94
 
96
- def run_platformio_cli_run(config, verbose, *args, **kwargs) -> Union[str, int]:
95
+ def run_platformio_cli_run(config, verbose, *args, **kwargs) -> str | int:
97
96
  command = ["run", "-d", CORE.build_path]
98
97
  if verbose:
99
98
  command += ["-v"]
esphome/storage_json.py CHANGED
@@ -46,15 +46,16 @@ class StorageJSON:
46
46
  storage_version: int,
47
47
  name: str,
48
48
  friendly_name: str,
49
- comment: str,
50
- esphome_version: str,
49
+ comment: str | None,
50
+ esphome_version: str | None,
51
51
  src_version: int | None,
52
52
  address: str,
53
53
  web_port: int | None,
54
54
  target_platform: str,
55
- build_path: str,
56
- firmware_bin_path: str,
55
+ build_path: str | None,
56
+ firmware_bin_path: str | None,
57
57
  loaded_integrations: set[str],
58
+ loaded_platforms: set[str],
58
59
  no_mdns: bool,
59
60
  framework: str | None = None,
60
61
  core_platform: str | None = None,
@@ -86,6 +87,8 @@ class StorageJSON:
86
87
  self.firmware_bin_path = firmware_bin_path
87
88
  # A set of strings of names of loaded integrations
88
89
  self.loaded_integrations = loaded_integrations
90
+ # A set of strings for platform/integration combos
91
+ self.loaded_platforms = loaded_platforms
89
92
  # Is mDNS disabled
90
93
  self.no_mdns = no_mdns
91
94
  # The framework used to compile the firmware
@@ -107,6 +110,7 @@ class StorageJSON:
107
110
  "build_path": self.build_path,
108
111
  "firmware_bin_path": self.firmware_bin_path,
109
112
  "loaded_integrations": sorted(self.loaded_integrations),
113
+ "loaded_platforms": sorted(self.loaded_platforms),
110
114
  "no_mdns": self.no_mdns,
111
115
  "framework": self.framework,
112
116
  "core_platform": self.core_platform,
@@ -138,6 +142,7 @@ class StorageJSON:
138
142
  build_path=esph.build_path,
139
143
  firmware_bin_path=esph.firmware_bin,
140
144
  loaded_integrations=esph.loaded_integrations,
145
+ loaded_platforms=esph.loaded_platforms,
141
146
  no_mdns=(
142
147
  CONF_MDNS in esph.config
143
148
  and CONF_DISABLED in esph.config[CONF_MDNS]
@@ -164,6 +169,7 @@ class StorageJSON:
164
169
  build_path=None,
165
170
  firmware_bin_path=None,
166
171
  loaded_integrations=set(),
172
+ loaded_platforms=set(),
167
173
  no_mdns=False,
168
174
  framework=None,
169
175
  core_platform=platform.lower(),
@@ -187,6 +193,7 @@ class StorageJSON:
187
193
  build_path = storage.get("build_path")
188
194
  firmware_bin_path = storage.get("firmware_bin_path")
189
195
  loaded_integrations = set(storage.get("loaded_integrations", []))
196
+ loaded_platforms = set(storage.get("loaded_platforms", []))
190
197
  no_mdns = storage.get("no_mdns", False)
191
198
  framework = storage.get("framework")
192
199
  core_platform = storage.get("core_platform")
@@ -203,6 +210,7 @@ class StorageJSON:
203
210
  build_path,
204
211
  firmware_bin_path,
205
212
  loaded_integrations,
213
+ loaded_platforms,
206
214
  no_mdns,
207
215
  framework,
208
216
  core_platform,
@@ -252,7 +260,7 @@ class EsphomeStorageJSON:
252
260
  def last_update_check(self, new: datetime) -> None:
253
261
  self.last_update_check_str = new.strftime("%Y-%m-%dT%H:%M:%S")
254
262
 
255
- def to_json(self) -> dict:
263
+ def to_json(self) -> str:
256
264
  return f"{json.dumps(self.as_dict(), indent=2)}\n"
257
265
 
258
266
  def save(self, path: str) -> None:
esphome/types.py CHANGED
@@ -1,19 +1,18 @@
1
1
  """This helper module tracks commonly used types in the esphome python codebase."""
2
2
 
3
- from typing import Union
4
-
5
3
  from esphome.core import ID, EsphomeCore, Lambda
6
4
 
7
- ConfigFragmentType = Union[
8
- str,
9
- int,
10
- float,
11
- None,
12
- dict[Union[str, int], "ConfigFragmentType"],
13
- list["ConfigFragmentType"],
14
- ID,
15
- Lambda,
16
- ]
5
+ ConfigFragmentType = (
6
+ str
7
+ | int
8
+ | float
9
+ | None
10
+ | dict[str | int, "ConfigFragmentType"]
11
+ | list["ConfigFragmentType"]
12
+ | ID
13
+ | Lambda
14
+ )
15
+
17
16
  ConfigType = dict[str, ConfigFragmentType]
18
17
  CoreType = EsphomeCore
19
- ConfigPathType = Union[str, int]
18
+ ConfigPathType = str | int
esphome/util.py CHANGED
@@ -6,7 +6,6 @@ from pathlib import Path
6
6
  import re
7
7
  import subprocess
8
8
  import sys
9
- from typing import Union
10
9
 
11
10
  from esphome import const
12
11
 
@@ -162,7 +161,7 @@ class RedirectText:
162
161
 
163
162
  def run_external_command(
164
163
  func, *cmd, capture_stdout: bool = False, filter_lines: str = None
165
- ) -> Union[int, str]:
164
+ ) -> int | str:
166
165
  """
167
166
  Run a function from an external package that acts like a main method.
168
167
 
esphome/writer.py CHANGED
@@ -3,7 +3,6 @@ import logging
3
3
  import os
4
4
  from pathlib import Path
5
5
  import re
6
- from typing import Union
7
6
 
8
7
  from esphome import loader
9
8
  from esphome.config import iter_component_configs, iter_components
@@ -108,7 +107,10 @@ def storage_should_clean(old: StorageJSON, new: StorageJSON) -> bool:
108
107
  return True
109
108
  if old.build_path != new.build_path:
110
109
  return True
111
- if old.loaded_integrations != new.loaded_integrations:
110
+ if (
111
+ old.loaded_integrations != new.loaded_integrations
112
+ or old.loaded_platforms != new.loaded_platforms
113
+ ):
112
114
  if new.core_platform == PLATFORM_ESP32:
113
115
  from esphome.components.esp32 import FRAMEWORK_ESP_IDF
114
116
 
@@ -132,7 +134,7 @@ def update_storage_json():
132
134
  new.save(path)
133
135
 
134
136
 
135
- def format_ini(data: dict[str, Union[str, list[str]]]) -> str:
137
+ def format_ini(data: dict[str, str | list[str]]) -> str:
136
138
  content = ""
137
139
  for key, value in sorted(data.items()):
138
140
  if isinstance(value, list):
esphome/yaml_util.py CHANGED
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from collections.abc import Callable
3
4
  import fnmatch
4
5
  import functools
5
6
  import inspect
@@ -8,7 +9,7 @@ from ipaddress import _BaseAddress
8
9
  import logging
9
10
  import math
10
11
  import os
11
- from typing import Any, Callable
12
+ from typing import Any
12
13
  import uuid
13
14
 
14
15
  import yaml
@@ -603,6 +604,10 @@ class ESPHomeDumper(yaml.SafeDumper):
603
604
  return self.represent_secret(value.id)
604
605
  return self.represent_stringify(value.id)
605
606
 
607
+ # The below override configures this dumper to indent output YAML properly:
608
+ def increase_indent(self, flow=False, indentless=False):
609
+ return super().increase_indent(flow, False)
610
+
606
611
 
607
612
  ESPHomeDumper.add_multi_representer(
608
613
  dict, lambda dumper, value: dumper.represent_mapping("tag:yaml.org,2002:map", value)
esphome/zeroconf.py CHANGED
@@ -1,9 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ from collections.abc import Callable
4
5
  from dataclasses import dataclass
5
6
  import logging
6
- from typing import Callable
7
7
 
8
8
  from zeroconf import (
9
9
  AddressResolver,