esphome 2024.12.4__py3-none-any.whl → 2025.2.0__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 (366) hide show
  1. esphome/__main__.py +16 -3
  2. esphome/components/adc/__init__.py +17 -11
  3. esphome/components/adc/adc_sensor.h +17 -0
  4. esphome/components/adc/adc_sensor_common.cpp +55 -0
  5. esphome/components/adc/adc_sensor_esp32.cpp +8 -5
  6. esphome/components/adc/adc_sensor_esp8266.cpp +10 -6
  7. esphome/components/adc/adc_sensor_libretiny.cpp +11 -6
  8. esphome/components/adc/adc_sensor_rp2040.cpp +13 -10
  9. esphome/components/adc/sensor.py +9 -3
  10. esphome/components/ads1115/ads1115.cpp +56 -7
  11. esphome/components/ads1115/ads1115.h +13 -1
  12. esphome/components/ads1115/sensor/__init__.py +16 -0
  13. esphome/components/ads1115/sensor/ads1115_sensor.cpp +2 -1
  14. esphome/components/ads1115/sensor/ads1115_sensor.h +2 -0
  15. esphome/components/animation/__init__.py +23 -261
  16. esphome/components/animation/animation.cpp +2 -2
  17. esphome/components/animation/animation.h +2 -1
  18. esphome/components/api/api_pb2.cpp +14 -0
  19. esphome/components/api/api_pb2.h +1 -0
  20. esphome/components/api/client.py +8 -3
  21. esphome/components/audio/__init__.py +112 -0
  22. esphome/components/audio/audio.cpp +67 -0
  23. esphome/components/audio/audio.h +125 -7
  24. esphome/components/audio/audio_decoder.cpp +361 -0
  25. esphome/components/audio/audio_decoder.h +135 -0
  26. esphome/components/audio/audio_reader.cpp +308 -0
  27. esphome/components/audio/audio_reader.h +85 -0
  28. esphome/components/audio/audio_resampler.cpp +159 -0
  29. esphome/components/audio/audio_resampler.h +101 -0
  30. esphome/components/audio/audio_transfer_buffer.cpp +165 -0
  31. esphome/components/audio/audio_transfer_buffer.h +139 -0
  32. esphome/components/audio_adc/__init__.py +41 -0
  33. esphome/components/audio_adc/audio_adc.h +17 -0
  34. esphome/components/audio_adc/automation.h +23 -0
  35. esphome/components/bk72xx/__init__.py +1 -0
  36. esphome/components/ble_client/ble_client.cpp +1 -2
  37. esphome/components/ble_client/sensor/__init__.py +1 -1
  38. esphome/components/ble_client/text_sensor/__init__.py +1 -1
  39. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -0
  40. esphome/components/bluetooth_proxy/bluetooth_connection.h +1 -0
  41. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +5 -0
  42. esphome/components/ch422g/ch422g.h +2 -0
  43. esphome/components/climate/__init__.py +1 -1
  44. esphome/components/climate_ir/climate_ir.cpp +2 -1
  45. esphome/components/coolix/coolix.cpp +2 -1
  46. esphome/components/cse7766/cse7766.cpp +8 -16
  47. esphome/components/custom/__init__.py +0 -3
  48. esphome/components/custom/binary_sensor/__init__.py +2 -28
  49. esphome/components/custom/climate/__init__.py +2 -27
  50. esphome/components/custom/cover/__init__.py +2 -27
  51. esphome/components/custom/light/__init__.py +2 -27
  52. esphome/components/custom/output/__init__.py +2 -58
  53. esphome/components/custom/sensor/__init__.py +2 -24
  54. esphome/components/custom/switch/__init__.py +2 -24
  55. esphome/components/custom/text_sensor/__init__.py +2 -29
  56. esphome/components/custom_component/__init__.py +3 -27
  57. esphome/components/daly_bms/daly_bms.cpp +6 -0
  58. esphome/components/daly_bms/daly_bms.h +2 -0
  59. esphome/components/daly_bms/sensor.py +6 -0
  60. esphome/components/debug/debug_component.cpp +4 -0
  61. esphome/components/debug/debug_component.h +14 -0
  62. esphome/components/debug/debug_esp32.cpp +154 -74
  63. esphome/components/dfplayer/dfplayer.cpp +15 -2
  64. esphome/components/dfrobot_sen0395/dfrobot_sen0395.cpp +2 -1
  65. esphome/components/dht/dht.cpp +4 -2
  66. esphome/components/dht/sensor.py +1 -1
  67. esphome/components/display/__init__.py +18 -5
  68. esphome/components/display/display.cpp +16 -3
  69. esphome/components/display/rect.cpp +2 -1
  70. esphome/components/es7210/__init__.py +0 -0
  71. esphome/components/es7210/audio_adc.py +51 -0
  72. esphome/components/es7210/es7210.cpp +228 -0
  73. esphome/components/es7210/es7210.h +62 -0
  74. esphome/components/es7210/es7210_const.h +129 -0
  75. esphome/components/es7243e/__init__.py +0 -0
  76. esphome/components/es7243e/audio_adc.py +34 -0
  77. esphome/components/es7243e/es7243e.cpp +125 -0
  78. esphome/components/es7243e/es7243e.h +37 -0
  79. esphome/components/es7243e/es7243e_const.h +54 -0
  80. esphome/components/es8156/__init__.py +0 -0
  81. esphome/components/es8156/audio_dac.py +27 -0
  82. esphome/components/es8156/es8156.cpp +87 -0
  83. esphome/components/es8156/es8156.h +51 -0
  84. esphome/components/es8156/es8156_const.h +68 -0
  85. esphome/components/es8311/audio_dac.py +1 -2
  86. esphome/components/esp32/__init__.py +1 -0
  87. esphome/components/esp32/core.cpp +5 -1
  88. esphome/components/esp32/gpio.h +2 -0
  89. esphome/components/esp32_ble/__init__.py +39 -0
  90. esphome/components/esp32_ble/queue.h +4 -4
  91. esphome/components/esp32_ble_client/ble_client_base.cpp +46 -0
  92. esphome/components/esp32_ble_client/ble_client_base.h +2 -0
  93. esphome/components/esp32_ble_server/__init__.py +582 -12
  94. esphome/components/esp32_ble_server/ble_characteristic.cpp +48 -60
  95. esphome/components/esp32_ble_server/ble_characteristic.h +24 -17
  96. esphome/components/esp32_ble_server/ble_descriptor.cpp +21 -9
  97. esphome/components/esp32_ble_server/ble_descriptor.h +17 -6
  98. esphome/components/esp32_ble_server/ble_server.cpp +62 -67
  99. esphome/components/esp32_ble_server/ble_server.h +28 -32
  100. esphome/components/esp32_ble_server/ble_server_automations.cpp +77 -0
  101. esphome/components/esp32_ble_server/ble_server_automations.h +115 -0
  102. esphome/components/esp32_ble_server/ble_service.cpp +17 -15
  103. esphome/components/esp32_ble_server/ble_service.h +10 -14
  104. esphome/components/esp32_ble_tracker/__init__.py +6 -39
  105. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +33 -10
  106. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +8 -4
  107. esphome/components/esp32_dac/esp32_dac.cpp +16 -7
  108. esphome/components/esp32_dac/esp32_dac.h +8 -0
  109. esphome/components/esp32_dac/output.py +16 -4
  110. esphome/components/esp32_improv/__init__.py +2 -8
  111. esphome/components/esp32_improv/esp32_improv_component.cpp +21 -20
  112. esphome/components/esp32_improv/esp32_improv_component.h +3 -4
  113. esphome/components/esp32_rmt/__init__.py +28 -3
  114. esphome/components/esp32_rmt_led_strip/led_strip.cpp +73 -6
  115. esphome/components/esp32_rmt_led_strip/led_strip.h +21 -3
  116. esphome/components/esp32_rmt_led_strip/light.py +72 -7
  117. esphome/components/esp32_touch/esp32_touch.cpp +5 -0
  118. esphome/components/esp8266/__init__.py +1 -0
  119. esphome/components/esp8266/gpio.h +1 -0
  120. esphome/components/ethernet/__init__.py +10 -10
  121. esphome/components/event/event.cpp +4 -2
  122. esphome/components/event/event.h +2 -0
  123. esphome/components/event_emitter/__init__.py +5 -0
  124. esphome/components/event_emitter/event_emitter.cpp +14 -0
  125. esphome/components/event_emitter/event_emitter.h +63 -0
  126. esphome/components/font/__init__.py +1 -1
  127. esphome/components/gcja5/gcja5.cpp +2 -1
  128. esphome/components/graph/graph.cpp +4 -9
  129. esphome/components/haier/haier_base.cpp +2 -1
  130. esphome/components/haier/hon_climate.cpp +2 -1
  131. esphome/components/heatpumpir/heatpumpir.cpp +2 -1
  132. esphome/components/host/__init__.py +1 -0
  133. esphome/components/host/gpio.h +1 -0
  134. esphome/components/http_request/http_request.h +2 -2
  135. esphome/components/http_request/http_request_arduino.cpp +1 -1
  136. esphome/components/http_request/http_request_idf.cpp +1 -1
  137. esphome/components/i2c/i2c_bus_esp_idf.cpp +4 -0
  138. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +7 -5
  139. esphome/components/i2s_audio/speaker/__init__.py +53 -6
  140. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +92 -46
  141. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +8 -0
  142. esphome/components/ili9xxx/display.py +29 -11
  143. esphome/components/ili9xxx/ili9xxx_display.cpp +2 -5
  144. esphome/components/ili9xxx/ili9xxx_display.h +2 -1
  145. esphome/components/image/__init__.py +443 -255
  146. esphome/components/image/image.cpp +115 -61
  147. esphome/components/image/image.h +15 -24
  148. esphome/components/json/json_util.cpp +8 -34
  149. esphome/components/libretiny/__init__.py +1 -0
  150. esphome/components/libretiny/gpio_arduino.h +1 -0
  151. esphome/components/light/light_color_values.h +1 -1
  152. esphome/components/logger/__init__.py +45 -9
  153. esphome/components/logger/logger.cpp +16 -14
  154. esphome/components/logger/logger.h +11 -7
  155. esphome/components/logger/select/__init__.py +29 -0
  156. esphome/components/logger/select/logger_level_select.cpp +27 -0
  157. esphome/components/logger/select/logger_level_select.h +15 -0
  158. esphome/components/lvgl/__init__.py +96 -73
  159. esphome/components/lvgl/automation.py +39 -7
  160. esphome/components/lvgl/defines.py +8 -2
  161. esphome/components/lvgl/lvgl_esphome.cpp +8 -15
  162. esphome/components/lvgl/lvgl_esphome.h +20 -5
  163. esphome/components/lvgl/schemas.py +25 -14
  164. esphome/components/lvgl/trigger.py +27 -3
  165. esphome/components/lvgl/widgets/dropdown.py +1 -1
  166. esphome/components/lvgl/widgets/keyboard.py +8 -1
  167. esphome/components/lvgl/widgets/meter.py +2 -1
  168. esphome/components/lvgl/widgets/msgbox.py +1 -1
  169. esphome/components/lvgl/widgets/obj.py +1 -12
  170. esphome/components/lvgl/widgets/page.py +37 -2
  171. esphome/components/lvgl/widgets/tabview.py +1 -1
  172. esphome/components/max6956/max6956.h +2 -0
  173. esphome/components/mcp23016/mcp23016.h +2 -0
  174. esphome/components/mcp23xxx_base/mcp23xxx_base.h +2 -0
  175. esphome/components/mdns/__init__.py +1 -1
  176. esphome/components/media_player/__init__.py +37 -8
  177. esphome/components/media_player/automation.h +11 -2
  178. esphome/components/media_player/media_player.cpp +8 -0
  179. esphome/components/media_player/media_player.h +8 -4
  180. esphome/components/micronova/switch/micronova_switch.cpp +4 -2
  181. esphome/components/midea/ac_automations.h +3 -1
  182. esphome/components/midea/air_conditioner.cpp +7 -5
  183. esphome/components/midea/air_conditioner.h +1 -1
  184. esphome/components/midea/climate.py +4 -2
  185. esphome/components/midea/ir_transmitter.h +36 -5
  186. esphome/components/mixer/__init__.py +0 -0
  187. esphome/components/mixer/speaker/__init__.py +172 -0
  188. esphome/components/mixer/speaker/automation.h +19 -0
  189. esphome/components/mixer/speaker/mixer_speaker.cpp +624 -0
  190. esphome/components/mixer/speaker/mixer_speaker.h +207 -0
  191. esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp +7 -13
  192. esphome/components/mpr121/mpr121.h +2 -0
  193. esphome/components/mqtt/__init__.py +1 -1
  194. esphome/components/mqtt/mqtt_client.cpp +7 -1
  195. esphome/components/mqtt/mqtt_client.h +1 -1
  196. esphome/components/mqtt/mqtt_climate.cpp +2 -2
  197. esphome/components/network/ip_address.h +2 -0
  198. esphome/components/nextion/automation.h +17 -0
  199. esphome/components/nextion/display.py +42 -17
  200. esphome/components/nextion/nextion.cpp +4 -10
  201. esphome/components/nextion/nextion.h +89 -82
  202. esphome/components/nextion/nextion_commands.cpp +10 -10
  203. esphome/components/ntc/sensor.py +2 -4
  204. esphome/components/online_image/__init__.py +98 -46
  205. esphome/components/online_image/bmp_image.cpp +101 -0
  206. esphome/components/online_image/bmp_image.h +40 -0
  207. esphome/components/online_image/image_decoder.cpp +31 -2
  208. esphome/components/online_image/image_decoder.h +24 -15
  209. esphome/components/online_image/jpeg_image.cpp +92 -0
  210. esphome/components/online_image/jpeg_image.h +34 -0
  211. esphome/components/online_image/online_image.cpp +118 -58
  212. esphome/components/online_image/online_image.h +39 -9
  213. esphome/components/online_image/png_image.cpp +7 -3
  214. esphome/components/online_image/png_image.h +2 -1
  215. esphome/components/opentherm/__init__.py +73 -7
  216. esphome/components/opentherm/automation.h +25 -0
  217. esphome/components/opentherm/const.py +1 -0
  218. esphome/components/opentherm/generate.py +39 -6
  219. esphome/components/opentherm/hub.cpp +117 -79
  220. esphome/components/opentherm/hub.h +31 -15
  221. esphome/components/opentherm/opentherm.cpp +47 -23
  222. esphome/components/opentherm/opentherm.h +27 -6
  223. esphome/components/opentherm/opentherm_macros.h +11 -0
  224. esphome/components/opentherm/schema.py +78 -1
  225. esphome/components/opentherm/validate.py +7 -2
  226. esphome/components/pca6416a/pca6416a.h +2 -0
  227. esphome/components/pca9554/pca9554.h +2 -0
  228. esphome/components/pcf8574/pcf8574.h +2 -0
  229. esphome/components/preferences/__init__.py +2 -4
  230. esphome/components/preferences/syncer.h +10 -3
  231. esphome/components/prometheus/prometheus_handler.cpp +313 -0
  232. esphome/components/prometheus/prometheus_handler.h +48 -7
  233. esphome/components/psram/psram.cpp +8 -1
  234. esphome/components/pulse_counter/pulse_counter_sensor.cpp +14 -9
  235. esphome/components/pulse_counter/pulse_counter_sensor.h +4 -4
  236. esphome/components/pulse_meter/pulse_meter_sensor.cpp +2 -0
  237. esphome/components/qspi_dbi/__init__.py +3 -0
  238. esphome/components/qspi_dbi/display.py +74 -47
  239. esphome/components/qspi_dbi/models.py +245 -2
  240. esphome/components/qspi_dbi/qspi_dbi.cpp +9 -16
  241. esphome/components/qspi_dbi/qspi_dbi.h +2 -2
  242. esphome/components/remote_base/__init__.py +77 -25
  243. esphome/components/remote_base/remote_base.cpp +1 -1
  244. esphome/components/remote_base/remote_base.h +20 -2
  245. esphome/components/remote_base/toto_protocol.cpp +100 -0
  246. esphome/components/remote_base/toto_protocol.h +45 -0
  247. esphome/components/remote_receiver/__init__.py +55 -10
  248. esphome/components/remote_receiver/remote_receiver.h +36 -3
  249. esphome/components/remote_receiver/remote_receiver_esp32.cpp +145 -6
  250. esphome/components/remote_transmitter/__init__.py +62 -4
  251. esphome/components/remote_transmitter/remote_transmitter.h +21 -2
  252. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +140 -4
  253. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +3 -3
  254. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +3 -3
  255. esphome/components/resampler/__init__.py +0 -0
  256. esphome/components/resampler/speaker/__init__.py +103 -0
  257. esphome/components/resampler/speaker/resampler_speaker.cpp +318 -0
  258. esphome/components/resampler/speaker/resampler_speaker.h +107 -0
  259. esphome/components/resistance/resistance_sensor.h +2 -3
  260. esphome/components/resistance/sensor.py +2 -9
  261. esphome/components/rotary_encoder/rotary_encoder.cpp +8 -4
  262. esphome/components/rp2040/__init__.py +1 -0
  263. esphome/components/rp2040/gpio.h +1 -0
  264. esphome/components/rtl87xx/__init__.py +2 -0
  265. esphome/components/scd30/sensor.py +1 -1
  266. esphome/components/sdl/binary_sensor.py +270 -0
  267. esphome/components/sdl/sdl_esphome.cpp +16 -0
  268. esphome/components/sdl/sdl_esphome.h +9 -0
  269. esphome/components/seeed_mr60bha2/binary_sensor.py +25 -0
  270. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +26 -2
  271. esphome/components/seeed_mr60bha2/seeed_mr60bha2.h +9 -20
  272. esphome/components/seeed_mr60bha2/sensor.py +9 -1
  273. esphome/components/sn74hc165/sn74hc165.h +3 -0
  274. esphome/components/sn74hc595/sn74hc595.h +3 -0
  275. esphome/components/speaker/__init__.py +5 -4
  276. esphome/components/speaker/media_player/__init__.py +458 -0
  277. esphome/components/speaker/media_player/audio_pipeline.cpp +568 -0
  278. esphome/components/speaker/media_player/audio_pipeline.h +159 -0
  279. esphome/components/speaker/media_player/automation.h +26 -0
  280. esphome/components/speaker/media_player/speaker_media_player.cpp +577 -0
  281. esphome/components/speaker/media_player/speaker_media_player.h +160 -0
  282. esphome/components/speaker/speaker.h +20 -0
  283. esphome/components/spi/__init__.py +1 -5
  284. esphome/components/spi/spi.cpp +7 -1
  285. esphome/components/spi/spi.h +21 -2
  286. esphome/components/spi_led_strip/light.py +3 -5
  287. esphome/components/spi_led_strip/spi_led_strip.cpp +67 -0
  288. esphome/components/spi_led_strip/spi_led_strip.h +8 -60
  289. esphome/components/sprinkler/sprinkler.cpp +3 -1
  290. esphome/components/sx1509/sx1509_gpio_pin.h +2 -0
  291. esphome/components/tca9555/tca9555.h +2 -0
  292. esphome/components/toshiba/toshiba.cpp +2 -1
  293. esphome/components/tuya/light/tuya_light.cpp +4 -2
  294. esphome/components/uart/uart_component_esp32_arduino.cpp +2 -2
  295. esphome/components/uart/uart_component_esp_idf.cpp +2 -2
  296. esphome/components/udp/__init__.py +8 -2
  297. esphome/components/udp/udp_component.cpp +25 -56
  298. esphome/components/udp/udp_component.h +3 -0
  299. esphome/components/uponor_smatrix/sensor/__init__.py +14 -4
  300. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +5 -0
  301. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.h +1 -0
  302. esphome/components/uptime/text_sensor/__init__.py +19 -0
  303. esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +63 -0
  304. esphome/components/uptime/text_sensor/uptime_text_sensor.h +25 -0
  305. esphome/components/voice_assistant/voice_assistant.cpp +24 -14
  306. esphome/components/voice_assistant/voice_assistant.h +8 -0
  307. esphome/components/waveshare_epaper/display.py +22 -1
  308. esphome/components/waveshare_epaper/waveshare_213v3.cpp +9 -3
  309. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1155 -44
  310. esphome/components/waveshare_epaper/waveshare_epaper.h +208 -7
  311. esphome/components/web_server/web_server.cpp +28 -6
  312. esphome/components/weikai/weikai.h +2 -0
  313. esphome/components/wifi/__init__.py +6 -6
  314. esphome/components/wifi/wifi_component.cpp +1 -1
  315. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -1
  316. esphome/components/wireguard/__init__.py +2 -2
  317. esphome/components/xl9535/xl9535.h +2 -0
  318. esphome/components/xxtea/__init__.py +3 -0
  319. esphome/components/xxtea/xxtea.cpp +46 -0
  320. esphome/components/xxtea/xxtea.h +26 -0
  321. esphome/components/yashima/yashima.cpp +2 -1
  322. esphome/config.py +9 -5
  323. esphome/config_validation.py +55 -17
  324. esphome/const.py +7 -10
  325. esphome/core/__init__.py +6 -13
  326. esphome/core/base_automation.h +1 -0
  327. esphome/core/config.py +59 -72
  328. esphome/core/defines.h +9 -1
  329. esphome/core/gpio.h +7 -0
  330. esphome/core/helpers.cpp +19 -15
  331. esphome/core/helpers.h +57 -8
  332. esphome/core/log.h +9 -7
  333. esphome/cpp_generator.py +2 -2
  334. esphome/dashboard/web_server.py +1 -1
  335. esphome/espota2.py +3 -2
  336. esphome/loader.py +12 -4
  337. esphome/log.py +5 -7
  338. esphome/yaml_util.py +2 -2
  339. {esphome-2024.12.4.dist-info → esphome-2025.2.0.dist-info}/METADATA +14 -9
  340. {esphome-2024.12.4.dist-info → esphome-2025.2.0.dist-info}/RECORD +349 -300
  341. esphome/components/custom/binary_sensor/custom_binary_sensor.cpp +0 -16
  342. esphome/components/custom/binary_sensor/custom_binary_sensor.h +0 -26
  343. esphome/components/custom/climate/custom_climate.h +0 -22
  344. esphome/components/custom/cover/custom_cover.h +0 -21
  345. esphome/components/custom/light/custom_light_output.h +0 -24
  346. esphome/components/custom/output/custom_output.h +0 -37
  347. esphome/components/custom/sensor/custom_sensor.cpp +0 -16
  348. esphome/components/custom/sensor/custom_sensor.h +0 -24
  349. esphome/components/custom/switch/custom_switch.cpp +0 -16
  350. esphome/components/custom/switch/custom_switch.h +0 -24
  351. esphome/components/custom/text_sensor/custom_text_sensor.cpp +0 -16
  352. esphome/components/custom/text_sensor/custom_text_sensor.h +0 -26
  353. esphome/components/custom_component/custom_component.h +0 -28
  354. esphome/components/esp32_ble_server/ble_2901.cpp +0 -18
  355. esphome/components/esp32_ble_server/ble_2901.h +0 -19
  356. esphome/components/resistance_sampler/__init__.py +0 -6
  357. esphome/components/resistance_sampler/resistance_sampler.h +0 -10
  358. esphome/components/uptime/{sensor.py → sensor/__init__.py} +3 -3
  359. /esphome/components/uptime/{uptime_seconds_sensor.cpp → sensor/uptime_seconds_sensor.cpp} +0 -0
  360. /esphome/components/uptime/{uptime_seconds_sensor.h → sensor/uptime_seconds_sensor.h} +0 -0
  361. /esphome/components/uptime/{uptime_timestamp_sensor.cpp → sensor/uptime_timestamp_sensor.cpp} +0 -0
  362. /esphome/components/uptime/{uptime_timestamp_sensor.h → sensor/uptime_timestamp_sensor.h} +0 -0
  363. {esphome-2024.12.4.dist-info → esphome-2025.2.0.dist-info}/LICENSE +0 -0
  364. {esphome-2024.12.4.dist-info → esphome-2025.2.0.dist-info}/WHEEL +0 -0
  365. {esphome-2024.12.4.dist-info → esphome-2025.2.0.dist-info}/entry_points.txt +0 -0
  366. {esphome-2024.12.4.dist-info → esphome-2025.2.0.dist-info}/top_level.txt +0 -0
@@ -27,10 +27,7 @@ class WaveshareEPaperBase : public display::DisplayBuffer,
27
27
 
28
28
  void update() override;
29
29
 
30
- void setup() override {
31
- this->setup_pins_();
32
- this->initialize();
33
- }
30
+ void setup() override;
34
31
 
35
32
  void on_safe_shutdown() override;
36
33
 
@@ -86,6 +83,23 @@ class WaveshareEPaperBWR : public WaveshareEPaperBase {
86
83
  uint32_t get_buffer_length_() override;
87
84
  };
88
85
 
86
+ class WaveshareEPaper7C : public WaveshareEPaperBase {
87
+ public:
88
+ uint8_t color_to_hex(Color color);
89
+ void fill(Color color) override;
90
+
91
+ display::DisplayType get_display_type() override { return display::DisplayType::DISPLAY_TYPE_COLOR; }
92
+
93
+ protected:
94
+ void draw_absolute_pixel_internal(int x, int y, Color color) override;
95
+ uint32_t get_buffer_length_() override;
96
+ void setup() override;
97
+ void init_internal_7c_(uint32_t buffer_length);
98
+
99
+ static const int NUM_BUFFERS = 10;
100
+ uint8_t *buffers_[NUM_BUFFERS];
101
+ };
102
+
89
103
  enum WaveshareEPaperTypeAModel {
90
104
  WAVESHARE_EPAPER_1_54_IN = 0,
91
105
  WAVESHARE_EPAPER_1_54_IN_V2,
@@ -160,6 +174,7 @@ enum WaveshareEPaperTypeBModel {
160
174
  WAVESHARE_EPAPER_2_7_IN_B_V2,
161
175
  WAVESHARE_EPAPER_4_2_IN,
162
176
  WAVESHARE_EPAPER_4_2_IN_B_V2,
177
+ WAVESHARE_EPAPER_7_3_IN_F,
163
178
  WAVESHARE_EPAPER_7_5_IN,
164
179
  WAVESHARE_EPAPER_7_5_INV2,
165
180
  WAVESHARE_EPAPER_7_5_IN_B_V2,
@@ -247,6 +262,37 @@ class WaveshareEPaper2P7InBV2 : public WaveshareEPaperBWR {
247
262
  };
248
263
 
249
264
  class GDEW029T5 : public WaveshareEPaper {
265
+ public:
266
+ void initialize() override;
267
+
268
+ void display() override;
269
+
270
+ void dump_config() override;
271
+
272
+ void deep_sleep() override;
273
+ void set_full_update_every(uint32_t full_update_every);
274
+
275
+ protected:
276
+ void init_display_();
277
+ void init_full_();
278
+ void init_partial_();
279
+ void write_lut_(const uint8_t *lut, uint8_t size);
280
+ void power_off_();
281
+ void power_on_();
282
+ int get_width_internal() override;
283
+
284
+ int get_height_internal() override;
285
+
286
+ private:
287
+ uint32_t full_update_every_{30};
288
+ uint32_t at_update_{0};
289
+ bool deep_sleep_between_updates_{false};
290
+ bool power_is_on_{false};
291
+ bool is_deep_sleep_{false};
292
+ uint8_t *old_buffer_{nullptr};
293
+ };
294
+
295
+ class GDEY029T94 : public WaveshareEPaper {
250
296
  public:
251
297
  void initialize() override;
252
298
 
@@ -255,9 +301,8 @@ class GDEW029T5 : public WaveshareEPaper {
255
301
  void dump_config() override;
256
302
 
257
303
  void deep_sleep() override {
258
- // COMMAND DEEP SLEEP
259
- this->command(0x07);
260
- this->data(0xA5); // check byte
304
+ this->command(0x10); // Enter deep sleep
305
+ this->data(0x01);
261
306
  }
262
307
 
263
308
  protected:
@@ -416,6 +461,63 @@ class WaveshareEPaper2P9InDKE : public WaveshareEPaper {
416
461
  int get_height_internal() override;
417
462
  };
418
463
 
464
+ class WaveshareEPaper2P9InD : public WaveshareEPaper {
465
+ public:
466
+ void initialize() override;
467
+
468
+ void display() override;
469
+
470
+ void dump_config() override;
471
+
472
+ void deep_sleep() override {
473
+ // COMMAND DEEP SLEEP
474
+ this->command(0x07);
475
+ this->data(0xA5);
476
+ }
477
+
478
+ protected:
479
+ int get_width_internal() override;
480
+
481
+ int get_height_internal() override;
482
+ };
483
+
484
+ class GDEY042T81 : public WaveshareEPaper {
485
+ public:
486
+ GDEY042T81();
487
+
488
+ void initialize() override;
489
+
490
+ void display() override;
491
+
492
+ void dump_config() override;
493
+
494
+ void deep_sleep() override {
495
+ // COMMAND POWER OFF
496
+ this->command(0x22);
497
+ this->data(0x83);
498
+ this->command(0x20);
499
+ // COMMAND DEEP SLEEP
500
+ this->command(0x10);
501
+ this->data(0x01);
502
+ }
503
+
504
+ void set_full_update_every(uint32_t full_update_every);
505
+
506
+ protected:
507
+ uint32_t full_update_every_{30};
508
+ uint32_t at_update_{0};
509
+
510
+ int get_width_internal() override;
511
+ int get_height_internal() override;
512
+ uint32_t idle_timeout_() override;
513
+
514
+ private:
515
+ void reset_();
516
+ void update_full_();
517
+ void update_part_();
518
+ void init_display_();
519
+ };
520
+
419
521
  class WaveshareEPaper4P2In : public WaveshareEPaper {
420
522
  public:
421
523
  void initialize() override;
@@ -487,6 +589,34 @@ class WaveshareEPaper4P2InBV2 : public WaveshareEPaper {
487
589
  int get_height_internal() override;
488
590
  };
489
591
 
592
+ class WaveshareEPaper4P2InBV2BWR : public WaveshareEPaperBWR {
593
+ public:
594
+ void initialize() override;
595
+
596
+ void display() override;
597
+
598
+ void dump_config() override;
599
+
600
+ void deep_sleep() override {
601
+ // COMMAND VCOM AND DATA INTERVAL SETTING
602
+ this->command(0x50);
603
+ this->data(0xF7); // border floating
604
+
605
+ // COMMAND POWER OFF
606
+ this->command(0x02);
607
+ this->wait_until_idle_();
608
+
609
+ // COMMAND DEEP SLEEP
610
+ this->command(0x07);
611
+ this->data(0xA5); // check code
612
+ }
613
+
614
+ protected:
615
+ int get_width_internal() override;
616
+
617
+ int get_height_internal() override;
618
+ };
619
+
490
620
  class WaveshareEPaper5P8In : public WaveshareEPaper {
491
621
  public:
492
622
  void initialize() override;
@@ -553,6 +683,39 @@ class WaveshareEPaper5P8InV2 : public WaveshareEPaper {
553
683
  int get_height_internal() override;
554
684
  };
555
685
 
686
+ class WaveshareEPaper7P3InF : public WaveshareEPaper7C {
687
+ public:
688
+ void initialize() override;
689
+
690
+ void display() override;
691
+
692
+ void dump_config() override;
693
+
694
+ protected:
695
+ int get_width_internal() override;
696
+
697
+ int get_height_internal() override;
698
+
699
+ uint32_t idle_timeout_() override;
700
+
701
+ void deep_sleep() override { ; }
702
+
703
+ bool wait_until_idle_();
704
+
705
+ bool deep_sleep_between_updates_{true};
706
+
707
+ void reset_() {
708
+ if (this->reset_pin_ != nullptr) {
709
+ this->reset_pin_->digital_write(true);
710
+ delay(20);
711
+ this->reset_pin_->digital_write(false);
712
+ delay(1);
713
+ this->reset_pin_->digital_write(true);
714
+ delay(20);
715
+ }
716
+ };
717
+ };
718
+
556
719
  class WaveshareEPaper7P5In : public WaveshareEPaper {
557
720
  public:
558
721
  void initialize() override;
@@ -744,6 +907,43 @@ class WaveshareEPaper7P5InV2alt : public WaveshareEPaper7P5InV2 {
744
907
  };
745
908
  };
746
909
 
910
+ class WaveshareEPaper7P5InV2P : public WaveshareEPaper {
911
+ public:
912
+ bool wait_until_idle_();
913
+
914
+ void initialize() override;
915
+
916
+ void display() override;
917
+
918
+ void dump_config() override;
919
+
920
+ void deep_sleep() override {
921
+ // COMMAND POWER OFF
922
+ this->command(0x02);
923
+ this->wait_until_idle_();
924
+ // COMMAND DEEP SLEEP
925
+ this->command(0x07);
926
+ this->data(0xA5); // check byte
927
+ }
928
+
929
+ void set_full_update_every(uint32_t full_update_every);
930
+
931
+ protected:
932
+ int get_width_internal() override;
933
+
934
+ int get_height_internal() override;
935
+
936
+ uint32_t idle_timeout_() override;
937
+
938
+ uint32_t full_update_every_{30};
939
+ uint32_t at_update_{0};
940
+
941
+ private:
942
+ void reset_();
943
+
944
+ void turn_on_display_();
945
+ };
946
+
747
947
  class WaveshareEPaper7P5InHDB : public WaveshareEPaper {
748
948
  public:
749
949
  void initialize() override;
@@ -811,6 +1011,7 @@ class WaveshareEPaper2P13InV3 : public WaveshareEPaper {
811
1011
  void initialize() override;
812
1012
 
813
1013
  protected:
1014
+ int get_width_controller() override;
814
1015
  int get_width_internal() override;
815
1016
  int get_height_internal() override;
816
1017
  uint32_t idle_timeout_() override;
@@ -455,8 +455,9 @@ void WebServer::handle_fan_request(AsyncWebServerRequest *request, const UrlMatc
455
455
  } else if (match.method == "toggle") {
456
456
  this->schedule_([obj]() { obj->toggle().perform(); });
457
457
  request->send(200);
458
- } else if (match.method == "turn_on") {
459
- auto call = obj->turn_on();
458
+ } else if (match.method == "turn_on" || match.method == "turn_off") {
459
+ auto call = match.method == "turn_on" ? obj->turn_on() : obj->turn_off();
460
+
460
461
  if (request->hasParam("speed_level")) {
461
462
  auto speed_level = request->getParam("speed_level")->value();
462
463
  auto val = parse_number<int>(speed_level.c_str());
@@ -486,9 +487,6 @@ void WebServer::handle_fan_request(AsyncWebServerRequest *request, const UrlMatc
486
487
  }
487
488
  this->schedule_([call]() mutable { call.perform(); });
488
489
  request->send(200);
489
- } else if (match.method == "turn_off") {
490
- this->schedule_([obj]() { obj->turn_off().perform(); });
491
- request->send(200);
492
490
  } else {
493
491
  request->send(404);
494
492
  }
@@ -1415,6 +1413,30 @@ void WebServer::handle_alarm_control_panel_request(AsyncWebServerRequest *reques
1415
1413
  request->send(200, "application/json", data.c_str());
1416
1414
  return;
1417
1415
  }
1416
+
1417
+ auto call = obj->make_call();
1418
+ if (request->hasParam("code")) {
1419
+ call.set_code(request->getParam("code")->value().c_str());
1420
+ }
1421
+
1422
+ if (match.method == "disarm") {
1423
+ call.disarm();
1424
+ } else if (match.method == "arm_away") {
1425
+ call.arm_away();
1426
+ } else if (match.method == "arm_home") {
1427
+ call.arm_home();
1428
+ } else if (match.method == "arm_night") {
1429
+ call.arm_night();
1430
+ } else if (match.method == "arm_vacation") {
1431
+ call.arm_vacation();
1432
+ } else {
1433
+ request->send(404);
1434
+ return;
1435
+ }
1436
+
1437
+ this->schedule_([call]() mutable { call.perform(); });
1438
+ request->send(200);
1439
+ return;
1418
1440
  }
1419
1441
  request->send(404);
1420
1442
  }
@@ -1664,7 +1686,7 @@ bool WebServer::canHandle(AsyncWebServerRequest *request) {
1664
1686
  #endif
1665
1687
 
1666
1688
  #ifdef USE_ALARM_CONTROL_PANEL
1667
- if (request->method() == HTTP_GET && match.domain == "alarm_control_panel")
1689
+ if ((request->method() == HTTP_GET || request->method() == HTTP_POST) && match.domain == "alarm_control_panel")
1668
1690
  return true;
1669
1691
  #endif
1670
1692
 
@@ -275,6 +275,8 @@ class WeikaiGPIOPin : public GPIOPin {
275
275
  void set_inverted(bool inverted) { this->inverted_ = inverted; }
276
276
  void set_flags(gpio::Flags flags) { this->flags_ = flags; }
277
277
 
278
+ gpio::Flags get_flags() const override { return this->flags_; }
279
+
278
280
  void setup() override;
279
281
  std::string dump_summary() const override;
280
282
  void pin_mode(gpio::Flags flags) override { this->parent_->set_pin_direction_(this->pin_, flags); }
@@ -93,16 +93,16 @@ def validate_channel(value):
93
93
 
94
94
  AP_MANUAL_IP_SCHEMA = cv.Schema(
95
95
  {
96
- cv.Required(CONF_STATIC_IP): cv.ipv4,
97
- cv.Required(CONF_GATEWAY): cv.ipv4,
98
- cv.Required(CONF_SUBNET): cv.ipv4,
96
+ cv.Required(CONF_STATIC_IP): cv.ipv4address,
97
+ cv.Required(CONF_GATEWAY): cv.ipv4address,
98
+ cv.Required(CONF_SUBNET): cv.ipv4address,
99
99
  }
100
100
  )
101
101
 
102
102
  STA_MANUAL_IP_SCHEMA = AP_MANUAL_IP_SCHEMA.extend(
103
103
  {
104
- cv.Optional(CONF_DNS1, default="0.0.0.0"): cv.ipv4,
105
- cv.Optional(CONF_DNS2, default="0.0.0.0"): cv.ipv4,
104
+ cv.Optional(CONF_DNS1, default="0.0.0.0"): cv.ipv4address,
105
+ cv.Optional(CONF_DNS2, default="0.0.0.0"): cv.ipv4address,
106
106
  }
107
107
  )
108
108
 
@@ -364,7 +364,7 @@ def eap_auth(config):
364
364
  def safe_ip(ip):
365
365
  if ip is None:
366
366
  return IPAddress(0, 0, 0, 0)
367
- return IPAddress(*ip.args)
367
+ return IPAddress(str(ip))
368
368
 
369
369
 
370
370
  def manual_ip(config):
@@ -66,7 +66,7 @@ void WiFiComponent::start() {
66
66
 
67
67
  this->pref_ = global_preferences->make_preference<wifi::SavedWifiSettings>(hash, true);
68
68
  if (this->fast_connect_) {
69
- this->fast_connect_pref_ = global_preferences->make_preference<wifi::SavedWifiFastConnectSettings>(hash, false);
69
+ this->fast_connect_pref_ = global_preferences->make_preference<wifi::SavedWifiFastConnectSettings>(hash + 1, false);
70
70
  }
71
71
 
72
72
  SavedWifiSettings save{};
@@ -11,10 +11,19 @@
11
11
  #ifdef USE_WIFI_WPA2_EAP
12
12
  #include <esp_wpa2.h>
13
13
  #endif
14
+
15
+ #ifdef USE_WIFI_AP
16
+ #include "dhcpserver/dhcpserver.h"
17
+ #endif // USE_WIFI_AP
18
+
14
19
  #include "lwip/apps/sntp.h"
15
20
  #include "lwip/dns.h"
16
21
  #include "lwip/err.h"
17
22
 
23
+ #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING
24
+ #include "lwip/priv/tcpip_priv.h"
25
+ #endif
26
+
18
27
  #include "esphome/core/application.h"
19
28
  #include "esphome/core/hal.h"
20
29
  #include "esphome/core/helpers.h"
@@ -286,11 +295,26 @@ bool WiFiComponent::wifi_sta_ip_config_(optional<ManualIP> manual_ip) {
286
295
  }
287
296
 
288
297
  if (!manual_ip.has_value()) {
298
+ // sntp_servermode_dhcp lwip/sntp.c (Required to lock TCPIP core functionality!)
299
+ // https://github.com/esphome/issues/issues/6591
300
+ // https://github.com/espressif/arduino-esp32/issues/10526
301
+ #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING
302
+ if (!sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) {
303
+ LOCK_TCPIP_CORE();
304
+ }
305
+ #endif
306
+
289
307
  // lwIP starts the SNTP client if it gets an SNTP server from DHCP. We don't need the time, and more importantly,
290
308
  // the built-in SNTP client has a memory leak in certain situations. Disable this feature.
291
309
  // https://github.com/esphome/issues/issues/2299
292
310
  sntp_servermode_dhcp(false);
293
311
 
312
+ #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING
313
+ if (sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) {
314
+ UNLOCK_TCPIP_CORE();
315
+ }
316
+ #endif
317
+
294
318
  // No manual IP is set; use DHCP client
295
319
  if (dhcp_status != ESP_NETIF_DHCP_STARTED) {
296
320
  err = esp_netif_dhcpc_start(s_sta_netif);
@@ -638,7 +662,12 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_
638
662
  }
639
663
 
640
664
  WiFiSTAConnectStatus WiFiComponent::wifi_sta_connect_status_() {
641
- auto status = WiFiClass::status();
665
+ #if USE_ARDUINO_VERSION_CODE < VERSION_CODE(3, 1, 0)
666
+ const auto status = WiFiClass::status();
667
+ #else
668
+ const auto status = WiFi.status();
669
+ #endif
670
+
642
671
  if (status == WL_CONNECT_FAILED || status == WL_CONNECTION_LOST) {
643
672
  return WiFiSTAConnectStatus::ERROR_CONNECT_FAILED;
644
673
  }
@@ -67,8 +67,8 @@ CONFIG_SCHEMA = cv.Schema(
67
67
  {
68
68
  cv.GenerateID(): cv.declare_id(Wireguard),
69
69
  cv.GenerateID(CONF_TIME_ID): cv.use_id(time.RealTimeClock),
70
- cv.Required(CONF_ADDRESS): cv.ipv4,
71
- cv.Optional(CONF_NETMASK, default="255.255.255.255"): cv.ipv4,
70
+ cv.Required(CONF_ADDRESS): cv.ipv4address,
71
+ cv.Optional(CONF_NETMASK, default="255.255.255.255"): cv.ipv4address,
72
72
  cv.Required(CONF_PRIVATE_KEY): _wireguard_key,
73
73
  cv.Required(CONF_PEER_ENDPOINT): cv.string,
74
74
  cv.Required(CONF_PEER_PUBLIC_KEY): _wireguard_key,
@@ -36,6 +36,8 @@ class XL9535GPIOPin : public GPIOPin {
36
36
  void set_inverted(bool inverted) { this->inverted_ = inverted; }
37
37
  void set_flags(gpio::Flags flags) { this->flags_ = flags; }
38
38
 
39
+ gpio::Flags get_flags() const override { return this->flags_; }
40
+
39
41
  void setup() override;
40
42
  std::string dump_summary() const override;
41
43
  void pin_mode(gpio::Flags flags) override;
@@ -0,0 +1,3 @@
1
+ """ESPHome XXTEA encryption component."""
2
+
3
+ CODEOWNERS = ["@clydebarrow"]
@@ -0,0 +1,46 @@
1
+ #include "xxtea.h"
2
+
3
+ namespace esphome {
4
+ namespace xxtea {
5
+
6
+ static const uint32_t DELTA = 0x9e3779b9;
7
+ #define MX ((((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4))) ^ ((sum ^ y) + (k[(p ^ e) & 7] ^ z)))
8
+
9
+ void encrypt(uint32_t *v, size_t n, const uint32_t *k) {
10
+ uint32_t z, y, sum, e;
11
+ size_t p;
12
+ size_t q = 6 + 52 / n;
13
+ sum = 0;
14
+ z = v[n - 1];
15
+ while (q-- != 0) {
16
+ sum += DELTA;
17
+ e = (sum >> 2);
18
+ for (p = 0; p != n - 1; p++) {
19
+ y = v[p + 1];
20
+ z = v[p] += MX;
21
+ }
22
+ y = v[0];
23
+ z = v[n - 1] += MX;
24
+ }
25
+ }
26
+
27
+ void decrypt(uint32_t *v, size_t n, const uint32_t *k) {
28
+ uint32_t z, y, sum, e;
29
+ size_t p;
30
+ size_t q = 6 + 52 / n;
31
+ sum = q * DELTA;
32
+ y = v[0];
33
+ while (q-- != 0) {
34
+ e = (sum >> 2);
35
+ for (p = n - 1; p != 0; p--) {
36
+ z = v[p - 1];
37
+ y = v[p] -= MX;
38
+ }
39
+ z = v[n - 1];
40
+ y = v[0] -= MX;
41
+ sum -= DELTA;
42
+ }
43
+ }
44
+
45
+ } // namespace xxtea
46
+ } // namespace esphome
@@ -0,0 +1,26 @@
1
+ #pragma once
2
+
3
+ #include <cstdint>
4
+ #include <cstddef>
5
+
6
+ namespace esphome {
7
+ namespace xxtea {
8
+
9
+ /**
10
+ * Encrypt a block of data in-place using XXTEA algorithm with 256-bit key
11
+ * @param v Data to encrypt (as array of 32-bit words)
12
+ * @param n Number of 32-bit words in data
13
+ * @param k Key (array of 8 32-bit words)
14
+ */
15
+ void encrypt(uint32_t *v, size_t n, const uint32_t *k);
16
+
17
+ /**
18
+ * Decrypt a block of data in-place using XXTEA algorithm with 256-bit key
19
+ * @param v Data to decrypt (as array of 32-bit words)
20
+ * @param n Number of 32-bit words in data
21
+ * @param k Key (array of 8 32-bit words)
22
+ */
23
+ void decrypt(uint32_t *v, size_t n, const uint32_t *k);
24
+
25
+ } // namespace xxtea
26
+ } // namespace esphome
@@ -104,8 +104,9 @@ void YashimaClimate::setup() {
104
104
  this->publish_state();
105
105
  });
106
106
  this->current_temperature = this->sensor_->state;
107
- } else
107
+ } else {
108
108
  this->current_temperature = NAN;
109
+ }
109
110
  // restore set points
110
111
  auto restore = this->restore_state_();
111
112
  if (restore.has_value()) {
esphome/config.py CHANGED
@@ -18,10 +18,10 @@ from esphome.const import (
18
18
  CONF_ESPHOME,
19
19
  CONF_EXTERNAL_COMPONENTS,
20
20
  CONF_ID,
21
+ CONF_MIN_VERSION,
21
22
  CONF_PACKAGES,
22
23
  CONF_PLATFORM,
23
24
  CONF_SUBSTITUTIONS,
24
- TARGET_PLATFORMS,
25
25
  )
26
26
  from esphome.core import CORE, DocumentRange, EsphomeError
27
27
  import esphome.core.config as core_config
@@ -832,17 +832,21 @@ def validate_config(
832
832
  result[CONF_ESPHOME] = config[CONF_ESPHOME]
833
833
  result.add_output_path([CONF_ESPHOME], CONF_ESPHOME)
834
834
  try:
835
- core_config.preload_core_config(config, result)
835
+ target_platform = core_config.preload_core_config(config, result)
836
836
  except vol.Invalid as err:
837
837
  result.add_error(err)
838
838
  return result
839
839
  # Remove temporary esphome config path again, it will be reloaded later
840
840
  result.remove_output_path([CONF_ESPHOME], CONF_ESPHOME)
841
841
 
842
+ # Check version number now to avoid loading components that are not supported
843
+ if min_version := config[CONF_ESPHOME].get(CONF_MIN_VERSION):
844
+ cv.All(cv.version_number, cv.validate_esphome_version)(min_version)
845
+
842
846
  # First run platform validation steps
843
- for key in TARGET_PLATFORMS:
844
- if key in config:
845
- result.add_validation_step(LoadValidationStep(key, config[key]))
847
+ result.add_validation_step(
848
+ LoadValidationStep(target_platform, config[target_platform])
849
+ )
846
850
  result.run_validation_steps()
847
851
 
848
852
  if result.errors: