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
@@ -1,164 +1,162 @@
1
- import hashlib
2
-
1
+ from esphome import automation
2
+ from esphome.automation import Trigger
3
3
  import esphome.codegen as cg
4
- from esphome.components.api import CONF_ENCRYPTION
5
- from esphome.components.binary_sensor import BinarySensor
6
- from esphome.components.sensor import Sensor
7
- import esphome.config_validation as cv
8
- from esphome.const import (
4
+ from esphome.components.packet_transport import (
9
5
  CONF_BINARY_SENSORS,
10
- CONF_ID,
11
- CONF_INTERNAL,
12
- CONF_KEY,
13
- CONF_NAME,
14
- CONF_PORT,
6
+ CONF_ENCRYPTION,
7
+ CONF_PING_PONG_ENABLE,
8
+ CONF_PROVIDERS,
9
+ CONF_ROLLING_CODE_ENABLE,
15
10
  CONF_SENSORS,
16
11
  )
17
- from esphome.cpp_generator import MockObjClass
12
+ import esphome.config_validation as cv
13
+ from esphome.const import CONF_DATA, CONF_ID, CONF_PORT, CONF_TRIGGER_ID
14
+ from esphome.core import Lambda
15
+ from esphome.cpp_generator import ExpressionStatement, MockObj
18
16
 
19
17
  CODEOWNERS = ["@clydebarrow"]
20
18
  DEPENDENCIES = ["network"]
21
- AUTO_LOAD = ["socket", "xxtea"]
22
- MULTI_CONF = True
19
+ AUTO_LOAD = ["socket"]
23
20
 
21
+ MULTI_CONF = True
24
22
  udp_ns = cg.esphome_ns.namespace("udp")
25
- UDPComponent = udp_ns.class_("UDPComponent", cg.PollingComponent)
23
+ UDPComponent = udp_ns.class_("UDPComponent", cg.Component)
24
+ UDPWriteAction = udp_ns.class_("UDPWriteAction", automation.Action)
25
+ trigger_args = cg.std_vector.template(cg.uint8)
26
26
 
27
- CONF_BROADCAST = "broadcast"
28
- CONF_BROADCAST_ID = "broadcast_id"
29
27
  CONF_ADDRESSES = "addresses"
30
28
  CONF_LISTEN_ADDRESS = "listen_address"
31
- CONF_PROVIDER = "provider"
32
- CONF_PROVIDERS = "providers"
33
- CONF_REMOTE_ID = "remote_id"
34
29
  CONF_UDP_ID = "udp_id"
35
- CONF_PING_PONG_ENABLE = "ping_pong_enable"
36
- CONF_PING_PONG_RECYCLE_TIME = "ping_pong_recycle_time"
37
- CONF_ROLLING_CODE_ENABLE = "rolling_code_enable"
38
-
39
-
40
- def sensor_validation(cls: MockObjClass):
41
- return cv.maybe_simple_value(
42
- cv.Schema(
43
- {
44
- cv.Required(CONF_ID): cv.use_id(cls),
45
- cv.Optional(CONF_BROADCAST_ID): cv.validate_id_name,
46
- }
47
- ),
48
- key=CONF_ID,
49
- )
50
-
30
+ CONF_ON_RECEIVE = "on_receive"
31
+ CONF_LISTEN_PORT = "listen_port"
32
+ CONF_BROADCAST_PORT = "broadcast_port"
51
33
 
52
- ENCRYPTION_SCHEMA = {
53
- cv.Optional(CONF_ENCRYPTION): cv.maybe_simple_value(
54
- cv.Schema(
55
- {
56
- cv.Required(CONF_KEY): cv.string,
57
- }
58
- ),
59
- key=CONF_KEY,
60
- )
61
- }
62
-
63
- PROVIDER_SCHEMA = cv.Schema(
34
+ UDP_SCHEMA = cv.Schema(
64
35
  {
65
- cv.Required(CONF_NAME): cv.valid_name,
36
+ cv.GenerateID(CONF_UDP_ID): cv.use_id(UDPComponent),
66
37
  }
67
- ).extend(ENCRYPTION_SCHEMA)
38
+ )
68
39
 
69
40
 
70
- def validate_(config):
71
- if CONF_ENCRYPTION in config:
72
- if CONF_SENSORS not in config and CONF_BINARY_SENSORS not in config:
73
- raise cv.Invalid("No sensors or binary sensors to encrypt")
74
- elif config[CONF_ROLLING_CODE_ENABLE]:
75
- raise cv.Invalid("Rolling code requires an encryption key")
76
- if config[CONF_PING_PONG_ENABLE]:
77
- if not any(CONF_ENCRYPTION in p for p in config.get(CONF_PROVIDERS) or ()):
78
- raise cv.Invalid("Ping-pong requires at least one encrypted provider")
79
- return config
41
+ def is_relocated(option):
42
+ def validator(value):
43
+ raise cv.Invalid(
44
+ f"The '{option}' option should now be configured in the 'packet_transport' component"
45
+ )
80
46
 
47
+ return validator
81
48
 
82
- CONFIG_SCHEMA = cv.All(
83
- cv.polling_component_schema("15s")
84
- .extend(
85
- {
86
- cv.GenerateID(): cv.declare_id(UDPComponent),
87
- cv.Optional(CONF_PORT, default=18511): cv.port,
88
- cv.Optional(
89
- CONF_LISTEN_ADDRESS, default="255.255.255.255"
90
- ): cv.ipv4address_multi_broadcast,
91
- cv.Optional(CONF_ADDRESSES, default=["255.255.255.255"]): cv.ensure_list(
92
- cv.ipv4address,
93
- ),
94
- cv.Optional(CONF_ROLLING_CODE_ENABLE, default=False): cv.boolean,
95
- cv.Optional(CONF_PING_PONG_ENABLE, default=False): cv.boolean,
96
- cv.Optional(
97
- CONF_PING_PONG_RECYCLE_TIME, default="600s"
98
- ): cv.positive_time_period_seconds,
99
- cv.Optional(CONF_SENSORS): cv.ensure_list(sensor_validation(Sensor)),
100
- cv.Optional(CONF_BINARY_SENSORS): cv.ensure_list(
101
- sensor_validation(BinarySensor)
102
- ),
103
- cv.Optional(CONF_PROVIDERS): cv.ensure_list(PROVIDER_SCHEMA),
104
- },
49
+
50
+ RELOCATED = {
51
+ cv.Optional(x): is_relocated(x)
52
+ for x in (
53
+ CONF_PROVIDERS,
54
+ CONF_ENCRYPTION,
55
+ CONF_PING_PONG_ENABLE,
56
+ CONF_ROLLING_CODE_ENABLE,
57
+ CONF_SENSORS,
58
+ CONF_BINARY_SENSORS,
105
59
  )
106
- .extend(ENCRYPTION_SCHEMA),
107
- validate_,
108
- )
60
+ }
109
61
 
110
- SENSOR_SCHEMA = cv.Schema(
62
+ CONFIG_SCHEMA = cv.COMPONENT_SCHEMA.extend(
111
63
  {
112
- cv.Optional(CONF_REMOTE_ID): cv.string_strict,
113
- cv.Required(CONF_PROVIDER): cv.valid_name,
114
- cv.GenerateID(CONF_UDP_ID): cv.use_id(UDPComponent),
64
+ cv.GenerateID(): cv.declare_id(UDPComponent),
65
+ cv.Optional(CONF_PORT, default=18511): cv.Any(
66
+ cv.port,
67
+ cv.Schema(
68
+ {
69
+ cv.Required(CONF_LISTEN_PORT): cv.port,
70
+ cv.Required(CONF_BROADCAST_PORT): cv.port,
71
+ }
72
+ ),
73
+ ),
74
+ cv.Optional(
75
+ CONF_LISTEN_ADDRESS, default="255.255.255.255"
76
+ ): cv.ipv4address_multi_broadcast,
77
+ cv.Optional(CONF_ADDRESSES, default=["255.255.255.255"]): cv.ensure_list(
78
+ cv.ipv4address,
79
+ ),
80
+ cv.Optional(CONF_ON_RECEIVE): automation.validate_automation(
81
+ {
82
+ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
83
+ Trigger.template(trigger_args)
84
+ ),
85
+ }
86
+ ),
115
87
  }
116
- )
117
-
88
+ ).extend(RELOCATED)
118
89
 
119
- def require_internal_with_name(config):
120
- if CONF_NAME in config and CONF_INTERNAL not in config:
121
- raise cv.Invalid("Must provide internal: config when using name:")
122
- return config
123
90
 
124
-
125
- def hash_encryption_key(config: dict):
126
- return list(hashlib.sha256(config[CONF_KEY].encode()).digest())
91
+ async def register_udp_client(var, config):
92
+ udp_var = await cg.get_variable(config[CONF_UDP_ID])
93
+ cg.add(var.set_parent(udp_var))
94
+ return udp_var
127
95
 
128
96
 
129
97
  async def to_code(config):
130
98
  cg.add_define("USE_UDP")
131
99
  cg.add_global(udp_ns.using)
132
100
  var = cg.new_Pvariable(config[CONF_ID])
133
- await cg.register_component(var, config)
134
- cg.add(var.set_port(config[CONF_PORT]))
135
- cg.add(var.set_rolling_code_enable(config[CONF_ROLLING_CODE_ENABLE]))
136
- cg.add(var.set_ping_pong_enable(config[CONF_PING_PONG_ENABLE]))
137
- cg.add(
138
- var.set_ping_pong_recycle_time(
139
- config[CONF_PING_PONG_RECYCLE_TIME].total_seconds
140
- )
141
- )
142
- for sens_conf in config.get(CONF_SENSORS, ()):
143
- sens_id = sens_conf[CONF_ID]
144
- sensor = await cg.get_variable(sens_id)
145
- bcst_id = sens_conf.get(CONF_BROADCAST_ID, sens_id.id)
146
- cg.add(var.add_sensor(bcst_id, sensor))
147
- for sens_conf in config.get(CONF_BINARY_SENSORS, ()):
148
- sens_id = sens_conf[CONF_ID]
149
- sensor = await cg.get_variable(sens_id)
150
- bcst_id = sens_conf.get(CONF_BROADCAST_ID, sens_id.id)
151
- cg.add(var.add_binary_sensor(bcst_id, sensor))
101
+ var = await cg.register_component(var, config)
102
+ conf_port = config[CONF_PORT]
103
+ if isinstance(conf_port, int):
104
+ cg.add(var.set_listen_port(conf_port))
105
+ cg.add(var.set_broadcast_port(conf_port))
106
+ else:
107
+ cg.add(var.set_listen_port(conf_port[CONF_LISTEN_PORT]))
108
+ cg.add(var.set_broadcast_port(conf_port[CONF_BROADCAST_PORT]))
109
+ if (listen_address := str(config[CONF_LISTEN_ADDRESS])) != "255.255.255.255":
110
+ cg.add(var.set_listen_address(listen_address))
152
111
  for address in config[CONF_ADDRESSES]:
153
112
  cg.add(var.add_address(str(address)))
113
+ if on_receive := config.get(CONF_ON_RECEIVE):
114
+ on_receive = on_receive[0]
115
+ trigger = cg.new_Pvariable(on_receive[CONF_TRIGGER_ID])
116
+ trigger = await automation.build_automation(
117
+ trigger, [(trigger_args, "data")], on_receive
118
+ )
119
+ trigger = Lambda(str(ExpressionStatement(trigger.trigger(MockObj("data")))))
120
+ trigger = await cg.process_lambda(trigger, [(trigger_args, "data")])
121
+ cg.add(var.add_listener(trigger))
122
+ cg.add(var.set_should_listen())
123
+
124
+
125
+ def validate_raw_data(value):
126
+ if isinstance(value, str):
127
+ return value.encode("utf-8")
128
+ if isinstance(value, str):
129
+ return value
130
+ if isinstance(value, list):
131
+ return cv.Schema([cv.hex_uint8_t])(value)
132
+ raise cv.Invalid(
133
+ "data must either be a string wrapped in quotes or a list of bytes"
134
+ )
154
135
 
155
- if encryption := config.get(CONF_ENCRYPTION):
156
- cg.add(var.set_encryption_key(hash_encryption_key(encryption)))
157
136
 
158
- for provider in config.get(CONF_PROVIDERS, ()):
159
- name = provider[CONF_NAME]
160
- cg.add(var.add_provider(name))
161
- if (listen_address := str(config[CONF_LISTEN_ADDRESS])) != "255.255.255.255":
162
- cg.add(var.set_listen_address(listen_address))
163
- if encryption := provider.get(CONF_ENCRYPTION):
164
- cg.add(var.set_provider_encryption(name, hash_encryption_key(encryption)))
137
+ @automation.register_action(
138
+ "udp.write",
139
+ UDPWriteAction,
140
+ cv.maybe_simple_value(
141
+ {
142
+ cv.GenerateID(): cv.use_id(UDPComponent),
143
+ cv.Required(CONF_DATA): cv.templatable(validate_raw_data),
144
+ },
145
+ key=CONF_DATA,
146
+ ),
147
+ )
148
+ async def udp_write_to_code(config, action_id, template_arg, args):
149
+ var = cg.new_Pvariable(action_id, template_arg)
150
+ udp_var = await cg.get_variable(config[CONF_ID])
151
+ await cg.register_parented(var, udp_var)
152
+ cg.add(udp_var.set_should_broadcast())
153
+ data = config[CONF_DATA]
154
+ if isinstance(data, bytes):
155
+ data = list(data)
156
+
157
+ if cg.is_template(data):
158
+ templ = await cg.templatable(data, args, cg.std_vector.template(cg.uint8))
159
+ cg.add(var.set_data_template(templ))
160
+ else:
161
+ cg.add(var.set_data_static(data))
162
+ return var
@@ -0,0 +1,40 @@
1
+ #pragma once
2
+
3
+ #include "udp_component.h"
4
+ #ifdef USE_NETWORK
5
+ #include "esphome/core/automation.h"
6
+
7
+ #include <vector>
8
+
9
+ namespace esphome {
10
+ namespace udp {
11
+
12
+ template<typename... Ts> class UDPWriteAction : public Action<Ts...>, public Parented<UDPComponent> {
13
+ public:
14
+ void set_data_template(std::function<std::vector<uint8_t>(Ts...)> func) {
15
+ this->data_func_ = func;
16
+ this->static_ = false;
17
+ }
18
+ void set_data_static(const std::vector<uint8_t> &data) {
19
+ this->data_static_ = data;
20
+ this->static_ = true;
21
+ }
22
+
23
+ void play(Ts... x) override {
24
+ if (this->static_) {
25
+ this->parent_->send_packet(this->data_static_);
26
+ } else {
27
+ auto val = this->data_func_(x...);
28
+ this->parent_->send_packet(val);
29
+ }
30
+ }
31
+
32
+ protected:
33
+ bool static_{false};
34
+ std::function<std::vector<uint8_t>(Ts...)> data_func_{};
35
+ std::vector<uint8_t> data_static_{};
36
+ };
37
+
38
+ } // namespace udp
39
+ } // namespace esphome
40
+ #endif
@@ -1,27 +1,5 @@
1
- import esphome.codegen as cg
2
- from esphome.components import binary_sensor
3
- from esphome.config_validation import All, has_at_least_one_key
4
- from esphome.const import CONF_ID
1
+ import esphome.config_validation as cv
5
2
 
6
- from . import (
7
- CONF_PROVIDER,
8
- CONF_REMOTE_ID,
9
- CONF_UDP_ID,
10
- SENSOR_SCHEMA,
11
- require_internal_with_name,
3
+ CONFIG_SCHEMA = cv.invalid(
4
+ "The 'udp.binary_sensor' component has been migrated to the 'packet_transport.binary_sensor' component."
12
5
  )
13
-
14
- DEPENDENCIES = ["udp"]
15
-
16
- CONFIG_SCHEMA = All(
17
- binary_sensor.binary_sensor_schema().extend(SENSOR_SCHEMA),
18
- has_at_least_one_key(CONF_ID, CONF_REMOTE_ID),
19
- require_internal_with_name,
20
- )
21
-
22
-
23
- async def to_code(config):
24
- var = await binary_sensor.new_binary_sensor(config)
25
- comp = await cg.get_variable(config[CONF_UDP_ID])
26
- remote_id = str(config.get(CONF_REMOTE_ID) or config.get(CONF_ID))
27
- cg.add(comp.add_remote_binary_sensor(config[CONF_PROVIDER], remote_id, var))
@@ -0,0 +1,29 @@
1
+ import esphome.codegen as cg
2
+ from esphome.components.api import CONF_ENCRYPTION
3
+ from esphome.components.packet_transport import (
4
+ CONF_PING_PONG_ENABLE,
5
+ PacketTransport,
6
+ new_packet_transport,
7
+ transport_schema,
8
+ )
9
+ from esphome.const import CONF_BINARY_SENSORS, CONF_SENSORS
10
+ from esphome.cpp_types import PollingComponent
11
+
12
+ from .. import UDP_SCHEMA, register_udp_client, udp_ns
13
+
14
+ UDPTransport = udp_ns.class_("UDPTransport", PacketTransport, PollingComponent)
15
+
16
+ CONFIG_SCHEMA = transport_schema(UDPTransport).extend(UDP_SCHEMA)
17
+
18
+
19
+ async def to_code(config):
20
+ var, providers = await new_packet_transport(config)
21
+ udp_var = await register_udp_client(var, config)
22
+ if CONF_ENCRYPTION in config or providers:
23
+ cg.add(udp_var.set_should_listen())
24
+ if (
25
+ config[CONF_PING_PONG_ENABLE]
26
+ or config.get(CONF_SENSORS, ())
27
+ or config.get(CONF_BINARY_SENSORS, ())
28
+ ):
29
+ cg.add(udp_var.set_should_broadcast())
@@ -0,0 +1,36 @@
1
+ #include "esphome/core/log.h"
2
+ #include "esphome/core/application.h"
3
+ #include "esphome/components/network/util.h"
4
+ #include "udp_transport.h"
5
+
6
+ namespace esphome {
7
+ namespace udp {
8
+
9
+ static const char *const TAG = "udp_transport";
10
+
11
+ bool UDPTransport::should_send() { return this->should_broadcast_ && network::is_connected(); }
12
+ void UDPTransport::setup() {
13
+ PacketTransport::setup();
14
+ this->should_broadcast_ = this->ping_pong_enable_;
15
+ #ifdef USE_SENSOR
16
+ this->should_broadcast_ |= !this->sensors_.empty();
17
+ #endif
18
+ #ifdef USE_BINARY_SENSOR
19
+ this->should_broadcast_ |= !this->binary_sensors_.empty();
20
+ #endif
21
+ if (this->should_broadcast_)
22
+ this->parent_->set_should_broadcast();
23
+ if (!this->providers_.empty() || this->is_encrypted_()) {
24
+ this->parent_->add_listener([this](std::vector<uint8_t> &buf) { this->process_(buf); });
25
+ }
26
+ }
27
+
28
+ void UDPTransport::update() {
29
+ PacketTransport::update();
30
+ this->updated_ = true;
31
+ this->resend_data_ = this->should_broadcast_;
32
+ }
33
+
34
+ void UDPTransport::send_packet(const std::vector<uint8_t> &buf) const { this->parent_->send_packet(buf); }
35
+ } // namespace udp
36
+ } // namespace esphome
@@ -0,0 +1,28 @@
1
+ #pragma once
2
+
3
+ #include "../udp_component.h"
4
+ #ifdef USE_NETWORK
5
+ #include "esphome/core/component.h"
6
+ #include "esphome/components/packet_transport/packet_transport.h"
7
+ #include <vector>
8
+
9
+ namespace esphome {
10
+ namespace udp {
11
+
12
+ class UDPTransport : public packet_transport::PacketTransport, public Parented<UDPComponent> {
13
+ public:
14
+ void setup() override;
15
+ void update() override;
16
+
17
+ float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
18
+
19
+ protected:
20
+ void send_packet(const std::vector<uint8_t> &buf) const override;
21
+ bool should_send() override;
22
+ bool should_broadcast_{false};
23
+ size_t get_max_packet_size() override { return MAX_PACKET_SIZE; }
24
+ };
25
+
26
+ } // namespace udp
27
+ } // namespace esphome
28
+ #endif
@@ -1,27 +1,5 @@
1
- import esphome.codegen as cg
2
- from esphome.components.sensor import new_sensor, sensor_schema
3
- from esphome.config_validation import All, has_at_least_one_key
4
- from esphome.const import CONF_ID
1
+ import esphome.config_validation as cv
5
2
 
6
- from . import (
7
- CONF_PROVIDER,
8
- CONF_REMOTE_ID,
9
- CONF_UDP_ID,
10
- SENSOR_SCHEMA,
11
- require_internal_with_name,
3
+ CONFIG_SCHEMA = cv.invalid(
4
+ "The 'udp.sensor' component has been migrated to the 'packet_transport.sensor' component."
12
5
  )
13
-
14
- DEPENDENCIES = ["udp"]
15
-
16
- CONFIG_SCHEMA = All(
17
- sensor_schema().extend(SENSOR_SCHEMA),
18
- has_at_least_one_key(CONF_ID, CONF_REMOTE_ID),
19
- require_internal_with_name,
20
- )
21
-
22
-
23
- async def to_code(config):
24
- var = await new_sensor(config)
25
- comp = await cg.get_variable(config[CONF_UDP_ID])
26
- remote_id = str(config.get(CONF_REMOTE_ID) or config.get(CONF_ID))
27
- cg.add(comp.add_remote_sensor(config[CONF_PROVIDER], remote_id, var))