esphome 2025.4.1__py3-none-any.whl → 2025.5.0b2__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 (412) hide show
  1. esphome/components/ac_dimmer/ac_dimmer.cpp +3 -2
  2. esphome/components/adc/__init__.py +51 -34
  3. esphome/components/airthings_wave_base/__init__.py +1 -1
  4. esphome/components/alarm_control_panel/__init__.py +37 -2
  5. esphome/components/am43/cover/__init__.py +4 -5
  6. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +6 -4
  7. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +4 -5
  8. esphome/components/analog_threshold/binary_sensor.py +10 -8
  9. esphome/components/anova/climate.py +4 -5
  10. esphome/components/api/__init__.py +25 -8
  11. esphome/components/api/api_connection.cpp +77 -10
  12. esphome/components/api/api_connection.h +6 -1
  13. esphome/components/api/api_frame_helper.cpp +98 -130
  14. esphome/components/api/api_frame_helper.h +12 -2
  15. esphome/components/api/api_noise_context.h +13 -4
  16. esphome/components/api/api_pb2.cpp +1422 -1
  17. esphome/components/api/api_pb2.h +255 -1
  18. esphome/components/api/api_pb2_service.cpp +162 -49
  19. esphome/components/api/api_pb2_service.h +90 -51
  20. esphome/components/api/api_pb2_size.h +361 -0
  21. esphome/components/api/api_server.cpp +110 -34
  22. esphome/components/api/api_server.h +8 -0
  23. esphome/components/api/proto.h +38 -9
  24. esphome/components/as3935_i2c/as3935_i2c.h +0 -3
  25. esphome/components/as7341/as7341.h +1 -1
  26. esphome/components/atm90e32/__init__.py +1 -0
  27. esphome/components/atm90e32/atm90e32.cpp +576 -199
  28. esphome/components/atm90e32/atm90e32.h +128 -31
  29. esphome/components/atm90e32/atm90e32_reg.h +4 -2
  30. esphome/components/atm90e32/button/__init__.py +62 -10
  31. esphome/components/atm90e32/button/atm90e32_button.cpp +63 -4
  32. esphome/components/atm90e32/button/atm90e32_button.h +36 -4
  33. esphome/components/atm90e32/number/__init__.py +130 -0
  34. esphome/components/atm90e32/number/atm90e32_number.h +16 -0
  35. esphome/components/atm90e32/sensor.py +21 -4
  36. esphome/components/atm90e32/text_sensor/__init__.py +48 -0
  37. esphome/components/audio/__init__.py +96 -49
  38. esphome/components/audio/audio.h +48 -0
  39. esphome/components/audio/audio_decoder.cpp +1 -1
  40. esphome/components/audio/audio_resampler.cpp +2 -0
  41. esphome/components/audio/audio_resampler.h +1 -0
  42. esphome/components/ballu/climate.py +2 -9
  43. esphome/components/bang_bang/climate.py +5 -6
  44. esphome/components/bedjet/climate/__init__.py +3 -8
  45. esphome/components/bedjet/fan/__init__.py +2 -11
  46. esphome/components/binary/fan/__init__.py +13 -16
  47. esphome/components/binary_sensor/__init__.py +13 -10
  48. esphome/components/binary_sensor/binary_sensor.cpp +6 -10
  49. esphome/components/binary_sensor/binary_sensor.h +1 -1
  50. esphome/components/binary_sensor/filter.cpp +21 -21
  51. esphome/components/binary_sensor/filter.h +10 -10
  52. esphome/components/bl0906/constants.h +16 -16
  53. esphome/components/ble_client/text_sensor/__init__.py +3 -5
  54. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +4 -6
  55. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +135 -21
  56. esphome/components/bluetooth_proxy/bluetooth_proxy.h +7 -0
  57. esphome/components/button/__init__.py +11 -8
  58. esphome/components/canbus/canbus.cpp +3 -0
  59. esphome/components/canbus/canbus.h +16 -0
  60. esphome/components/climate/__init__.py +35 -2
  61. esphome/components/climate/climate_mode.h +1 -1
  62. esphome/components/climate/climate_traits.h +63 -57
  63. esphome/components/climate_ir/__init__.py +57 -17
  64. esphome/components/climate_ir_lg/climate.py +2 -5
  65. esphome/components/climate_ir_lg/climate_ir_lg.cpp +7 -7
  66. esphome/components/climate_ir_lg/climate_ir_lg.h +1 -1
  67. esphome/components/color/__init__.py +2 -0
  68. esphome/components/const/__init__.py +5 -0
  69. esphome/components/coolix/climate.py +2 -9
  70. esphome/components/copy/cover/__init__.py +10 -9
  71. esphome/components/copy/fan/__init__.py +11 -9
  72. esphome/components/copy/lock/__init__.py +11 -9
  73. esphome/components/copy/text/__init__.py +9 -6
  74. esphome/components/cover/__init__.py +37 -2
  75. esphome/components/cst226/binary_sensor/__init__.py +28 -0
  76. esphome/components/cst226/binary_sensor/cs226_button.h +22 -0
  77. esphome/components/cst226/binary_sensor/cstt6_button.cpp +19 -0
  78. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +27 -5
  79. esphome/components/cst226/touchscreen/cst226_touchscreen.h +10 -10
  80. esphome/components/current_based/cover.py +37 -36
  81. esphome/components/daikin/climate.py +2 -9
  82. esphome/components/daikin/daikin.cpp +15 -9
  83. esphome/components/daikin/daikin.h +5 -5
  84. esphome/components/daikin_arc/climate.py +2 -7
  85. esphome/components/daikin_brc/climate.py +3 -5
  86. esphome/components/dallas_temp/dallas_temp.cpp +17 -24
  87. esphome/components/dallas_temp/dallas_temp.h +0 -1
  88. esphome/components/debug/debug_component.cpp +5 -0
  89. esphome/components/debug/debug_component.h +6 -0
  90. esphome/components/debug/debug_esp32.cpp +109 -254
  91. esphome/components/debug/sensor.py +14 -0
  92. esphome/components/deep_sleep/deep_sleep_esp32.cpp +13 -1
  93. esphome/components/delonghi/climate.py +2 -9
  94. esphome/components/demo/__init__.py +18 -20
  95. esphome/components/dfrobot_sen0395/switch/__init__.py +21 -22
  96. esphome/components/display/rect.cpp +4 -9
  97. esphome/components/display/rect.h +1 -1
  98. esphome/components/emmeti/climate.py +2 -9
  99. esphome/components/endstop/cover.py +17 -16
  100. esphome/components/esp32/__init__.py +60 -3
  101. esphome/components/esp32/core.cpp +11 -5
  102. esphome/components/esp32/gpio.cpp +86 -24
  103. esphome/components/esp32/gpio.py +15 -16
  104. esphome/components/esp32/gpio_esp32.py +1 -2
  105. esphome/components/esp32/gpio_esp32_c2.py +1 -1
  106. esphome/components/esp32/gpio_esp32_c3.py +1 -1
  107. esphome/components/esp32/gpio_esp32_c6.py +1 -1
  108. esphome/components/esp32/gpio_esp32_h2.py +1 -1
  109. esphome/components/esp32_ble/ble.cpp +1 -8
  110. esphome/components/esp32_ble/ble.h +5 -3
  111. esphome/components/esp32_ble/ble_advertising.h +1 -0
  112. esphome/components/esp32_ble_server/__init__.py +3 -0
  113. esphome/components/esp32_ble_tracker/__init__.py +7 -1
  114. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +192 -118
  115. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +29 -3
  116. esphome/components/esp32_can/esp32_can.cpp +1 -1
  117. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -1
  118. esphome/components/esp32_rmt_led_strip/led_strip.h +7 -5
  119. esphome/components/esp32_rmt_led_strip/light.py +9 -1
  120. esphome/components/esp8266/gpio.cpp +69 -8
  121. esphome/components/event/__init__.py +13 -10
  122. esphome/components/factory_reset/switch/__init__.py +7 -21
  123. esphome/components/fan/__init__.py +52 -5
  124. esphome/components/fastled_base/__init__.py +1 -4
  125. esphome/components/fastled_base/fastled_light.cpp +1 -1
  126. esphome/components/feedback/cover.py +38 -33
  127. esphome/components/fujitsu_general/climate.py +2 -9
  128. esphome/components/gpio/one_wire/gpio_one_wire.cpp +45 -43
  129. esphome/components/gpio/one_wire/gpio_one_wire.h +2 -1
  130. esphome/components/gpio_expander/cached_gpio.h +22 -7
  131. esphome/components/gps/__init__.py +11 -2
  132. esphome/components/gps/gps.cpp +11 -8
  133. esphome/components/gps/gps.h +9 -6
  134. esphome/components/graph/__init__.py +1 -2
  135. esphome/components/gree/climate.py +4 -6
  136. esphome/components/gree/gree.cpp +16 -2
  137. esphome/components/gree/gree.h +2 -2
  138. esphome/components/haier/climate.py +37 -34
  139. esphome/components/hbridge/fan/__init__.py +19 -17
  140. esphome/components/he60r/cover.py +4 -5
  141. esphome/components/heatpumpir/climate.py +3 -6
  142. esphome/components/hitachi_ac344/climate.py +2 -9
  143. esphome/components/hitachi_ac424/climate.py +2 -9
  144. esphome/components/hlw8012/hlw8012.cpp +1 -1
  145. esphome/components/hm3301/hm3301.h +1 -1
  146. esphome/components/http_request/__init__.py +39 -6
  147. esphome/components/http_request/http_request.cpp +20 -0
  148. esphome/components/http_request/http_request.h +57 -15
  149. esphome/components/http_request/http_request_arduino.cpp +22 -6
  150. esphome/components/http_request/http_request_arduino.h +4 -3
  151. esphome/components/http_request/http_request_host.cpp +141 -0
  152. esphome/components/http_request/http_request_host.h +37 -0
  153. esphome/components/http_request/http_request_idf.cpp +35 -3
  154. esphome/components/http_request/http_request_idf.h +10 -3
  155. esphome/components/http_request/httplib.h +9691 -0
  156. esphome/components/http_request/update/__init__.py +11 -8
  157. esphome/components/i2c/i2c.h +4 -0
  158. esphome/components/i2c/i2c_bus_esp_idf.cpp +1 -1
  159. esphome/components/i2s_audio/__init__.py +131 -22
  160. esphome/components/i2s_audio/i2s_audio.h +44 -4
  161. esphome/components/i2s_audio/media_player/__init__.py +19 -9
  162. esphome/components/i2s_audio/microphone/__init__.py +63 -5
  163. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +351 -61
  164. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +40 -6
  165. esphome/components/i2s_audio/speaker/__init__.py +31 -5
  166. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +155 -19
  167. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +17 -4
  168. esphome/components/ili9xxx/ili9xxx_init.h +1 -1
  169. esphome/components/image/__init__.py +37 -17
  170. esphome/components/image/image.cpp +25 -8
  171. esphome/components/internal_temperature/internal_temperature.cpp +6 -4
  172. esphome/components/key_collector/__init__.py +35 -0
  173. esphome/components/key_collector/key_collector.cpp +8 -0
  174. esphome/components/key_collector/key_collector.h +10 -0
  175. esphome/components/ld2410/ld2410.h +1 -1
  176. esphome/components/ld2450/ld2450.h +1 -1
  177. esphome/components/light/__init__.py +57 -0
  178. esphome/components/lock/__init__.py +51 -4
  179. esphome/components/lock/automation.h +2 -13
  180. esphome/components/logger/__init__.py +21 -0
  181. esphome/components/logger/logger.cpp +125 -95
  182. esphome/components/logger/logger.h +160 -35
  183. esphome/components/logger/task_log_buffer.cpp +138 -0
  184. esphome/components/logger/task_log_buffer.h +69 -0
  185. esphome/components/lvgl/__init__.py +13 -5
  186. esphome/components/lvgl/automation.py +50 -1
  187. esphome/components/lvgl/defines.py +0 -1
  188. esphome/components/lvgl/lv_validation.py +10 -1
  189. esphome/components/lvgl/lvgl_esphome.cpp +5 -1
  190. esphome/components/lvgl/schemas.py +14 -14
  191. esphome/components/lvgl/text/__init__.py +1 -2
  192. esphome/components/lvgl/widgets/arc.py +7 -6
  193. esphome/components/lvgl/widgets/buttonmatrix.py +3 -3
  194. esphome/components/lvgl/widgets/checkbox.py +2 -2
  195. esphome/components/lvgl/widgets/dropdown.py +2 -1
  196. esphome/components/lvgl/widgets/img.py +15 -12
  197. esphome/components/mapping/__init__.py +134 -0
  198. esphome/components/max7219digit/max7219digit.cpp +27 -27
  199. esphome/components/mdns/__init__.py +11 -5
  200. esphome/components/mdns/mdns_component.cpp +11 -5
  201. esphome/components/mdns/mdns_component.h +3 -2
  202. esphome/components/mdns/mdns_esp32.cpp +4 -3
  203. esphome/components/mdns/mdns_esp8266.cpp +4 -2
  204. esphome/components/mdns/mdns_libretiny.cpp +4 -2
  205. esphome/components/mdns/mdns_rp2040.cpp +4 -2
  206. esphome/components/media_player/__init__.py +40 -6
  207. esphome/components/micro_wake_word/__init__.py +99 -31
  208. esphome/components/micro_wake_word/automation.h +54 -0
  209. esphome/components/micro_wake_word/micro_wake_word.cpp +331 -319
  210. esphome/components/micro_wake_word/micro_wake_word.h +58 -105
  211. esphome/components/micro_wake_word/preprocessor_settings.h +19 -2
  212. esphome/components/micro_wake_word/streaming_model.cpp +158 -41
  213. esphome/components/micro_wake_word/streaming_model.h +85 -13
  214. esphome/components/microphone/__init__.py +139 -9
  215. esphome/components/microphone/automation.h +14 -2
  216. esphome/components/microphone/microphone.cpp +21 -0
  217. esphome/components/microphone/microphone.h +14 -5
  218. esphome/components/microphone/microphone_source.cpp +95 -0
  219. esphome/components/microphone/microphone_source.h +80 -0
  220. esphome/components/mics_4514/sensor.py +25 -14
  221. esphome/components/midea/climate.py +3 -4
  222. esphome/components/midea_ir/climate.py +3 -5
  223. esphome/components/mipi_spi/__init__.py +15 -0
  224. esphome/components/mipi_spi/display.py +474 -0
  225. esphome/components/mipi_spi/mipi_spi.cpp +481 -0
  226. esphome/components/mipi_spi/mipi_spi.h +171 -0
  227. esphome/components/mipi_spi/models/__init__.py +65 -0
  228. esphome/components/mipi_spi/models/amoled.py +72 -0
  229. esphome/components/mipi_spi/models/commands.py +82 -0
  230. esphome/components/mipi_spi/models/cyd.py +10 -0
  231. esphome/components/mipi_spi/models/ili.py +749 -0
  232. esphome/components/mipi_spi/models/jc.py +260 -0
  233. esphome/components/mipi_spi/models/lanbon.py +15 -0
  234. esphome/components/mipi_spi/models/lilygo.py +60 -0
  235. esphome/components/mipi_spi/models/waveshare.py +139 -0
  236. esphome/components/mitsubishi/climate.py +2 -5
  237. esphome/components/mitsubishi/mitsubishi.cpp +9 -9
  238. esphome/components/mixer/speaker/mixer_speaker.cpp +12 -22
  239. esphome/components/mixer/speaker/mixer_speaker.h +1 -3
  240. esphome/components/mlx90393/sensor.py +5 -0
  241. esphome/components/mlx90393/sensor_mlx90393.cpp +195 -13
  242. esphome/components/mlx90393/sensor_mlx90393.h +21 -4
  243. esphome/components/mqtt/__init__.py +1 -1
  244. esphome/components/mqtt/mqtt_client.cpp +5 -1
  245. esphome/components/mqtt/mqtt_const.h +4 -0
  246. esphome/components/mqtt/mqtt_fan.cpp +39 -0
  247. esphome/components/mqtt/mqtt_fan.h +2 -0
  248. esphome/components/network/__init__.py +1 -1
  249. esphome/components/nextion/base_component.py +17 -16
  250. esphome/components/nextion/display.py +11 -2
  251. esphome/components/nextion/nextion.cpp +39 -1
  252. esphome/components/nextion/nextion.h +50 -0
  253. esphome/components/noblex/climate.py +2 -9
  254. esphome/components/number/__init__.py +12 -9
  255. esphome/components/one_wire/one_wire_bus.cpp +14 -10
  256. esphome/components/one_wire/one_wire_bus.h +14 -8
  257. esphome/components/online_image/bmp_image.cpp +48 -11
  258. esphome/components/online_image/bmp_image.h +2 -0
  259. esphome/components/opentherm/binary_sensor/__init__.py +2 -4
  260. esphome/components/opentherm/number/__init__.py +11 -20
  261. esphome/components/opentherm/sensor/__init__.py +3 -3
  262. esphome/components/opentherm/switch/__init__.py +3 -5
  263. esphome/components/output/lock/__init__.py +11 -9
  264. esphome/components/packages/__init__.py +33 -31
  265. esphome/components/packet_transport/__init__.py +201 -0
  266. esphome/components/packet_transport/binary_sensor.py +19 -0
  267. esphome/components/packet_transport/packet_transport.cpp +534 -0
  268. esphome/components/packet_transport/packet_transport.h +154 -0
  269. esphome/components/packet_transport/sensor.py +19 -0
  270. esphome/components/pca9685/pca9685_output.cpp +2 -1
  271. esphome/components/pid/climate.py +2 -4
  272. esphome/components/pm2005/__init__.py +1 -0
  273. esphome/components/pm2005/pm2005.cpp +123 -0
  274. esphome/components/pm2005/pm2005.h +46 -0
  275. esphome/components/pm2005/sensor.py +86 -0
  276. esphome/components/pmsa003i/pmsa003i.cpp +43 -16
  277. esphome/components/pmsa003i/pmsa003i.h +25 -25
  278. esphome/components/pmsx003/pmsx003.cpp +193 -229
  279. esphome/components/pmsx003/pmsx003.h +51 -33
  280. esphome/components/pmsx003/sensor.py +21 -11
  281. esphome/components/pn7150/pn7150.h +2 -2
  282. esphome/components/pn7160/pn7160.h +2 -2
  283. esphome/components/prometheus/prometheus_handler.cpp +174 -0
  284. esphome/components/prometheus/prometheus_handler.h +17 -0
  285. esphome/components/psram/__init__.py +7 -5
  286. esphome/components/pulse_meter/pulse_meter_sensor.cpp +32 -12
  287. esphome/components/pulse_meter/pulse_meter_sensor.h +5 -5
  288. esphome/components/qspi_dbi/__init__.py +0 -1
  289. esphome/components/qspi_dbi/display.py +2 -1
  290. esphome/components/qspi_dbi/models.py +1 -2
  291. esphome/components/remote_base/__init__.py +91 -0
  292. esphome/components/remote_base/beo4_protocol.cpp +153 -0
  293. esphome/components/remote_base/beo4_protocol.h +43 -0
  294. esphome/components/remote_base/gobox_protocol.cpp +131 -0
  295. esphome/components/remote_base/gobox_protocol.h +54 -0
  296. esphome/components/remote_receiver/remote_receiver_esp32.cpp +16 -9
  297. esphome/components/resampler/speaker/resampler_speaker.cpp +12 -10
  298. esphome/components/resampler/speaker/resampler_speaker.h +1 -1
  299. esphome/components/scd30/sensor.py +2 -3
  300. esphome/components/scd4x/sensor.py +4 -5
  301. esphome/components/sdp3x/sensor.py +2 -1
  302. esphome/components/select/__init__.py +19 -20
  303. esphome/components/sen5x/sensor.py +1 -1
  304. esphome/components/sensor/__init__.py +158 -14
  305. esphome/components/sensor/filter.cpp +23 -0
  306. esphome/components/sensor/filter.h +22 -0
  307. esphome/components/sgp4x/sensor.py +1 -1
  308. esphome/components/sht4x/sht4x.cpp +43 -22
  309. esphome/components/sht4x/sht4x.h +1 -1
  310. esphome/components/sml/text_sensor/__init__.py +4 -6
  311. esphome/components/sound_level/__init__.py +0 -0
  312. esphome/components/sound_level/sensor.py +97 -0
  313. esphome/components/sound_level/sound_level.cpp +194 -0
  314. esphome/components/sound_level/sound_level.h +73 -0
  315. esphome/components/speaker/media_player/__init__.py +4 -8
  316. esphome/components/speaker/media_player/speaker_media_player.cpp +0 -18
  317. esphome/components/speaker/media_player/speaker_media_player.h +0 -11
  318. esphome/components/speaker/speaker.h +4 -7
  319. esphome/components/speed/fan/__init__.py +17 -16
  320. esphome/components/spi/spi.h +11 -1
  321. esphome/components/sprinkler/__init__.py +18 -19
  322. esphome/components/switch/__init__.py +32 -42
  323. esphome/components/syslog/__init__.py +41 -0
  324. esphome/components/syslog/esphome_syslog.cpp +49 -0
  325. esphome/components/syslog/esphome_syslog.h +27 -0
  326. esphome/components/tca9555/tca9555.cpp +11 -6
  327. esphome/components/tcl112/climate.py +2 -9
  328. esphome/components/template/alarm_control_panel/__init__.py +7 -6
  329. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +21 -17
  330. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +2 -1
  331. esphome/components/template/cover/__init__.py +27 -21
  332. esphome/components/template/fan/__init__.py +14 -12
  333. esphome/components/template/lock/__init__.py +20 -25
  334. esphome/components/template/lock/automation.h +18 -0
  335. esphome/components/template/text/__init__.py +4 -3
  336. esphome/components/template/valve/__init__.py +32 -21
  337. esphome/components/template/valve/automation.h +24 -0
  338. esphome/components/text/__init__.py +32 -1
  339. esphome/components/text_sensor/__init__.py +24 -29
  340. esphome/components/thermostat/climate.py +5 -5
  341. esphome/components/time_based/cover.py +17 -16
  342. esphome/components/tm1638/switch/__init__.py +10 -7
  343. esphome/components/tormatic/cover.py +4 -5
  344. esphome/components/toshiba/climate.py +3 -5
  345. esphome/components/touchscreen/touchscreen.cpp +3 -1
  346. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  347. esphome/components/tuya/climate/__init__.py +5 -6
  348. esphome/components/tuya/cover/__init__.py +6 -11
  349. esphome/components/tuya/select/__init__.py +15 -5
  350. esphome/components/tuya/select/tuya_select.cpp +6 -1
  351. esphome/components/tuya/select/tuya_select.h +5 -1
  352. esphome/components/uart/packet_transport/__init__.py +20 -0
  353. esphome/components/uart/packet_transport/uart_transport.cpp +88 -0
  354. esphome/components/uart/packet_transport/uart_transport.h +41 -0
  355. esphome/components/udp/__init__.py +126 -128
  356. esphome/components/udp/automation.h +40 -0
  357. esphome/components/udp/binary_sensor.py +3 -25
  358. esphome/components/udp/packet_transport/__init__.py +29 -0
  359. esphome/components/udp/packet_transport/udp_transport.cpp +36 -0
  360. esphome/components/udp/packet_transport/udp_transport.h +28 -0
  361. esphome/components/udp/sensor.py +3 -25
  362. esphome/components/udp/udp_component.cpp +26 -470
  363. esphome/components/udp/udp_component.h +21 -128
  364. esphome/components/update/__init__.py +31 -1
  365. esphome/components/uponor_smatrix/climate/__init__.py +4 -9
  366. esphome/components/uptime/text_sensor/__init__.py +47 -7
  367. esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +12 -7
  368. esphome/components/uptime/text_sensor/uptime_text_sensor.h +19 -0
  369. esphome/components/valve/__init__.py +34 -3
  370. esphome/components/valve/automation.h +1 -19
  371. esphome/components/vl53l0x/sensor.py +11 -0
  372. esphome/components/vl53l0x/vl53l0x_sensor.cpp +5 -1
  373. esphome/components/vl53l0x/vl53l0x_sensor.h +2 -1
  374. esphome/components/voice_assistant/__init__.py +36 -10
  375. esphome/components/voice_assistant/voice_assistant.cpp +170 -144
  376. esphome/components/voice_assistant/voice_assistant.h +26 -25
  377. esphome/components/waveshare_epaper/display.py +6 -0
  378. esphome/components/waveshare_epaper/waveshare_epaper.cpp +439 -37
  379. esphome/components/waveshare_epaper/waveshare_epaper.h +60 -11
  380. esphome/components/whirlpool/climate.py +3 -5
  381. esphome/components/whynter/climate.py +3 -5
  382. esphome/components/xpt2046/touchscreen/xpt2046.cpp +1 -1
  383. esphome/components/yashima/climate.py +6 -6
  384. esphome/components/zhlt01/climate.py +2 -7
  385. esphome/config_validation.py +38 -58
  386. esphome/const.py +15 -1
  387. esphome/core/__init__.py +2 -0
  388. esphome/core/application.cpp +1 -0
  389. esphome/core/application.h +4 -0
  390. esphome/core/automation.h +4 -3
  391. esphome/core/component.cpp +19 -3
  392. esphome/core/component.h +5 -0
  393. esphome/core/defines.h +23 -17
  394. esphome/core/macros.h +4 -0
  395. esphome/core/scheduler.cpp +3 -0
  396. esphome/cpp_generator.py +6 -2
  397. esphome/dashboard/web_server.py +3 -3
  398. esphome/helpers.py +39 -0
  399. esphome/loader.py +4 -0
  400. esphome/mqtt.py +21 -8
  401. esphome/platformio_api.py +1 -1
  402. esphome/schema_extractors.py +0 -1
  403. esphome/vscode.py +15 -0
  404. esphome/wizard.py +2 -2
  405. esphome/zeroconf.py +7 -3
  406. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/METADATA +10 -11
  407. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/RECORD +411 -352
  408. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/WHEEL +1 -1
  409. esphome/components/esp32_ble/const_esp32c6.h +0 -74
  410. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/entry_points.txt +0 -0
  411. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/licenses/LICENSE +0 -0
  412. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/top_level.txt +0 -0
@@ -2,7 +2,7 @@ import esphome.codegen as cg
2
2
  from esphome.components import climate, remote_transmitter, sensor
3
3
  from esphome.components.remote_base import CONF_TRANSMITTER_ID
4
4
  import esphome.config_validation as cv
5
- from esphome.const import CONF_ID, CONF_SENSOR, CONF_SUPPORTS_COOL, CONF_SUPPORTS_HEAT
5
+ from esphome.const import CONF_SENSOR, CONF_SUPPORTS_COOL, CONF_SUPPORTS_HEAT
6
6
 
7
7
  AUTO_LOAD = ["sensor"]
8
8
 
@@ -10,9 +10,9 @@ yashima_ns = cg.esphome_ns.namespace("yashima")
10
10
  YashimaClimate = yashima_ns.class_("YashimaClimate", climate.Climate, cg.Component)
11
11
 
12
12
  CONFIG_SCHEMA = cv.All(
13
- climate.CLIMATE_SCHEMA.extend(
13
+ climate.climate_schema(YashimaClimate)
14
+ .extend(
14
15
  {
15
- cv.GenerateID(): cv.declare_id(YashimaClimate),
16
16
  cv.GenerateID(CONF_TRANSMITTER_ID): cv.use_id(
17
17
  remote_transmitter.RemoteTransmitterComponent
18
18
  ),
@@ -20,14 +20,14 @@ CONFIG_SCHEMA = cv.All(
20
20
  cv.Optional(CONF_SUPPORTS_HEAT, default=True): cv.boolean,
21
21
  cv.Optional(CONF_SENSOR): cv.use_id(sensor.Sensor),
22
22
  }
23
- ).extend(cv.COMPONENT_SCHEMA)
23
+ )
24
+ .extend(cv.COMPONENT_SCHEMA)
24
25
  )
25
26
 
26
27
 
27
28
  async def to_code(config):
28
- var = cg.new_Pvariable(config[CONF_ID])
29
+ var = await climate.new_climate(config)
29
30
  await cg.register_component(var, config)
30
- await climate.register_climate(var, config)
31
31
 
32
32
  cg.add(var.set_supports_cool(config[CONF_SUPPORTS_COOL]))
33
33
  cg.add(var.set_supports_heat(config[CONF_SUPPORTS_HEAT]))
@@ -1,7 +1,5 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import climate_ir
3
- import esphome.config_validation as cv
4
- from esphome.const import CONF_ID
5
3
 
6
4
  AUTO_LOAD = ["climate_ir"]
7
5
  CODEOWNERS = ["@cfeenstra1024"]
@@ -9,11 +7,8 @@ CODEOWNERS = ["@cfeenstra1024"]
9
7
  zhlt01_ns = cg.esphome_ns.namespace("zhlt01")
10
8
  ZHLT01Climate = zhlt01_ns.class_("ZHLT01Climate", climate_ir.ClimateIR)
11
9
 
12
- CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
13
- {cv.GenerateID(): cv.declare_id(ZHLT01Climate)}
14
- )
10
+ CONFIG_SCHEMA = climate_ir.climare_ir_with_receiver_schema(ZHLT01Climate)
15
11
 
16
12
 
17
13
  async def to_code(config):
18
- var = cg.new_Pvariable(config[CONF_ID])
19
- await climate_ir.register_climate_ir(var, config)
14
+ await climate_ir.new_climate_ir(config)
@@ -56,7 +56,6 @@ from esphome.const import (
56
56
  KEY_CORE,
57
57
  KEY_FRAMEWORK_VERSION,
58
58
  KEY_TARGET_FRAMEWORK,
59
- KEY_TARGET_PLATFORM,
60
59
  PLATFORM_ESP32,
61
60
  PLATFORM_ESP8266,
62
61
  PLATFORM_RP2040,
@@ -117,7 +116,7 @@ RequiredFieldInvalid = vol.RequiredFieldInvalid
117
116
  ROOT_CONFIG_PATH = object()
118
117
 
119
118
  RESERVED_IDS = [
120
- # C++ keywords http://en.cppreference.com/w/cpp/keyword
119
+ # C++ keywords https://en.cppreference.com/w/cpp/keyword
121
120
  "alarm",
122
121
  "alignas",
123
122
  "alignof",
@@ -1942,70 +1941,28 @@ def platformio_version_constraint(value):
1942
1941
 
1943
1942
  def require_framework_version(
1944
1943
  *,
1945
- esp_idf=None,
1946
- esp32_arduino=None,
1947
- esp8266_arduino=None,
1948
- rp2040_arduino=None,
1949
- bk72xx_libretiny=None,
1950
- host=None,
1951
1944
  max_version=False,
1952
1945
  extra_message=None,
1946
+ **kwargs,
1953
1947
  ):
1954
1948
  def validator(value):
1955
1949
  core_data = CORE.data[KEY_CORE]
1956
1950
  framework = core_data[KEY_TARGET_FRAMEWORK]
1957
- if framework == "esp-idf":
1958
- if esp_idf is None:
1959
- msg = "This feature is incompatible with esp-idf"
1960
- if extra_message:
1961
- msg += f". {extra_message}"
1962
- raise Invalid(msg)
1963
- required = esp_idf
1964
- elif CORE.is_bk72xx and framework == "arduino":
1965
- if bk72xx_libretiny is None:
1966
- msg = "This feature is incompatible with BK72XX"
1967
- if extra_message:
1968
- msg += f". {extra_message}"
1969
- raise Invalid(msg)
1970
- required = bk72xx_libretiny
1971
- elif CORE.is_esp32 and framework == "arduino":
1972
- if esp32_arduino is None:
1973
- msg = "This feature is incompatible with ESP32 using arduino framework"
1974
- if extra_message:
1975
- msg += f". {extra_message}"
1976
- raise Invalid(msg)
1977
- required = esp32_arduino
1978
- elif CORE.is_esp8266 and framework == "arduino":
1979
- if esp8266_arduino is None:
1980
- msg = "This feature is incompatible with ESP8266"
1981
- if extra_message:
1982
- msg += f". {extra_message}"
1983
- raise Invalid(msg)
1984
- required = esp8266_arduino
1985
- elif CORE.is_rp2040 and framework == "arduino":
1986
- if rp2040_arduino is None:
1987
- msg = "This feature is incompatible with RP2040"
1988
- if extra_message:
1989
- msg += f". {extra_message}"
1990
- raise Invalid(msg)
1991
- required = rp2040_arduino
1992
- elif CORE.is_host and framework == "host":
1993
- if host is None:
1994
- msg = "This feature is incompatible with host platform"
1995
- if extra_message:
1996
- msg += f". {extra_message}"
1997
- raise Invalid(msg)
1998
- required = host
1951
+
1952
+ if CORE.is_host and framework == "host":
1953
+ key = "host"
1954
+ elif framework == "esp-idf":
1955
+ key = "esp_idf"
1999
1956
  else:
2000
- raise Invalid(
2001
- f"""
2002
- Internal Error: require_framework_version does not support this platform configuration
2003
- platform: {core_data[KEY_TARGET_PLATFORM]}
2004
- framework: {framework}
1957
+ key = CORE.target_platform + "_" + framework
2005
1958
 
2006
- Please report this issue on GitHub -> https://github.com/esphome/issues/issues/new?template=bug_report.yml.
2007
- """
2008
- )
1959
+ if key not in kwargs:
1960
+ msg = f"This feature is incompatible with {CORE.target_platform.upper()} using {framework} framework"
1961
+ if extra_message:
1962
+ msg += f". {extra_message}"
1963
+ raise Invalid(msg)
1964
+
1965
+ required = kwargs[key]
2009
1966
 
2010
1967
  if max_version:
2011
1968
  if core_data[KEY_FRAMEWORK_VERSION] > required:
@@ -2115,3 +2072,26 @@ def rename_key(old_key, new_key):
2115
2072
  return config
2116
2073
 
2117
2074
  return validator
2075
+
2076
+
2077
+ # Remove before 2025.11.0
2078
+ def deprecated_schema_constant(entity_type: str):
2079
+ def validator(config):
2080
+ type: str = "unknown"
2081
+ if (id := config.get(CONF_ID)) is not None and isinstance(id, core.ID):
2082
+ type = str(id.type).split("::", maxsplit=1)[0]
2083
+ _LOGGER.warning(
2084
+ "Using `%s.%s_SCHEMA` is deprecated and will be removed in ESPHome 2025.11.0. "
2085
+ "Please use `%s.%s_schema(...)` instead. "
2086
+ "If you are seeing this, report an issue to the external_component author and ask them to update it. "
2087
+ "https://developers.esphome.io/blog/2025/05/14/_schema-deprecations/. "
2088
+ "Component using this schema: %s",
2089
+ entity_type,
2090
+ entity_type.upper(),
2091
+ entity_type,
2092
+ entity_type,
2093
+ type,
2094
+ )
2095
+ return config
2096
+
2097
+ return validator
esphome/const.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """Constants used by esphome."""
2
2
 
3
- __version__ = "2025.4.1"
3
+ __version__ = "2025.5.0b2"
4
4
 
5
5
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
6
6
  VALID_SUBSTITUTIONS_CHARACTERS = (
@@ -45,6 +45,8 @@ CONF_ALLOW_OTHER_USES = "allow_other_uses"
45
45
  CONF_ALPHA = "alpha"
46
46
  CONF_ALTITUDE = "altitude"
47
47
  CONF_AMBIENT_LIGHT = "ambient_light"
48
+ CONF_AMBIENT_PRESSURE_COMPENSATION = "ambient_pressure_compensation"
49
+ CONF_AMBIENT_PRESSURE_COMPENSATION_SOURCE = "ambient_pressure_compensation_source"
48
50
  CONF_AMMONIA = "ammonia"
49
51
  CONF_ANALOG = "analog"
50
52
  CONF_AND = "and"
@@ -63,6 +65,7 @@ CONF_AUTH = "auth"
63
65
  CONF_AUTO_CLEAR_ENABLED = "auto_clear_enabled"
64
66
  CONF_AUTO_MODE = "auto_mode"
65
67
  CONF_AUTOCONF = "autoconf"
68
+ CONF_AUTOMATIC_SELF_CALIBRATION = "automatic_self_calibration"
66
69
  CONF_AUTOMATION_ID = "automation_id"
67
70
  CONF_AVAILABILITY = "availability"
68
71
  CONF_AWAY = "away"
@@ -157,6 +160,7 @@ CONF_CONDITION = "condition"
157
160
  CONF_CONDITION_ID = "condition_id"
158
161
  CONF_CONDUCTIVITY = "conductivity"
159
162
  CONF_CONSTANT_BRIGHTNESS = "constant_brightness"
163
+ CONF_CONTINUOUS = "continuous"
160
164
  CONF_CONTRAST = "contrast"
161
165
  CONF_COOL_ACTION = "cool_action"
162
166
  CONF_COOL_DEADBAND = "cool_deadband"
@@ -217,7 +221,9 @@ CONF_DIMENSIONS = "dimensions"
217
221
  CONF_DIO_PIN = "dio_pin"
218
222
  CONF_DIR_PIN = "dir_pin"
219
223
  CONF_DIRECTION = "direction"
224
+ CONF_DIRECTION_COMMAND_TOPIC = "direction_command_topic"
220
225
  CONF_DIRECTION_OUTPUT = "direction_output"
226
+ CONF_DIRECTION_STATE_TOPIC = "direction_state_topic"
221
227
  CONF_DISABLE_CRC = "disable_crc"
222
228
  CONF_DISABLED = "disabled"
223
229
  CONF_DISABLED_BY_DEFAULT = "disabled_by_default"
@@ -330,6 +336,7 @@ CONF_FULL_SPECTRUM = "full_spectrum"
330
336
  CONF_FULL_SPECTRUM_COUNTS = "full_spectrum_counts"
331
337
  CONF_FULL_UPDATE_EVERY = "full_update_every"
332
338
  CONF_GAIN = "gain"
339
+ CONF_GAIN_FACTOR = "gain_factor"
333
340
  CONF_GAMMA_CORRECT = "gamma_correct"
334
341
  CONF_GAS_RESISTANCE = "gas_resistance"
335
342
  CONF_GATEWAY = "gateway"
@@ -401,6 +408,7 @@ CONF_INITIAL_OPTION = "initial_option"
401
408
  CONF_INITIAL_STATE = "initial_state"
402
409
  CONF_INITIAL_VALUE = "initial_value"
403
410
  CONF_INPUT = "input"
411
+ CONF_INT_DATAPOINT = "int_datapoint"
404
412
  CONF_INTEGRATION_TIME = "integration_time"
405
413
  CONF_INTENSITY = "intensity"
406
414
  CONF_INTERLOCK = "interlock"
@@ -477,6 +485,7 @@ CONF_MAX_VALUE = "max_value"
477
485
  CONF_MAX_VOLTAGE = "max_voltage"
478
486
  CONF_MDNS = "mdns"
479
487
  CONF_MEASUREMENT_DURATION = "measurement_duration"
488
+ CONF_MEASUREMENT_MODE = "measurement_mode"
480
489
  CONF_MEASUREMENT_SEQUENCE_NUMBER = "measurement_sequence_number"
481
490
  CONF_MEDIA_PLAYER = "media_player"
482
491
  CONF_MEDIUM = "medium"
@@ -795,6 +804,7 @@ CONF_SHUTDOWN_MESSAGE = "shutdown_message"
795
804
  CONF_SIGNAL_STRENGTH = "signal_strength"
796
805
  CONF_SINGLE_LIGHT_ID = "single_light_id"
797
806
  CONF_SIZE = "size"
807
+ CONF_SKIP_CERT_CN_CHECK = "skip_cert_cn_check"
798
808
  CONF_SLEEP_DURATION = "sleep_duration"
799
809
  CONF_SLEEP_PIN = "sleep_pin"
800
810
  CONF_SLEEP_WHEN_DONE = "sleep_when_done"
@@ -891,6 +901,8 @@ CONF_TIMES = "times"
891
901
  CONF_TIMEZONE = "timezone"
892
902
  CONF_TIMING = "timing"
893
903
  CONF_TO = "to"
904
+ CONF_TO_NTC_RESISTANCE = "to_ntc_resistance"
905
+ CONF_TO_NTC_TEMPERATURE = "to_ntc_temperature"
894
906
  CONF_TOLERANCE = "tolerance"
895
907
  CONF_TOPIC = "topic"
896
908
  CONF_TOPIC_PREFIX = "topic_prefix"
@@ -1080,6 +1092,7 @@ UNIT_KILOWATT = "kW"
1080
1092
  UNIT_KILOWATT_HOURS = "kWh"
1081
1093
  UNIT_LITRE = "L"
1082
1094
  UNIT_LUX = "lx"
1095
+ UNIT_MEGAJOULE = "MJ"
1083
1096
  UNIT_METER = "m"
1084
1097
  UNIT_METER_PER_SECOND_SQUARED = "m/s²"
1085
1098
  UNIT_MICROAMP = "µA"
@@ -1093,6 +1106,7 @@ UNIT_MILLIGRAMS_PER_CUBIC_METER = "mg/m³"
1093
1106
  UNIT_MILLIMETER = "mm"
1094
1107
  UNIT_MILLISECOND = "ms"
1095
1108
  UNIT_MILLISIEMENS_PER_CENTIMETER = "mS/cm"
1109
+ UNIT_MILLIVOLT = "mV"
1096
1110
  UNIT_MINUTE = "min"
1097
1111
  UNIT_OHM = "Ω"
1098
1112
  UNIT_PARTS_PER_BILLION = "ppb"
esphome/core/__init__.py CHANGED
@@ -518,6 +518,8 @@ class EsphomeCore:
518
518
  self.verbose = False
519
519
  # Whether ESPHome was started in quiet mode
520
520
  self.quiet = False
521
+ # A list of all known ID classes
522
+ self.id_classes = {}
521
523
 
522
524
  def reset(self):
523
525
  from esphome.pins import PIN_SCHEMA_REGISTRY
@@ -70,6 +70,7 @@ void Application::loop() {
70
70
  this->feed_wdt();
71
71
  for (Component *component : this->looping_components_) {
72
72
  {
73
+ this->set_current_component(component);
73
74
  WarnIfComponentBlockingGuard guard{component};
74
75
  component->call();
75
76
  }
@@ -97,6 +97,9 @@ class Application {
97
97
  this->compilation_time_ = compilation_time;
98
98
  }
99
99
 
100
+ void set_current_component(Component *component) { this->current_component_ = component; }
101
+ Component *get_current_component() { return this->current_component_; }
102
+
100
103
  #ifdef USE_BINARY_SENSOR
101
104
  void register_binary_sensor(binary_sensor::BinarySensor *binary_sensor) {
102
105
  this->binary_sensors_.push_back(binary_sensor);
@@ -547,6 +550,7 @@ class Application {
547
550
  uint32_t loop_interval_{16};
548
551
  size_t dump_config_at_{SIZE_MAX};
549
552
  uint32_t app_state_{0};
553
+ Component *current_component_{nullptr};
550
554
  };
551
555
 
552
556
  /// Global storage of Application pointer - only one Application can exist.
esphome/core/automation.h CHANGED
@@ -1,10 +1,11 @@
1
1
  #pragma once
2
2
 
3
- #include <vector>
4
3
  #include "esphome/core/component.h"
5
- #include "esphome/core/helpers.h"
6
4
  #include "esphome/core/defines.h"
5
+ #include "esphome/core/helpers.h"
7
6
  #include "esphome/core/preferences.h"
7
+ #include <utility>
8
+ #include <vector>
8
9
 
9
10
  namespace esphome {
10
11
 
@@ -27,7 +28,7 @@ template<typename T, typename... X> class TemplatableValue {
27
28
  TemplatableValue() : type_(NONE) {}
28
29
 
29
30
  template<typename F, enable_if_t<!is_invocable<F, X...>::value, int> = 0>
30
- TemplatableValue(F value) : type_(VALUE), value_(value) {}
31
+ TemplatableValue(F value) : type_(VALUE), value_(std::move(value)) {}
31
32
 
32
33
  template<typename F, enable_if_t<is_invocable<F, X...>::value, int> = 0>
33
34
  TemplatableValue(F f) : type_(LAMBDA), f_(f) {}
@@ -39,6 +39,9 @@ const uint32_t STATUS_LED_OK = 0x0000;
39
39
  const uint32_t STATUS_LED_WARNING = 0x0100;
40
40
  const uint32_t STATUS_LED_ERROR = 0x0200;
41
41
 
42
+ const uint32_t WARN_IF_BLOCKING_OVER_MS = 50U; ///< Initial blocking time allowed without warning
43
+ const uint32_t WARN_IF_BLOCKING_INCREMENT_MS = 10U; ///< How long the blocking time must be larger to warn again
44
+
42
45
  uint32_t global_state = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
43
46
 
44
47
  float Component::get_loop_priority() const { return 0.0f; }
@@ -115,6 +118,13 @@ const char *Component::get_component_source() const {
115
118
  return "<unknown>";
116
119
  return this->component_source_;
117
120
  }
121
+ bool Component::should_warn_of_blocking(uint32_t blocking_time) {
122
+ if (blocking_time > this->warn_if_blocking_over_) {
123
+ this->warn_if_blocking_over_ = blocking_time + WARN_IF_BLOCKING_INCREMENT_MS;
124
+ return true;
125
+ }
126
+ return false;
127
+ }
118
128
  void Component::mark_failed() {
119
129
  ESP_LOGE(TAG, "Component %s was marked as failed.", this->get_component_source());
120
130
  this->component_state_ &= ~COMPONENT_STATE_MASK;
@@ -233,10 +243,16 @@ void PollingComponent::set_update_interval(uint32_t update_interval) { this->upd
233
243
  WarnIfComponentBlockingGuard::WarnIfComponentBlockingGuard(Component *component)
234
244
  : started_(millis()), component_(component) {}
235
245
  WarnIfComponentBlockingGuard::~WarnIfComponentBlockingGuard() {
236
- uint32_t now = millis();
237
- if (now - started_ > 50) {
246
+ uint32_t blocking_time = millis() - this->started_;
247
+ bool should_warn;
248
+ if (this->component_ != nullptr) {
249
+ should_warn = this->component_->should_warn_of_blocking(blocking_time);
250
+ } else {
251
+ should_warn = blocking_time > WARN_IF_BLOCKING_OVER_MS;
252
+ }
253
+ if (should_warn) {
238
254
  const char *src = component_ == nullptr ? "<null>" : component_->get_component_source();
239
- ESP_LOGW(TAG, "Component %s took a long time for an operation (%" PRIu32 " ms).", src, (now - started_));
255
+ ESP_LOGW(TAG, "Component %s took a long time for an operation (%" PRIu32 " ms).", src, blocking_time);
240
256
  ESP_LOGW(TAG, "Components should block for at most 30 ms.");
241
257
  ;
242
258
  }
esphome/core/component.h CHANGED
@@ -65,6 +65,8 @@ extern const uint32_t STATUS_LED_ERROR;
65
65
 
66
66
  enum class RetryResult { DONE, RETRY };
67
67
 
68
+ extern const uint32_t WARN_IF_BLOCKING_OVER_MS;
69
+
68
70
  class Component {
69
71
  public:
70
72
  /** Where the component's initialization should happen.
@@ -158,6 +160,8 @@ class Component {
158
160
  */
159
161
  const char *get_component_source() const;
160
162
 
163
+ bool should_warn_of_blocking(uint32_t blocking_time);
164
+
161
165
  protected:
162
166
  friend class Application;
163
167
 
@@ -284,6 +288,7 @@ class Component {
284
288
  uint32_t component_state_{0x0000}; ///< State of this component.
285
289
  float setup_priority_override_{NAN};
286
290
  const char *component_source_{nullptr};
291
+ uint32_t warn_if_blocking_over_{WARN_IF_BLOCKING_OVER_MS};
287
292
  std::string error_message_{};
288
293
  };
289
294
 
esphome/core/defines.h CHANGED
@@ -20,11 +20,6 @@
20
20
 
21
21
  // Feature flags
22
22
  #define USE_ALARM_CONTROL_PANEL
23
- #define USE_AUDIO_FLAC_SUPPORT
24
- #define USE_AUDIO_MP3_SUPPORT
25
- #define USE_API
26
- #define USE_API_NOISE
27
- #define USE_API_PLAINTEXT
28
23
  #define USE_BINARY_SENSOR
29
24
  #define USE_BUTTON
30
25
  #define USE_CLIMATE
@@ -79,20 +74,10 @@
79
74
  #define USE_LVGL_TEXTAREA
80
75
  #define USE_LVGL_TILEVIEW
81
76
  #define USE_LVGL_TOUCHSCREEN
82
- #define USE_MD5
83
77
  #define USE_MDNS
84
78
  #define USE_MEDIA_PLAYER
85
- #define USE_MQTT
86
- #define USE_NETWORK
87
79
  #define USE_NEXTION_TFT_UPLOAD
88
80
  #define USE_NUMBER
89
- #define USE_ONLINE_IMAGE_BMP_SUPPORT
90
- #define USE_ONLINE_IMAGE_PNG_SUPPORT
91
- #define USE_ONLINE_IMAGE_JPEG_SUPPORT
92
- #define USE_OTA
93
- #define USE_OTA_PASSWORD
94
- #define USE_OTA_STATE_CALLBACK
95
- #define USE_OTA_VERSION 2
96
81
  #define USE_OUTPUT
97
82
  #define USE_POWER_SUPPLY
98
83
  #define USE_QR_CODE
@@ -107,14 +92,34 @@
107
92
  #define USE_UART_DEBUGGER
108
93
  #define USE_UPDATE
109
94
  #define USE_VALVE
95
+
96
+ // Feature flags which do not work for zephyr
97
+ #ifndef USE_ZEPHYR
98
+ #define USE_AUDIO_FLAC_SUPPORT
99
+ #define USE_AUDIO_MP3_SUPPORT
100
+ #define USE_API
101
+ #define USE_API_NOISE
102
+ #define USE_API_PLAINTEXT
103
+ #define USE_MD5
104
+ #define USE_MQTT
105
+ #define USE_NETWORK
106
+ #define USE_ONLINE_IMAGE_BMP_SUPPORT
107
+ #define USE_ONLINE_IMAGE_PNG_SUPPORT
108
+ #define USE_ONLINE_IMAGE_JPEG_SUPPORT
109
+ #define USE_OTA
110
+ #define USE_OTA_PASSWORD
111
+ #define USE_OTA_STATE_CALLBACK
112
+ #define USE_OTA_VERSION 2
110
113
  #define USE_WIFI
111
114
  #define USE_WIFI_AP
112
115
  #define USE_WIREGUARD
116
+ #endif
113
117
 
114
118
  // Arduino-specific feature flags
115
119
  #ifdef USE_ARDUINO
116
120
  #define USE_PROMETHEUS
117
121
  #define USE_WIFI_WPA2_EAP
122
+ #define USE_I2S_LEGACY
118
123
  #endif
119
124
 
120
125
  // IDF-specific feature flags
@@ -131,7 +136,6 @@
131
136
  #define USE_ESP32_BLE_SERVER
132
137
  #define USE_ESP32_CAMERA
133
138
  #define USE_IMPROV
134
- #define USE_MICRO_WAKE_WORD_VAD
135
139
  #define USE_MICROPHONE
136
140
  #define USE_PSRAM
137
141
  #define USE_SOCKET_IMPL_BSD_SOCKETS
@@ -148,7 +152,9 @@
148
152
  #endif
149
153
 
150
154
  #ifdef USE_ESP_IDF
151
- #define USE_ESP_IDF_VERSION_CODE VERSION_CODE(5, 1, 5)
155
+ #define USE_ESP_IDF_VERSION_CODE VERSION_CODE(5, 1, 6)
156
+ #define USE_MICRO_WAKE_WORD
157
+ #define USE_MICRO_WAKE_WORD_VAD
152
158
  #endif
153
159
 
154
160
  #if defined(USE_ESP32_VARIANT_ESP32S2)
esphome/core/macros.h CHANGED
@@ -2,3 +2,7 @@
2
2
 
3
3
  // Helper macro to define a version code, whose value can be compared against other version codes.
4
4
  #define VERSION_CODE(major, minor, patch) ((major) << 16 | (minor) << 8 | (patch))
5
+
6
+ #ifdef USE_ARDUINO
7
+ #include <Arduino.h>
8
+ #endif
@@ -1,4 +1,6 @@
1
1
  #include "scheduler.h"
2
+
3
+ #include "application.h"
2
4
  #include "esphome/core/defines.h"
3
5
  #include "esphome/core/log.h"
4
6
  #include "esphome/core/helpers.h"
@@ -215,6 +217,7 @@ void HOT Scheduler::call() {
215
217
  this->pop_raw_();
216
218
  continue;
217
219
  }
220
+ App.set_current_component(item->component);
218
221
 
219
222
  #ifdef ESPHOME_DEBUG_SCHEDULER
220
223
  ESP_LOGV(TAG, "Running %s '%s/%s' with interval=%" PRIu32 " next_execution=%" PRIu64 " (now=%" PRIu64 ")",
esphome/cpp_generator.py CHANGED
@@ -789,13 +789,17 @@ class MockObj(Expression):
789
789
 
790
790
  def class_(self, name: str, *parents: "MockObjClass") -> "MockObjClass":
791
791
  op = "" if self.op == "" else "::"
792
- return MockObjClass(f"{self.base}{op}{name}", ".", parents=parents)
792
+ result = MockObjClass(f"{self.base}{op}{name}", ".", parents=parents)
793
+ CORE.id_classes[str(result)] = result
794
+ return result
793
795
 
794
796
  def struct(self, name: str) -> "MockObjClass":
795
797
  return self.class_(name)
796
798
 
797
799
  def enum(self, name: str, is_class: bool = False) -> "MockObj":
798
- return MockObjEnum(enum=name, is_class=is_class, base=self.base, op=self.op)
800
+ result = MockObjEnum(enum=name, is_class=is_class, base=self.base, op=self.op)
801
+ CORE.id_classes[str(result)] = result
802
+ return result
799
803
 
800
804
  def operator(self, name: str) -> "MockObj":
801
805
  """Various other operations.
@@ -38,7 +38,7 @@ import yaml
38
38
  from yaml.nodes import Node
39
39
 
40
40
  from esphome import const, platformio_api, yaml_util
41
- from esphome.helpers import get_bool_env, mkdir_p
41
+ from esphome.helpers import get_bool_env, mkdir_p, sort_ip_addresses
42
42
  from esphome.storage_json import (
43
43
  StorageJSON,
44
44
  archive_storage_path,
@@ -336,7 +336,7 @@ class EsphomePortCommandWebSocket(EsphomeCommandWebSocket):
336
336
  # Use the IP address if available but only
337
337
  # if the API is loaded and the device is online
338
338
  # since MQTT logging will not work otherwise
339
- port = address_list[0]
339
+ port = sort_ip_addresses(address_list)[0]
340
340
  elif (
341
341
  entry.address
342
342
  and (
@@ -347,7 +347,7 @@ class EsphomePortCommandWebSocket(EsphomeCommandWebSocket):
347
347
  and not isinstance(address_list, Exception)
348
348
  ):
349
349
  # If mdns is not available, try to use the DNS cache
350
- port = address_list[0]
350
+ port = sort_ip_addresses(address_list)[0]
351
351
 
352
352
  return [
353
353
  *DASHBOARD_COMMAND,
esphome/helpers.py CHANGED
@@ -200,6 +200,45 @@ def resolve_ip_address(host, port):
200
200
  return res
201
201
 
202
202
 
203
+ def sort_ip_addresses(address_list: list[str]) -> list[str]:
204
+ """Takes a list of IP addresses in string form, e.g. from mDNS or MQTT,
205
+ and sorts them into the best order to actually try connecting to them.
206
+
207
+ This is roughly based on RFC6724 but a lot simpler: First we choose
208
+ IPv6 addresses, then Legacy IP addresses, and lowest priority is
209
+ link-local IPv6 addresses that don't have a link specified (which
210
+ are useless, but mDNS does provide them in that form). Addresses
211
+ which cannot be parsed are silently dropped.
212
+ """
213
+ import socket
214
+
215
+ # First "resolve" all the IP addresses to getaddrinfo() tuples of the form
216
+ # (family, type, proto, canonname, sockaddr)
217
+ res: list[
218
+ tuple[
219
+ int,
220
+ int,
221
+ int,
222
+ Union[str, None],
223
+ Union[tuple[str, int], tuple[str, int, int, int]],
224
+ ]
225
+ ] = []
226
+ for addr in address_list:
227
+ # This should always work as these are supposed to be IP addresses
228
+ try:
229
+ res += socket.getaddrinfo(
230
+ addr, 0, proto=socket.IPPROTO_TCP, flags=socket.AI_NUMERICHOST
231
+ )
232
+ except OSError:
233
+ _LOGGER.info("Failed to parse IP address '%s'", addr)
234
+
235
+ # Now use that information to sort them.
236
+ res.sort(key=addr_preference_)
237
+
238
+ # Finally, turn the getaddrinfo() tuples back into plain hostnames.
239
+ return [socket.getnameinfo(r[4], socket.NI_NUMERICHOST)[0] for r in res]
240
+
241
+
203
242
  def get_bool_env(var, default=False):
204
243
  value = os.getenv(var, default)
205
244
  if isinstance(value, str):
esphome/loader.py CHANGED
@@ -91,6 +91,10 @@ class ComponentManifest:
91
91
  def codeowners(self) -> list[str]:
92
92
  return getattr(self.module, "CODEOWNERS", [])
93
93
 
94
+ @property
95
+ def instance_type(self) -> list[str]:
96
+ return getattr(self.module, "INSTANCE_TYPE", None)
97
+
94
98
  @property
95
99
  def final_validate_schema(self) -> Optional[Callable[[ConfigType], None]]:
96
100
  """Components can declare a `FINAL_VALIDATE_SCHEMA` cv.Schema that gets called