esphome 2025.4.1__py3-none-any.whl → 2025.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) 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 +416 -662
  13. esphome/components/api/api_connection.h +256 -57
  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/as3935_i2c/as3935_i2c.h +0 -3
  26. esphome/components/as7341/as7341.h +1 -1
  27. esphome/components/at581x/at581x.h +4 -4
  28. esphome/components/atm90e32/__init__.py +1 -0
  29. esphome/components/atm90e32/atm90e32.cpp +576 -199
  30. esphome/components/atm90e32/atm90e32.h +128 -31
  31. esphome/components/atm90e32/atm90e32_reg.h +4 -2
  32. esphome/components/atm90e32/button/__init__.py +62 -10
  33. esphome/components/atm90e32/button/atm90e32_button.cpp +63 -4
  34. esphome/components/atm90e32/button/atm90e32_button.h +36 -4
  35. esphome/components/atm90e32/number/__init__.py +130 -0
  36. esphome/components/atm90e32/number/atm90e32_number.h +16 -0
  37. esphome/components/atm90e32/sensor.py +21 -4
  38. esphome/components/atm90e32/text_sensor/__init__.py +48 -0
  39. esphome/components/audio/__init__.py +96 -49
  40. esphome/components/audio/audio.h +48 -0
  41. esphome/components/audio/audio_decoder.cpp +1 -1
  42. esphome/components/audio/audio_resampler.cpp +2 -0
  43. esphome/components/audio/audio_resampler.h +1 -0
  44. esphome/components/ballu/climate.py +2 -9
  45. esphome/components/bang_bang/climate.py +5 -6
  46. esphome/components/bedjet/bedjet_hub.cpp +1 -0
  47. esphome/components/bedjet/climate/__init__.py +3 -8
  48. esphome/components/bedjet/fan/__init__.py +2 -11
  49. esphome/components/binary/fan/__init__.py +13 -16
  50. esphome/components/binary_sensor/__init__.py +13 -10
  51. esphome/components/bl0906/constants.h +16 -16
  52. esphome/components/ble_client/text_sensor/__init__.py +3 -5
  53. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +4 -6
  54. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +136 -21
  55. esphome/components/bluetooth_proxy/bluetooth_proxy.h +7 -0
  56. esphome/components/button/__init__.py +11 -8
  57. esphome/components/canbus/canbus.cpp +3 -0
  58. esphome/components/canbus/canbus.h +16 -0
  59. esphome/components/ccs811/sensor.py +9 -6
  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/cse7766/cse7766.cpp +2 -1
  76. esphome/components/cst226/binary_sensor/__init__.py +28 -0
  77. esphome/components/cst226/binary_sensor/cs226_button.h +22 -0
  78. esphome/components/cst226/binary_sensor/cstt6_button.cpp +19 -0
  79. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +27 -5
  80. esphome/components/cst226/touchscreen/cst226_touchscreen.h +10 -10
  81. esphome/components/current_based/cover.py +37 -36
  82. esphome/components/current_based/current_based_cover.cpp +2 -1
  83. esphome/components/daikin/climate.py +2 -9
  84. esphome/components/daikin/daikin.cpp +15 -9
  85. esphome/components/daikin/daikin.h +5 -5
  86. esphome/components/daikin_arc/climate.py +2 -7
  87. esphome/components/daikin_brc/climate.py +3 -5
  88. esphome/components/dallas_temp/dallas_temp.cpp +17 -24
  89. esphome/components/dallas_temp/dallas_temp.h +0 -1
  90. esphome/components/daly_bms/daly_bms.cpp +2 -1
  91. esphome/components/debug/debug_component.cpp +6 -1
  92. esphome/components/debug/debug_component.h +8 -0
  93. esphome/components/debug/debug_esp32.cpp +109 -254
  94. esphome/components/debug/sensor.py +14 -0
  95. esphome/components/deep_sleep/deep_sleep_esp32.cpp +13 -1
  96. esphome/components/delonghi/climate.py +2 -9
  97. esphome/components/demo/__init__.py +18 -20
  98. esphome/components/dfrobot_sen0395/switch/__init__.py +21 -22
  99. esphome/components/display/rect.cpp +4 -9
  100. esphome/components/display/rect.h +1 -1
  101. esphome/components/dps310/sensor.py +6 -6
  102. esphome/components/ee895/sensor.py +9 -9
  103. esphome/components/emmeti/climate.py +2 -9
  104. esphome/components/endstop/cover.py +17 -16
  105. esphome/components/endstop/endstop_cover.cpp +2 -1
  106. esphome/components/ens160_base/__init__.py +12 -9
  107. esphome/components/esp32/__init__.py +60 -3
  108. esphome/components/esp32/core.cpp +11 -5
  109. esphome/components/esp32/gpio.cpp +86 -24
  110. esphome/components/esp32/gpio.py +15 -16
  111. esphome/components/esp32/gpio_esp32.py +1 -2
  112. esphome/components/esp32/gpio_esp32_c2.py +1 -1
  113. esphome/components/esp32/gpio_esp32_c3.py +1 -1
  114. esphome/components/esp32/gpio_esp32_c6.py +1 -1
  115. esphome/components/esp32/gpio_esp32_h2.py +1 -1
  116. esphome/components/esp32_ble/ble.cpp +1 -8
  117. esphome/components/esp32_ble/ble.h +5 -3
  118. esphome/components/esp32_ble/ble_advertising.cpp +2 -1
  119. esphome/components/esp32_ble/ble_advertising.h +1 -0
  120. esphome/components/esp32_ble_server/__init__.py +3 -0
  121. esphome/components/esp32_ble_tracker/__init__.py +7 -1
  122. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +192 -118
  123. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +29 -3
  124. esphome/components/esp32_camera/__init__.py +1 -1
  125. esphome/components/esp32_camera/esp32_camera.cpp +2 -10
  126. esphome/components/esp32_camera/esp32_camera.h +1 -1
  127. esphome/components/esp32_can/esp32_can.cpp +1 -1
  128. esphome/components/esp32_improv/esp32_improv_component.cpp +1 -1
  129. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -1
  130. esphome/components/esp32_rmt_led_strip/led_strip.h +7 -5
  131. esphome/components/esp32_rmt_led_strip/light.py +9 -1
  132. esphome/components/esp32_touch/esp32_touch.cpp +1 -1
  133. esphome/components/esp8266/gpio.cpp +69 -8
  134. esphome/components/ethernet/ethernet_component.cpp +1 -1
  135. esphome/components/event/__init__.py +13 -10
  136. esphome/components/factory_reset/switch/__init__.py +7 -21
  137. esphome/components/fan/__init__.py +52 -5
  138. esphome/components/fastled_base/__init__.py +1 -4
  139. esphome/components/fastled_base/fastled_light.cpp +1 -1
  140. esphome/components/feedback/cover.py +38 -33
  141. esphome/components/feedback/feedback_cover.cpp +2 -1
  142. esphome/components/fujitsu_general/climate.py +2 -9
  143. esphome/components/gcja5/gcja5.cpp +2 -1
  144. esphome/components/gpio/one_wire/gpio_one_wire.cpp +45 -43
  145. esphome/components/gpio/one_wire/gpio_one_wire.h +2 -1
  146. esphome/components/gpio_expander/cached_gpio.h +22 -7
  147. esphome/components/gps/__init__.py +47 -17
  148. esphome/components/gps/gps.cpp +42 -23
  149. esphome/components/gps/gps.h +17 -13
  150. esphome/components/graph/__init__.py +1 -2
  151. esphome/components/gree/climate.py +4 -6
  152. esphome/components/gree/gree.cpp +16 -2
  153. esphome/components/gree/gree.h +2 -2
  154. esphome/components/growatt_solar/growatt_solar.cpp +2 -1
  155. esphome/components/haier/climate.py +37 -34
  156. esphome/components/hbridge/fan/__init__.py +19 -17
  157. esphome/components/he60r/cover.py +4 -5
  158. esphome/components/heatpumpir/climate.py +3 -6
  159. esphome/components/hitachi_ac344/climate.py +2 -9
  160. esphome/components/hitachi_ac424/climate.py +2 -9
  161. esphome/components/hlw8012/hlw8012.cpp +1 -1
  162. esphome/components/hm3301/hm3301.h +1 -1
  163. esphome/components/hte501/sensor.py +6 -6
  164. esphome/components/http_request/__init__.py +39 -6
  165. esphome/components/http_request/http_request.cpp +20 -0
  166. esphome/components/http_request/http_request.h +57 -15
  167. esphome/components/http_request/http_request_arduino.cpp +22 -6
  168. esphome/components/http_request/http_request_arduino.h +4 -3
  169. esphome/components/http_request/http_request_host.cpp +141 -0
  170. esphome/components/http_request/http_request_host.h +37 -0
  171. esphome/components/http_request/http_request_idf.cpp +35 -3
  172. esphome/components/http_request/http_request_idf.h +10 -3
  173. esphome/components/http_request/httplib.h +9691 -0
  174. esphome/components/http_request/update/__init__.py +11 -8
  175. esphome/components/hyt271/sensor.py +6 -6
  176. esphome/components/i2c/i2c.h +4 -0
  177. esphome/components/i2c/i2c_bus_esp_idf.cpp +1 -1
  178. esphome/components/i2s_audio/__init__.py +131 -22
  179. esphome/components/i2s_audio/i2s_audio.h +44 -4
  180. esphome/components/i2s_audio/media_player/__init__.py +19 -9
  181. esphome/components/i2s_audio/microphone/__init__.py +63 -5
  182. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +351 -61
  183. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +40 -6
  184. esphome/components/i2s_audio/speaker/__init__.py +31 -5
  185. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +155 -19
  186. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +17 -4
  187. esphome/components/ili9xxx/ili9xxx_init.h +1 -1
  188. esphome/components/image/__init__.py +37 -17
  189. esphome/components/image/image.cpp +25 -8
  190. esphome/components/internal_temperature/internal_temperature.cpp +6 -4
  191. esphome/components/key_collector/__init__.py +35 -0
  192. esphome/components/key_collector/key_collector.cpp +8 -0
  193. esphome/components/key_collector/key_collector.h +10 -0
  194. esphome/components/kuntze/kuntze.cpp +2 -1
  195. esphome/components/ld2410/ld2410.h +1 -1
  196. esphome/components/ld2450/ld2450.h +1 -1
  197. esphome/components/light/__init__.py +57 -0
  198. esphome/components/lock/__init__.py +51 -4
  199. esphome/components/lock/automation.h +2 -13
  200. esphome/components/logger/__init__.py +22 -0
  201. esphome/components/logger/logger.cpp +154 -103
  202. esphome/components/logger/logger.h +211 -36
  203. esphome/components/logger/task_log_buffer.cpp +138 -0
  204. esphome/components/logger/task_log_buffer.h +69 -0
  205. esphome/components/lvgl/__init__.py +13 -5
  206. esphome/components/lvgl/automation.py +50 -1
  207. esphome/components/lvgl/defines.py +0 -1
  208. esphome/components/lvgl/lv_validation.py +10 -1
  209. esphome/components/lvgl/lvgl_esphome.cpp +5 -1
  210. esphome/components/lvgl/schemas.py +14 -14
  211. esphome/components/lvgl/text/__init__.py +1 -2
  212. esphome/components/lvgl/widgets/arc.py +7 -6
  213. esphome/components/lvgl/widgets/buttonmatrix.py +3 -3
  214. esphome/components/lvgl/widgets/checkbox.py +2 -2
  215. esphome/components/lvgl/widgets/dropdown.py +2 -1
  216. esphome/components/lvgl/widgets/img.py +15 -12
  217. esphome/components/mapping/__init__.py +134 -0
  218. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -1
  219. esphome/components/max7219digit/max7219digit.cpp +28 -27
  220. esphome/components/mdns/__init__.py +11 -5
  221. esphome/components/mdns/mdns_component.cpp +11 -5
  222. esphome/components/mdns/mdns_component.h +3 -2
  223. esphome/components/mdns/mdns_esp32.cpp +4 -3
  224. esphome/components/mdns/mdns_esp8266.cpp +4 -2
  225. esphome/components/mdns/mdns_libretiny.cpp +4 -2
  226. esphome/components/mdns/mdns_rp2040.cpp +4 -2
  227. esphome/components/media_player/__init__.py +40 -6
  228. esphome/components/mhz19/sensor.py +11 -7
  229. esphome/components/micro_wake_word/__init__.py +99 -31
  230. esphome/components/micro_wake_word/automation.h +54 -0
  231. esphome/components/micro_wake_word/micro_wake_word.cpp +331 -319
  232. esphome/components/micro_wake_word/micro_wake_word.h +58 -105
  233. esphome/components/micro_wake_word/preprocessor_settings.h +19 -2
  234. esphome/components/micro_wake_word/streaming_model.cpp +158 -41
  235. esphome/components/micro_wake_word/streaming_model.h +85 -13
  236. esphome/components/microphone/__init__.py +139 -9
  237. esphome/components/microphone/automation.h +14 -2
  238. esphome/components/microphone/microphone.cpp +21 -0
  239. esphome/components/microphone/microphone.h +14 -5
  240. esphome/components/microphone/microphone_source.cpp +95 -0
  241. esphome/components/microphone/microphone_source.h +80 -0
  242. esphome/components/mics_4514/sensor.py +25 -14
  243. esphome/components/midea/climate.py +3 -4
  244. esphome/components/midea_ir/climate.py +3 -5
  245. esphome/components/mipi_spi/__init__.py +15 -0
  246. esphome/components/mipi_spi/display.py +474 -0
  247. esphome/components/mipi_spi/mipi_spi.cpp +481 -0
  248. esphome/components/mipi_spi/mipi_spi.h +171 -0
  249. esphome/components/mipi_spi/models/__init__.py +65 -0
  250. esphome/components/mipi_spi/models/amoled.py +72 -0
  251. esphome/components/mipi_spi/models/commands.py +82 -0
  252. esphome/components/mipi_spi/models/cyd.py +10 -0
  253. esphome/components/mipi_spi/models/ili.py +749 -0
  254. esphome/components/mipi_spi/models/jc.py +260 -0
  255. esphome/components/mipi_spi/models/lanbon.py +15 -0
  256. esphome/components/mipi_spi/models/lilygo.py +60 -0
  257. esphome/components/mipi_spi/models/waveshare.py +139 -0
  258. esphome/components/mitsubishi/climate.py +2 -5
  259. esphome/components/mitsubishi/mitsubishi.cpp +9 -9
  260. esphome/components/mixer/speaker/mixer_speaker.cpp +12 -22
  261. esphome/components/mixer/speaker/mixer_speaker.h +1 -3
  262. esphome/components/mlx90393/sensor.py +5 -0
  263. esphome/components/mlx90393/sensor_mlx90393.cpp +195 -13
  264. esphome/components/mlx90393/sensor_mlx90393.h +21 -4
  265. esphome/components/modbus/modbus.cpp +2 -1
  266. esphome/components/mqtt/__init__.py +1 -1
  267. esphome/components/mqtt/mqtt_client.cpp +6 -2
  268. esphome/components/mqtt/mqtt_const.h +4 -0
  269. esphome/components/mqtt/mqtt_fan.cpp +39 -0
  270. esphome/components/mqtt/mqtt_fan.h +2 -0
  271. esphome/components/ms5611/sensor.py +6 -6
  272. esphome/components/ms8607/sensor.py +3 -3
  273. esphome/components/network/__init__.py +1 -1
  274. esphome/components/nextion/base_component.py +17 -16
  275. esphome/components/nextion/display.py +11 -2
  276. esphome/components/nextion/nextion.cpp +39 -1
  277. esphome/components/nextion/nextion.h +50 -0
  278. esphome/components/noblex/climate.py +2 -9
  279. esphome/components/number/__init__.py +12 -9
  280. esphome/components/one_wire/one_wire_bus.cpp +14 -10
  281. esphome/components/one_wire/one_wire_bus.h +14 -8
  282. esphome/components/online_image/bmp_image.cpp +48 -11
  283. esphome/components/online_image/bmp_image.h +2 -0
  284. esphome/components/opentherm/binary_sensor/__init__.py +2 -4
  285. esphome/components/opentherm/number/__init__.py +11 -20
  286. esphome/components/opentherm/sensor/__init__.py +3 -3
  287. esphome/components/opentherm/switch/__init__.py +3 -5
  288. esphome/components/output/lock/__init__.py +11 -9
  289. esphome/components/packages/__init__.py +33 -31
  290. esphome/components/packet_transport/__init__.py +201 -0
  291. esphome/components/packet_transport/binary_sensor.py +19 -0
  292. esphome/components/packet_transport/packet_transport.cpp +534 -0
  293. esphome/components/packet_transport/packet_transport.h +154 -0
  294. esphome/components/packet_transport/sensor.py +19 -0
  295. esphome/components/pca9685/pca9685_output.cpp +2 -1
  296. esphome/components/pid/climate.py +2 -4
  297. esphome/components/pm2005/__init__.py +1 -0
  298. esphome/components/pm2005/pm2005.cpp +123 -0
  299. esphome/components/pm2005/pm2005.h +46 -0
  300. esphome/components/pm2005/sensor.py +86 -0
  301. esphome/components/pmsa003i/pmsa003i.cpp +43 -16
  302. esphome/components/pmsa003i/pmsa003i.h +25 -25
  303. esphome/components/pmsx003/pmsx003.cpp +195 -230
  304. esphome/components/pmsx003/pmsx003.h +51 -33
  305. esphome/components/pmsx003/sensor.py +21 -11
  306. esphome/components/pn7150/pn7150.h +2 -2
  307. esphome/components/pn7160/pn7160.h +2 -2
  308. esphome/components/prometheus/prometheus_handler.cpp +174 -0
  309. esphome/components/prometheus/prometheus_handler.h +17 -0
  310. esphome/components/psram/__init__.py +7 -5
  311. esphome/components/pulse_meter/pulse_meter_sensor.cpp +32 -12
  312. esphome/components/pulse_meter/pulse_meter_sensor.h +5 -5
  313. esphome/components/pzem004t/pzem004t.cpp +2 -1
  314. esphome/components/qspi_dbi/__init__.py +0 -1
  315. esphome/components/qspi_dbi/display.py +2 -1
  316. esphome/components/qspi_dbi/models.py +1 -2
  317. esphome/components/remote_base/__init__.py +91 -0
  318. esphome/components/remote_base/beo4_protocol.cpp +153 -0
  319. esphome/components/remote_base/beo4_protocol.h +43 -0
  320. esphome/components/remote_base/gobox_protocol.cpp +131 -0
  321. esphome/components/remote_base/gobox_protocol.h +54 -0
  322. esphome/components/remote_receiver/remote_receiver_esp32.cpp +16 -9
  323. esphome/components/resampler/speaker/resampler_speaker.cpp +12 -10
  324. esphome/components/resampler/speaker/resampler_speaker.h +1 -1
  325. esphome/components/rf_bridge/rf_bridge.cpp +2 -1
  326. esphome/components/scd30/sensor.py +2 -3
  327. esphome/components/scd4x/sensor.py +4 -5
  328. esphome/components/sdp3x/sensor.py +2 -1
  329. esphome/components/sds011/sds011.cpp +2 -1
  330. esphome/components/select/__init__.py +19 -20
  331. esphome/components/sen5x/sen5x.cpp +55 -36
  332. esphome/components/sen5x/sensor.py +1 -1
  333. esphome/components/senseair/sensor.py +3 -3
  334. esphome/components/sensor/__init__.py +158 -14
  335. esphome/components/sensor/filter.cpp +23 -0
  336. esphome/components/sensor/filter.h +22 -0
  337. esphome/components/sgp30/sensor.py +14 -16
  338. esphome/components/sgp4x/sensor.py +1 -1
  339. esphome/components/sht4x/sht4x.cpp +43 -22
  340. esphome/components/sht4x/sht4x.h +1 -1
  341. esphome/components/shtcx/sensor.py +6 -6
  342. esphome/components/slow_pwm/slow_pwm_output.cpp +2 -1
  343. esphome/components/sml/text_sensor/__init__.py +4 -6
  344. esphome/components/sound_level/__init__.py +0 -0
  345. esphome/components/sound_level/sensor.py +97 -0
  346. esphome/components/sound_level/sound_level.cpp +194 -0
  347. esphome/components/sound_level/sound_level.h +73 -0
  348. esphome/components/speaker/media_player/__init__.py +4 -8
  349. esphome/components/speaker/media_player/speaker_media_player.cpp +0 -18
  350. esphome/components/speaker/media_player/speaker_media_player.h +0 -11
  351. esphome/components/speaker/speaker.h +4 -7
  352. esphome/components/speed/fan/__init__.py +17 -16
  353. esphome/components/spi/spi.h +11 -1
  354. esphome/components/sprinkler/__init__.py +18 -19
  355. esphome/components/sprinkler/sprinkler.cpp +6 -5
  356. esphome/components/switch/__init__.py +32 -42
  357. esphome/components/syslog/__init__.py +41 -0
  358. esphome/components/syslog/esphome_syslog.cpp +49 -0
  359. esphome/components/syslog/esphome_syslog.h +27 -0
  360. esphome/components/t6615/sensor.py +3 -3
  361. esphome/components/t6615/t6615.cpp +2 -1
  362. esphome/components/tca9555/tca9555.cpp +11 -6
  363. esphome/components/tcl112/climate.py +2 -9
  364. esphome/components/template/alarm_control_panel/__init__.py +7 -6
  365. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +21 -17
  366. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +2 -1
  367. esphome/components/template/cover/__init__.py +27 -21
  368. esphome/components/template/fan/__init__.py +14 -12
  369. esphome/components/template/lock/__init__.py +20 -25
  370. esphome/components/template/lock/automation.h +18 -0
  371. esphome/components/template/text/__init__.py +4 -3
  372. esphome/components/template/valve/__init__.py +32 -21
  373. esphome/components/template/valve/automation.h +24 -0
  374. esphome/components/text/__init__.py +32 -1
  375. esphome/components/text_sensor/__init__.py +24 -29
  376. esphome/components/thermostat/climate.py +5 -5
  377. esphome/components/time_based/cover.py +17 -16
  378. esphome/components/time_based/time_based_cover.cpp +2 -1
  379. esphome/components/tm1638/switch/__init__.py +10 -7
  380. esphome/components/tormatic/cover.py +4 -5
  381. esphome/components/toshiba/climate.py +3 -5
  382. esphome/components/touchscreen/touchscreen.cpp +3 -1
  383. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  384. esphome/components/tuya/climate/__init__.py +5 -6
  385. esphome/components/tuya/cover/__init__.py +6 -11
  386. esphome/components/tuya/select/__init__.py +15 -5
  387. esphome/components/tuya/select/tuya_select.cpp +6 -1
  388. esphome/components/tuya/select/tuya_select.h +5 -1
  389. esphome/components/uart/packet_transport/__init__.py +20 -0
  390. esphome/components/uart/packet_transport/uart_transport.cpp +88 -0
  391. esphome/components/uart/packet_transport/uart_transport.h +41 -0
  392. esphome/components/uart/switch/uart_switch.cpp +2 -1
  393. esphome/components/udp/__init__.py +126 -128
  394. esphome/components/udp/automation.h +40 -0
  395. esphome/components/udp/binary_sensor.py +3 -25
  396. esphome/components/udp/packet_transport/__init__.py +29 -0
  397. esphome/components/udp/packet_transport/udp_transport.cpp +36 -0
  398. esphome/components/udp/packet_transport/udp_transport.h +28 -0
  399. esphome/components/udp/sensor.py +3 -25
  400. esphome/components/udp/udp_component.cpp +26 -470
  401. esphome/components/udp/udp_component.h +21 -128
  402. esphome/components/update/__init__.py +31 -1
  403. esphome/components/uponor_smatrix/climate/__init__.py +4 -9
  404. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +2 -1
  405. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  406. esphome/components/uptime/text_sensor/__init__.py +47 -7
  407. esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +12 -7
  408. esphome/components/uptime/text_sensor/uptime_text_sensor.h +19 -0
  409. esphome/components/valve/__init__.py +34 -3
  410. esphome/components/valve/automation.h +1 -19
  411. esphome/components/vl53l0x/sensor.py +11 -0
  412. esphome/components/vl53l0x/vl53l0x_sensor.cpp +5 -1
  413. esphome/components/vl53l0x/vl53l0x_sensor.h +2 -1
  414. esphome/components/voice_assistant/__init__.py +36 -10
  415. esphome/components/voice_assistant/voice_assistant.cpp +170 -144
  416. esphome/components/voice_assistant/voice_assistant.h +26 -25
  417. esphome/components/waveshare_epaper/display.py +6 -0
  418. esphome/components/waveshare_epaper/waveshare_epaper.cpp +439 -37
  419. esphome/components/waveshare_epaper/waveshare_epaper.h +60 -11
  420. esphome/components/weikai/weikai.cpp +0 -52
  421. esphome/components/whirlpool/climate.py +3 -5
  422. esphome/components/whynter/climate.py +3 -5
  423. esphome/components/xpt2046/touchscreen/xpt2046.cpp +1 -1
  424. esphome/components/yashima/climate.py +6 -6
  425. esphome/components/zhlt01/climate.py +2 -7
  426. esphome/config.py +13 -13
  427. esphome/config_validation.py +38 -58
  428. esphome/const.py +15 -1
  429. esphome/core/__init__.py +2 -0
  430. esphome/core/application.cpp +27 -10
  431. esphome/core/application.h +9 -1
  432. esphome/core/automation.h +4 -3
  433. esphome/core/component.cpp +28 -7
  434. esphome/core/component.h +10 -1
  435. esphome/core/defines.h +23 -17
  436. esphome/core/doxygen.h +13 -0
  437. esphome/core/macros.h +4 -0
  438. esphome/core/scheduler.cpp +7 -1
  439. esphome/cpp_generator.py +6 -2
  440. esphome/dashboard/web_server.py +3 -3
  441. esphome/helpers.py +39 -0
  442. esphome/loader.py +4 -0
  443. esphome/log.py +15 -19
  444. esphome/mqtt.py +23 -10
  445. esphome/platformio_api.py +1 -1
  446. esphome/schema_extractors.py +0 -1
  447. esphome/voluptuous_schema.py +3 -1
  448. esphome/vscode.py +15 -0
  449. esphome/wizard.py +47 -37
  450. esphome/zeroconf.py +7 -3
  451. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/METADATA +10 -11
  452. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/RECORD +456 -396
  453. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/WHEEL +1 -1
  454. esphome/components/esp32_ble/const_esp32c6.h +0 -74
  455. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/entry_points.txt +0 -0
  456. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/licenses/LICENSE +0 -0
  457. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/top_level.txt +0 -0
@@ -2,6 +2,8 @@ from esphome import automation
2
2
  import esphome.codegen as cg
3
3
  import esphome.config_validation as cv
4
4
  from esphome.const import (
5
+ CONF_ENTITY_CATEGORY,
6
+ CONF_ICON,
5
7
  CONF_ID,
6
8
  CONF_ON_IDLE,
7
9
  CONF_ON_STATE,
@@ -10,6 +12,7 @@ from esphome.const import (
10
12
  )
11
13
  from esphome.core import CORE
12
14
  from esphome.coroutine import coroutine_with_priority
15
+ from esphome.cpp_generator import MockObjClass
13
16
  from esphome.cpp_helpers import setup_entity
14
17
 
15
18
  CODEOWNERS = ["@jesserockz"]
@@ -103,7 +106,13 @@ async def register_media_player(var, config):
103
106
  await setup_media_player_core_(var, config)
104
107
 
105
108
 
106
- MEDIA_PLAYER_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(
109
+ async def new_media_player(config, *args):
110
+ var = cg.new_Pvariable(config[CONF_ID], *args)
111
+ await register_media_player(var, config)
112
+ return var
113
+
114
+
115
+ _MEDIA_PLAYER_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(
107
116
  {
108
117
  cv.Optional(CONF_ON_STATE): automation.validate_automation(
109
118
  {
@@ -134,11 +143,36 @@ MEDIA_PLAYER_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(
134
143
  )
135
144
 
136
145
 
137
- MEDIA_PLAYER_ACTION_SCHEMA = cv.Schema(
138
- {
139
- cv.GenerateID(): cv.use_id(MediaPlayer),
140
- cv.Optional(CONF_ANNOUNCEMENT, default=False): cv.templatable(cv.boolean),
141
- }
146
+ def media_player_schema(
147
+ class_: MockObjClass,
148
+ *,
149
+ entity_category: str = cv.UNDEFINED,
150
+ icon: str = cv.UNDEFINED,
151
+ ) -> cv.Schema:
152
+ schema = {cv.GenerateID(CONF_ID): cv.declare_id(class_)}
153
+
154
+ for key, default, validator in [
155
+ (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
156
+ (CONF_ICON, icon, cv.icon),
157
+ ]:
158
+ if default is not cv.UNDEFINED:
159
+ schema[cv.Optional(key, default=default)] = validator
160
+
161
+ return _MEDIA_PLAYER_SCHEMA.extend(schema)
162
+
163
+
164
+ # Remove before 2025.11.0
165
+ MEDIA_PLAYER_SCHEMA = media_player_schema(MediaPlayer)
166
+ MEDIA_PLAYER_SCHEMA.add_extra(cv.deprecated_schema_constant("media_player"))
167
+
168
+
169
+ MEDIA_PLAYER_ACTION_SCHEMA = automation.maybe_simple_id(
170
+ cv.Schema(
171
+ {
172
+ cv.GenerateID(): cv.use_id(MediaPlayer),
173
+ cv.Optional(CONF_ANNOUNCEMENT, default=False): cv.templatable(cv.boolean),
174
+ }
175
+ )
142
176
  )
143
177
 
144
178
  MEDIA_PLAYER_CONDITION_SCHEMA = automation.maybe_simple_id(
@@ -32,7 +32,7 @@ CONFIG_SCHEMA = (
32
32
  cv.Schema(
33
33
  {
34
34
  cv.GenerateID(): cv.declare_id(MHZ19Component),
35
- cv.Required(CONF_CO2): sensor.sensor_schema(
35
+ cv.Optional(CONF_CO2): sensor.sensor_schema(
36
36
  unit_of_measurement=UNIT_PARTS_PER_MILLION,
37
37
  icon=ICON_MOLECULE_CO2,
38
38
  accuracy_decimals=0,
@@ -61,16 +61,20 @@ async def to_code(config):
61
61
  await cg.register_component(var, config)
62
62
  await uart.register_uart_device(var, config)
63
63
 
64
- if CONF_CO2 in config:
65
- sens = await sensor.new_sensor(config[CONF_CO2])
64
+ if co2 := config.get(CONF_CO2):
65
+ sens = await sensor.new_sensor(co2)
66
66
  cg.add(var.set_co2_sensor(sens))
67
67
 
68
- if CONF_TEMPERATURE in config:
69
- sens = await sensor.new_sensor(config[CONF_TEMPERATURE])
68
+ if temperature := config.get(CONF_TEMPERATURE):
69
+ sens = await sensor.new_sensor(temperature)
70
70
  cg.add(var.set_temperature_sensor(sens))
71
71
 
72
- if CONF_AUTOMATIC_BASELINE_CALIBRATION in config:
73
- cg.add(var.set_abc_enabled(config[CONF_AUTOMATIC_BASELINE_CALIBRATION]))
72
+ if (
73
+ automatic_baseline_calibration := config.get(
74
+ CONF_AUTOMATIC_BASELINE_CALIBRATION
75
+ )
76
+ ) is not None:
77
+ cg.add(var.set_abc_enabled(automatic_baseline_calibration))
74
78
 
75
79
  cg.add(var.set_warmup_seconds(config[CONF_WARMUP_TIME]))
76
80
 
@@ -12,6 +12,7 @@ import esphome.config_validation as cv
12
12
  from esphome.const import (
13
13
  CONF_FILE,
14
14
  CONF_ID,
15
+ CONF_INTERNAL,
15
16
  CONF_MICROPHONE,
16
17
  CONF_MODEL,
17
18
  CONF_PASSWORD,
@@ -40,6 +41,7 @@ CONF_ON_WAKE_WORD_DETECTED = "on_wake_word_detected"
40
41
  CONF_PROBABILITY_CUTOFF = "probability_cutoff"
41
42
  CONF_SLIDING_WINDOW_AVERAGE_SIZE = "sliding_window_average_size"
42
43
  CONF_SLIDING_WINDOW_SIZE = "sliding_window_size"
44
+ CONF_STOP_AFTER_DETECTION = "stop_after_detection"
43
45
  CONF_TENSOR_ARENA_SIZE = "tensor_arena_size"
44
46
  CONF_VAD = "vad"
45
47
 
@@ -49,13 +51,20 @@ micro_wake_word_ns = cg.esphome_ns.namespace("micro_wake_word")
49
51
 
50
52
  MicroWakeWord = micro_wake_word_ns.class_("MicroWakeWord", cg.Component)
51
53
 
54
+ DisableModelAction = micro_wake_word_ns.class_("DisableModelAction", automation.Action)
55
+ EnableModelAction = micro_wake_word_ns.class_("EnableModelAction", automation.Action)
52
56
  StartAction = micro_wake_word_ns.class_("StartAction", automation.Action)
53
57
  StopAction = micro_wake_word_ns.class_("StopAction", automation.Action)
54
58
 
59
+ ModelIsEnabledCondition = micro_wake_word_ns.class_(
60
+ "ModelIsEnabledCondition", automation.Condition
61
+ )
55
62
  IsRunningCondition = micro_wake_word_ns.class_(
56
63
  "IsRunningCondition", automation.Condition
57
64
  )
58
65
 
66
+ WakeWordModel = micro_wake_word_ns.class_("WakeWordModel")
67
+
59
68
 
60
69
  def _validate_json_filename(value):
61
70
  value = cv.string(value)
@@ -169,9 +178,10 @@ def _convert_manifest_v1_to_v2(v1_manifest):
169
178
 
170
179
  # Original Inception-based V1 manifest models require a minimum of 45672 bytes
171
180
  v2_manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE] = 45672
172
-
173
181
  # Original Inception-based V1 manifest models use a 20 ms feature step size
174
182
  v2_manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE] = 20
183
+ # Original Inception-based V1 manifest models were trained only on TTS English samples
184
+ v2_manifest[KEY_TRAINED_LANGUAGES] = ["en"]
175
185
 
176
186
  return v2_manifest
177
187
 
@@ -296,14 +306,16 @@ MODEL_SOURCE_SCHEMA = cv.Any(
296
306
 
297
307
  MODEL_SCHEMA = cv.Schema(
298
308
  {
309
+ cv.GenerateID(CONF_ID): cv.declare_id(WakeWordModel),
299
310
  cv.Optional(CONF_MODEL): MODEL_SOURCE_SCHEMA,
300
311
  cv.Optional(CONF_PROBABILITY_CUTOFF): cv.percentage,
301
312
  cv.Optional(CONF_SLIDING_WINDOW_SIZE): cv.positive_int,
313
+ cv.Optional(CONF_INTERNAL, default=False): cv.boolean,
302
314
  cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_id(cg.uint8),
303
315
  }
304
316
  )
305
317
 
306
- # Provide a default VAD model that could be overridden
318
+ # Provides a default VAD model that could be overridden
307
319
  VAD_MODEL_SCHEMA = MODEL_SCHEMA.extend(
308
320
  cv.Schema(
309
321
  {
@@ -328,7 +340,14 @@ CONFIG_SCHEMA = cv.All(
328
340
  cv.Schema(
329
341
  {
330
342
  cv.GenerateID(): cv.declare_id(MicroWakeWord),
331
- cv.GenerateID(CONF_MICROPHONE): cv.use_id(microphone.Microphone),
343
+ cv.Optional(
344
+ CONF_MICROPHONE, default={}
345
+ ): microphone.microphone_source_schema(
346
+ min_bits_per_sample=16,
347
+ max_bits_per_sample=16,
348
+ min_channels=1,
349
+ max_channels=1,
350
+ ),
332
351
  cv.Required(CONF_MODELS): cv.ensure_list(
333
352
  cv.maybe_simple_value(MODEL_SCHEMA, key=CONF_MODEL)
334
353
  ),
@@ -336,6 +355,7 @@ CONFIG_SCHEMA = cv.All(
336
355
  single=True
337
356
  ),
338
357
  cv.Optional(CONF_VAD): _maybe_empty_vad_schema,
358
+ cv.Optional(CONF_STOP_AFTER_DETECTION, default=True): cv.boolean,
339
359
  cv.Optional(CONF_MODEL): cv.invalid(
340
360
  f"The {CONF_MODEL} parameter has moved to be a list element under the {CONF_MODELS} parameter."
341
361
  ),
@@ -404,39 +424,42 @@ def _feature_step_size_validate(config):
404
424
  raise cv.Invalid("Cannot load models with different features step sizes.")
405
425
 
406
426
 
407
- FINAL_VALIDATE_SCHEMA = _feature_step_size_validate
427
+ FINAL_VALIDATE_SCHEMA = cv.All(
428
+ cv.Schema(
429
+ {
430
+ cv.Required(
431
+ CONF_MICROPHONE
432
+ ): microphone.final_validate_microphone_source_schema(
433
+ "micro_wake_word", sample_rate=16000
434
+ ),
435
+ },
436
+ extra=cv.ALLOW_EXTRA,
437
+ ),
438
+ _feature_step_size_validate,
439
+ )
408
440
 
409
441
 
410
442
  async def to_code(config):
411
443
  var = cg.new_Pvariable(config[CONF_ID])
412
444
  await cg.register_component(var, config)
413
445
 
414
- mic = await cg.get_variable(config[CONF_MICROPHONE])
415
- cg.add(var.set_microphone(mic))
446
+ mic_source = await microphone.microphone_source_to_code(config[CONF_MICROPHONE])
447
+ cg.add(var.set_microphone_source(mic_source))
448
+
449
+ cg.add_define("USE_MICRO_WAKE_WORD")
450
+ cg.add_define("USE_OTA_STATE_CALLBACK")
416
451
 
417
452
  esp32.add_idf_component(
418
453
  name="esp-tflite-micro",
419
454
  repo="https://github.com/espressif/esp-tflite-micro",
420
- ref="v1.3.1",
421
- )
422
- # add esp-nn dependency for tflite-micro to work around https://github.com/espressif/esp-nn/issues/17
423
- # ...remove after switching to IDF 5.1.4+
424
- esp32.add_idf_component(
425
- name="esp-nn",
426
- repo="https://github.com/espressif/esp-nn",
427
- ref="v1.1.0",
455
+ ref="v1.3.3.1",
428
456
  )
429
457
 
430
458
  cg.add_build_flag("-DTF_LITE_STATIC_MEMORY")
431
459
  cg.add_build_flag("-DTF_LITE_DISABLE_X86_NEON")
432
460
  cg.add_build_flag("-DESP_NN")
433
461
 
434
- if on_wake_word_detection_config := config.get(CONF_ON_WAKE_WORD_DETECTED):
435
- await automation.build_automation(
436
- var.get_wake_word_detected_trigger(),
437
- [(cg.std_string, "wake_word")],
438
- on_wake_word_detection_config,
439
- )
462
+ cg.add_library("kahrendt/ESPMicroSpeechFeatures", "1.1.0")
440
463
 
441
464
  if vad_model := config.get(CONF_VAD):
442
465
  cg.add_define("USE_MICRO_WAKE_WORD_VAD")
@@ -444,7 +467,7 @@ async def to_code(config):
444
467
  # Use the general model loading code for the VAD codegen
445
468
  config[CONF_MODELS].append(vad_model)
446
469
 
447
- for model_parameters in config[CONF_MODELS]:
470
+ for i, model_parameters in enumerate(config[CONF_MODELS]):
448
471
  model_config = model_parameters.get(CONF_MODEL)
449
472
  data = []
450
473
  manifest, data = _model_config_to_manifest_data(model_config)
@@ -455,6 +478,8 @@ async def to_code(config):
455
478
  probability_cutoff = model_parameters.get(
456
479
  CONF_PROBABILITY_CUTOFF, manifest[KEY_MICRO][CONF_PROBABILITY_CUTOFF]
457
480
  )
481
+ quantized_probability_cutoff = int(probability_cutoff * 255)
482
+
458
483
  sliding_window_size = model_parameters.get(
459
484
  CONF_SLIDING_WINDOW_SIZE,
460
485
  manifest[KEY_MICRO][CONF_SLIDING_WINDOW_SIZE],
@@ -464,24 +489,40 @@ async def to_code(config):
464
489
  cg.add(
465
490
  var.add_vad_model(
466
491
  prog_arr,
467
- probability_cutoff,
492
+ quantized_probability_cutoff,
468
493
  sliding_window_size,
469
494
  manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
470
495
  )
471
496
  )
472
497
  else:
473
- cg.add(
474
- var.add_wake_word_model(
475
- prog_arr,
476
- probability_cutoff,
477
- sliding_window_size,
478
- manifest[KEY_WAKE_WORD],
479
- manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
480
- )
498
+ # Only enable the first wake word by default. After first boot, the enable state is saved/loaded to the flash
499
+ default_enabled = i == 0
500
+ wake_word_model = cg.new_Pvariable(
501
+ model_parameters[CONF_ID],
502
+ str(model_parameters[CONF_ID]),
503
+ prog_arr,
504
+ quantized_probability_cutoff,
505
+ sliding_window_size,
506
+ manifest[KEY_WAKE_WORD],
507
+ manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
508
+ default_enabled,
509
+ model_parameters[CONF_INTERNAL],
481
510
  )
482
511
 
512
+ for lang in manifest[KEY_TRAINED_LANGUAGES]:
513
+ cg.add(wake_word_model.add_trained_language(lang))
514
+
515
+ cg.add(var.add_wake_word_model(wake_word_model))
516
+
483
517
  cg.add(var.set_features_step_size(manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE]))
484
- cg.add_library("kahrendt/ESPMicroSpeechFeatures", "1.1.0")
518
+ cg.add(var.set_stop_after_detection(config[CONF_STOP_AFTER_DETECTION]))
519
+
520
+ if on_wake_word_detection_config := config.get(CONF_ON_WAKE_WORD_DETECTED):
521
+ await automation.build_automation(
522
+ var.get_wake_word_detected_trigger(),
523
+ [(cg.std_string, "wake_word")],
524
+ on_wake_word_detection_config,
525
+ )
485
526
 
486
527
 
487
528
  MICRO_WAKE_WORD_ACTION_SCHEMA = cv.Schema({cv.GenerateID(): cv.use_id(MicroWakeWord)})
@@ -496,3 +537,30 @@ async def micro_wake_word_action_to_code(config, action_id, template_arg, args):
496
537
  var = cg.new_Pvariable(action_id, template_arg)
497
538
  await cg.register_parented(var, config[CONF_ID])
498
539
  return var
540
+
541
+
542
+ MICRO_WAKE_WORLD_MODEL_ACTION_SCHEMA = automation.maybe_simple_id(
543
+ {
544
+ cv.Required(CONF_ID): cv.use_id(WakeWordModel),
545
+ }
546
+ )
547
+
548
+
549
+ @register_action(
550
+ "micro_wake_word.enable_model",
551
+ EnableModelAction,
552
+ MICRO_WAKE_WORLD_MODEL_ACTION_SCHEMA,
553
+ )
554
+ @register_action(
555
+ "micro_wake_word.disable_model",
556
+ DisableModelAction,
557
+ MICRO_WAKE_WORLD_MODEL_ACTION_SCHEMA,
558
+ )
559
+ @register_condition(
560
+ "micro_wake_word.model_is_enabled",
561
+ ModelIsEnabledCondition,
562
+ MICRO_WAKE_WORLD_MODEL_ACTION_SCHEMA,
563
+ )
564
+ async def model_action(config, action_id, template_arg, args):
565
+ parent = await cg.get_variable(config[CONF_ID])
566
+ return cg.new_Pvariable(action_id, template_arg, parent)
@@ -0,0 +1,54 @@
1
+ #pragma once
2
+
3
+ #include "micro_wake_word.h"
4
+ #include "streaming_model.h"
5
+
6
+ #ifdef USE_ESP_IDF
7
+ namespace esphome {
8
+ namespace micro_wake_word {
9
+
10
+ template<typename... Ts> class StartAction : public Action<Ts...>, public Parented<MicroWakeWord> {
11
+ public:
12
+ void play(Ts... x) override { this->parent_->start(); }
13
+ };
14
+
15
+ template<typename... Ts> class StopAction : public Action<Ts...>, public Parented<MicroWakeWord> {
16
+ public:
17
+ void play(Ts... x) override { this->parent_->stop(); }
18
+ };
19
+
20
+ template<typename... Ts> class IsRunningCondition : public Condition<Ts...>, public Parented<MicroWakeWord> {
21
+ public:
22
+ bool check(Ts... x) override { return this->parent_->is_running(); }
23
+ };
24
+
25
+ template<typename... Ts> class EnableModelAction : public Action<Ts...> {
26
+ public:
27
+ explicit EnableModelAction(WakeWordModel *wake_word_model) : wake_word_model_(wake_word_model) {}
28
+ void play(Ts... x) override { this->wake_word_model_->enable(); }
29
+
30
+ protected:
31
+ WakeWordModel *wake_word_model_;
32
+ };
33
+
34
+ template<typename... Ts> class DisableModelAction : public Action<Ts...> {
35
+ public:
36
+ explicit DisableModelAction(WakeWordModel *wake_word_model) : wake_word_model_(wake_word_model) {}
37
+ void play(Ts... x) override { this->wake_word_model_->disable(); }
38
+
39
+ protected:
40
+ WakeWordModel *wake_word_model_;
41
+ };
42
+
43
+ template<typename... Ts> class ModelIsEnabledCondition : public Condition<Ts...> {
44
+ public:
45
+ explicit ModelIsEnabledCondition(WakeWordModel *wake_word_model) : wake_word_model_(wake_word_model) {}
46
+ bool check(Ts... x) override { return this->wake_word_model_->is_enabled(); }
47
+
48
+ protected:
49
+ WakeWordModel *wake_word_model_;
50
+ };
51
+
52
+ } // namespace micro_wake_word
53
+ } // namespace esphome
54
+ #endif