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
@@ -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),
@@ -0,0 +1,28 @@
1
+ import esphome.codegen as cg
2
+ from esphome.components import binary_sensor
3
+ import esphome.config_validation as cv
4
+
5
+ from .. import cst226_ns
6
+ from ..touchscreen import CST226ButtonListener, CST226Touchscreen
7
+
8
+ CONF_CST226_ID = "cst226_id"
9
+
10
+ CST226Button = cst226_ns.class_(
11
+ "CST226Button",
12
+ binary_sensor.BinarySensor,
13
+ cg.Component,
14
+ CST226ButtonListener,
15
+ cg.Parented.template(CST226Touchscreen),
16
+ )
17
+
18
+ CONFIG_SCHEMA = binary_sensor.binary_sensor_schema(CST226Button).extend(
19
+ {
20
+ cv.GenerateID(CONF_CST226_ID): cv.use_id(CST226Touchscreen),
21
+ }
22
+ )
23
+
24
+
25
+ async def to_code(config):
26
+ var = await binary_sensor.new_binary_sensor(config)
27
+ await cg.register_component(var, config)
28
+ await cg.register_parented(var, config[CONF_CST226_ID])
@@ -0,0 +1,22 @@
1
+ #pragma once
2
+
3
+ #include "esphome/components/binary_sensor/binary_sensor.h"
4
+ #include "../touchscreen/cst226_touchscreen.h"
5
+ #include "esphome/core/helpers.h"
6
+
7
+ namespace esphome {
8
+ namespace cst226 {
9
+
10
+ class CST226Button : public binary_sensor::BinarySensor,
11
+ public Component,
12
+ public CST226ButtonListener,
13
+ public Parented<CST226Touchscreen> {
14
+ public:
15
+ void setup() override;
16
+ void dump_config() override;
17
+
18
+ void update_button(bool state) override;
19
+ };
20
+
21
+ } // namespace cst226
22
+ } // namespace esphome
@@ -0,0 +1,19 @@
1
+ #include "cs226_button.h"
2
+ #include "esphome/core/log.h"
3
+
4
+ namespace esphome {
5
+ namespace cst226 {
6
+
7
+ static const char *const TAG = "CST226.binary_sensor";
8
+
9
+ void CST226Button::setup() {
10
+ this->parent_->register_button_listener(this);
11
+ this->publish_initial_state(false);
12
+ }
13
+
14
+ void CST226Button::dump_config() { LOG_BINARY_SENSOR("", "CST226 Button", this); }
15
+
16
+ void CST226Button::update_button(bool state) { this->publish_state(state); }
17
+
18
+ } // namespace cst226
19
+ } // namespace esphome
@@ -3,8 +3,10 @@
3
3
  namespace esphome {
4
4
  namespace cst226 {
5
5
 
6
+ static const char *const TAG = "cst226.touchscreen";
7
+
6
8
  void CST226Touchscreen::setup() {
7
- esph_log_config(TAG, "Setting up CST226 Touchscreen...");
9
+ ESP_LOGCONFIG(TAG, "Setting up CST226 Touchscreen...");
8
10
  if (this->reset_pin_ != nullptr) {
9
11
  this->reset_pin_->setup();
10
12
  this->reset_pin_->digital_write(true);
@@ -26,6 +28,11 @@ void CST226Touchscreen::update_touches() {
26
28
  return;
27
29
  }
28
30
  this->status_clear_warning();
31
+ if (data[0] == 0x83 && data[1] == 0x17 && data[5] == 0x80) {
32
+ this->update_button_state_(true);
33
+ return;
34
+ }
35
+ this->update_button_state_(false);
29
36
  if (data[6] != 0xAB || data[0] == 0xAB || data[5] == 0x80) {
30
37
  this->skip_update_ = true;
31
38
  return;
@@ -43,13 +50,21 @@ void CST226Touchscreen::update_touches() {
43
50
  int16_t y = (data[index + 2] << 4) | (data[index + 3] & 0x0F);
44
51
  int16_t z = data[index + 4];
45
52
  this->add_raw_touch_position_(id, x, y, z);
46
- esph_log_v(TAG, "Read touch %d: %d/%d", id, x, y);
53
+ ESP_LOGV(TAG, "Read touch %d: %d/%d", id, x, y);
47
54
  index += 5;
48
55
  if (i == 0)
49
56
  index += 2;
50
57
  }
51
58
  }
52
59
 
60
+ bool CST226Touchscreen::read16_(uint16_t addr, uint8_t *data, size_t len) {
61
+ if (this->read_register16(addr, data, len) != i2c::ERROR_OK) {
62
+ ESP_LOGE(TAG, "Read data from 0x%04X failed", addr);
63
+ this->mark_failed();
64
+ return false;
65
+ }
66
+ return true;
67
+ }
53
68
  void CST226Touchscreen::continue_setup_() {
54
69
  uint8_t buffer[8];
55
70
  if (this->interrupt_pin_ != nullptr) {
@@ -58,7 +73,7 @@ void CST226Touchscreen::continue_setup_() {
58
73
  }
59
74
  buffer[0] = 0xD1;
60
75
  if (this->write_register16(0xD1, buffer, 1) != i2c::ERROR_OK) {
61
- esph_log_e(TAG, "Write byte to 0xD1 failed");
76
+ ESP_LOGE(TAG, "Write byte to 0xD1 failed");
62
77
  this->mark_failed();
63
78
  return;
64
79
  }
@@ -66,7 +81,7 @@ void CST226Touchscreen::continue_setup_() {
66
81
  if (this->read16_(0xD204, buffer, 4)) {
67
82
  uint16_t chip_id = buffer[2] + (buffer[3] << 8);
68
83
  uint16_t project_id = buffer[0] + (buffer[1] << 8);
69
- esph_log_config(TAG, "Chip ID %X, project ID %x", chip_id, project_id);
84
+ ESP_LOGCONFIG(TAG, "Chip ID %X, project ID %x", chip_id, project_id);
70
85
  }
71
86
  if (this->x_raw_max_ == 0 || this->y_raw_max_ == 0) {
72
87
  if (this->read16_(0xD1F8, buffer, 4)) {
@@ -80,7 +95,14 @@ void CST226Touchscreen::continue_setup_() {
80
95
  }
81
96
  }
82
97
  this->setup_complete_ = true;
83
- esph_log_config(TAG, "CST226 Touchscreen setup complete");
98
+ ESP_LOGCONFIG(TAG, "CST226 Touchscreen setup complete");
99
+ }
100
+ void CST226Touchscreen::update_button_state_(bool state) {
101
+ if (this->button_touched_ == state)
102
+ return;
103
+ this->button_touched_ = state;
104
+ for (auto *listener : this->button_listeners_)
105
+ listener->update_button(state);
84
106
  }
85
107
 
86
108
  void CST226Touchscreen::dump_config() {
@@ -9,10 +9,13 @@
9
9
  namespace esphome {
10
10
  namespace cst226 {
11
11
 
12
- static const char *const TAG = "cst226.touchscreen";
13
-
14
12
  static const uint8_t CST226_REG_STATUS = 0x00;
15
13
 
14
+ class CST226ButtonListener {
15
+ public:
16
+ virtual void update_button(bool state) = 0;
17
+ };
18
+
16
19
  class CST226Touchscreen : public touchscreen::Touchscreen, public i2c::I2CDevice {
17
20
  public:
18
21
  void setup() override;
@@ -22,22 +25,19 @@ class CST226Touchscreen : public touchscreen::Touchscreen, public i2c::I2CDevice
22
25
  void set_interrupt_pin(InternalGPIOPin *pin) { this->interrupt_pin_ = pin; }
23
26
  void set_reset_pin(GPIOPin *pin) { this->reset_pin_ = pin; }
24
27
  bool can_proceed() override { return this->setup_complete_ || this->is_failed(); }
28
+ void register_button_listener(CST226ButtonListener *listener) { this->button_listeners_.push_back(listener); }
25
29
 
26
30
  protected:
27
- bool read16_(uint16_t addr, uint8_t *data, size_t len) {
28
- if (this->read_register16(addr, data, len) != i2c::ERROR_OK) {
29
- esph_log_e(TAG, "Read data from 0x%04X failed", addr);
30
- this->mark_failed();
31
- return false;
32
- }
33
- return true;
34
- }
31
+ bool read16_(uint16_t addr, uint8_t *data, size_t len);
35
32
  void continue_setup_();
33
+ void update_button_state_(bool state);
36
34
 
37
35
  InternalGPIOPin *interrupt_pin_{};
38
36
  GPIOPin *reset_pin_{};
39
37
  uint8_t chip_id_{};
40
38
  bool setup_complete_{};
39
+ std::vector<CST226ButtonListener *> button_listeners_;
40
+ bool button_touched_{};
41
41
  };
42
42
 
43
43
  } // namespace cst226
@@ -5,7 +5,6 @@ import esphome.config_validation as cv
5
5
  from esphome.const import (
6
6
  CONF_CLOSE_ACTION,
7
7
  CONF_CLOSE_DURATION,
8
- CONF_ID,
9
8
  CONF_MAX_DURATION,
10
9
  CONF_OPEN_ACTION,
11
10
  CONF_OPEN_DURATION,
@@ -30,45 +29,47 @@ CurrentBasedCover = current_based_ns.class_(
30
29
  "CurrentBasedCover", cover.Cover, cg.Component
31
30
  )
32
31
 
33
- CONFIG_SCHEMA = cover.COVER_SCHEMA.extend(
34
- {
35
- cv.GenerateID(): cv.declare_id(CurrentBasedCover),
36
- cv.Required(CONF_STOP_ACTION): automation.validate_automation(single=True),
37
- cv.Required(CONF_OPEN_SENSOR): cv.use_id(sensor.Sensor),
38
- cv.Required(CONF_OPEN_MOVING_CURRENT_THRESHOLD): cv.float_range(
39
- min=0, min_included=False
40
- ),
41
- cv.Optional(CONF_OPEN_OBSTACLE_CURRENT_THRESHOLD): cv.float_range(
42
- min=0, min_included=False
43
- ),
44
- cv.Required(CONF_OPEN_ACTION): automation.validate_automation(single=True),
45
- cv.Required(CONF_OPEN_DURATION): cv.positive_time_period_milliseconds,
46
- cv.Required(CONF_CLOSE_SENSOR): cv.use_id(sensor.Sensor),
47
- cv.Required(CONF_CLOSE_MOVING_CURRENT_THRESHOLD): cv.float_range(
48
- min=0, min_included=False
49
- ),
50
- cv.Optional(CONF_CLOSE_OBSTACLE_CURRENT_THRESHOLD): cv.float_range(
51
- min=0, min_included=False
52
- ),
53
- cv.Required(CONF_CLOSE_ACTION): automation.validate_automation(single=True),
54
- cv.Required(CONF_CLOSE_DURATION): cv.positive_time_period_milliseconds,
55
- cv.Optional(CONF_OBSTACLE_ROLLBACK, default="10%"): cv.percentage,
56
- cv.Optional(CONF_MAX_DURATION): cv.positive_time_period_milliseconds,
57
- cv.Optional(CONF_MALFUNCTION_DETECTION, default=True): cv.boolean,
58
- cv.Optional(CONF_MALFUNCTION_ACTION): automation.validate_automation(
59
- single=True
60
- ),
61
- cv.Optional(
62
- CONF_START_SENSING_DELAY, default="500ms"
63
- ): cv.positive_time_period_milliseconds,
64
- }
65
- ).extend(cv.COMPONENT_SCHEMA)
32
+ CONFIG_SCHEMA = (
33
+ cover.cover_schema(CurrentBasedCover)
34
+ .extend(
35
+ {
36
+ cv.Required(CONF_STOP_ACTION): automation.validate_automation(single=True),
37
+ cv.Required(CONF_OPEN_SENSOR): cv.use_id(sensor.Sensor),
38
+ cv.Required(CONF_OPEN_MOVING_CURRENT_THRESHOLD): cv.float_range(
39
+ min=0, min_included=False
40
+ ),
41
+ cv.Optional(CONF_OPEN_OBSTACLE_CURRENT_THRESHOLD): cv.float_range(
42
+ min=0, min_included=False
43
+ ),
44
+ cv.Required(CONF_OPEN_ACTION): automation.validate_automation(single=True),
45
+ cv.Required(CONF_OPEN_DURATION): cv.positive_time_period_milliseconds,
46
+ cv.Required(CONF_CLOSE_SENSOR): cv.use_id(sensor.Sensor),
47
+ cv.Required(CONF_CLOSE_MOVING_CURRENT_THRESHOLD): cv.float_range(
48
+ min=0, min_included=False
49
+ ),
50
+ cv.Optional(CONF_CLOSE_OBSTACLE_CURRENT_THRESHOLD): cv.float_range(
51
+ min=0, min_included=False
52
+ ),
53
+ cv.Required(CONF_CLOSE_ACTION): automation.validate_automation(single=True),
54
+ cv.Required(CONF_CLOSE_DURATION): cv.positive_time_period_milliseconds,
55
+ cv.Optional(CONF_OBSTACLE_ROLLBACK, default="10%"): cv.percentage,
56
+ cv.Optional(CONF_MAX_DURATION): cv.positive_time_period_milliseconds,
57
+ cv.Optional(CONF_MALFUNCTION_DETECTION, default=True): cv.boolean,
58
+ cv.Optional(CONF_MALFUNCTION_ACTION): automation.validate_automation(
59
+ single=True
60
+ ),
61
+ cv.Optional(
62
+ CONF_START_SENSING_DELAY, default="500ms"
63
+ ): cv.positive_time_period_milliseconds,
64
+ }
65
+ )
66
+ .extend(cv.COMPONENT_SCHEMA)
67
+ )
66
68
 
67
69
 
68
70
  async def to_code(config):
69
- var = cg.new_Pvariable(config[CONF_ID])
71
+ var = await cover.new_cover(config)
70
72
  await cg.register_component(var, config)
71
- await cover.register_cover(var, config)
72
73
 
73
74
  await automation.build_automation(
74
75
  var.get_stop_trigger(), [], config[CONF_STOP_ACTION]
@@ -1,20 +1,13 @@
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
 
8
6
  daikin_ns = cg.esphome_ns.namespace("daikin")
9
7
  DaikinClimate = daikin_ns.class_("DaikinClimate", climate_ir.ClimateIR)
10
8
 
11
- CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
12
- {
13
- cv.GenerateID(): cv.declare_id(DaikinClimate),
14
- }
15
- )
9
+ CONFIG_SCHEMA = climate_ir.climare_ir_with_receiver_schema(DaikinClimate)
16
10
 
17
11
 
18
12
  async def to_code(config):
19
- var = cg.new_Pvariable(config[CONF_ID])
20
- await climate_ir.register_climate_ir(var, config)
13
+ await climate_ir.new_climate_ir(config)
@@ -65,7 +65,7 @@ void DaikinClimate::transmit_state() {
65
65
  transmit.perform();
66
66
  }
67
67
 
68
- uint8_t DaikinClimate::operation_mode_() {
68
+ uint8_t DaikinClimate::operation_mode_() const {
69
69
  uint8_t operating_mode = DAIKIN_MODE_ON;
70
70
  switch (this->mode) {
71
71
  case climate::CLIMATE_MODE_COOL:
@@ -92,9 +92,12 @@ uint8_t DaikinClimate::operation_mode_() {
92
92
  return operating_mode;
93
93
  }
94
94
 
95
- uint16_t DaikinClimate::fan_speed_() {
95
+ uint16_t DaikinClimate::fan_speed_() const {
96
96
  uint16_t fan_speed;
97
97
  switch (this->fan_mode.value()) {
98
+ case climate::CLIMATE_FAN_QUIET:
99
+ fan_speed = DAIKIN_FAN_SILENT << 8;
100
+ break;
98
101
  case climate::CLIMATE_FAN_LOW:
99
102
  fan_speed = DAIKIN_FAN_1 << 8;
100
103
  break;
@@ -126,12 +129,11 @@ uint16_t DaikinClimate::fan_speed_() {
126
129
  return fan_speed;
127
130
  }
128
131
 
129
- uint8_t DaikinClimate::temperature_() {
132
+ uint8_t DaikinClimate::temperature_() const {
130
133
  // Force special temperatures depending on the mode
131
134
  switch (this->mode) {
132
135
  case climate::CLIMATE_MODE_FAN_ONLY:
133
136
  return 0x32;
134
- case climate::CLIMATE_MODE_HEAT_COOL:
135
137
  case climate::CLIMATE_MODE_DRY:
136
138
  return 0xc0;
137
139
  default:
@@ -148,19 +150,25 @@ bool DaikinClimate::parse_state_frame_(const uint8_t frame[]) {
148
150
  if (frame[DAIKIN_STATE_FRAME_SIZE - 1] != checksum)
149
151
  return false;
150
152
  uint8_t mode = frame[5];
153
+ // Temperature is given in degrees celcius * 2
154
+ // only update for states that use the temperature
155
+ uint8_t temperature = frame[6];
151
156
  if (mode & DAIKIN_MODE_ON) {
152
157
  switch (mode & 0xF0) {
153
158
  case DAIKIN_MODE_COOL:
154
159
  this->mode = climate::CLIMATE_MODE_COOL;
160
+ this->target_temperature = static_cast<float>(temperature * 0.5f);
155
161
  break;
156
162
  case DAIKIN_MODE_DRY:
157
163
  this->mode = climate::CLIMATE_MODE_DRY;
158
164
  break;
159
165
  case DAIKIN_MODE_HEAT:
160
166
  this->mode = climate::CLIMATE_MODE_HEAT;
167
+ this->target_temperature = static_cast<float>(temperature * 0.5f);
161
168
  break;
162
169
  case DAIKIN_MODE_AUTO:
163
170
  this->mode = climate::CLIMATE_MODE_HEAT_COOL;
171
+ this->target_temperature = static_cast<float>(temperature * 0.5f);
164
172
  break;
165
173
  case DAIKIN_MODE_FAN:
166
174
  this->mode = climate::CLIMATE_MODE_FAN_ONLY;
@@ -169,10 +177,6 @@ bool DaikinClimate::parse_state_frame_(const uint8_t frame[]) {
169
177
  } else {
170
178
  this->mode = climate::CLIMATE_MODE_OFF;
171
179
  }
172
- uint8_t temperature = frame[6];
173
- if (!(temperature & 0xC0)) {
174
- this->target_temperature = temperature >> 1;
175
- }
176
180
  uint8_t fan_mode = frame[8];
177
181
  uint8_t swing_mode = frame[9];
178
182
  if (fan_mode & 0xF && swing_mode & 0xF) {
@@ -187,7 +191,6 @@ bool DaikinClimate::parse_state_frame_(const uint8_t frame[]) {
187
191
  switch (fan_mode & 0xF0) {
188
192
  case DAIKIN_FAN_1:
189
193
  case DAIKIN_FAN_2:
190
- case DAIKIN_FAN_SILENT:
191
194
  this->fan_mode = climate::CLIMATE_FAN_LOW;
192
195
  break;
193
196
  case DAIKIN_FAN_3:
@@ -200,6 +203,9 @@ bool DaikinClimate::parse_state_frame_(const uint8_t frame[]) {
200
203
  case DAIKIN_FAN_AUTO:
201
204
  this->fan_mode = climate::CLIMATE_FAN_AUTO;
202
205
  break;
206
+ case DAIKIN_FAN_SILENT:
207
+ this->fan_mode = climate::CLIMATE_FAN_QUIET;
208
+ break;
203
209
  }
204
210
  this->publish_state();
205
211
  return true;
@@ -44,17 +44,17 @@ class DaikinClimate : public climate_ir::ClimateIR {
44
44
  public:
45
45
  DaikinClimate()
46
46
  : climate_ir::ClimateIR(DAIKIN_TEMP_MIN, DAIKIN_TEMP_MAX, 1.0f, true, true,
47
- {climate::CLIMATE_FAN_AUTO, climate::CLIMATE_FAN_LOW, climate::CLIMATE_FAN_MEDIUM,
48
- climate::CLIMATE_FAN_HIGH},
47
+ {climate::CLIMATE_FAN_QUIET, climate::CLIMATE_FAN_AUTO, climate::CLIMATE_FAN_LOW,
48
+ climate::CLIMATE_FAN_MEDIUM, climate::CLIMATE_FAN_HIGH},
49
49
  {climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL,
50
50
  climate::CLIMATE_SWING_HORIZONTAL, climate::CLIMATE_SWING_BOTH}) {}
51
51
 
52
52
  protected:
53
53
  // Transmit via IR the state of this climate controller.
54
54
  void transmit_state() override;
55
- uint8_t operation_mode_();
56
- uint16_t fan_speed_();
57
- uint8_t temperature_();
55
+ uint8_t operation_mode_() const;
56
+ uint16_t fan_speed_() const;
57
+ uint8_t temperature_() const;
58
58
  // Handle received IR Buffer
59
59
  bool on_receive(remote_base::RemoteReceiveData data) override;
60
60
  bool parse_state_frame_(const uint8_t frame[]);
@@ -1,18 +1,13 @@
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
 
8
6
  daikin_arc_ns = cg.esphome_ns.namespace("daikin_arc")
9
7
  DaikinArcClimate = daikin_arc_ns.class_("DaikinArcClimate", climate_ir.ClimateIR)
10
8
 
11
- CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
12
- {cv.GenerateID(): cv.declare_id(DaikinArcClimate)}
13
- )
9
+ CONFIG_SCHEMA = climate_ir.climare_ir_with_receiver_schema(DaikinArcClimate)
14
10
 
15
11
 
16
12
  async def to_code(config):
17
- var = cg.new_Pvariable(config[CONF_ID])
18
- await climate_ir.register_climate_ir(var, config)
13
+ await climate_ir.new_climate_ir(config)
@@ -1,7 +1,7 @@
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, CONF_USE_FAHRENHEIT
4
+ from esphome.const import CONF_USE_FAHRENHEIT
5
5
 
6
6
  AUTO_LOAD = ["climate_ir"]
7
7
 
@@ -9,15 +9,13 @@ daikin_brc_ns = cg.esphome_ns.namespace("daikin_brc")
9
9
  DaikinBrcClimate = daikin_brc_ns.class_("DaikinBrcClimate", climate_ir.ClimateIR)
10
10
 
11
11
 
12
- CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
12
+ CONFIG_SCHEMA = climate_ir.climare_ir_with_receiver_schema(DaikinBrcClimate).extend(
13
13
  {
14
- cv.GenerateID(): cv.declare_id(DaikinBrcClimate),
15
14
  cv.Optional(CONF_USE_FAHRENHEIT, default=False): cv.boolean,
16
15
  }
17
16
  )
18
17
 
19
18
 
20
19
  async def to_code(config):
21
- var = cg.new_Pvariable(config[CONF_ID])
22
- await climate_ir.register_climate_ir(var, config)
20
+ var = await climate_ir.new_climate_ir(config)
23
21
  cg.add(var.set_fahrenheit(config[CONF_USE_FAHRENHEIT]))
@@ -56,21 +56,13 @@ void DallasTemperatureSensor::update() {
56
56
  });
57
57
  }
58
58
 
59
- void IRAM_ATTR DallasTemperatureSensor::read_scratch_pad_int_() {
60
- for (uint8_t &i : this->scratch_pad_) {
61
- i = this->bus_->read8();
62
- }
63
- }
64
-
65
59
  bool DallasTemperatureSensor::read_scratch_pad_() {
66
- bool success;
67
- {
68
- InterruptLock lock;
69
- success = this->send_command_(DALLAS_COMMAND_READ_SCRATCH_PAD);
70
- if (success)
71
- this->read_scratch_pad_int_();
72
- }
73
- if (!success) {
60
+ bool success = this->send_command_(DALLAS_COMMAND_READ_SCRATCH_PAD);
61
+ if (success) {
62
+ for (uint8_t &i : this->scratch_pad_) {
63
+ i = this->bus_->read8();
64
+ }
65
+ } else {
74
66
  ESP_LOGW(TAG, "'%s' - reading scratch pad failed bus reset", this->get_name().c_str());
75
67
  this->status_set_warning("bus reset failed");
76
68
  }
@@ -113,17 +105,14 @@ void DallasTemperatureSensor::setup() {
113
105
  return;
114
106
  this->scratch_pad_[4] = res;
115
107
 
116
- {
117
- InterruptLock lock;
118
- if (this->send_command_(DALLAS_COMMAND_WRITE_SCRATCH_PAD)) {
119
- this->bus_->write8(this->scratch_pad_[2]); // high alarm temp
120
- this->bus_->write8(this->scratch_pad_[3]); // low alarm temp
121
- this->bus_->write8(this->scratch_pad_[4]); // resolution
122
- }
123
-
124
- // write value to EEPROM
125
- this->send_command_(DALLAS_COMMAND_COPY_SCRATCH_PAD);
108
+ if (this->send_command_(DALLAS_COMMAND_WRITE_SCRATCH_PAD)) {
109
+ this->bus_->write8(this->scratch_pad_[2]); // high alarm temp
110
+ this->bus_->write8(this->scratch_pad_[3]); // low alarm temp
111
+ this->bus_->write8(this->scratch_pad_[4]); // resolution
126
112
  }
113
+
114
+ // write value to EEPROM
115
+ this->send_command_(DALLAS_COMMAND_COPY_SCRATCH_PAD);
127
116
  }
128
117
 
129
118
  bool DallasTemperatureSensor::check_scratch_pad_() {
@@ -138,6 +127,10 @@ bool DallasTemperatureSensor::check_scratch_pad_() {
138
127
  if (!chksum_validity) {
139
128
  ESP_LOGW(TAG, "'%s' - Scratch pad checksum invalid!", this->get_name().c_str());
140
129
  this->status_set_warning("scratch pad checksum invalid");
130
+ ESP_LOGD(TAG, "Scratch pad: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X (%02X)", this->scratch_pad_[0],
131
+ this->scratch_pad_[1], this->scratch_pad_[2], this->scratch_pad_[3], this->scratch_pad_[4],
132
+ this->scratch_pad_[5], this->scratch_pad_[6], this->scratch_pad_[7], this->scratch_pad_[8],
133
+ crc8(this->scratch_pad_, 8));
141
134
  }
142
135
  return chksum_validity;
143
136
  }
@@ -23,7 +23,6 @@ class DallasTemperatureSensor : public PollingComponent, public sensor::Sensor,
23
23
  /// Get the number of milliseconds we have to wait for the conversion phase.
24
24
  uint16_t millis_to_wait_for_conversion_() const;
25
25
  bool read_scratch_pad_();
26
- void read_scratch_pad_int_();
27
26
  bool check_scratch_pad_();
28
27
  float get_temp_c_();
29
28
  };
@@ -1,6 +1,7 @@
1
1
  #include "debug_component.h"
2
2
 
3
3
  #include <algorithm>
4
+ #include "esphome/core/application.h"
4
5
  #include "esphome/core/log.h"
5
6
  #include "esphome/core/hal.h"
6
7
  #include "esphome/core/helpers.h"
@@ -25,6 +26,7 @@ void DebugComponent::dump_config() {
25
26
  #ifdef USE_SENSOR
26
27
  LOG_SENSOR(" ", "Free space on heap", this->free_sensor_);
27
28
  LOG_SENSOR(" ", "Largest free heap block", this->block_sensor_);
29
+ LOG_SENSOR(" ", "CPU frequency", this->cpu_frequency_sensor_);
28
30
  #if defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
29
31
  LOG_SENSOR(" ", "Heap fragmentation", this->fragmentation_sensor_);
30
32
  #endif // defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
@@ -86,6 +88,9 @@ void DebugComponent::update() {
86
88
  this->loop_time_sensor_->publish_state(this->max_loop_time_);
87
89
  this->max_loop_time_ = 0;
88
90
  }
91
+ if (this->cpu_frequency_sensor_ != nullptr) {
92
+ this->cpu_frequency_sensor_->publish_state(arch_get_cpu_freq_hz());
93
+ }
89
94
 
90
95
  #endif // USE_SENSOR
91
96
  update_platform_();