esphome 2025.4.2__py3-none-any.whl → 2025.5.0b3__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 (440) hide show
  1. esphome/__main__.py +16 -14
  2. esphome/components/ac_dimmer/ac_dimmer.cpp +3 -2
  3. esphome/components/adc/__init__.py +51 -34
  4. esphome/components/airthings_wave_base/__init__.py +1 -1
  5. esphome/components/alarm_control_panel/__init__.py +37 -2
  6. esphome/components/am43/cover/__init__.py +4 -5
  7. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +6 -4
  8. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +4 -5
  9. esphome/components/analog_threshold/binary_sensor.py +10 -8
  10. esphome/components/anova/climate.py +4 -5
  11. esphome/components/api/__init__.py +25 -8
  12. esphome/components/api/api_connection.cpp +81 -13
  13. esphome/components/api/api_connection.h +13 -1
  14. esphome/components/api/api_frame_helper.cpp +232 -177
  15. esphome/components/api/api_frame_helper.h +61 -8
  16. esphome/components/api/api_noise_context.h +13 -4
  17. esphome/components/api/api_pb2.cpp +1422 -1
  18. esphome/components/api/api_pb2.h +255 -1
  19. esphome/components/api/api_pb2_service.cpp +162 -49
  20. esphome/components/api/api_pb2_service.h +90 -51
  21. esphome/components/api/api_pb2_size.h +361 -0
  22. esphome/components/api/api_server.cpp +110 -34
  23. esphome/components/api/api_server.h +8 -0
  24. esphome/components/api/proto.h +86 -17
  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/bedjet_hub.cpp +1 -0
  45. esphome/components/bedjet/climate/__init__.py +3 -8
  46. esphome/components/bedjet/fan/__init__.py +2 -11
  47. esphome/components/binary/fan/__init__.py +13 -16
  48. esphome/components/binary_sensor/__init__.py +13 -10
  49. esphome/components/bl0906/constants.h +16 -16
  50. esphome/components/ble_client/text_sensor/__init__.py +3 -5
  51. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +4 -6
  52. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +136 -21
  53. esphome/components/bluetooth_proxy/bluetooth_proxy.h +7 -0
  54. esphome/components/button/__init__.py +11 -8
  55. esphome/components/canbus/canbus.cpp +3 -0
  56. esphome/components/canbus/canbus.h +16 -0
  57. esphome/components/ccs811/sensor.py +9 -6
  58. esphome/components/climate/__init__.py +35 -2
  59. esphome/components/climate/climate_mode.h +1 -1
  60. esphome/components/climate/climate_traits.h +63 -57
  61. esphome/components/climate_ir/__init__.py +57 -17
  62. esphome/components/climate_ir_lg/climate.py +2 -5
  63. esphome/components/climate_ir_lg/climate_ir_lg.cpp +7 -7
  64. esphome/components/climate_ir_lg/climate_ir_lg.h +1 -1
  65. esphome/components/color/__init__.py +2 -0
  66. esphome/components/const/__init__.py +5 -0
  67. esphome/components/coolix/climate.py +2 -9
  68. esphome/components/copy/cover/__init__.py +10 -9
  69. esphome/components/copy/fan/__init__.py +11 -9
  70. esphome/components/copy/lock/__init__.py +11 -9
  71. esphome/components/copy/text/__init__.py +9 -6
  72. esphome/components/cover/__init__.py +37 -2
  73. esphome/components/cse7766/cse7766.cpp +2 -1
  74. esphome/components/cst226/binary_sensor/__init__.py +28 -0
  75. esphome/components/cst226/binary_sensor/cs226_button.h +22 -0
  76. esphome/components/cst226/binary_sensor/cstt6_button.cpp +19 -0
  77. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +27 -5
  78. esphome/components/cst226/touchscreen/cst226_touchscreen.h +10 -10
  79. esphome/components/current_based/cover.py +37 -36
  80. esphome/components/current_based/current_based_cover.cpp +2 -1
  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/daly_bms/daly_bms.cpp +2 -1
  89. esphome/components/debug/debug_component.cpp +6 -1
  90. esphome/components/debug/debug_component.h +6 -0
  91. esphome/components/debug/debug_esp32.cpp +109 -254
  92. esphome/components/debug/sensor.py +14 -0
  93. esphome/components/deep_sleep/deep_sleep_esp32.cpp +13 -1
  94. esphome/components/delonghi/climate.py +2 -9
  95. esphome/components/demo/__init__.py +18 -20
  96. esphome/components/dfrobot_sen0395/switch/__init__.py +21 -22
  97. esphome/components/dps310/sensor.py +6 -6
  98. esphome/components/ee895/sensor.py +9 -9
  99. esphome/components/emmeti/climate.py +2 -9
  100. esphome/components/endstop/cover.py +17 -16
  101. esphome/components/endstop/endstop_cover.cpp +2 -1
  102. esphome/components/ens160_base/__init__.py +12 -9
  103. esphome/components/esp32/__init__.py +60 -3
  104. esphome/components/esp32/core.cpp +11 -5
  105. esphome/components/esp32/gpio.cpp +86 -24
  106. esphome/components/esp32/gpio.py +15 -16
  107. esphome/components/esp32/gpio_esp32.py +1 -2
  108. esphome/components/esp32/gpio_esp32_c2.py +1 -1
  109. esphome/components/esp32/gpio_esp32_c3.py +1 -1
  110. esphome/components/esp32/gpio_esp32_c6.py +1 -1
  111. esphome/components/esp32/gpio_esp32_h2.py +1 -1
  112. esphome/components/esp32_ble/ble.cpp +1 -0
  113. esphome/components/esp32_ble/ble.h +5 -3
  114. esphome/components/esp32_ble/ble_advertising.cpp +2 -1
  115. esphome/components/esp32_ble/ble_advertising.h +1 -0
  116. esphome/components/esp32_ble_server/__init__.py +3 -0
  117. esphome/components/esp32_ble_tracker/__init__.py +7 -1
  118. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +192 -118
  119. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +29 -3
  120. esphome/components/esp32_camera/esp32_camera.cpp +2 -1
  121. esphome/components/esp32_camera/esp32_camera.h +1 -1
  122. esphome/components/esp32_can/esp32_can.cpp +1 -1
  123. esphome/components/esp32_improv/esp32_improv_component.cpp +1 -1
  124. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -1
  125. esphome/components/esp32_rmt_led_strip/led_strip.h +7 -5
  126. esphome/components/esp32_rmt_led_strip/light.py +9 -1
  127. esphome/components/esp32_touch/esp32_touch.cpp +1 -1
  128. esphome/components/esp8266/gpio.cpp +69 -8
  129. esphome/components/ethernet/ethernet_component.cpp +1 -1
  130. esphome/components/event/__init__.py +13 -10
  131. esphome/components/factory_reset/switch/__init__.py +7 -21
  132. esphome/components/fan/__init__.py +52 -5
  133. esphome/components/fastled_base/__init__.py +1 -4
  134. esphome/components/fastled_base/fastled_light.cpp +1 -1
  135. esphome/components/feedback/cover.py +38 -33
  136. esphome/components/feedback/feedback_cover.cpp +2 -1
  137. esphome/components/fujitsu_general/climate.py +2 -9
  138. esphome/components/gcja5/gcja5.cpp +2 -1
  139. esphome/components/gpio/one_wire/gpio_one_wire.cpp +45 -43
  140. esphome/components/gpio/one_wire/gpio_one_wire.h +2 -1
  141. esphome/components/gpio_expander/cached_gpio.h +22 -7
  142. esphome/components/gps/__init__.py +47 -17
  143. esphome/components/gps/gps.cpp +42 -23
  144. esphome/components/gps/gps.h +17 -13
  145. esphome/components/graph/__init__.py +1 -2
  146. esphome/components/gree/climate.py +4 -6
  147. esphome/components/gree/gree.cpp +16 -2
  148. esphome/components/gree/gree.h +2 -2
  149. esphome/components/growatt_solar/growatt_solar.cpp +2 -1
  150. esphome/components/haier/climate.py +37 -34
  151. esphome/components/hbridge/fan/__init__.py +19 -17
  152. esphome/components/he60r/cover.py +4 -5
  153. esphome/components/heatpumpir/climate.py +3 -6
  154. esphome/components/hitachi_ac344/climate.py +2 -9
  155. esphome/components/hitachi_ac424/climate.py +2 -9
  156. esphome/components/hm3301/hm3301.h +1 -1
  157. esphome/components/hte501/sensor.py +6 -6
  158. esphome/components/http_request/__init__.py +39 -6
  159. esphome/components/http_request/http_request.cpp +20 -0
  160. esphome/components/http_request/http_request.h +57 -15
  161. esphome/components/http_request/http_request_arduino.cpp +22 -6
  162. esphome/components/http_request/http_request_arduino.h +4 -3
  163. esphome/components/http_request/http_request_host.cpp +141 -0
  164. esphome/components/http_request/http_request_host.h +37 -0
  165. esphome/components/http_request/http_request_idf.cpp +35 -3
  166. esphome/components/http_request/http_request_idf.h +10 -3
  167. esphome/components/http_request/httplib.h +9691 -0
  168. esphome/components/http_request/update/__init__.py +11 -8
  169. esphome/components/hyt271/sensor.py +6 -6
  170. esphome/components/i2c/i2c.h +4 -0
  171. esphome/components/i2c/i2c_bus_esp_idf.cpp +1 -1
  172. esphome/components/i2s_audio/__init__.py +131 -22
  173. esphome/components/i2s_audio/i2s_audio.h +44 -4
  174. esphome/components/i2s_audio/media_player/__init__.py +19 -9
  175. esphome/components/i2s_audio/microphone/__init__.py +63 -5
  176. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +351 -61
  177. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +40 -6
  178. esphome/components/i2s_audio/speaker/__init__.py +31 -5
  179. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +155 -19
  180. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +17 -4
  181. esphome/components/ili9xxx/ili9xxx_init.h +1 -1
  182. esphome/components/image/__init__.py +37 -17
  183. esphome/components/image/image.cpp +25 -8
  184. esphome/components/internal_temperature/internal_temperature.cpp +6 -4
  185. esphome/components/key_collector/__init__.py +35 -0
  186. esphome/components/key_collector/key_collector.cpp +8 -0
  187. esphome/components/key_collector/key_collector.h +10 -0
  188. esphome/components/kuntze/kuntze.cpp +2 -1
  189. esphome/components/ld2410/ld2410.h +1 -1
  190. esphome/components/ld2450/ld2450.h +1 -1
  191. esphome/components/light/__init__.py +57 -0
  192. esphome/components/lock/__init__.py +51 -4
  193. esphome/components/lock/automation.h +2 -13
  194. esphome/components/logger/__init__.py +22 -0
  195. esphome/components/logger/logger.cpp +154 -103
  196. esphome/components/logger/logger.h +211 -36
  197. esphome/components/logger/task_log_buffer.cpp +138 -0
  198. esphome/components/logger/task_log_buffer.h +69 -0
  199. esphome/components/lvgl/__init__.py +13 -5
  200. esphome/components/lvgl/automation.py +50 -1
  201. esphome/components/lvgl/defines.py +0 -1
  202. esphome/components/lvgl/lvgl_esphome.cpp +5 -1
  203. esphome/components/lvgl/text/__init__.py +1 -2
  204. esphome/components/mapping/__init__.py +134 -0
  205. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -1
  206. esphome/components/max7219digit/max7219digit.cpp +28 -27
  207. esphome/components/mdns/__init__.py +11 -5
  208. esphome/components/mdns/mdns_component.cpp +11 -5
  209. esphome/components/mdns/mdns_component.h +3 -2
  210. esphome/components/mdns/mdns_esp32.cpp +4 -3
  211. esphome/components/mdns/mdns_esp8266.cpp +4 -2
  212. esphome/components/mdns/mdns_libretiny.cpp +4 -2
  213. esphome/components/mdns/mdns_rp2040.cpp +4 -2
  214. esphome/components/media_player/__init__.py +33 -1
  215. esphome/components/mhz19/sensor.py +11 -7
  216. esphome/components/micro_wake_word/__init__.py +99 -31
  217. esphome/components/micro_wake_word/automation.h +54 -0
  218. esphome/components/micro_wake_word/micro_wake_word.cpp +331 -319
  219. esphome/components/micro_wake_word/micro_wake_word.h +58 -105
  220. esphome/components/micro_wake_word/preprocessor_settings.h +19 -2
  221. esphome/components/micro_wake_word/streaming_model.cpp +158 -41
  222. esphome/components/micro_wake_word/streaming_model.h +85 -13
  223. esphome/components/microphone/__init__.py +139 -9
  224. esphome/components/microphone/automation.h +14 -2
  225. esphome/components/microphone/microphone.cpp +21 -0
  226. esphome/components/microphone/microphone.h +14 -5
  227. esphome/components/microphone/microphone_source.cpp +95 -0
  228. esphome/components/microphone/microphone_source.h +80 -0
  229. esphome/components/mics_4514/sensor.py +25 -14
  230. esphome/components/midea/climate.py +3 -4
  231. esphome/components/midea_ir/climate.py +3 -5
  232. esphome/components/mipi_spi/__init__.py +15 -0
  233. esphome/components/mipi_spi/display.py +474 -0
  234. esphome/components/mipi_spi/mipi_spi.cpp +481 -0
  235. esphome/components/mipi_spi/mipi_spi.h +171 -0
  236. esphome/components/mipi_spi/models/__init__.py +65 -0
  237. esphome/components/mipi_spi/models/amoled.py +72 -0
  238. esphome/components/mipi_spi/models/commands.py +82 -0
  239. esphome/components/mipi_spi/models/cyd.py +10 -0
  240. esphome/components/mipi_spi/models/ili.py +749 -0
  241. esphome/components/mipi_spi/models/jc.py +260 -0
  242. esphome/components/mipi_spi/models/lanbon.py +15 -0
  243. esphome/components/mipi_spi/models/lilygo.py +60 -0
  244. esphome/components/mipi_spi/models/waveshare.py +139 -0
  245. esphome/components/mitsubishi/climate.py +2 -5
  246. esphome/components/mitsubishi/mitsubishi.cpp +9 -9
  247. esphome/components/mixer/speaker/mixer_speaker.cpp +12 -22
  248. esphome/components/mixer/speaker/mixer_speaker.h +1 -3
  249. esphome/components/mlx90393/sensor.py +5 -0
  250. esphome/components/mlx90393/sensor_mlx90393.cpp +195 -13
  251. esphome/components/mlx90393/sensor_mlx90393.h +21 -4
  252. esphome/components/modbus/modbus.cpp +2 -1
  253. esphome/components/mqtt/__init__.py +1 -1
  254. esphome/components/mqtt/mqtt_client.cpp +6 -2
  255. esphome/components/mqtt/mqtt_const.h +4 -0
  256. esphome/components/mqtt/mqtt_fan.cpp +39 -0
  257. esphome/components/mqtt/mqtt_fan.h +2 -0
  258. esphome/components/ms5611/sensor.py +6 -6
  259. esphome/components/ms8607/sensor.py +3 -3
  260. esphome/components/network/__init__.py +1 -1
  261. esphome/components/nextion/base_component.py +17 -16
  262. esphome/components/nextion/display.py +11 -2
  263. esphome/components/nextion/nextion.cpp +39 -1
  264. esphome/components/nextion/nextion.h +50 -0
  265. esphome/components/noblex/climate.py +2 -9
  266. esphome/components/number/__init__.py +12 -9
  267. esphome/components/one_wire/one_wire_bus.cpp +14 -10
  268. esphome/components/one_wire/one_wire_bus.h +14 -8
  269. esphome/components/online_image/bmp_image.cpp +48 -11
  270. esphome/components/online_image/bmp_image.h +2 -0
  271. esphome/components/opentherm/binary_sensor/__init__.py +2 -4
  272. esphome/components/opentherm/number/__init__.py +11 -20
  273. esphome/components/opentherm/sensor/__init__.py +3 -3
  274. esphome/components/opentherm/switch/__init__.py +3 -5
  275. esphome/components/output/lock/__init__.py +11 -9
  276. esphome/components/packages/__init__.py +33 -31
  277. esphome/components/packet_transport/__init__.py +201 -0
  278. esphome/components/packet_transport/binary_sensor.py +19 -0
  279. esphome/components/packet_transport/packet_transport.cpp +534 -0
  280. esphome/components/packet_transport/packet_transport.h +154 -0
  281. esphome/components/packet_transport/sensor.py +19 -0
  282. esphome/components/pca9685/pca9685_output.cpp +2 -1
  283. esphome/components/pid/climate.py +2 -4
  284. esphome/components/pm2005/__init__.py +1 -0
  285. esphome/components/pm2005/pm2005.cpp +123 -0
  286. esphome/components/pm2005/pm2005.h +46 -0
  287. esphome/components/pm2005/sensor.py +86 -0
  288. esphome/components/pmsa003i/pmsa003i.cpp +43 -16
  289. esphome/components/pmsa003i/pmsa003i.h +25 -25
  290. esphome/components/pmsx003/pmsx003.cpp +195 -230
  291. esphome/components/pmsx003/pmsx003.h +51 -33
  292. esphome/components/pmsx003/sensor.py +21 -11
  293. esphome/components/pn7150/pn7150.h +2 -2
  294. esphome/components/pn7160/pn7160.h +2 -2
  295. esphome/components/prometheus/prometheus_handler.cpp +174 -0
  296. esphome/components/prometheus/prometheus_handler.h +17 -0
  297. esphome/components/psram/__init__.py +7 -5
  298. esphome/components/pulse_meter/pulse_meter_sensor.cpp +32 -12
  299. esphome/components/pulse_meter/pulse_meter_sensor.h +5 -5
  300. esphome/components/pzem004t/pzem004t.cpp +2 -1
  301. esphome/components/qspi_dbi/__init__.py +0 -1
  302. esphome/components/qspi_dbi/display.py +2 -1
  303. esphome/components/qspi_dbi/models.py +1 -2
  304. esphome/components/remote_base/__init__.py +91 -0
  305. esphome/components/remote_base/beo4_protocol.cpp +153 -0
  306. esphome/components/remote_base/beo4_protocol.h +43 -0
  307. esphome/components/remote_base/gobox_protocol.cpp +131 -0
  308. esphome/components/remote_base/gobox_protocol.h +54 -0
  309. esphome/components/remote_receiver/remote_receiver_esp32.cpp +16 -9
  310. esphome/components/resampler/speaker/resampler_speaker.cpp +12 -10
  311. esphome/components/resampler/speaker/resampler_speaker.h +1 -1
  312. esphome/components/rf_bridge/rf_bridge.cpp +2 -1
  313. esphome/components/scd30/sensor.py +2 -3
  314. esphome/components/scd4x/sensor.py +4 -5
  315. esphome/components/sdp3x/sensor.py +2 -1
  316. esphome/components/sds011/sds011.cpp +2 -1
  317. esphome/components/select/__init__.py +19 -20
  318. esphome/components/sen5x/sen5x.cpp +55 -36
  319. esphome/components/sen5x/sensor.py +1 -1
  320. esphome/components/senseair/sensor.py +3 -3
  321. esphome/components/sensor/__init__.py +158 -14
  322. esphome/components/sensor/filter.cpp +23 -0
  323. esphome/components/sensor/filter.h +22 -0
  324. esphome/components/sgp30/sensor.py +14 -16
  325. esphome/components/sgp4x/sensor.py +1 -1
  326. esphome/components/sht4x/sht4x.cpp +43 -22
  327. esphome/components/sht4x/sht4x.h +1 -1
  328. esphome/components/shtcx/sensor.py +6 -6
  329. esphome/components/slow_pwm/slow_pwm_output.cpp +2 -1
  330. esphome/components/sml/text_sensor/__init__.py +4 -6
  331. esphome/components/sound_level/__init__.py +0 -0
  332. esphome/components/sound_level/sensor.py +97 -0
  333. esphome/components/sound_level/sound_level.cpp +194 -0
  334. esphome/components/sound_level/sound_level.h +73 -0
  335. esphome/components/speaker/media_player/__init__.py +4 -8
  336. esphome/components/speaker/media_player/speaker_media_player.cpp +0 -18
  337. esphome/components/speaker/media_player/speaker_media_player.h +0 -11
  338. esphome/components/speaker/speaker.h +4 -7
  339. esphome/components/speed/fan/__init__.py +17 -16
  340. esphome/components/spi/spi.h +11 -1
  341. esphome/components/sprinkler/__init__.py +18 -19
  342. esphome/components/sprinkler/sprinkler.cpp +6 -5
  343. esphome/components/switch/__init__.py +32 -42
  344. esphome/components/syslog/__init__.py +41 -0
  345. esphome/components/syslog/esphome_syslog.cpp +49 -0
  346. esphome/components/syslog/esphome_syslog.h +27 -0
  347. esphome/components/t6615/sensor.py +3 -3
  348. esphome/components/t6615/t6615.cpp +2 -1
  349. esphome/components/tca9555/tca9555.cpp +11 -6
  350. esphome/components/tcl112/climate.py +2 -9
  351. esphome/components/template/alarm_control_panel/__init__.py +7 -6
  352. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +21 -17
  353. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +2 -1
  354. esphome/components/template/cover/__init__.py +27 -21
  355. esphome/components/template/fan/__init__.py +14 -12
  356. esphome/components/template/lock/__init__.py +20 -25
  357. esphome/components/template/lock/automation.h +18 -0
  358. esphome/components/template/text/__init__.py +4 -3
  359. esphome/components/template/valve/__init__.py +32 -21
  360. esphome/components/template/valve/automation.h +24 -0
  361. esphome/components/text/__init__.py +32 -1
  362. esphome/components/text_sensor/__init__.py +24 -29
  363. esphome/components/thermostat/climate.py +5 -5
  364. esphome/components/time_based/cover.py +17 -16
  365. esphome/components/time_based/time_based_cover.cpp +2 -1
  366. esphome/components/tm1638/switch/__init__.py +10 -7
  367. esphome/components/tormatic/cover.py +4 -5
  368. esphome/components/toshiba/climate.py +3 -5
  369. esphome/components/touchscreen/touchscreen.cpp +3 -1
  370. esphome/components/tuya/climate/__init__.py +5 -6
  371. esphome/components/tuya/cover/__init__.py +6 -11
  372. esphome/components/tuya/select/__init__.py +15 -5
  373. esphome/components/tuya/select/tuya_select.cpp +6 -1
  374. esphome/components/tuya/select/tuya_select.h +5 -1
  375. esphome/components/uart/packet_transport/__init__.py +20 -0
  376. esphome/components/uart/packet_transport/uart_transport.cpp +88 -0
  377. esphome/components/uart/packet_transport/uart_transport.h +41 -0
  378. esphome/components/uart/switch/uart_switch.cpp +2 -1
  379. esphome/components/udp/__init__.py +126 -128
  380. esphome/components/udp/automation.h +40 -0
  381. esphome/components/udp/binary_sensor.py +3 -25
  382. esphome/components/udp/packet_transport/__init__.py +29 -0
  383. esphome/components/udp/packet_transport/udp_transport.cpp +36 -0
  384. esphome/components/udp/packet_transport/udp_transport.h +28 -0
  385. esphome/components/udp/sensor.py +3 -25
  386. esphome/components/udp/udp_component.cpp +26 -470
  387. esphome/components/udp/udp_component.h +21 -128
  388. esphome/components/update/__init__.py +31 -1
  389. esphome/components/uponor_smatrix/climate/__init__.py +4 -9
  390. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +2 -1
  391. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  392. esphome/components/uptime/text_sensor/__init__.py +47 -7
  393. esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +12 -7
  394. esphome/components/uptime/text_sensor/uptime_text_sensor.h +19 -0
  395. esphome/components/valve/__init__.py +34 -3
  396. esphome/components/valve/automation.h +1 -19
  397. esphome/components/vl53l0x/sensor.py +11 -0
  398. esphome/components/vl53l0x/vl53l0x_sensor.cpp +5 -1
  399. esphome/components/vl53l0x/vl53l0x_sensor.h +2 -1
  400. esphome/components/voice_assistant/__init__.py +36 -10
  401. esphome/components/voice_assistant/voice_assistant.cpp +170 -144
  402. esphome/components/voice_assistant/voice_assistant.h +26 -25
  403. esphome/components/waveshare_epaper/display.py +6 -0
  404. esphome/components/waveshare_epaper/waveshare_epaper.cpp +439 -37
  405. esphome/components/waveshare_epaper/waveshare_epaper.h +60 -11
  406. esphome/components/whirlpool/climate.py +3 -5
  407. esphome/components/whynter/climate.py +3 -5
  408. esphome/components/xpt2046/touchscreen/xpt2046.cpp +1 -1
  409. esphome/components/yashima/climate.py +6 -6
  410. esphome/components/zhlt01/climate.py +2 -7
  411. esphome/config.py +13 -13
  412. esphome/config_validation.py +38 -58
  413. esphome/const.py +15 -1
  414. esphome/core/__init__.py +2 -0
  415. esphome/core/application.cpp +23 -10
  416. esphome/core/application.h +9 -1
  417. esphome/core/automation.h +4 -3
  418. esphome/core/component.cpp +28 -7
  419. esphome/core/component.h +10 -1
  420. esphome/core/defines.h +23 -17
  421. esphome/core/macros.h +4 -0
  422. esphome/core/scheduler.cpp +7 -1
  423. esphome/cpp_generator.py +6 -2
  424. esphome/dashboard/web_server.py +3 -3
  425. esphome/helpers.py +39 -0
  426. esphome/loader.py +4 -0
  427. esphome/log.py +15 -19
  428. esphome/mqtt.py +23 -10
  429. esphome/platformio_api.py +1 -1
  430. esphome/schema_extractors.py +0 -1
  431. esphome/voluptuous_schema.py +3 -1
  432. esphome/vscode.py +15 -0
  433. esphome/wizard.py +47 -37
  434. esphome/zeroconf.py +7 -3
  435. {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/METADATA +10 -11
  436. {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/RECORD +440 -380
  437. {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/WHEEL +1 -1
  438. {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/entry_points.txt +0 -0
  439. {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/licenses/LICENSE +0 -0
  440. {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/top_level.txt +0 -0
@@ -14,8 +14,9 @@ namespace http_request {
14
14
 
15
15
  static const char *const TAG = "http_request.arduino";
16
16
 
17
- std::shared_ptr<HttpContainer> HttpRequestArduino::start(std::string url, std::string method, std::string body,
18
- std::list<Header> headers) {
17
+ std::shared_ptr<HttpContainer> HttpRequestArduino::perform(std::string url, std::string method, std::string body,
18
+ std::list<Header> request_headers,
19
+ std::set<std::string> collect_headers) {
19
20
  if (!network::is_connected()) {
20
21
  this->status_momentary_error("failed", 1000);
21
22
  ESP_LOGW(TAG, "HTTP Request failed; Not connected to network");
@@ -95,14 +96,17 @@ std::shared_ptr<HttpContainer> HttpRequestArduino::start(std::string url, std::s
95
96
  if (this->useragent_ != nullptr) {
96
97
  container->client_.setUserAgent(this->useragent_);
97
98
  }
98
- for (const auto &header : headers) {
99
+ for (const auto &header : request_headers) {
99
100
  container->client_.addHeader(header.name.c_str(), header.value.c_str(), false, true);
100
101
  }
101
102
 
102
103
  // returned needed headers must be collected before the requests
103
- static const char *header_keys[] = {"Content-Length", "Content-Type"};
104
- static const size_t HEADER_COUNT = sizeof(header_keys) / sizeof(header_keys[0]);
105
- container->client_.collectHeaders(header_keys, HEADER_COUNT);
104
+ const char *header_keys[collect_headers.size()];
105
+ int index = 0;
106
+ for (auto const &header_name : collect_headers) {
107
+ header_keys[index++] = header_name.c_str();
108
+ }
109
+ container->client_.collectHeaders(header_keys, index);
106
110
 
107
111
  App.feed_wdt();
108
112
  container->status_code = container->client_.sendRequest(method.c_str(), body.c_str());
@@ -121,6 +125,18 @@ std::shared_ptr<HttpContainer> HttpRequestArduino::start(std::string url, std::s
121
125
  // Still return the container, so it can be used to get the status code and error message
122
126
  }
123
127
 
128
+ container->response_headers_ = {};
129
+ auto header_count = container->client_.headers();
130
+ for (int i = 0; i < header_count; i++) {
131
+ const std::string header_name = str_lower_case(container->client_.headerName(i).c_str());
132
+ if (collect_headers.count(header_name) > 0) {
133
+ std::string header_value = container->client_.header(i).c_str();
134
+ ESP_LOGD(TAG, "Received response header, name: %s, value: %s", header_name.c_str(), header_value.c_str());
135
+ container->response_headers_[header_name].push_back(header_value);
136
+ break;
137
+ }
138
+ }
139
+
124
140
  int content_length = container->client_.getSize();
125
141
  ESP_LOGD(TAG, "Content-Length: %d", content_length);
126
142
  container->content_length = (size_t) content_length;
@@ -29,9 +29,10 @@ class HttpContainerArduino : public HttpContainer {
29
29
  };
30
30
 
31
31
  class HttpRequestArduino : public HttpRequestComponent {
32
- public:
33
- std::shared_ptr<HttpContainer> start(std::string url, std::string method, std::string body,
34
- std::list<Header> headers) override;
32
+ protected:
33
+ std::shared_ptr<HttpContainer> perform(std::string url, std::string method, std::string body,
34
+ std::list<Header> request_headers,
35
+ std::set<std::string> collect_headers) override;
35
36
  };
36
37
 
37
38
  } // namespace http_request
@@ -0,0 +1,141 @@
1
+ #include "http_request_host.h"
2
+
3
+ #ifdef USE_HOST
4
+
5
+ #include <regex>
6
+ #include "esphome/components/network/util.h"
7
+ #include "esphome/components/watchdog/watchdog.h"
8
+
9
+ #include "esphome/core/application.h"
10
+ #include "esphome/core/log.h"
11
+
12
+ namespace esphome {
13
+ namespace http_request {
14
+
15
+ static const char *const TAG = "http_request.host";
16
+
17
+ std::shared_ptr<HttpContainer> HttpRequestHost::perform(std::string url, std::string method, std::string body,
18
+ std::list<Header> request_headers,
19
+ std::set<std::string> response_headers) {
20
+ if (!network::is_connected()) {
21
+ this->status_momentary_error("failed", 1000);
22
+ ESP_LOGW(TAG, "HTTP Request failed; Not connected to network");
23
+ return nullptr;
24
+ }
25
+
26
+ std::regex url_regex(R"(^(([^:\/?#]+):)?(//([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)", std::regex::extended);
27
+ std::smatch url_match_result;
28
+
29
+ if (!std::regex_match(url, url_match_result, url_regex) || url_match_result.length() < 7) {
30
+ ESP_LOGE(TAG, "HTTP Request failed; Malformed URL: %s", url.c_str());
31
+ return nullptr;
32
+ }
33
+ auto host = url_match_result[4].str();
34
+ auto scheme_host = url_match_result[1].str() + url_match_result[3].str();
35
+ auto path = url_match_result[5].str() + url_match_result[6].str();
36
+ if (path.empty())
37
+ path = "/";
38
+
39
+ std::shared_ptr<HttpContainerHost> container = std::make_shared<HttpContainerHost>();
40
+ container->set_parent(this);
41
+
42
+ const uint32_t start = millis();
43
+
44
+ watchdog::WatchdogManager wdm(this->get_watchdog_timeout());
45
+
46
+ httplib::Headers h_headers;
47
+ h_headers.emplace("Host", host.c_str());
48
+ h_headers.emplace("User-Agent", this->useragent_);
49
+ for (const auto &[name, value] : request_headers) {
50
+ h_headers.emplace(name, value);
51
+ }
52
+ httplib::Client client(scheme_host.c_str());
53
+ if (!client.is_valid()) {
54
+ ESP_LOGE(TAG, "HTTP Request failed; Invalid URL: %s", url.c_str());
55
+ return nullptr;
56
+ }
57
+ client.set_follow_location(this->follow_redirects_);
58
+ #ifdef CPPHTTPLIB_OPENSSL_SUPPORT
59
+ if (this->ca_path_ != nullptr)
60
+ client.set_ca_cert_path(this->ca_path_);
61
+ #endif
62
+
63
+ httplib::Result result;
64
+ if (method == "GET") {
65
+ result = client.Get(path, h_headers, [&](const char *data, size_t data_length) {
66
+ ESP_LOGV(TAG, "Got data length: %zu", data_length);
67
+ container->response_body_.insert(container->response_body_.end(), (const uint8_t *) data,
68
+ (const uint8_t *) data + data_length);
69
+ return true;
70
+ });
71
+ } else if (method == "HEAD") {
72
+ result = client.Head(path, h_headers);
73
+ } else if (method == "PUT") {
74
+ result = client.Put(path, h_headers, body, "");
75
+ if (result) {
76
+ auto data = std::vector<uint8_t>(result->body.begin(), result->body.end());
77
+ container->response_body_.insert(container->response_body_.end(), data.begin(), data.end());
78
+ }
79
+ } else if (method == "PATCH") {
80
+ result = client.Patch(path, h_headers, body, "");
81
+ if (result) {
82
+ auto data = std::vector<uint8_t>(result->body.begin(), result->body.end());
83
+ container->response_body_.insert(container->response_body_.end(), data.begin(), data.end());
84
+ }
85
+ } else if (method == "POST") {
86
+ result = client.Post(path, h_headers, body, "");
87
+ if (result) {
88
+ auto data = std::vector<uint8_t>(result->body.begin(), result->body.end());
89
+ container->response_body_.insert(container->response_body_.end(), data.begin(), data.end());
90
+ }
91
+ } else {
92
+ ESP_LOGW(TAG, "HTTP Request failed - unsupported method %s; URL: %s", method.c_str(), url.c_str());
93
+ container->end();
94
+ return nullptr;
95
+ }
96
+ App.feed_wdt();
97
+ if (!result) {
98
+ ESP_LOGW(TAG, "HTTP Request failed; URL: %s, error code: %u", url.c_str(), (unsigned) result.error());
99
+ container->end();
100
+ this->status_momentary_error("failed", 1000);
101
+ return nullptr;
102
+ }
103
+ App.feed_wdt();
104
+ auto response = *result;
105
+ container->status_code = response.status;
106
+ if (!is_success(response.status)) {
107
+ ESP_LOGE(TAG, "HTTP Request failed; URL: %s; Code: %d", url.c_str(), response.status);
108
+ this->status_momentary_error("failed", 1000);
109
+ // Still return the container, so it can be used to get the status code and error message
110
+ }
111
+
112
+ container->content_length = container->response_body_.size();
113
+ for (auto header : response.headers) {
114
+ ESP_LOGD(TAG, "Header: %s: %s", header.first.c_str(), header.second.c_str());
115
+ auto lower_name = str_lower_case(header.first);
116
+ if (response_headers.find(lower_name) != response_headers.end()) {
117
+ container->response_headers_[lower_name].emplace_back(header.second);
118
+ }
119
+ }
120
+ container->duration_ms = millis() - start;
121
+ return container;
122
+ }
123
+
124
+ int HttpContainerHost::read(uint8_t *buf, size_t max_len) {
125
+ auto bytes_remaining = this->response_body_.size() - this->bytes_read_;
126
+ auto read_len = std::min(max_len, bytes_remaining);
127
+ memcpy(buf, this->response_body_.data() + this->bytes_read_, read_len);
128
+ this->bytes_read_ += read_len;
129
+ return read_len;
130
+ }
131
+
132
+ void HttpContainerHost::end() {
133
+ watchdog::WatchdogManager wdm(this->parent_->get_watchdog_timeout());
134
+ this->response_body_ = std::vector<uint8_t>();
135
+ this->bytes_read_ = 0;
136
+ }
137
+
138
+ } // namespace http_request
139
+ } // namespace esphome
140
+
141
+ #endif // USE_HOST
@@ -0,0 +1,37 @@
1
+ #pragma once
2
+
3
+ #include "http_request.h"
4
+
5
+ #ifdef USE_HOST
6
+
7
+ #define CPPHTTPLIB_NO_EXCEPTIONS
8
+ #include "httplib.h"
9
+ namespace esphome {
10
+ namespace http_request {
11
+
12
+ class HttpRequestHost;
13
+ class HttpContainerHost : public HttpContainer {
14
+ public:
15
+ int read(uint8_t *buf, size_t max_len) override;
16
+ void end() override;
17
+
18
+ protected:
19
+ friend class HttpRequestHost;
20
+ std::vector<uint8_t> response_body_{};
21
+ };
22
+
23
+ class HttpRequestHost : public HttpRequestComponent {
24
+ public:
25
+ std::shared_ptr<HttpContainer> perform(std::string url, std::string method, std::string body,
26
+ std::list<Header> request_headers,
27
+ std::set<std::string> response_headers) override;
28
+ void set_ca_path(const char *ca_path) { this->ca_path_ = ca_path; }
29
+
30
+ protected:
31
+ const char *ca_path_{};
32
+ };
33
+
34
+ } // namespace http_request
35
+ } // namespace esphome
36
+
37
+ #endif // USE_HOST
@@ -19,14 +19,41 @@ namespace http_request {
19
19
 
20
20
  static const char *const TAG = "http_request.idf";
21
21
 
22
+ struct UserData {
23
+ const std::set<std::string> &collect_headers;
24
+ std::map<std::string, std::list<std::string>> response_headers;
25
+ };
26
+
22
27
  void HttpRequestIDF::dump_config() {
23
28
  HttpRequestComponent::dump_config();
24
29
  ESP_LOGCONFIG(TAG, " Buffer Size RX: %u", this->buffer_size_rx_);
25
30
  ESP_LOGCONFIG(TAG, " Buffer Size TX: %u", this->buffer_size_tx_);
26
31
  }
27
32
 
28
- std::shared_ptr<HttpContainer> HttpRequestIDF::start(std::string url, std::string method, std::string body,
29
- std::list<Header> headers) {
33
+ esp_err_t HttpRequestIDF::http_event_handler(esp_http_client_event_t *evt) {
34
+ UserData *user_data = (UserData *) evt->user_data;
35
+
36
+ switch (evt->event_id) {
37
+ case HTTP_EVENT_ON_HEADER: {
38
+ const std::string header_name = str_lower_case(evt->header_key);
39
+ if (user_data->collect_headers.count(header_name)) {
40
+ const std::string header_value = evt->header_value;
41
+ ESP_LOGD(TAG, "Received response header, name: %s, value: %s", header_name.c_str(), header_value.c_str());
42
+ user_data->response_headers[header_name].push_back(header_value);
43
+ break;
44
+ }
45
+ break;
46
+ }
47
+ default: {
48
+ break;
49
+ }
50
+ }
51
+ return ESP_OK;
52
+ }
53
+
54
+ std::shared_ptr<HttpContainer> HttpRequestIDF::perform(std::string url, std::string method, std::string body,
55
+ std::list<Header> request_headers,
56
+ std::set<std::string> collect_headers) {
30
57
  if (!network::is_connected()) {
31
58
  this->status_momentary_error("failed", 1000);
32
59
  ESP_LOGE(TAG, "HTTP Request failed; Not connected to network");
@@ -76,6 +103,10 @@ std::shared_ptr<HttpContainer> HttpRequestIDF::start(std::string url, std::strin
76
103
  const uint32_t start = millis();
77
104
  watchdog::WatchdogManager wdm(this->get_watchdog_timeout());
78
105
 
106
+ config.event_handler = http_event_handler;
107
+ auto user_data = UserData{collect_headers, {}};
108
+ config.user_data = static_cast<void *>(&user_data);
109
+
79
110
  esp_http_client_handle_t client = esp_http_client_init(&config);
80
111
 
81
112
  std::shared_ptr<HttpContainerIDF> container = std::make_shared<HttpContainerIDF>(client);
@@ -83,7 +114,7 @@ std::shared_ptr<HttpContainer> HttpRequestIDF::start(std::string url, std::strin
83
114
 
84
115
  container->set_secure(secure);
85
116
 
86
- for (const auto &header : headers) {
117
+ for (const auto &header : request_headers) {
87
118
  esp_http_client_set_header(client, header.name.c_str(), header.value.c_str());
88
119
  }
89
120
 
@@ -124,6 +155,7 @@ std::shared_ptr<HttpContainer> HttpRequestIDF::start(std::string url, std::strin
124
155
  container->feed_wdt();
125
156
  container->status_code = esp_http_client_get_status_code(client);
126
157
  container->feed_wdt();
158
+ container->set_response_headers(user_data.response_headers);
127
159
  if (is_success(container->status_code)) {
128
160
  container->duration_ms = millis() - start;
129
161
  return container;
@@ -21,6 +21,10 @@ class HttpContainerIDF : public HttpContainer {
21
21
  /// @brief Feeds the watchdog timer if the executing task has one attached
22
22
  void feed_wdt();
23
23
 
24
+ void set_response_headers(std::map<std::string, std::list<std::string>> &response_headers) {
25
+ this->response_headers_ = std::move(response_headers);
26
+ }
27
+
24
28
  protected:
25
29
  esp_http_client_handle_t client_;
26
30
  };
@@ -29,16 +33,19 @@ class HttpRequestIDF : public HttpRequestComponent {
29
33
  public:
30
34
  void dump_config() override;
31
35
 
32
- std::shared_ptr<HttpContainer> start(std::string url, std::string method, std::string body,
33
- std::list<Header> headers) override;
34
-
35
36
  void set_buffer_size_rx(uint16_t buffer_size_rx) { this->buffer_size_rx_ = buffer_size_rx; }
36
37
  void set_buffer_size_tx(uint16_t buffer_size_tx) { this->buffer_size_tx_ = buffer_size_tx; }
37
38
 
38
39
  protected:
40
+ std::shared_ptr<HttpContainer> perform(std::string url, std::string method, std::string body,
41
+ std::list<Header> request_headers,
42
+ std::set<std::string> collect_headers) override;
39
43
  // if zero ESP-IDF will use DEFAULT_HTTP_BUF_SIZE
40
44
  uint16_t buffer_size_rx_{};
41
45
  uint16_t buffer_size_tx_{};
46
+
47
+ /// @brief Monitors the http client events to gather response headers
48
+ static esp_err_t http_event_handler(esp_http_client_event_t *evt);
42
49
  };
43
50
 
44
51
  } // namespace http_request