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
@@ -40,24 +40,24 @@ namespace climate {
40
40
  */
41
41
  class ClimateTraits {
42
42
  public:
43
- bool get_supports_current_temperature() const { return supports_current_temperature_; }
43
+ bool get_supports_current_temperature() const { return this->supports_current_temperature_; }
44
44
  void set_supports_current_temperature(bool supports_current_temperature) {
45
- supports_current_temperature_ = supports_current_temperature;
45
+ this->supports_current_temperature_ = supports_current_temperature;
46
46
  }
47
- bool get_supports_current_humidity() const { return supports_current_humidity_; }
47
+ bool get_supports_current_humidity() const { return this->supports_current_humidity_; }
48
48
  void set_supports_current_humidity(bool supports_current_humidity) {
49
- supports_current_humidity_ = supports_current_humidity;
49
+ this->supports_current_humidity_ = supports_current_humidity;
50
50
  }
51
- bool get_supports_two_point_target_temperature() const { return supports_two_point_target_temperature_; }
51
+ bool get_supports_two_point_target_temperature() const { return this->supports_two_point_target_temperature_; }
52
52
  void set_supports_two_point_target_temperature(bool supports_two_point_target_temperature) {
53
- supports_two_point_target_temperature_ = supports_two_point_target_temperature;
53
+ this->supports_two_point_target_temperature_ = supports_two_point_target_temperature;
54
54
  }
55
- bool get_supports_target_humidity() const { return supports_target_humidity_; }
55
+ bool get_supports_target_humidity() const { return this->supports_target_humidity_; }
56
56
  void set_supports_target_humidity(bool supports_target_humidity) {
57
- supports_target_humidity_ = supports_target_humidity;
57
+ this->supports_target_humidity_ = supports_target_humidity;
58
58
  }
59
- void set_supported_modes(std::set<ClimateMode> modes) { supported_modes_ = std::move(modes); }
60
- void add_supported_mode(ClimateMode mode) { supported_modes_.insert(mode); }
59
+ void set_supported_modes(std::set<ClimateMode> modes) { this->supported_modes_ = std::move(modes); }
60
+ void add_supported_mode(ClimateMode mode) { this->supported_modes_.insert(mode); }
61
61
  ESPDEPRECATED("This method is deprecated, use set_supported_modes() instead", "v1.20")
62
62
  void set_supports_auto_mode(bool supports_auto_mode) { set_mode_support_(CLIMATE_MODE_AUTO, supports_auto_mode); }
63
63
  ESPDEPRECATED("This method is deprecated, use set_supported_modes() instead", "v1.20")
@@ -72,15 +72,15 @@ class ClimateTraits {
72
72
  }
73
73
  ESPDEPRECATED("This method is deprecated, use set_supported_modes() instead", "v1.20")
74
74
  void set_supports_dry_mode(bool supports_dry_mode) { set_mode_support_(CLIMATE_MODE_DRY, supports_dry_mode); }
75
- bool supports_mode(ClimateMode mode) const { return supported_modes_.count(mode); }
76
- const std::set<ClimateMode> &get_supported_modes() const { return supported_modes_; }
75
+ bool supports_mode(ClimateMode mode) const { return this->supported_modes_.count(mode); }
76
+ const std::set<ClimateMode> &get_supported_modes() const { return this->supported_modes_; }
77
77
 
78
- void set_supports_action(bool supports_action) { supports_action_ = supports_action; }
79
- bool get_supports_action() const { return supports_action_; }
78
+ void set_supports_action(bool supports_action) { this->supports_action_ = supports_action; }
79
+ bool get_supports_action() const { return this->supports_action_; }
80
80
 
81
- void set_supported_fan_modes(std::set<ClimateFanMode> modes) { supported_fan_modes_ = std::move(modes); }
82
- void add_supported_fan_mode(ClimateFanMode mode) { supported_fan_modes_.insert(mode); }
83
- void add_supported_custom_fan_mode(const std::string &mode) { supported_custom_fan_modes_.insert(mode); }
81
+ void set_supported_fan_modes(std::set<ClimateFanMode> modes) { this->supported_fan_modes_ = std::move(modes); }
82
+ void add_supported_fan_mode(ClimateFanMode mode) { this->supported_fan_modes_.insert(mode); }
83
+ void add_supported_custom_fan_mode(const std::string &mode) { this->supported_custom_fan_modes_.insert(mode); }
84
84
  ESPDEPRECATED("This method is deprecated, use set_supported_fan_modes() instead", "v1.20")
85
85
  void set_supports_fan_mode_on(bool supported) { set_fan_mode_support_(CLIMATE_FAN_ON, supported); }
86
86
  ESPDEPRECATED("This method is deprecated, use set_supported_fan_modes() instead", "v1.20")
@@ -99,35 +99,37 @@ class ClimateTraits {
99
99
  void set_supports_fan_mode_focus(bool supported) { set_fan_mode_support_(CLIMATE_FAN_FOCUS, supported); }
100
100
  ESPDEPRECATED("This method is deprecated, use set_supported_fan_modes() instead", "v1.20")
101
101
  void set_supports_fan_mode_diffuse(bool supported) { set_fan_mode_support_(CLIMATE_FAN_DIFFUSE, supported); }
102
- bool supports_fan_mode(ClimateFanMode fan_mode) const { return supported_fan_modes_.count(fan_mode); }
103
- bool get_supports_fan_modes() const { return !supported_fan_modes_.empty() || !supported_custom_fan_modes_.empty(); }
104
- const std::set<ClimateFanMode> &get_supported_fan_modes() const { return supported_fan_modes_; }
102
+ bool supports_fan_mode(ClimateFanMode fan_mode) const { return this->supported_fan_modes_.count(fan_mode); }
103
+ bool get_supports_fan_modes() const {
104
+ return !this->supported_fan_modes_.empty() || !this->supported_custom_fan_modes_.empty();
105
+ }
106
+ const std::set<ClimateFanMode> &get_supported_fan_modes() const { return this->supported_fan_modes_; }
105
107
 
106
108
  void set_supported_custom_fan_modes(std::set<std::string> supported_custom_fan_modes) {
107
- supported_custom_fan_modes_ = std::move(supported_custom_fan_modes);
109
+ this->supported_custom_fan_modes_ = std::move(supported_custom_fan_modes);
108
110
  }
109
- const std::set<std::string> &get_supported_custom_fan_modes() const { return supported_custom_fan_modes_; }
111
+ const std::set<std::string> &get_supported_custom_fan_modes() const { return this->supported_custom_fan_modes_; }
110
112
  bool supports_custom_fan_mode(const std::string &custom_fan_mode) const {
111
- return supported_custom_fan_modes_.count(custom_fan_mode);
113
+ return this->supported_custom_fan_modes_.count(custom_fan_mode);
112
114
  }
113
115
 
114
- void set_supported_presets(std::set<ClimatePreset> presets) { supported_presets_ = std::move(presets); }
115
- void add_supported_preset(ClimatePreset preset) { supported_presets_.insert(preset); }
116
- void add_supported_custom_preset(const std::string &preset) { supported_custom_presets_.insert(preset); }
117
- bool supports_preset(ClimatePreset preset) const { return supported_presets_.count(preset); }
118
- bool get_supports_presets() const { return !supported_presets_.empty(); }
119
- const std::set<climate::ClimatePreset> &get_supported_presets() const { return supported_presets_; }
116
+ void set_supported_presets(std::set<ClimatePreset> presets) { this->supported_presets_ = std::move(presets); }
117
+ void add_supported_preset(ClimatePreset preset) { this->supported_presets_.insert(preset); }
118
+ void add_supported_custom_preset(const std::string &preset) { this->supported_custom_presets_.insert(preset); }
119
+ bool supports_preset(ClimatePreset preset) const { return this->supported_presets_.count(preset); }
120
+ bool get_supports_presets() const { return !this->supported_presets_.empty(); }
121
+ const std::set<climate::ClimatePreset> &get_supported_presets() const { return this->supported_presets_; }
120
122
 
121
123
  void set_supported_custom_presets(std::set<std::string> supported_custom_presets) {
122
- supported_custom_presets_ = std::move(supported_custom_presets);
124
+ this->supported_custom_presets_ = std::move(supported_custom_presets);
123
125
  }
124
- const std::set<std::string> &get_supported_custom_presets() const { return supported_custom_presets_; }
126
+ const std::set<std::string> &get_supported_custom_presets() const { return this->supported_custom_presets_; }
125
127
  bool supports_custom_preset(const std::string &custom_preset) const {
126
- return supported_custom_presets_.count(custom_preset);
128
+ return this->supported_custom_presets_.count(custom_preset);
127
129
  }
128
130
 
129
- void set_supported_swing_modes(std::set<ClimateSwingMode> modes) { supported_swing_modes_ = std::move(modes); }
130
- void add_supported_swing_mode(ClimateSwingMode mode) { supported_swing_modes_.insert(mode); }
131
+ void set_supported_swing_modes(std::set<ClimateSwingMode> modes) { this->supported_swing_modes_ = std::move(modes); }
132
+ void add_supported_swing_mode(ClimateSwingMode mode) { this->supported_swing_modes_.insert(mode); }
131
133
  ESPDEPRECATED("This method is deprecated, use set_supported_swing_modes() instead", "v1.20")
132
134
  void set_supports_swing_mode_off(bool supported) { set_swing_mode_support_(CLIMATE_SWING_OFF, supported); }
133
135
  ESPDEPRECATED("This method is deprecated, use set_supported_swing_modes() instead", "v1.20")
@@ -138,54 +140,58 @@ class ClimateTraits {
138
140
  void set_supports_swing_mode_horizontal(bool supported) {
139
141
  set_swing_mode_support_(CLIMATE_SWING_HORIZONTAL, supported);
140
142
  }
141
- bool supports_swing_mode(ClimateSwingMode swing_mode) const { return supported_swing_modes_.count(swing_mode); }
142
- bool get_supports_swing_modes() const { return !supported_swing_modes_.empty(); }
143
- const std::set<ClimateSwingMode> &get_supported_swing_modes() const { return supported_swing_modes_; }
143
+ bool supports_swing_mode(ClimateSwingMode swing_mode) const { return this->supported_swing_modes_.count(swing_mode); }
144
+ bool get_supports_swing_modes() const { return !this->supported_swing_modes_.empty(); }
145
+ const std::set<ClimateSwingMode> &get_supported_swing_modes() const { return this->supported_swing_modes_; }
144
146
 
145
- float get_visual_min_temperature() const { return visual_min_temperature_; }
146
- void set_visual_min_temperature(float visual_min_temperature) { visual_min_temperature_ = visual_min_temperature; }
147
- float get_visual_max_temperature() const { return visual_max_temperature_; }
148
- void set_visual_max_temperature(float visual_max_temperature) { visual_max_temperature_ = visual_max_temperature; }
149
- float get_visual_target_temperature_step() const { return visual_target_temperature_step_; }
150
- float get_visual_current_temperature_step() const { return visual_current_temperature_step_; }
147
+ float get_visual_min_temperature() const { return this->visual_min_temperature_; }
148
+ void set_visual_min_temperature(float visual_min_temperature) {
149
+ this->visual_min_temperature_ = visual_min_temperature;
150
+ }
151
+ float get_visual_max_temperature() const { return this->visual_max_temperature_; }
152
+ void set_visual_max_temperature(float visual_max_temperature) {
153
+ this->visual_max_temperature_ = visual_max_temperature;
154
+ }
155
+ float get_visual_target_temperature_step() const { return this->visual_target_temperature_step_; }
156
+ float get_visual_current_temperature_step() const { return this->visual_current_temperature_step_; }
151
157
  void set_visual_target_temperature_step(float temperature_step) {
152
- visual_target_temperature_step_ = temperature_step;
158
+ this->visual_target_temperature_step_ = temperature_step;
153
159
  }
154
160
  void set_visual_current_temperature_step(float temperature_step) {
155
- visual_current_temperature_step_ = temperature_step;
161
+ this->visual_current_temperature_step_ = temperature_step;
156
162
  }
157
163
  void set_visual_temperature_step(float temperature_step) {
158
- visual_target_temperature_step_ = temperature_step;
159
- visual_current_temperature_step_ = temperature_step;
164
+ this->visual_target_temperature_step_ = temperature_step;
165
+ this->visual_current_temperature_step_ = temperature_step;
160
166
  }
161
167
  int8_t get_target_temperature_accuracy_decimals() const;
162
168
  int8_t get_current_temperature_accuracy_decimals() const;
163
169
 
164
- float get_visual_min_humidity() const { return visual_min_humidity_; }
165
- void set_visual_min_humidity(float visual_min_humidity) { visual_min_humidity_ = visual_min_humidity; }
166
- float get_visual_max_humidity() const { return visual_max_humidity_; }
167
- void set_visual_max_humidity(float visual_max_humidity) { visual_max_humidity_ = visual_max_humidity; }
170
+ float get_visual_min_humidity() const { return this->visual_min_humidity_; }
171
+ void set_visual_min_humidity(float visual_min_humidity) { this->visual_min_humidity_ = visual_min_humidity; }
172
+ float get_visual_max_humidity() const { return this->visual_max_humidity_; }
173
+ void set_visual_max_humidity(float visual_max_humidity) { this->visual_max_humidity_ = visual_max_humidity; }
168
174
 
169
175
  protected:
170
176
  void set_mode_support_(climate::ClimateMode mode, bool supported) {
171
177
  if (supported) {
172
- supported_modes_.insert(mode);
178
+ this->supported_modes_.insert(mode);
173
179
  } else {
174
- supported_modes_.erase(mode);
180
+ this->supported_modes_.erase(mode);
175
181
  }
176
182
  }
177
183
  void set_fan_mode_support_(climate::ClimateFanMode mode, bool supported) {
178
184
  if (supported) {
179
- supported_fan_modes_.insert(mode);
185
+ this->supported_fan_modes_.insert(mode);
180
186
  } else {
181
- supported_fan_modes_.erase(mode);
187
+ this->supported_fan_modes_.erase(mode);
182
188
  }
183
189
  }
184
190
  void set_swing_mode_support_(climate::ClimateSwingMode mode, bool supported) {
185
191
  if (supported) {
186
- supported_swing_modes_.insert(mode);
192
+ this->supported_swing_modes_.insert(mode);
187
193
  } else {
188
- supported_swing_modes_.erase(mode);
194
+ this->supported_swing_modes_.erase(mode);
189
195
  }
190
196
  }
191
197
 
@@ -1,7 +1,13 @@
1
+ import logging
2
+
3
+ from esphome import core
1
4
  import esphome.codegen as cg
2
5
  from esphome.components import climate, remote_base, sensor
3
6
  import esphome.config_validation as cv
4
- from esphome.const import CONF_SENSOR, CONF_SUPPORTS_COOL, CONF_SUPPORTS_HEAT
7
+ from esphome.const import CONF_ID, CONF_SENSOR, CONF_SUPPORTS_COOL, CONF_SUPPORTS_HEAT
8
+ from esphome.cpp_generator import MockObjClass
9
+
10
+ _LOGGER = logging.getLogger(__name__)
5
11
 
6
12
  DEPENDENCIES = ["remote_transmitter"]
7
13
  AUTO_LOAD = ["sensor", "remote_base"]
@@ -16,30 +22,58 @@ ClimateIR = climate_ir_ns.class_(
16
22
  remote_base.RemoteTransmittable,
17
23
  )
18
24
 
19
- CLIMATE_IR_SCHEMA = (
20
- climate.CLIMATE_SCHEMA.extend(
25
+
26
+ def climate_ir_schema(
27
+ class_: MockObjClass,
28
+ ) -> cv.Schema:
29
+ return (
30
+ climate.climate_schema(class_)
31
+ .extend(
32
+ {
33
+ cv.Optional(CONF_SUPPORTS_COOL, default=True): cv.boolean,
34
+ cv.Optional(CONF_SUPPORTS_HEAT, default=True): cv.boolean,
35
+ cv.Optional(CONF_SENSOR): cv.use_id(sensor.Sensor),
36
+ }
37
+ )
38
+ .extend(cv.COMPONENT_SCHEMA)
39
+ .extend(remote_base.REMOTE_TRANSMITTABLE_SCHEMA)
40
+ )
41
+
42
+
43
+ def climate_ir_with_receiver_schema(
44
+ class_: MockObjClass,
45
+ ) -> cv.Schema:
46
+ return climate_ir_schema(class_).extend(
21
47
  {
22
- cv.Optional(CONF_SUPPORTS_COOL, default=True): cv.boolean,
23
- cv.Optional(CONF_SUPPORTS_HEAT, default=True): cv.boolean,
24
- cv.Optional(CONF_SENSOR): cv.use_id(sensor.Sensor),
48
+ cv.Optional(remote_base.CONF_RECEIVER_ID): cv.use_id(
49
+ remote_base.RemoteReceiverBase
50
+ ),
25
51
  }
26
52
  )
27
- .extend(cv.COMPONENT_SCHEMA)
28
- .extend(remote_base.REMOTE_TRANSMITTABLE_SCHEMA)
29
- )
30
53
 
31
- CLIMATE_IR_WITH_RECEIVER_SCHEMA = CLIMATE_IR_SCHEMA.extend(
32
- {
33
- cv.Optional(remote_base.CONF_RECEIVER_ID): cv.use_id(
34
- remote_base.RemoteReceiverBase
35
- ),
36
- }
37
- )
54
+
55
+ # Remove before 2025.11.0
56
+ def deprecated_schema_constant(config):
57
+ type: str = "unknown"
58
+ if (id := config.get(CONF_ID)) is not None and isinstance(id, core.ID):
59
+ type = str(id.type).split("::", maxsplit=1)[0]
60
+ _LOGGER.warning(
61
+ "Using `climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA` is deprecated and will be removed in ESPHome 2025.11.0. "
62
+ "Please use `climate_ir.climate_ir_with_receiver_schema(...)` instead. "
63
+ "If you are seeing this, report an issue to the external_component author and ask them to update it. "
64
+ "https://developers.esphome.io/blog/2025/05/14/_schema-deprecations/. "
65
+ "Component using this schema: %s",
66
+ type,
67
+ )
68
+ return config
69
+
70
+
71
+ CLIMATE_IR_WITH_RECEIVER_SCHEMA = climate_ir_with_receiver_schema(ClimateIR)
72
+ CLIMATE_IR_WITH_RECEIVER_SCHEMA.add_extra(deprecated_schema_constant)
38
73
 
39
74
 
40
75
  async def register_climate_ir(var, config):
41
76
  await cg.register_component(var, config)
42
- await climate.register_climate(var, config)
43
77
  await remote_base.register_transmittable(var, config)
44
78
  cg.add(var.set_supports_cool(config[CONF_SUPPORTS_COOL]))
45
79
  cg.add(var.set_supports_heat(config[CONF_SUPPORTS_HEAT]))
@@ -48,3 +82,9 @@ async def register_climate_ir(var, config):
48
82
  if sensor_id := config.get(CONF_SENSOR):
49
83
  sens = await cg.get_variable(sensor_id)
50
84
  cg.add(var.set_sensor(sens))
85
+
86
+
87
+ async def new_climate_ir(config, *args):
88
+ var = await climate.new_climate(config, *args)
89
+ await register_climate_ir(var, config)
90
+ return var
@@ -1,7 +1,6 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import climate_ir
3
3
  import esphome.config_validation as cv
4
- from esphome.const import CONF_ID
5
4
 
6
5
  AUTO_LOAD = ["climate_ir"]
7
6
 
@@ -14,9 +13,8 @@ CONF_BIT_HIGH = "bit_high"
14
13
  CONF_BIT_ONE_LOW = "bit_one_low"
15
14
  CONF_BIT_ZERO_LOW = "bit_zero_low"
16
15
 
17
- CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
16
+ CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(LgIrClimate).extend(
18
17
  {
19
- cv.GenerateID(): cv.declare_id(LgIrClimate),
20
18
  cv.Optional(
21
19
  CONF_HEADER_HIGH, default="8000us"
22
20
  ): cv.positive_time_period_microseconds,
@@ -37,8 +35,7 @@ CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
37
35
 
38
36
 
39
37
  async def to_code(config):
40
- var = cg.new_Pvariable(config[CONF_ID])
41
- await climate_ir.register_climate_ir(var, config)
38
+ var = await climate_ir.new_climate_ir(config)
42
39
 
43
40
  cg.add(var.set_header_high(config[CONF_HEADER_HIGH]))
44
41
  cg.add(var.set_header_low(config[CONF_HEADER_LOW]))
@@ -32,7 +32,7 @@ const uint32_t FAN_MAX = 0x40;
32
32
 
33
33
  // Temperature
34
34
  const uint8_t TEMP_RANGE = TEMP_MAX - TEMP_MIN + 1;
35
- const uint32_t TEMP_MASK = 0XF00;
35
+ const uint32_t TEMP_MASK = 0xF00;
36
36
  const uint32_t TEMP_SHIFT = 8;
37
37
 
38
38
  const uint16_t BITS = 28;
@@ -43,11 +43,11 @@ void LgIrClimate::transmit_state() {
43
43
  // ESP_LOGD(TAG, "climate_lg_ir mode_before_ code: 0x%02X", modeBefore_);
44
44
 
45
45
  // Set command
46
- if (send_swing_cmd_) {
47
- send_swing_cmd_ = false;
46
+ if (this->send_swing_cmd_) {
47
+ this->send_swing_cmd_ = false;
48
48
  remote_state |= COMMAND_SWING;
49
49
  } else {
50
- bool climate_is_off = (mode_before_ == climate::CLIMATE_MODE_OFF);
50
+ bool climate_is_off = (this->mode_before_ == climate::CLIMATE_MODE_OFF);
51
51
  switch (this->mode) {
52
52
  case climate::CLIMATE_MODE_COOL:
53
53
  remote_state |= climate_is_off ? COMMAND_ON_COOL : COMMAND_COOL;
@@ -71,7 +71,7 @@ void LgIrClimate::transmit_state() {
71
71
  }
72
72
  }
73
73
 
74
- mode_before_ = this->mode;
74
+ this->mode_before_ = this->mode;
75
75
 
76
76
  ESP_LOGD(TAG, "climate_lg_ir mode code: 0x%02X", this->mode);
77
77
 
@@ -102,7 +102,7 @@ void LgIrClimate::transmit_state() {
102
102
  remote_state |= ((temp - 15) << TEMP_SHIFT);
103
103
  }
104
104
 
105
- transmit_(remote_state);
105
+ this->transmit_(remote_state);
106
106
  this->publish_state();
107
107
  }
108
108
 
@@ -187,7 +187,7 @@ bool LgIrClimate::on_receive(remote_base::RemoteReceiveData data) {
187
187
  }
188
188
 
189
189
  void LgIrClimate::transmit_(uint32_t value) {
190
- calc_checksum_(value);
190
+ this->calc_checksum_(value);
191
191
  ESP_LOGD(TAG, "Sending climate_lg_ir code: 0x%02" PRIX32, value);
192
192
 
193
193
  auto transmit = this->transmitter_->transmit();
@@ -21,7 +21,7 @@ class LgIrClimate : public climate_ir::ClimateIR {
21
21
 
22
22
  /// Override control to change settings of the climate device.
23
23
  void control(const climate::ClimateCall &call) override {
24
- send_swing_cmd_ = call.get_swing_mode().has_value();
24
+ this->send_swing_cmd_ = call.get_swing_mode().has_value();
25
25
  // swing resets after unit powered off
26
26
  if (call.get_mode().has_value() && *call.get_mode() == climate::CLIMATE_MODE_OFF)
27
27
  this->swing_mode = climate::CLIMATE_SWING_OFF;
@@ -3,6 +3,8 @@ from esphome.const import CONF_BLUE, CONF_GREEN, CONF_ID, CONF_RED, CONF_WHITE
3
3
 
4
4
  ColorStruct = cg.esphome_ns.struct("Color")
5
5
 
6
+ INSTANCE_TYPE = ColorStruct
7
+
6
8
  MULTI_CONF = True
7
9
 
8
10
  CONF_RED_INT = "red_int"
@@ -0,0 +1,5 @@
1
+ """Constants used by esphome components."""
2
+
3
+ CODEOWNERS = ["@esphome/core"]
4
+
5
+ CONF_DRAW_ROUNDING = "draw_rounding"
@@ -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
  coolix_ns = cg.esphome_ns.namespace("coolix")
10
8
  CoolixClimate = coolix_ns.class_("CoolixClimate", climate_ir.ClimateIR)
11
9
 
12
- CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
13
- {
14
- cv.GenerateID(): cv.declare_id(CoolixClimate),
15
- }
16
- )
10
+ CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(CoolixClimate)
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)
@@ -5,7 +5,6 @@ from esphome.const import (
5
5
  CONF_DEVICE_CLASS,
6
6
  CONF_ENTITY_CATEGORY,
7
7
  CONF_ICON,
8
- CONF_ID,
9
8
  CONF_SOURCE_ID,
10
9
  )
11
10
  from esphome.core.entity_helpers import inherit_property_from
@@ -15,12 +14,15 @@ from .. import copy_ns
15
14
  CopyCover = copy_ns.class_("CopyCover", cover.Cover, cg.Component)
16
15
 
17
16
 
18
- CONFIG_SCHEMA = cover.COVER_SCHEMA.extend(
19
- {
20
- cv.GenerateID(): cv.declare_id(CopyCover),
21
- cv.Required(CONF_SOURCE_ID): cv.use_id(cover.Cover),
22
- }
23
- ).extend(cv.COMPONENT_SCHEMA)
17
+ CONFIG_SCHEMA = (
18
+ cover.cover_schema(CopyCover)
19
+ .extend(
20
+ {
21
+ cv.Required(CONF_SOURCE_ID): cv.use_id(cover.Cover),
22
+ }
23
+ )
24
+ .extend(cv.COMPONENT_SCHEMA)
25
+ )
24
26
 
25
27
  FINAL_VALIDATE_SCHEMA = cv.All(
26
28
  inherit_property_from(CONF_ICON, CONF_SOURCE_ID),
@@ -30,8 +32,7 @@ FINAL_VALIDATE_SCHEMA = cv.All(
30
32
 
31
33
 
32
34
  async def to_code(config):
33
- var = cg.new_Pvariable(config[CONF_ID])
34
- await cover.register_cover(var, config)
35
+ var = await cover.new_cover(config)
35
36
  await cg.register_component(var, config)
36
37
 
37
38
  source = await cg.get_variable(config[CONF_SOURCE_ID])
@@ -1,7 +1,7 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import fan
3
3
  import esphome.config_validation as cv
4
- from esphome.const import CONF_ENTITY_CATEGORY, CONF_ICON, CONF_ID, CONF_SOURCE_ID
4
+ from esphome.const import CONF_ENTITY_CATEGORY, CONF_ICON, CONF_SOURCE_ID
5
5
  from esphome.core.entity_helpers import inherit_property_from
6
6
 
7
7
  from .. import copy_ns
@@ -9,12 +9,15 @@ from .. import copy_ns
9
9
  CopyFan = copy_ns.class_("CopyFan", fan.Fan, cg.Component)
10
10
 
11
11
 
12
- CONFIG_SCHEMA = fan.FAN_SCHEMA.extend(
13
- {
14
- cv.GenerateID(): cv.declare_id(CopyFan),
15
- cv.Required(CONF_SOURCE_ID): cv.use_id(fan.Fan),
16
- }
17
- ).extend(cv.COMPONENT_SCHEMA)
12
+ CONFIG_SCHEMA = (
13
+ fan.fan_schema(CopyFan)
14
+ .extend(
15
+ {
16
+ cv.Required(CONF_SOURCE_ID): cv.use_id(fan.Fan),
17
+ }
18
+ )
19
+ .extend(cv.COMPONENT_SCHEMA)
20
+ )
18
21
 
19
22
  FINAL_VALIDATE_SCHEMA = cv.All(
20
23
  inherit_property_from(CONF_ICON, CONF_SOURCE_ID),
@@ -23,8 +26,7 @@ FINAL_VALIDATE_SCHEMA = cv.All(
23
26
 
24
27
 
25
28
  async def to_code(config):
26
- var = cg.new_Pvariable(config[CONF_ID])
27
- await fan.register_fan(var, config)
29
+ var = await fan.new_fan(config)
28
30
  await cg.register_component(var, config)
29
31
 
30
32
  source = await cg.get_variable(config[CONF_SOURCE_ID])
@@ -1,7 +1,7 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import lock
3
3
  import esphome.config_validation as cv
4
- from esphome.const import CONF_ENTITY_CATEGORY, CONF_ICON, CONF_ID, CONF_SOURCE_ID
4
+ from esphome.const import CONF_ENTITY_CATEGORY, CONF_ICON, CONF_SOURCE_ID
5
5
  from esphome.core.entity_helpers import inherit_property_from
6
6
 
7
7
  from .. import copy_ns
@@ -9,12 +9,15 @@ from .. import copy_ns
9
9
  CopyLock = copy_ns.class_("CopyLock", lock.Lock, cg.Component)
10
10
 
11
11
 
12
- CONFIG_SCHEMA = lock.LOCK_SCHEMA.extend(
13
- {
14
- cv.GenerateID(): cv.declare_id(CopyLock),
15
- cv.Required(CONF_SOURCE_ID): cv.use_id(lock.Lock),
16
- }
17
- ).extend(cv.COMPONENT_SCHEMA)
12
+ CONFIG_SCHEMA = (
13
+ lock.lock_schema(CopyLock)
14
+ .extend(
15
+ {
16
+ cv.Required(CONF_SOURCE_ID): cv.use_id(lock.Lock),
17
+ }
18
+ )
19
+ .extend(cv.COMPONENT_SCHEMA)
20
+ )
18
21
 
19
22
  FINAL_VALIDATE_SCHEMA = cv.All(
20
23
  inherit_property_from(CONF_ICON, CONF_SOURCE_ID),
@@ -23,8 +26,7 @@ FINAL_VALIDATE_SCHEMA = cv.All(
23
26
 
24
27
 
25
28
  async def to_code(config):
26
- var = cg.new_Pvariable(config[CONF_ID])
27
- await lock.register_lock(var, config)
29
+ var = await lock.new_lock(config)
28
30
  await cg.register_component(var, config)
29
31
 
30
32
  source = await cg.get_variable(config[CONF_SOURCE_ID])
@@ -9,12 +9,15 @@ from .. import copy_ns
9
9
  CopyText = copy_ns.class_("CopyText", text.Text, cg.Component)
10
10
 
11
11
 
12
- CONFIG_SCHEMA = text.TEXT_SCHEMA.extend(
13
- {
14
- cv.GenerateID(): cv.declare_id(CopyText),
15
- cv.Required(CONF_SOURCE_ID): cv.use_id(text.Text),
16
- }
17
- ).extend(cv.COMPONENT_SCHEMA)
12
+ CONFIG_SCHEMA = (
13
+ text.text_schema(CopyText)
14
+ .extend(
15
+ {
16
+ cv.Required(CONF_SOURCE_ID): cv.use_id(text.Text),
17
+ }
18
+ )
19
+ .extend(cv.COMPONENT_SCHEMA)
20
+ )
18
21
 
19
22
  FINAL_VALIDATE_SCHEMA = cv.All(
20
23
  inherit_property_from(CONF_ICON, CONF_SOURCE_ID),
@@ -5,6 +5,8 @@ from esphome.components import mqtt, web_server
5
5
  import esphome.config_validation as cv
6
6
  from esphome.const import (
7
7
  CONF_DEVICE_CLASS,
8
+ CONF_ENTITY_CATEGORY,
9
+ CONF_ICON,
8
10
  CONF_ID,
9
11
  CONF_MQTT_ID,
10
12
  CONF_ON_OPEN,
@@ -31,6 +33,7 @@ from esphome.const import (
31
33
  DEVICE_CLASS_WINDOW,
32
34
  )
33
35
  from esphome.core import CORE, coroutine_with_priority
36
+ from esphome.cpp_generator import MockObjClass
34
37
  from esphome.cpp_helpers import setup_entity
35
38
 
36
39
  IS_PLATFORM_COMPONENT = True
@@ -89,12 +92,11 @@ CoverClosedTrigger = cover_ns.class_(
89
92
 
90
93
  CONF_ON_CLOSED = "on_closed"
91
94
 
92
- COVER_SCHEMA = (
95
+ _COVER_SCHEMA = (
93
96
  cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA)
94
97
  .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA)
95
98
  .extend(
96
99
  {
97
- cv.GenerateID(): cv.declare_id(Cover),
98
100
  cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTCoverComponent),
99
101
  cv.Optional(CONF_DEVICE_CLASS): cv.one_of(*DEVICE_CLASSES, lower=True),
100
102
  cv.Optional(CONF_POSITION_COMMAND_TOPIC): cv.All(
@@ -124,6 +126,33 @@ COVER_SCHEMA = (
124
126
  )
125
127
 
126
128
 
129
+ def cover_schema(
130
+ class_: MockObjClass,
131
+ *,
132
+ device_class: str = cv.UNDEFINED,
133
+ entity_category: str = cv.UNDEFINED,
134
+ icon: str = cv.UNDEFINED,
135
+ ) -> cv.Schema:
136
+ schema = {
137
+ cv.GenerateID(): cv.declare_id(class_),
138
+ }
139
+
140
+ for key, default, validator in [
141
+ (CONF_DEVICE_CLASS, device_class, cv.one_of(*DEVICE_CLASSES, lower=True)),
142
+ (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
143
+ (CONF_ICON, icon, cv.icon),
144
+ ]:
145
+ if default is not cv.UNDEFINED:
146
+ schema[cv.Optional(key, default=default)] = validator
147
+
148
+ return _COVER_SCHEMA.extend(schema)
149
+
150
+
151
+ # Remove before 2025.11.0
152
+ COVER_SCHEMA = cover_schema(Cover)
153
+ COVER_SCHEMA.add_extra(cv.deprecated_schema_constant("cover"))
154
+
155
+
127
156
  async def setup_cover_core_(var, config):
128
157
  await setup_entity(var, config)
129
158
 
@@ -163,6 +192,12 @@ async def register_cover(var, config):
163
192
  await setup_cover_core_(var, config)
164
193
 
165
194
 
195
+ async def new_cover(config, *args):
196
+ var = cg.new_Pvariable(config[CONF_ID], *args)
197
+ await register_cover(var, config)
198
+ return var
199
+
200
+
166
201
  COVER_ACTION_SCHEMA = maybe_simple_id(
167
202
  {
168
203
  cv.Required(CONF_ID): cv.use_id(Cover),
@@ -1,5 +1,6 @@
1
1
  #include "cse7766.h"
2
2
  #include "esphome/core/log.h"
3
+ #include "esphome/core/application.h"
3
4
 
4
5
  namespace esphome {
5
6
  namespace cse7766 {
@@ -7,7 +8,7 @@ namespace cse7766 {
7
8
  static const char *const TAG = "cse7766";
8
9
 
9
10
  void CSE7766Component::loop() {
10
- const uint32_t now = millis();
11
+ const uint32_t now = App.get_loop_component_start_time();
11
12
  if (now - this->last_transmission_ >= 500) {
12
13
  // last transmission too long ago. Reset RX index.
13
14
  this->raw_data_index_ = 0;