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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. esphome/components/ac_dimmer/ac_dimmer.cpp +3 -2
  2. esphome/components/adc/__init__.py +51 -34
  3. esphome/components/airthings_wave_base/__init__.py +1 -1
  4. esphome/components/alarm_control_panel/__init__.py +37 -2
  5. esphome/components/am43/cover/__init__.py +4 -5
  6. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +6 -4
  7. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +4 -5
  8. esphome/components/analog_threshold/binary_sensor.py +10 -8
  9. esphome/components/anova/climate.py +4 -5
  10. esphome/components/api/__init__.py +25 -8
  11. esphome/components/api/api_connection.cpp +77 -10
  12. esphome/components/api/api_connection.h +6 -1
  13. esphome/components/api/api_frame_helper.cpp +98 -130
  14. esphome/components/api/api_frame_helper.h +12 -2
  15. esphome/components/api/api_noise_context.h +13 -4
  16. esphome/components/api/api_pb2.cpp +1422 -1
  17. esphome/components/api/api_pb2.h +255 -1
  18. esphome/components/api/api_pb2_service.cpp +162 -49
  19. esphome/components/api/api_pb2_service.h +90 -51
  20. esphome/components/api/api_pb2_size.h +361 -0
  21. esphome/components/api/api_server.cpp +110 -34
  22. esphome/components/api/api_server.h +8 -0
  23. esphome/components/api/proto.h +38 -9
  24. esphome/components/as3935_i2c/as3935_i2c.h +0 -3
  25. esphome/components/as7341/as7341.h +1 -1
  26. esphome/components/atm90e32/__init__.py +1 -0
  27. esphome/components/atm90e32/atm90e32.cpp +576 -199
  28. esphome/components/atm90e32/atm90e32.h +128 -31
  29. esphome/components/atm90e32/atm90e32_reg.h +4 -2
  30. esphome/components/atm90e32/button/__init__.py +62 -10
  31. esphome/components/atm90e32/button/atm90e32_button.cpp +63 -4
  32. esphome/components/atm90e32/button/atm90e32_button.h +36 -4
  33. esphome/components/atm90e32/number/__init__.py +130 -0
  34. esphome/components/atm90e32/number/atm90e32_number.h +16 -0
  35. esphome/components/atm90e32/sensor.py +21 -4
  36. esphome/components/atm90e32/text_sensor/__init__.py +48 -0
  37. esphome/components/audio/__init__.py +96 -49
  38. esphome/components/audio/audio.h +48 -0
  39. esphome/components/audio/audio_decoder.cpp +1 -1
  40. esphome/components/audio/audio_resampler.cpp +2 -0
  41. esphome/components/audio/audio_resampler.h +1 -0
  42. esphome/components/ballu/climate.py +2 -9
  43. esphome/components/bang_bang/climate.py +5 -6
  44. esphome/components/bedjet/climate/__init__.py +3 -8
  45. esphome/components/bedjet/fan/__init__.py +2 -11
  46. esphome/components/binary/fan/__init__.py +13 -16
  47. esphome/components/binary_sensor/__init__.py +13 -10
  48. esphome/components/binary_sensor/binary_sensor.cpp +6 -10
  49. esphome/components/binary_sensor/binary_sensor.h +1 -1
  50. esphome/components/binary_sensor/filter.cpp +21 -21
  51. esphome/components/binary_sensor/filter.h +10 -10
  52. esphome/components/bl0906/constants.h +16 -16
  53. esphome/components/ble_client/text_sensor/__init__.py +3 -5
  54. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +4 -6
  55. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +135 -21
  56. esphome/components/bluetooth_proxy/bluetooth_proxy.h +7 -0
  57. esphome/components/button/__init__.py +11 -8
  58. esphome/components/canbus/canbus.cpp +3 -0
  59. esphome/components/canbus/canbus.h +16 -0
  60. esphome/components/climate/__init__.py +35 -2
  61. esphome/components/climate/climate_mode.h +1 -1
  62. esphome/components/climate/climate_traits.h +63 -57
  63. esphome/components/climate_ir/__init__.py +57 -17
  64. esphome/components/climate_ir_lg/climate.py +2 -5
  65. esphome/components/climate_ir_lg/climate_ir_lg.cpp +7 -7
  66. esphome/components/climate_ir_lg/climate_ir_lg.h +1 -1
  67. esphome/components/color/__init__.py +2 -0
  68. esphome/components/const/__init__.py +5 -0
  69. esphome/components/coolix/climate.py +2 -9
  70. esphome/components/copy/cover/__init__.py +10 -9
  71. esphome/components/copy/fan/__init__.py +11 -9
  72. esphome/components/copy/lock/__init__.py +11 -9
  73. esphome/components/copy/text/__init__.py +9 -6
  74. esphome/components/cover/__init__.py +37 -2
  75. esphome/components/cst226/binary_sensor/__init__.py +28 -0
  76. esphome/components/cst226/binary_sensor/cs226_button.h +22 -0
  77. esphome/components/cst226/binary_sensor/cstt6_button.cpp +19 -0
  78. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +27 -5
  79. esphome/components/cst226/touchscreen/cst226_touchscreen.h +10 -10
  80. esphome/components/current_based/cover.py +37 -36
  81. esphome/components/daikin/climate.py +2 -9
  82. esphome/components/daikin/daikin.cpp +15 -9
  83. esphome/components/daikin/daikin.h +5 -5
  84. esphome/components/daikin_arc/climate.py +2 -7
  85. esphome/components/daikin_brc/climate.py +3 -5
  86. esphome/components/dallas_temp/dallas_temp.cpp +17 -24
  87. esphome/components/dallas_temp/dallas_temp.h +0 -1
  88. esphome/components/debug/debug_component.cpp +5 -0
  89. esphome/components/debug/debug_component.h +6 -0
  90. esphome/components/debug/debug_esp32.cpp +109 -254
  91. esphome/components/debug/sensor.py +14 -0
  92. esphome/components/deep_sleep/deep_sleep_esp32.cpp +13 -1
  93. esphome/components/delonghi/climate.py +2 -9
  94. esphome/components/demo/__init__.py +18 -20
  95. esphome/components/dfrobot_sen0395/switch/__init__.py +21 -22
  96. esphome/components/display/rect.cpp +4 -9
  97. esphome/components/display/rect.h +1 -1
  98. esphome/components/emmeti/climate.py +2 -9
  99. esphome/components/endstop/cover.py +17 -16
  100. esphome/components/esp32/__init__.py +60 -3
  101. esphome/components/esp32/core.cpp +11 -5
  102. esphome/components/esp32/gpio.cpp +86 -24
  103. esphome/components/esp32/gpio.py +15 -16
  104. esphome/components/esp32/gpio_esp32.py +1 -2
  105. esphome/components/esp32/gpio_esp32_c2.py +1 -1
  106. esphome/components/esp32/gpio_esp32_c3.py +1 -1
  107. esphome/components/esp32/gpio_esp32_c6.py +1 -1
  108. esphome/components/esp32/gpio_esp32_h2.py +1 -1
  109. esphome/components/esp32_ble/ble.cpp +1 -8
  110. esphome/components/esp32_ble/ble.h +5 -3
  111. esphome/components/esp32_ble/ble_advertising.h +1 -0
  112. esphome/components/esp32_ble_server/__init__.py +3 -0
  113. esphome/components/esp32_ble_tracker/__init__.py +7 -1
  114. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +192 -118
  115. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +29 -3
  116. esphome/components/esp32_can/esp32_can.cpp +1 -1
  117. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -1
  118. esphome/components/esp32_rmt_led_strip/led_strip.h +7 -5
  119. esphome/components/esp32_rmt_led_strip/light.py +9 -1
  120. esphome/components/esp8266/gpio.cpp +69 -8
  121. esphome/components/event/__init__.py +13 -10
  122. esphome/components/factory_reset/switch/__init__.py +7 -21
  123. esphome/components/fan/__init__.py +52 -5
  124. esphome/components/fastled_base/__init__.py +1 -4
  125. esphome/components/fastled_base/fastled_light.cpp +1 -1
  126. esphome/components/feedback/cover.py +38 -33
  127. esphome/components/fujitsu_general/climate.py +2 -9
  128. esphome/components/gpio/one_wire/gpio_one_wire.cpp +45 -43
  129. esphome/components/gpio/one_wire/gpio_one_wire.h +2 -1
  130. esphome/components/gpio_expander/cached_gpio.h +22 -7
  131. esphome/components/gps/__init__.py +11 -2
  132. esphome/components/gps/gps.cpp +11 -8
  133. esphome/components/gps/gps.h +9 -6
  134. esphome/components/graph/__init__.py +1 -2
  135. esphome/components/gree/climate.py +4 -6
  136. esphome/components/gree/gree.cpp +16 -2
  137. esphome/components/gree/gree.h +2 -2
  138. esphome/components/haier/climate.py +37 -34
  139. esphome/components/hbridge/fan/__init__.py +19 -17
  140. esphome/components/he60r/cover.py +4 -5
  141. esphome/components/heatpumpir/climate.py +3 -6
  142. esphome/components/hitachi_ac344/climate.py +2 -9
  143. esphome/components/hitachi_ac424/climate.py +2 -9
  144. esphome/components/hlw8012/hlw8012.cpp +1 -1
  145. esphome/components/hm3301/hm3301.h +1 -1
  146. esphome/components/http_request/__init__.py +39 -6
  147. esphome/components/http_request/http_request.cpp +20 -0
  148. esphome/components/http_request/http_request.h +57 -15
  149. esphome/components/http_request/http_request_arduino.cpp +22 -6
  150. esphome/components/http_request/http_request_arduino.h +4 -3
  151. esphome/components/http_request/http_request_host.cpp +141 -0
  152. esphome/components/http_request/http_request_host.h +37 -0
  153. esphome/components/http_request/http_request_idf.cpp +35 -3
  154. esphome/components/http_request/http_request_idf.h +10 -3
  155. esphome/components/http_request/httplib.h +9691 -0
  156. esphome/components/http_request/update/__init__.py +11 -8
  157. esphome/components/i2c/i2c.h +4 -0
  158. esphome/components/i2c/i2c_bus_esp_idf.cpp +1 -1
  159. esphome/components/i2s_audio/__init__.py +131 -22
  160. esphome/components/i2s_audio/i2s_audio.h +44 -4
  161. esphome/components/i2s_audio/media_player/__init__.py +19 -9
  162. esphome/components/i2s_audio/microphone/__init__.py +63 -5
  163. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +351 -61
  164. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +40 -6
  165. esphome/components/i2s_audio/speaker/__init__.py +31 -5
  166. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +155 -19
  167. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +17 -4
  168. esphome/components/ili9xxx/ili9xxx_init.h +1 -1
  169. esphome/components/image/__init__.py +37 -17
  170. esphome/components/image/image.cpp +25 -8
  171. esphome/components/internal_temperature/internal_temperature.cpp +6 -4
  172. esphome/components/key_collector/__init__.py +35 -0
  173. esphome/components/key_collector/key_collector.cpp +8 -0
  174. esphome/components/key_collector/key_collector.h +10 -0
  175. esphome/components/ld2410/ld2410.h +1 -1
  176. esphome/components/ld2450/ld2450.h +1 -1
  177. esphome/components/light/__init__.py +57 -0
  178. esphome/components/lock/__init__.py +51 -4
  179. esphome/components/lock/automation.h +2 -13
  180. esphome/components/logger/__init__.py +21 -0
  181. esphome/components/logger/logger.cpp +125 -95
  182. esphome/components/logger/logger.h +160 -35
  183. esphome/components/logger/task_log_buffer.cpp +138 -0
  184. esphome/components/logger/task_log_buffer.h +69 -0
  185. esphome/components/lvgl/__init__.py +13 -5
  186. esphome/components/lvgl/automation.py +50 -1
  187. esphome/components/lvgl/defines.py +0 -1
  188. esphome/components/lvgl/lv_validation.py +10 -1
  189. esphome/components/lvgl/lvgl_esphome.cpp +5 -1
  190. esphome/components/lvgl/schemas.py +14 -14
  191. esphome/components/lvgl/text/__init__.py +1 -2
  192. esphome/components/lvgl/widgets/arc.py +7 -6
  193. esphome/components/lvgl/widgets/buttonmatrix.py +3 -3
  194. esphome/components/lvgl/widgets/checkbox.py +2 -2
  195. esphome/components/lvgl/widgets/dropdown.py +2 -1
  196. esphome/components/lvgl/widgets/img.py +15 -12
  197. esphome/components/mapping/__init__.py +134 -0
  198. esphome/components/max7219digit/max7219digit.cpp +27 -27
  199. esphome/components/mdns/__init__.py +11 -5
  200. esphome/components/mdns/mdns_component.cpp +11 -5
  201. esphome/components/mdns/mdns_component.h +3 -2
  202. esphome/components/mdns/mdns_esp32.cpp +4 -3
  203. esphome/components/mdns/mdns_esp8266.cpp +4 -2
  204. esphome/components/mdns/mdns_libretiny.cpp +4 -2
  205. esphome/components/mdns/mdns_rp2040.cpp +4 -2
  206. esphome/components/media_player/__init__.py +40 -6
  207. esphome/components/micro_wake_word/__init__.py +99 -31
  208. esphome/components/micro_wake_word/automation.h +54 -0
  209. esphome/components/micro_wake_word/micro_wake_word.cpp +331 -319
  210. esphome/components/micro_wake_word/micro_wake_word.h +58 -105
  211. esphome/components/micro_wake_word/preprocessor_settings.h +19 -2
  212. esphome/components/micro_wake_word/streaming_model.cpp +158 -41
  213. esphome/components/micro_wake_word/streaming_model.h +85 -13
  214. esphome/components/microphone/__init__.py +139 -9
  215. esphome/components/microphone/automation.h +14 -2
  216. esphome/components/microphone/microphone.cpp +21 -0
  217. esphome/components/microphone/microphone.h +14 -5
  218. esphome/components/microphone/microphone_source.cpp +95 -0
  219. esphome/components/microphone/microphone_source.h +80 -0
  220. esphome/components/mics_4514/sensor.py +25 -14
  221. esphome/components/midea/climate.py +3 -4
  222. esphome/components/midea_ir/climate.py +3 -5
  223. esphome/components/mipi_spi/__init__.py +15 -0
  224. esphome/components/mipi_spi/display.py +474 -0
  225. esphome/components/mipi_spi/mipi_spi.cpp +481 -0
  226. esphome/components/mipi_spi/mipi_spi.h +171 -0
  227. esphome/components/mipi_spi/models/__init__.py +65 -0
  228. esphome/components/mipi_spi/models/amoled.py +72 -0
  229. esphome/components/mipi_spi/models/commands.py +82 -0
  230. esphome/components/mipi_spi/models/cyd.py +10 -0
  231. esphome/components/mipi_spi/models/ili.py +749 -0
  232. esphome/components/mipi_spi/models/jc.py +260 -0
  233. esphome/components/mipi_spi/models/lanbon.py +15 -0
  234. esphome/components/mipi_spi/models/lilygo.py +60 -0
  235. esphome/components/mipi_spi/models/waveshare.py +139 -0
  236. esphome/components/mitsubishi/climate.py +2 -5
  237. esphome/components/mitsubishi/mitsubishi.cpp +9 -9
  238. esphome/components/mixer/speaker/mixer_speaker.cpp +12 -22
  239. esphome/components/mixer/speaker/mixer_speaker.h +1 -3
  240. esphome/components/mlx90393/sensor.py +5 -0
  241. esphome/components/mlx90393/sensor_mlx90393.cpp +195 -13
  242. esphome/components/mlx90393/sensor_mlx90393.h +21 -4
  243. esphome/components/mqtt/__init__.py +1 -1
  244. esphome/components/mqtt/mqtt_client.cpp +5 -1
  245. esphome/components/mqtt/mqtt_const.h +4 -0
  246. esphome/components/mqtt/mqtt_fan.cpp +39 -0
  247. esphome/components/mqtt/mqtt_fan.h +2 -0
  248. esphome/components/network/__init__.py +1 -1
  249. esphome/components/nextion/base_component.py +17 -16
  250. esphome/components/nextion/display.py +11 -2
  251. esphome/components/nextion/nextion.cpp +39 -1
  252. esphome/components/nextion/nextion.h +50 -0
  253. esphome/components/noblex/climate.py +2 -9
  254. esphome/components/number/__init__.py +12 -9
  255. esphome/components/one_wire/one_wire_bus.cpp +14 -10
  256. esphome/components/one_wire/one_wire_bus.h +14 -8
  257. esphome/components/online_image/bmp_image.cpp +48 -11
  258. esphome/components/online_image/bmp_image.h +2 -0
  259. esphome/components/opentherm/binary_sensor/__init__.py +2 -4
  260. esphome/components/opentherm/number/__init__.py +11 -20
  261. esphome/components/opentherm/sensor/__init__.py +3 -3
  262. esphome/components/opentherm/switch/__init__.py +3 -5
  263. esphome/components/output/lock/__init__.py +11 -9
  264. esphome/components/packages/__init__.py +33 -31
  265. esphome/components/packet_transport/__init__.py +201 -0
  266. esphome/components/packet_transport/binary_sensor.py +19 -0
  267. esphome/components/packet_transport/packet_transport.cpp +534 -0
  268. esphome/components/packet_transport/packet_transport.h +154 -0
  269. esphome/components/packet_transport/sensor.py +19 -0
  270. esphome/components/pca9685/pca9685_output.cpp +2 -1
  271. esphome/components/pid/climate.py +2 -4
  272. esphome/components/pm2005/__init__.py +1 -0
  273. esphome/components/pm2005/pm2005.cpp +123 -0
  274. esphome/components/pm2005/pm2005.h +46 -0
  275. esphome/components/pm2005/sensor.py +86 -0
  276. esphome/components/pmsa003i/pmsa003i.cpp +43 -16
  277. esphome/components/pmsa003i/pmsa003i.h +25 -25
  278. esphome/components/pmsx003/pmsx003.cpp +193 -229
  279. esphome/components/pmsx003/pmsx003.h +51 -33
  280. esphome/components/pmsx003/sensor.py +21 -11
  281. esphome/components/pn7150/pn7150.h +2 -2
  282. esphome/components/pn7160/pn7160.h +2 -2
  283. esphome/components/prometheus/prometheus_handler.cpp +174 -0
  284. esphome/components/prometheus/prometheus_handler.h +17 -0
  285. esphome/components/psram/__init__.py +7 -5
  286. esphome/components/pulse_meter/pulse_meter_sensor.cpp +32 -12
  287. esphome/components/pulse_meter/pulse_meter_sensor.h +5 -5
  288. esphome/components/qspi_dbi/__init__.py +0 -1
  289. esphome/components/qspi_dbi/display.py +2 -1
  290. esphome/components/qspi_dbi/models.py +1 -2
  291. esphome/components/remote_base/__init__.py +91 -0
  292. esphome/components/remote_base/beo4_protocol.cpp +153 -0
  293. esphome/components/remote_base/beo4_protocol.h +43 -0
  294. esphome/components/remote_base/gobox_protocol.cpp +131 -0
  295. esphome/components/remote_base/gobox_protocol.h +54 -0
  296. esphome/components/remote_receiver/remote_receiver_esp32.cpp +16 -9
  297. esphome/components/resampler/speaker/resampler_speaker.cpp +12 -10
  298. esphome/components/resampler/speaker/resampler_speaker.h +1 -1
  299. esphome/components/scd30/sensor.py +2 -3
  300. esphome/components/scd4x/sensor.py +4 -5
  301. esphome/components/sdp3x/sensor.py +2 -1
  302. esphome/components/select/__init__.py +19 -20
  303. esphome/components/sen5x/sensor.py +1 -1
  304. esphome/components/sensor/__init__.py +158 -14
  305. esphome/components/sensor/filter.cpp +23 -0
  306. esphome/components/sensor/filter.h +22 -0
  307. esphome/components/sgp4x/sensor.py +1 -1
  308. esphome/components/sht4x/sht4x.cpp +43 -22
  309. esphome/components/sht4x/sht4x.h +1 -1
  310. esphome/components/sml/text_sensor/__init__.py +4 -6
  311. esphome/components/sound_level/__init__.py +0 -0
  312. esphome/components/sound_level/sensor.py +97 -0
  313. esphome/components/sound_level/sound_level.cpp +194 -0
  314. esphome/components/sound_level/sound_level.h +73 -0
  315. esphome/components/speaker/media_player/__init__.py +4 -8
  316. esphome/components/speaker/media_player/speaker_media_player.cpp +0 -18
  317. esphome/components/speaker/media_player/speaker_media_player.h +0 -11
  318. esphome/components/speaker/speaker.h +4 -7
  319. esphome/components/speed/fan/__init__.py +17 -16
  320. esphome/components/spi/spi.h +11 -1
  321. esphome/components/sprinkler/__init__.py +18 -19
  322. esphome/components/switch/__init__.py +32 -42
  323. esphome/components/syslog/__init__.py +41 -0
  324. esphome/components/syslog/esphome_syslog.cpp +49 -0
  325. esphome/components/syslog/esphome_syslog.h +27 -0
  326. esphome/components/tca9555/tca9555.cpp +11 -6
  327. esphome/components/tcl112/climate.py +2 -9
  328. esphome/components/template/alarm_control_panel/__init__.py +7 -6
  329. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +21 -17
  330. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +2 -1
  331. esphome/components/template/cover/__init__.py +27 -21
  332. esphome/components/template/fan/__init__.py +14 -12
  333. esphome/components/template/lock/__init__.py +20 -25
  334. esphome/components/template/lock/automation.h +18 -0
  335. esphome/components/template/text/__init__.py +4 -3
  336. esphome/components/template/valve/__init__.py +32 -21
  337. esphome/components/template/valve/automation.h +24 -0
  338. esphome/components/text/__init__.py +32 -1
  339. esphome/components/text_sensor/__init__.py +24 -29
  340. esphome/components/thermostat/climate.py +5 -5
  341. esphome/components/time_based/cover.py +17 -16
  342. esphome/components/tm1638/switch/__init__.py +10 -7
  343. esphome/components/tormatic/cover.py +4 -5
  344. esphome/components/toshiba/climate.py +3 -5
  345. esphome/components/touchscreen/touchscreen.cpp +3 -1
  346. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  347. esphome/components/tuya/climate/__init__.py +5 -6
  348. esphome/components/tuya/cover/__init__.py +6 -11
  349. esphome/components/tuya/select/__init__.py +15 -5
  350. esphome/components/tuya/select/tuya_select.cpp +6 -1
  351. esphome/components/tuya/select/tuya_select.h +5 -1
  352. esphome/components/uart/packet_transport/__init__.py +20 -0
  353. esphome/components/uart/packet_transport/uart_transport.cpp +88 -0
  354. esphome/components/uart/packet_transport/uart_transport.h +41 -0
  355. esphome/components/udp/__init__.py +126 -128
  356. esphome/components/udp/automation.h +40 -0
  357. esphome/components/udp/binary_sensor.py +3 -25
  358. esphome/components/udp/packet_transport/__init__.py +29 -0
  359. esphome/components/udp/packet_transport/udp_transport.cpp +36 -0
  360. esphome/components/udp/packet_transport/udp_transport.h +28 -0
  361. esphome/components/udp/sensor.py +3 -25
  362. esphome/components/udp/udp_component.cpp +26 -470
  363. esphome/components/udp/udp_component.h +21 -128
  364. esphome/components/update/__init__.py +31 -1
  365. esphome/components/uponor_smatrix/climate/__init__.py +4 -9
  366. esphome/components/uptime/text_sensor/__init__.py +47 -7
  367. esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +12 -7
  368. esphome/components/uptime/text_sensor/uptime_text_sensor.h +19 -0
  369. esphome/components/valve/__init__.py +34 -3
  370. esphome/components/valve/automation.h +1 -19
  371. esphome/components/vl53l0x/sensor.py +11 -0
  372. esphome/components/vl53l0x/vl53l0x_sensor.cpp +5 -1
  373. esphome/components/vl53l0x/vl53l0x_sensor.h +2 -1
  374. esphome/components/voice_assistant/__init__.py +36 -10
  375. esphome/components/voice_assistant/voice_assistant.cpp +170 -144
  376. esphome/components/voice_assistant/voice_assistant.h +26 -25
  377. esphome/components/waveshare_epaper/display.py +6 -0
  378. esphome/components/waveshare_epaper/waveshare_epaper.cpp +439 -37
  379. esphome/components/waveshare_epaper/waveshare_epaper.h +60 -11
  380. esphome/components/whirlpool/climate.py +3 -5
  381. esphome/components/whynter/climate.py +3 -5
  382. esphome/components/xpt2046/touchscreen/xpt2046.cpp +1 -1
  383. esphome/components/yashima/climate.py +6 -6
  384. esphome/components/zhlt01/climate.py +2 -7
  385. esphome/config_validation.py +38 -58
  386. esphome/const.py +15 -1
  387. esphome/core/__init__.py +2 -0
  388. esphome/core/application.cpp +1 -0
  389. esphome/core/application.h +4 -0
  390. esphome/core/automation.h +4 -3
  391. esphome/core/component.cpp +19 -3
  392. esphome/core/component.h +5 -0
  393. esphome/core/defines.h +23 -17
  394. esphome/core/macros.h +4 -0
  395. esphome/core/scheduler.cpp +3 -0
  396. esphome/cpp_generator.py +6 -2
  397. esphome/dashboard/web_server.py +3 -3
  398. esphome/helpers.py +39 -0
  399. esphome/loader.py +4 -0
  400. esphome/mqtt.py +21 -8
  401. esphome/platformio_api.py +1 -1
  402. esphome/schema_extractors.py +0 -1
  403. esphome/vscode.py +15 -0
  404. esphome/wizard.py +2 -2
  405. esphome/zeroconf.py +7 -3
  406. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/METADATA +10 -11
  407. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/RECORD +411 -352
  408. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/WHEEL +1 -1
  409. esphome/components/esp32_ble/const_esp32c6.h +0 -74
  410. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/entry_points.txt +0 -0
  411. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/licenses/LICENSE +0 -0
  412. {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/top_level.txt +0 -0
@@ -11,9 +11,11 @@ from esphome.const import (
11
11
  CONF_CURRENT_TEMPERATURE_STATE_TOPIC,
12
12
  CONF_CUSTOM_FAN_MODE,
13
13
  CONF_CUSTOM_PRESET,
14
+ CONF_ENTITY_CATEGORY,
14
15
  CONF_FAN_MODE,
15
16
  CONF_FAN_MODE_COMMAND_TOPIC,
16
17
  CONF_FAN_MODE_STATE_TOPIC,
18
+ CONF_ICON,
17
19
  CONF_ID,
18
20
  CONF_MAX_TEMPERATURE,
19
21
  CONF_MIN_TEMPERATURE,
@@ -46,6 +48,7 @@ from esphome.const import (
46
48
  CONF_WEB_SERVER,
47
49
  )
48
50
  from esphome.core import CORE, coroutine_with_priority
51
+ from esphome.cpp_generator import MockObjClass
49
52
  from esphome.cpp_helpers import setup_entity
50
53
 
51
54
  IS_PLATFORM_COMPONENT = True
@@ -151,12 +154,11 @@ ControlTrigger = climate_ns.class_(
151
154
  "ControlTrigger", automation.Trigger.template(ClimateCall.operator("ref"))
152
155
  )
153
156
 
154
- CLIMATE_SCHEMA = (
157
+ _CLIMATE_SCHEMA = (
155
158
  cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA)
156
159
  .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA)
157
160
  .extend(
158
161
  {
159
- cv.GenerateID(): cv.declare_id(Climate),
160
162
  cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTClimateComponent),
161
163
  cv.Optional(CONF_VISUAL, default={}): cv.Schema(
162
164
  {
@@ -245,6 +247,31 @@ CLIMATE_SCHEMA = (
245
247
  )
246
248
 
247
249
 
250
+ def climate_schema(
251
+ class_: MockObjClass,
252
+ *,
253
+ entity_category: str = cv.UNDEFINED,
254
+ icon: str = cv.UNDEFINED,
255
+ ) -> cv.Schema:
256
+ schema = {
257
+ cv.GenerateID(): cv.declare_id(class_),
258
+ }
259
+
260
+ for key, default, validator in [
261
+ (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
262
+ (CONF_ICON, icon, cv.icon),
263
+ ]:
264
+ if default is not cv.UNDEFINED:
265
+ schema[cv.Optional(key, default=default)] = validator
266
+
267
+ return _CLIMATE_SCHEMA.extend(schema)
268
+
269
+
270
+ # Remove before 2025.11.0
271
+ CLIMATE_SCHEMA = climate_schema(Climate)
272
+ CLIMATE_SCHEMA.add_extra(cv.deprecated_schema_constant("climate"))
273
+
274
+
248
275
  async def setup_climate_core_(var, config):
249
276
  await setup_entity(var, config)
250
277
 
@@ -419,6 +446,12 @@ async def register_climate(var, config):
419
446
  await setup_climate_core_(var, config)
420
447
 
421
448
 
449
+ async def new_climate(config, *args):
450
+ var = cg.new_Pvariable(config[CONF_ID], *args)
451
+ await register_climate(var, config)
452
+ return var
453
+
454
+
422
455
  CLIMATE_CONTROL_ACTION_SCHEMA = cv.Schema(
423
456
  {
424
457
  cv.Required(CONF_ID): cv.use_id(Climate),
@@ -20,7 +20,7 @@ enum ClimateMode : uint8_t {
20
20
  CLIMATE_MODE_FAN_ONLY = 4,
21
21
  /// The climate device is set to dry/humidity mode
22
22
  CLIMATE_MODE_DRY = 5,
23
- /** The climate device is adjusting the temperatre dynamically.
23
+ /** The climate device is adjusting the temperature dynamically.
24
24
  * For example, the target temperature can be adjusted based on a schedule, or learned behavior.
25
25
  * The target temperature can't be adjusted when in this mode.
26
26
  */
@@ -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 climare_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.climare_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 = climare_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.climare_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.climare_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),