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
@@ -4,7 +4,6 @@ import esphome.codegen as cg
4
4
  from esphome.components import number, switch
5
5
  import esphome.config_validation as cv
6
6
  from esphome.const import (
7
- CONF_ENTITY_CATEGORY,
8
7
  CONF_ID,
9
8
  CONF_INITIAL_VALUE,
10
9
  CONF_MAX_VALUE,
@@ -296,12 +295,11 @@ SPRINKLER_VALVE_SCHEMA = cv.Schema(
296
295
  cv.Optional(CONF_PUMP_SWITCH_ID): cv.use_id(switch.Switch),
297
296
  cv.Optional(CONF_RUN_DURATION): cv.positive_time_period_seconds,
298
297
  cv.Optional(CONF_RUN_DURATION_NUMBER): cv.maybe_simple_value(
299
- number.NUMBER_SCHEMA.extend(
298
+ number.number_schema(
299
+ SprinklerControllerNumber, entity_category=ENTITY_CATEGORY_CONFIG
300
+ )
301
+ .extend(
300
302
  {
301
- cv.GenerateID(): cv.declare_id(SprinklerControllerNumber),
302
- cv.Optional(
303
- CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG
304
- ): cv.entity_category,
305
303
  cv.Optional(CONF_INITIAL_VALUE, default=900): cv.positive_int,
306
304
  cv.Optional(CONF_MAX_VALUE, default=86400): cv.positive_int,
307
305
  cv.Optional(CONF_MIN_VALUE, default=1): cv.positive_int,
@@ -314,7 +312,8 @@ SPRINKLER_VALVE_SCHEMA = cv.Schema(
314
312
  CONF_UNIT_OF_MEASUREMENT, default=UNIT_SECOND
315
313
  ): cv.one_of(UNIT_MINUTE, UNIT_SECOND, lower="True"),
316
314
  }
317
- ).extend(cv.COMPONENT_SCHEMA),
315
+ )
316
+ .extend(cv.COMPONENT_SCHEMA),
318
317
  validate_min_max,
319
318
  key=CONF_NAME,
320
319
  ),
@@ -371,12 +370,11 @@ SPRINKLER_CONTROLLER_SCHEMA = cv.Schema(
371
370
  cv.Optional(CONF_NEXT_PREV_IGNORE_DISABLED, default=False): cv.boolean,
372
371
  cv.Optional(CONF_MANUAL_SELECTION_DELAY): cv.positive_time_period_seconds,
373
372
  cv.Optional(CONF_MULTIPLIER_NUMBER): cv.maybe_simple_value(
374
- number.NUMBER_SCHEMA.extend(
373
+ number.number_schema(
374
+ SprinklerControllerNumber, entity_category=ENTITY_CATEGORY_CONFIG
375
+ )
376
+ .extend(
375
377
  {
376
- cv.GenerateID(): cv.declare_id(SprinklerControllerNumber),
377
- cv.Optional(
378
- CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG
379
- ): cv.entity_category,
380
378
  cv.Optional(CONF_INITIAL_VALUE, default=1): cv.positive_float,
381
379
  cv.Optional(CONF_MAX_VALUE, default=10): cv.positive_float,
382
380
  cv.Optional(CONF_MIN_VALUE, default=0): cv.positive_float,
@@ -386,18 +384,18 @@ SPRINKLER_CONTROLLER_SCHEMA = cv.Schema(
386
384
  single=True
387
385
  ),
388
386
  }
389
- ).extend(cv.COMPONENT_SCHEMA),
387
+ )
388
+ .extend(cv.COMPONENT_SCHEMA),
390
389
  validate_min_max,
391
390
  key=CONF_NAME,
392
391
  ),
393
392
  cv.Optional(CONF_REPEAT): cv.positive_int,
394
393
  cv.Optional(CONF_REPEAT_NUMBER): cv.maybe_simple_value(
395
- number.NUMBER_SCHEMA.extend(
394
+ number.number_schema(
395
+ SprinklerControllerNumber, entity_category=ENTITY_CATEGORY_CONFIG
396
+ )
397
+ .extend(
396
398
  {
397
- cv.GenerateID(): cv.declare_id(SprinklerControllerNumber),
398
- cv.Optional(
399
- CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG
400
- ): cv.entity_category,
401
399
  cv.Optional(CONF_INITIAL_VALUE, default=0): cv.positive_int,
402
400
  cv.Optional(CONF_MAX_VALUE, default=10): cv.positive_int,
403
401
  cv.Optional(CONF_MIN_VALUE, default=0): cv.positive_int,
@@ -407,7 +405,8 @@ SPRINKLER_CONTROLLER_SCHEMA = cv.Schema(
407
405
  single=True
408
406
  ),
409
407
  }
410
- ).extend(cv.COMPONENT_SCHEMA),
408
+ )
409
+ .extend(cv.COMPONENT_SCHEMA),
411
410
  validate_min_max,
412
411
  key=CONF_NAME,
413
412
  ),
@@ -20,7 +20,7 @@ SprinklerSwitch::SprinklerSwitch(switch_::Switch *off_switch, switch_::Switch *o
20
20
  bool SprinklerSwitch::is_latching_valve() { return (this->off_switch_ != nullptr) && (this->on_switch_ != nullptr); }
21
21
 
22
22
  void SprinklerSwitch::loop() {
23
- if ((this->pinned_millis_) && (millis() > this->pinned_millis_ + this->pulse_duration_)) {
23
+ if ((this->pinned_millis_) && (App.get_loop_component_start_time() > this->pinned_millis_ + this->pulse_duration_)) {
24
24
  this->pinned_millis_ = 0; // reset tracker
25
25
  if (this->off_switch_->state) {
26
26
  this->off_switch_->turn_off();
@@ -148,22 +148,23 @@ SprinklerValveOperator::SprinklerValveOperator(SprinklerValve *valve, Sprinkler
148
148
  : controller_(controller), valve_(valve) {}
149
149
 
150
150
  void SprinklerValveOperator::loop() {
151
- if (millis() >= this->start_millis_) { // dummy check
151
+ uint32_t now = App.get_loop_component_start_time();
152
+ if (now >= this->start_millis_) { // dummy check
152
153
  switch (this->state_) {
153
154
  case STARTING:
154
- if (millis() > (this->start_millis_ + this->start_delay_)) {
155
+ if (now > (this->start_millis_ + this->start_delay_)) {
155
156
  this->run_(); // start_delay_ has been exceeded, so ensure both valves are on and update the state
156
157
  }
157
158
  break;
158
159
 
159
160
  case ACTIVE:
160
- if (millis() > (this->start_millis_ + this->start_delay_ + this->run_duration_)) {
161
+ if (now > (this->start_millis_ + this->start_delay_ + this->run_duration_)) {
161
162
  this->stop(); // start_delay_ + run_duration_ has been exceeded, start shutting down
162
163
  }
163
164
  break;
164
165
 
165
166
  case STOPPING:
166
- if (millis() > (this->stop_millis_ + this->stop_delay_)) {
167
+ if (now > (this->stop_millis_ + this->stop_delay_)) {
167
168
  this->kill_(); // stop_delay_has been exceeded, ensure all valves are off
168
169
  }
169
170
  break;
@@ -72,6 +72,9 @@ _SWITCH_SCHEMA = (
72
72
  {
73
73
  cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTSwitchComponent),
74
74
  cv.Optional(CONF_INVERTED): cv.boolean,
75
+ cv.Optional(CONF_RESTORE_MODE, default="ALWAYS_OFF"): cv.enum(
76
+ RESTORE_MODES, upper=True, space="_"
77
+ ),
75
78
  cv.Optional(CONF_ON_TURN_ON): automation.validate_automation(
76
79
  {
77
80
  cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(SwitchTurnOnTrigger),
@@ -87,57 +90,44 @@ _SWITCH_SCHEMA = (
87
90
  )
88
91
  )
89
92
 
90
- _UNDEF = object()
91
-
92
93
 
93
94
  def switch_schema(
94
- class_: MockObjClass = _UNDEF,
95
+ class_: MockObjClass,
95
96
  *,
96
- entity_category: str = _UNDEF,
97
- device_class: str = _UNDEF,
98
- icon: str = _UNDEF,
99
97
  block_inverted: bool = False,
100
- default_restore_mode: str = "ALWAYS_OFF",
98
+ default_restore_mode: str = cv.UNDEFINED,
99
+ device_class: str = cv.UNDEFINED,
100
+ entity_category: str = cv.UNDEFINED,
101
+ icon: str = cv.UNDEFINED,
101
102
  ):
102
- schema = _SWITCH_SCHEMA.extend(
103
- {
104
- cv.Optional(CONF_RESTORE_MODE, default=default_restore_mode): cv.enum(
105
- RESTORE_MODES, upper=True, space="_"
106
- ),
107
- }
108
- )
109
- if class_ is not _UNDEF:
110
- schema = schema.extend({cv.GenerateID(): cv.declare_id(class_)})
111
- if entity_category is not _UNDEF:
112
- schema = schema.extend(
113
- {
114
- cv.Optional(
115
- CONF_ENTITY_CATEGORY, default=entity_category
116
- ): cv.entity_category
117
- }
118
- )
119
- if device_class is not _UNDEF:
120
- schema = schema.extend(
121
- {
122
- cv.Optional(
123
- CONF_DEVICE_CLASS, default=device_class
124
- ): validate_device_class
125
- }
126
- )
127
- if icon is not _UNDEF:
128
- schema = schema.extend({cv.Optional(CONF_ICON, default=icon): cv.icon})
103
+ schema = {cv.GenerateID(): cv.declare_id(class_)}
104
+
105
+ for key, default, validator in [
106
+ (CONF_DEVICE_CLASS, device_class, validate_device_class),
107
+ (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
108
+ (CONF_ICON, icon, cv.icon),
109
+ (
110
+ CONF_RESTORE_MODE,
111
+ default_restore_mode,
112
+ cv.enum(RESTORE_MODES, upper=True, space="_")
113
+ if default_restore_mode is not cv.UNDEFINED
114
+ else cv.UNDEFINED,
115
+ ),
116
+ ]:
117
+ if default is not cv.UNDEFINED:
118
+ schema[cv.Optional(key, default=default)] = validator
119
+
129
120
  if block_inverted:
130
- schema = schema.extend(
131
- {
132
- cv.Optional(CONF_INVERTED): cv.invalid(
133
- "Inverted is not supported for this platform!"
134
- )
135
- }
121
+ schema[cv.Optional(CONF_INVERTED)] = cv.invalid(
122
+ "Inverted is not supported for this platform!"
136
123
  )
137
- return schema
124
+
125
+ return _SWITCH_SCHEMA.extend(schema)
138
126
 
139
127
 
140
- SWITCH_SCHEMA = switch_schema() # for compatibility
128
+ # Remove before 2025.11.0
129
+ SWITCH_SCHEMA = switch_schema(Switch)
130
+ SWITCH_SCHEMA.add_extra(cv.deprecated_schema_constant("switch"))
141
131
 
142
132
 
143
133
  async def setup_switch_core_(var, config):
@@ -0,0 +1,41 @@
1
+ import esphome.codegen as cg
2
+ from esphome.components import udp
3
+ from esphome.components.logger import LOG_LEVELS, is_log_level
4
+ from esphome.components.time import RealTimeClock
5
+ from esphome.components.udp import CONF_UDP_ID
6
+ import esphome.config_validation as cv
7
+ from esphome.const import CONF_ID, CONF_LEVEL, CONF_PORT, CONF_TIME_ID
8
+ from esphome.cpp_types import Component, Parented
9
+
10
+ CODEOWNERS = ["@clydebarrow"]
11
+
12
+ DEPENDENCIES = ["udp", "logger", "time"]
13
+
14
+ syslog_ns = cg.esphome_ns.namespace("syslog")
15
+ Syslog = syslog_ns.class_("Syslog", Component, Parented.template(udp.UDPComponent))
16
+
17
+ CONF_STRIP = "strip"
18
+ CONF_FACILITY = "facility"
19
+ CONFIG_SCHEMA = udp.UDP_SCHEMA.extend(
20
+ {
21
+ cv.GenerateID(): cv.declare_id(Syslog),
22
+ cv.GenerateID(CONF_TIME_ID): cv.use_id(RealTimeClock),
23
+ cv.Optional(CONF_PORT, default=514): cv.port,
24
+ cv.Optional(CONF_LEVEL, default="DEBUG"): is_log_level,
25
+ cv.Optional(CONF_STRIP, default=True): cv.boolean,
26
+ cv.Optional(CONF_FACILITY, default=16): cv.int_range(0, 23),
27
+ }
28
+ )
29
+
30
+
31
+ async def to_code(config):
32
+ parent = await cg.get_variable(config[CONF_UDP_ID])
33
+ time = await cg.get_variable(config[CONF_TIME_ID])
34
+ cg.add(parent.set_broadcast_port(config[CONF_PORT]))
35
+ cg.add(parent.set_should_broadcast())
36
+ level = LOG_LEVELS[config[CONF_LEVEL]]
37
+ var = cg.new_Pvariable(config[CONF_ID], level, time)
38
+ await cg.register_component(var, config)
39
+ await cg.register_parented(var, parent)
40
+ cg.add(var.set_strip(config[CONF_STRIP]))
41
+ cg.add(var.set_facility(config[CONF_FACILITY]))
@@ -0,0 +1,49 @@
1
+ #include "esphome_syslog.h"
2
+
3
+ #include "esphome/components/logger/logger.h"
4
+ #include "esphome/core/application.h"
5
+ #include "esphome/core/time.h"
6
+
7
+ namespace esphome {
8
+ namespace syslog {
9
+
10
+ // Map log levels to syslog severity using an array, indexed by ESPHome log level (1-7)
11
+ constexpr int LOG_LEVEL_TO_SYSLOG_SEVERITY[] = {
12
+ 3, // NONE
13
+ 3, // ERROR
14
+ 4, // WARN
15
+ 5, // INFO
16
+ 6, // CONFIG
17
+ 7, // DEBUG
18
+ 7, // VERBOSE
19
+ 7 // VERY_VERBOSE
20
+ };
21
+
22
+ void Syslog::setup() {
23
+ logger::global_logger->add_on_log_callback(
24
+ [this](int level, const char *tag, const char *message) { this->log_(level, tag, message); });
25
+ }
26
+
27
+ void Syslog::log_(const int level, const char *tag, const char *message) const {
28
+ if (level > this->log_level_)
29
+ return;
30
+ // Syslog PRI calculation: facility * 8 + severity
31
+ int severity = 7;
32
+ if ((unsigned) level <= 7) {
33
+ severity = LOG_LEVEL_TO_SYSLOG_SEVERITY[level];
34
+ }
35
+ int pri = this->facility_ * 8 + severity;
36
+ auto timestamp = this->time_->now().strftime("%b %d %H:%M:%S");
37
+ unsigned len = strlen(message);
38
+ // remove color formatting
39
+ if (this->strip_ && message[0] == 0x1B && len > 11) {
40
+ message += 7;
41
+ len -= 11;
42
+ }
43
+
44
+ auto data = str_sprintf("<%d>%s %s %s: %.*s", pri, timestamp.c_str(), App.get_name().c_str(), tag, len, message);
45
+ this->parent_->send_packet((const uint8_t *) data.data(), data.size());
46
+ }
47
+
48
+ } // namespace syslog
49
+ } // namespace esphome
@@ -0,0 +1,27 @@
1
+ #pragma once
2
+ #include "esphome/core/component.h"
3
+ #include "esphome/core/helpers.h"
4
+ #include "esphome/core/log.h"
5
+ #include "esphome/components/udp/udp_component.h"
6
+ #include "esphome/components/time/real_time_clock.h"
7
+
8
+ #ifdef USE_NETWORK
9
+ namespace esphome {
10
+ namespace syslog {
11
+ class Syslog : public Component, public Parented<udp::UDPComponent> {
12
+ public:
13
+ Syslog(int level, time::RealTimeClock *time) : log_level_(level), time_(time) {}
14
+ void setup() override;
15
+ void set_strip(bool strip) { this->strip_ = strip; }
16
+ void set_facility(int facility) { this->facility_ = facility; }
17
+
18
+ protected:
19
+ int log_level_;
20
+ void log_(int level, const char *tag, const char *message) const;
21
+ time::RealTimeClock *time_;
22
+ bool strip_{true};
23
+ int facility_{16};
24
+ };
25
+ } // namespace syslog
26
+ } // namespace esphome
27
+ #endif
@@ -19,7 +19,7 @@ CONFIG_SCHEMA = (
19
19
  cv.Schema(
20
20
  {
21
21
  cv.GenerateID(): cv.declare_id(T6615Component),
22
- cv.Required(CONF_CO2): sensor.sensor_schema(
22
+ cv.Optional(CONF_CO2): sensor.sensor_schema(
23
23
  unit_of_measurement=UNIT_PARTS_PER_MILLION,
24
24
  accuracy_decimals=0,
25
25
  device_class=DEVICE_CLASS_CARBON_DIOXIDE,
@@ -41,6 +41,6 @@ async def to_code(config):
41
41
  await cg.register_component(var, config)
42
42
  await uart.register_uart_device(var, config)
43
43
 
44
- if CONF_CO2 in config:
45
- sens = await sensor.new_sensor(config[CONF_CO2])
44
+ if co2 := config.get(CONF_CO2):
45
+ sens = await sensor.new_sensor(co2)
46
46
  cg.add(var.set_co2_sensor(sens))
@@ -63,7 +63,8 @@ void T6615Component::loop() {
63
63
  case T6615Command::GET_PPM: {
64
64
  const uint16_t ppm = encode_uint16(response_buffer[3], response_buffer[4]);
65
65
  ESP_LOGD(TAG, "T6615 Received CO₂=%uppm", ppm);
66
- this->co2_sensor_->publish_state(ppm);
66
+ if (this->co2_sensor_ != nullptr)
67
+ this->co2_sensor_->publish_state(ppm);
67
68
  break;
68
69
  }
69
70
  default:
@@ -76,15 +76,20 @@ bool TCA9555Component::read_gpio_modes_() {
76
76
  bool TCA9555Component::digital_read_hw(uint8_t pin) {
77
77
  if (this->is_failed())
78
78
  return false;
79
- bool success;
80
- uint8_t data[2];
81
- success = this->read_bytes(TCA9555_INPUT_PORT_REGISTER_0, data, 2);
82
- this->input_mask_ = (uint16_t(data[1]) << 8) | (uint16_t(data[0]) << 0);
83
-
84
- if (!success) {
79
+ uint8_t data;
80
+ uint8_t bank_number = pin < 8 ? 0 : 1;
81
+ uint8_t register_to_read = bank_number ? TCA9555_INPUT_PORT_REGISTER_1 : TCA9555_INPUT_PORT_REGISTER_0;
82
+ if (!this->read_bytes(register_to_read, &data, 1)) {
85
83
  this->status_set_warning("Failed to read input register");
86
84
  return false;
87
85
  }
86
+ uint8_t second_half = this->input_mask_ >> 8;
87
+ uint8_t first_half = this->input_mask_;
88
+ if (bank_number) {
89
+ this->input_mask_ = (data << 8) | (uint16_t(first_half) << 0);
90
+ } else {
91
+ this->input_mask_ = (uint16_t(second_half) << 8) | (data << 0);
92
+ }
88
93
 
89
94
  this->status_clear_warning();
90
95
  return true;
@@ -1,7 +1,5 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import climate_ir
3
- import esphome.config_validation as cv
4
- from esphome.const import CONF_ID
5
3
 
6
4
  AUTO_LOAD = ["climate_ir"]
7
5
  CODEOWNERS = ["@glmnet"]
@@ -9,13 +7,8 @@ CODEOWNERS = ["@glmnet"]
9
7
  tcl112_ns = cg.esphome_ns.namespace("tcl112")
10
8
  Tcl112Climate = tcl112_ns.class_("Tcl112Climate", climate_ir.ClimateIR)
11
9
 
12
- CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
13
- {
14
- cv.GenerateID(): cv.declare_id(Tcl112Climate),
15
- }
16
- )
10
+ CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(Tcl112Climate)
17
11
 
18
12
 
19
13
  async def to_code(config):
20
- var = cg.new_Pvariable(config[CONF_ID])
21
- await climate_ir.register_climate_ir(var, config)
14
+ await climate_ir.new_climate_ir(config)
@@ -1,7 +1,7 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import alarm_control_panel, binary_sensor
3
3
  import esphome.config_validation as cv
4
- from esphome.const import CONF_BINARY_SENSORS, CONF_ID, CONF_INPUT, CONF_RESTORE_MODE
4
+ from esphome.const import CONF_BINARY_SENSORS, CONF_INPUT, CONF_RESTORE_MODE
5
5
 
6
6
  from .. import template_ns
7
7
 
@@ -51,6 +51,7 @@ ALARM_SENSOR_TYPES = {
51
51
  "DELAYED": AlarmSensorType.ALARM_SENSOR_TYPE_DELAYED,
52
52
  "INSTANT": AlarmSensorType.ALARM_SENSOR_TYPE_INSTANT,
53
53
  "DELAYED_FOLLOWER": AlarmSensorType.ALARM_SENSOR_TYPE_DELAYED_FOLLOWER,
54
+ "INSTANT_ALWAYS": AlarmSensorType.ALARM_SENSOR_TYPE_INSTANT_ALWAYS,
54
55
  }
55
56
 
56
57
 
@@ -76,9 +77,9 @@ TEMPLATE_ALARM_CONTROL_PANEL_BINARY_SENSOR_SCHEMA = cv.maybe_simple_value(
76
77
  )
77
78
 
78
79
  TEMPLATE_ALARM_CONTROL_PANEL_SCHEMA = (
79
- alarm_control_panel.ALARM_CONTROL_PANEL_SCHEMA.extend(
80
+ alarm_control_panel.alarm_control_panel_schema(TemplateAlarmControlPanel)
81
+ .extend(
80
82
  {
81
- cv.GenerateID(): cv.declare_id(TemplateAlarmControlPanel),
82
83
  cv.Optional(CONF_CODES): cv.ensure_list(cv.string_strict),
83
84
  cv.Optional(CONF_REQUIRES_CODE_TO_ARM): cv.boolean,
84
85
  cv.Optional(CONF_ARMING_HOME_TIME): cv.positive_time_period_milliseconds,
@@ -99,7 +100,8 @@ TEMPLATE_ALARM_CONTROL_PANEL_SCHEMA = (
99
100
  RESTORE_MODES, upper=True
100
101
  ),
101
102
  }
102
- ).extend(cv.COMPONENT_SCHEMA)
103
+ )
104
+ .extend(cv.COMPONENT_SCHEMA)
103
105
  )
104
106
 
105
107
  CONFIG_SCHEMA = cv.All(
@@ -109,9 +111,8 @@ CONFIG_SCHEMA = cv.All(
109
111
 
110
112
 
111
113
  async def to_code(config):
112
- var = cg.new_Pvariable(config[CONF_ID])
114
+ var = await alarm_control_panel.new_alarm_control_panel(config)
113
115
  await cg.register_component(var, config)
114
- await alarm_control_panel.register_alarm_control_panel(var, config)
115
116
  if CONF_CODES in config:
116
117
  for acode in config[CONF_CODES]:
117
118
  cg.add(var.add_code(acode))
@@ -58,6 +58,9 @@ void TemplateAlarmControlPanel::dump_config() {
58
58
  case ALARM_SENSOR_TYPE_DELAYED_FOLLOWER:
59
59
  sensor_type = "delayed_follower";
60
60
  break;
61
+ case ALARM_SENSOR_TYPE_INSTANT_ALWAYS:
62
+ sensor_type = "instant_always";
63
+ break;
61
64
  case ALARM_SENSOR_TYPE_DELAYED:
62
65
  default:
63
66
  sensor_type = "delayed";
@@ -145,24 +148,25 @@ void TemplateAlarmControlPanel::loop() {
145
148
  continue;
146
149
  }
147
150
 
148
- // If sensor type is of type instant
149
- if (sensor_info.second.type == ALARM_SENSOR_TYPE_INSTANT) {
150
- instant_sensor_not_ready = true;
151
- break;
152
- }
153
- // If sensor type is of type interior follower
154
- if (sensor_info.second.type == ALARM_SENSOR_TYPE_DELAYED_FOLLOWER) {
155
- // Look to see if we are in the pending state
156
- if (this->current_state_ == ACP_STATE_PENDING) {
157
- delayed_sensor_not_ready = true;
158
- } else {
151
+ switch (sensor_info.second.type) {
152
+ case ALARM_SENSOR_TYPE_INSTANT:
159
153
  instant_sensor_not_ready = true;
160
- }
161
- }
162
- // If sensor type is of type delayed
163
- if (sensor_info.second.type == ALARM_SENSOR_TYPE_DELAYED) {
164
- delayed_sensor_not_ready = true;
165
- break;
154
+ break;
155
+ case ALARM_SENSOR_TYPE_INSTANT_ALWAYS:
156
+ instant_sensor_not_ready = true;
157
+ future_state = ACP_STATE_TRIGGERED;
158
+ break;
159
+ case ALARM_SENSOR_TYPE_DELAYED_FOLLOWER:
160
+ // Look to see if we are in the pending state
161
+ if (this->current_state_ == ACP_STATE_PENDING) {
162
+ delayed_sensor_not_ready = true;
163
+ } else {
164
+ instant_sensor_not_ready = true;
165
+ }
166
+ break;
167
+ case ALARM_SENSOR_TYPE_DELAYED:
168
+ default:
169
+ delayed_sensor_not_ready = true;
166
170
  }
167
171
  }
168
172
  }
@@ -27,7 +27,8 @@ enum BinarySensorFlags : uint16_t {
27
27
  enum AlarmSensorType : uint16_t {
28
28
  ALARM_SENSOR_TYPE_DELAYED = 0,
29
29
  ALARM_SENSOR_TYPE_INSTANT,
30
- ALARM_SENSOR_TYPE_DELAYED_FOLLOWER
30
+ ALARM_SENSOR_TYPE_DELAYED_FOLLOWER,
31
+ ALARM_SENSOR_TYPE_INSTANT_ALWAYS,
31
32
  };
32
33
 
33
34
  #endif
@@ -34,31 +34,37 @@ RESTORE_MODES = {
34
34
  CONF_HAS_POSITION = "has_position"
35
35
  CONF_TOGGLE_ACTION = "toggle_action"
36
36
 
37
- CONFIG_SCHEMA = cover.COVER_SCHEMA.extend(
38
- {
39
- cv.GenerateID(): cv.declare_id(TemplateCover),
40
- cv.Optional(CONF_LAMBDA): cv.returning_lambda,
41
- cv.Optional(CONF_OPTIMISTIC, default=False): cv.boolean,
42
- cv.Optional(CONF_ASSUMED_STATE, default=False): cv.boolean,
43
- cv.Optional(CONF_HAS_POSITION, default=False): cv.boolean,
44
- cv.Optional(CONF_OPEN_ACTION): automation.validate_automation(single=True),
45
- cv.Optional(CONF_CLOSE_ACTION): automation.validate_automation(single=True),
46
- cv.Optional(CONF_STOP_ACTION): automation.validate_automation(single=True),
47
- cv.Optional(CONF_TILT_ACTION): automation.validate_automation(single=True),
48
- cv.Optional(CONF_TILT_LAMBDA): cv.returning_lambda,
49
- cv.Optional(CONF_TOGGLE_ACTION): automation.validate_automation(single=True),
50
- cv.Optional(CONF_POSITION_ACTION): automation.validate_automation(single=True),
51
- cv.Optional(CONF_RESTORE_MODE, default="RESTORE"): cv.enum(
52
- RESTORE_MODES, upper=True
53
- ),
54
- }
55
- ).extend(cv.COMPONENT_SCHEMA)
37
+ CONFIG_SCHEMA = (
38
+ cover.cover_schema(TemplateCover)
39
+ .extend(
40
+ {
41
+ cv.Optional(CONF_LAMBDA): cv.returning_lambda,
42
+ cv.Optional(CONF_OPTIMISTIC, default=False): cv.boolean,
43
+ cv.Optional(CONF_ASSUMED_STATE, default=False): cv.boolean,
44
+ cv.Optional(CONF_HAS_POSITION, default=False): cv.boolean,
45
+ cv.Optional(CONF_OPEN_ACTION): automation.validate_automation(single=True),
46
+ cv.Optional(CONF_CLOSE_ACTION): automation.validate_automation(single=True),
47
+ cv.Optional(CONF_STOP_ACTION): automation.validate_automation(single=True),
48
+ cv.Optional(CONF_TILT_ACTION): automation.validate_automation(single=True),
49
+ cv.Optional(CONF_TILT_LAMBDA): cv.returning_lambda,
50
+ cv.Optional(CONF_TOGGLE_ACTION): automation.validate_automation(
51
+ single=True
52
+ ),
53
+ cv.Optional(CONF_POSITION_ACTION): automation.validate_automation(
54
+ single=True
55
+ ),
56
+ cv.Optional(CONF_RESTORE_MODE, default="RESTORE"): cv.enum(
57
+ RESTORE_MODES, upper=True
58
+ ),
59
+ }
60
+ )
61
+ .extend(cv.COMPONENT_SCHEMA)
62
+ )
56
63
 
57
64
 
58
65
  async def to_code(config):
59
- var = cg.new_Pvariable(config[CONF_ID])
66
+ var = await cover.new_cover(config)
60
67
  await cg.register_component(var, config)
61
- await cover.register_cover(var, config)
62
68
  if CONF_LAMBDA in config:
63
69
  template_ = await cg.process_lambda(
64
70
  config[CONF_LAMBDA], [], return_type=cg.optional.template(float)
@@ -2,7 +2,7 @@ import esphome.codegen as cg
2
2
  from esphome.components import fan
3
3
  from esphome.components.fan import validate_preset_modes
4
4
  import esphome.config_validation as cv
5
- from esphome.const import CONF_OUTPUT_ID, CONF_PRESET_MODES, CONF_SPEED_COUNT
5
+ from esphome.const import CONF_PRESET_MODES, CONF_SPEED_COUNT
6
6
 
7
7
  from .. import template_ns
8
8
 
@@ -13,21 +13,23 @@ TemplateFan = template_ns.class_("TemplateFan", cg.Component, fan.Fan)
13
13
  CONF_HAS_DIRECTION = "has_direction"
14
14
  CONF_HAS_OSCILLATING = "has_oscillating"
15
15
 
16
- CONFIG_SCHEMA = fan.FAN_SCHEMA.extend(
17
- {
18
- cv.GenerateID(CONF_OUTPUT_ID): cv.declare_id(TemplateFan),
19
- cv.Optional(CONF_HAS_DIRECTION, default=False): cv.boolean,
20
- cv.Optional(CONF_HAS_OSCILLATING, default=False): cv.boolean,
21
- cv.Optional(CONF_SPEED_COUNT): cv.int_range(min=1),
22
- cv.Optional(CONF_PRESET_MODES): validate_preset_modes,
23
- }
24
- ).extend(cv.COMPONENT_SCHEMA)
16
+ CONFIG_SCHEMA = (
17
+ fan.fan_schema(TemplateFan)
18
+ .extend(
19
+ {
20
+ cv.Optional(CONF_HAS_DIRECTION, default=False): cv.boolean,
21
+ cv.Optional(CONF_HAS_OSCILLATING, default=False): cv.boolean,
22
+ cv.Optional(CONF_SPEED_COUNT): cv.int_range(min=1),
23
+ cv.Optional(CONF_PRESET_MODES): validate_preset_modes,
24
+ }
25
+ )
26
+ .extend(cv.COMPONENT_SCHEMA)
27
+ )
25
28
 
26
29
 
27
30
  async def to_code(config):
28
- var = cg.new_Pvariable(config[CONF_OUTPUT_ID])
31
+ var = await fan.new_fan(config)
29
32
  await cg.register_component(var, config)
30
- await fan.register_fan(var, config)
31
33
 
32
34
  cg.add(var.set_has_direction(config[CONF_HAS_DIRECTION]))
33
35
  cg.add(var.set_has_oscillating(config[CONF_HAS_OSCILLATING]))