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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. esphome/__main__.py +16 -14
  2. esphome/components/ac_dimmer/ac_dimmer.cpp +3 -2
  3. esphome/components/adc/__init__.py +51 -34
  4. esphome/components/airthings_wave_base/__init__.py +1 -1
  5. esphome/components/alarm_control_panel/__init__.py +37 -2
  6. esphome/components/am43/cover/__init__.py +4 -5
  7. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +6 -4
  8. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +4 -5
  9. esphome/components/analog_threshold/binary_sensor.py +10 -8
  10. esphome/components/anova/climate.py +4 -5
  11. esphome/components/api/__init__.py +25 -8
  12. esphome/components/api/api_connection.cpp +416 -662
  13. esphome/components/api/api_connection.h +256 -57
  14. esphome/components/api/api_frame_helper.cpp +232 -177
  15. esphome/components/api/api_frame_helper.h +61 -8
  16. esphome/components/api/api_noise_context.h +13 -4
  17. esphome/components/api/api_pb2.cpp +1422 -1
  18. esphome/components/api/api_pb2.h +255 -1
  19. esphome/components/api/api_pb2_service.cpp +162 -49
  20. esphome/components/api/api_pb2_service.h +90 -51
  21. esphome/components/api/api_pb2_size.h +361 -0
  22. esphome/components/api/api_server.cpp +110 -34
  23. esphome/components/api/api_server.h +8 -0
  24. esphome/components/api/proto.h +86 -17
  25. esphome/components/as7341/as7341.h +1 -1
  26. esphome/components/at581x/at581x.h +4 -4
  27. esphome/components/atm90e32/__init__.py +1 -0
  28. esphome/components/atm90e32/atm90e32.cpp +576 -199
  29. esphome/components/atm90e32/atm90e32.h +128 -31
  30. esphome/components/atm90e32/atm90e32_reg.h +4 -2
  31. esphome/components/atm90e32/button/__init__.py +62 -10
  32. esphome/components/atm90e32/button/atm90e32_button.cpp +63 -4
  33. esphome/components/atm90e32/button/atm90e32_button.h +36 -4
  34. esphome/components/atm90e32/number/__init__.py +130 -0
  35. esphome/components/atm90e32/number/atm90e32_number.h +16 -0
  36. esphome/components/atm90e32/sensor.py +21 -4
  37. esphome/components/atm90e32/text_sensor/__init__.py +48 -0
  38. esphome/components/audio/__init__.py +96 -49
  39. esphome/components/audio/audio.h +48 -0
  40. esphome/components/audio/audio_decoder.cpp +1 -1
  41. esphome/components/audio/audio_resampler.cpp +2 -0
  42. esphome/components/audio/audio_resampler.h +1 -0
  43. esphome/components/ballu/climate.py +2 -9
  44. esphome/components/bang_bang/climate.py +5 -6
  45. esphome/components/bedjet/bedjet_hub.cpp +1 -0
  46. esphome/components/bedjet/climate/__init__.py +3 -8
  47. esphome/components/bedjet/fan/__init__.py +2 -11
  48. esphome/components/binary/fan/__init__.py +13 -16
  49. esphome/components/binary_sensor/__init__.py +13 -10
  50. esphome/components/bl0906/constants.h +16 -16
  51. esphome/components/ble_client/text_sensor/__init__.py +3 -5
  52. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +4 -6
  53. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +136 -21
  54. esphome/components/bluetooth_proxy/bluetooth_proxy.h +7 -0
  55. esphome/components/button/__init__.py +11 -8
  56. esphome/components/canbus/canbus.cpp +3 -0
  57. esphome/components/canbus/canbus.h +16 -0
  58. esphome/components/ccs811/sensor.py +9 -6
  59. esphome/components/climate/__init__.py +35 -2
  60. esphome/components/climate/climate_mode.h +1 -1
  61. esphome/components/climate/climate_traits.h +63 -57
  62. esphome/components/climate_ir/__init__.py +57 -17
  63. esphome/components/climate_ir_lg/climate.py +2 -5
  64. esphome/components/climate_ir_lg/climate_ir_lg.cpp +7 -7
  65. esphome/components/climate_ir_lg/climate_ir_lg.h +1 -1
  66. esphome/components/color/__init__.py +2 -0
  67. esphome/components/const/__init__.py +5 -0
  68. esphome/components/coolix/climate.py +2 -9
  69. esphome/components/copy/cover/__init__.py +10 -9
  70. esphome/components/copy/fan/__init__.py +11 -9
  71. esphome/components/copy/lock/__init__.py +11 -9
  72. esphome/components/copy/text/__init__.py +9 -6
  73. esphome/components/cover/__init__.py +37 -2
  74. esphome/components/cse7766/cse7766.cpp +2 -1
  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/current_based/current_based_cover.cpp +2 -1
  82. esphome/components/daikin/climate.py +2 -9
  83. esphome/components/daikin/daikin.cpp +15 -9
  84. esphome/components/daikin/daikin.h +5 -5
  85. esphome/components/daikin_arc/climate.py +2 -7
  86. esphome/components/daikin_brc/climate.py +3 -5
  87. esphome/components/dallas_temp/dallas_temp.cpp +17 -24
  88. esphome/components/dallas_temp/dallas_temp.h +0 -1
  89. esphome/components/daly_bms/daly_bms.cpp +2 -1
  90. esphome/components/debug/debug_component.cpp +6 -1
  91. esphome/components/debug/debug_component.h +8 -0
  92. esphome/components/debug/debug_esp32.cpp +109 -254
  93. esphome/components/debug/sensor.py +14 -0
  94. esphome/components/deep_sleep/deep_sleep_esp32.cpp +13 -1
  95. esphome/components/delonghi/climate.py +2 -9
  96. esphome/components/demo/__init__.py +18 -20
  97. esphome/components/dfrobot_sen0395/switch/__init__.py +21 -22
  98. esphome/components/dps310/sensor.py +6 -6
  99. esphome/components/ee895/sensor.py +9 -9
  100. esphome/components/emmeti/climate.py +2 -9
  101. esphome/components/endstop/cover.py +17 -16
  102. esphome/components/endstop/endstop_cover.cpp +2 -1
  103. esphome/components/ens160_base/__init__.py +12 -9
  104. esphome/components/esp32/__init__.py +60 -3
  105. esphome/components/esp32/core.cpp +11 -5
  106. esphome/components/esp32/gpio.cpp +86 -24
  107. esphome/components/esp32/gpio.py +15 -16
  108. esphome/components/esp32/gpio_esp32.py +1 -2
  109. esphome/components/esp32/gpio_esp32_c2.py +1 -1
  110. esphome/components/esp32/gpio_esp32_c3.py +1 -1
  111. esphome/components/esp32/gpio_esp32_c6.py +1 -1
  112. esphome/components/esp32/gpio_esp32_h2.py +1 -1
  113. esphome/components/esp32_ble/ble.cpp +1 -0
  114. esphome/components/esp32_ble/ble.h +5 -3
  115. esphome/components/esp32_ble/ble_advertising.cpp +2 -1
  116. esphome/components/esp32_ble/ble_advertising.h +1 -0
  117. esphome/components/esp32_ble_server/__init__.py +3 -0
  118. esphome/components/esp32_ble_tracker/__init__.py +7 -1
  119. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +192 -118
  120. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +29 -3
  121. esphome/components/esp32_camera/__init__.py +1 -1
  122. esphome/components/esp32_camera/esp32_camera.cpp +2 -10
  123. esphome/components/esp32_camera/esp32_camera.h +1 -1
  124. esphome/components/esp32_can/esp32_can.cpp +1 -1
  125. esphome/components/esp32_improv/esp32_improv_component.cpp +1 -1
  126. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -1
  127. esphome/components/esp32_rmt_led_strip/led_strip.h +7 -5
  128. esphome/components/esp32_rmt_led_strip/light.py +9 -1
  129. esphome/components/esp32_touch/esp32_touch.cpp +1 -1
  130. esphome/components/esp8266/gpio.cpp +69 -8
  131. esphome/components/ethernet/ethernet_component.cpp +1 -1
  132. esphome/components/event/__init__.py +13 -10
  133. esphome/components/factory_reset/switch/__init__.py +7 -21
  134. esphome/components/fan/__init__.py +52 -5
  135. esphome/components/fastled_base/__init__.py +1 -4
  136. esphome/components/fastled_base/fastled_light.cpp +1 -1
  137. esphome/components/feedback/cover.py +38 -33
  138. esphome/components/feedback/feedback_cover.cpp +2 -1
  139. esphome/components/fujitsu_general/climate.py +2 -9
  140. esphome/components/gcja5/gcja5.cpp +2 -1
  141. esphome/components/gpio/one_wire/gpio_one_wire.cpp +45 -43
  142. esphome/components/gpio/one_wire/gpio_one_wire.h +2 -1
  143. esphome/components/gpio_expander/cached_gpio.h +22 -7
  144. esphome/components/gps/__init__.py +47 -17
  145. esphome/components/gps/gps.cpp +42 -23
  146. esphome/components/gps/gps.h +17 -13
  147. esphome/components/graph/__init__.py +1 -2
  148. esphome/components/gree/climate.py +4 -6
  149. esphome/components/gree/gree.cpp +16 -2
  150. esphome/components/gree/gree.h +2 -2
  151. esphome/components/growatt_solar/growatt_solar.cpp +2 -1
  152. esphome/components/haier/climate.py +37 -34
  153. esphome/components/hbridge/fan/__init__.py +19 -17
  154. esphome/components/he60r/cover.py +4 -5
  155. esphome/components/heatpumpir/climate.py +3 -6
  156. esphome/components/hitachi_ac344/climate.py +2 -9
  157. esphome/components/hitachi_ac424/climate.py +2 -9
  158. esphome/components/hm3301/hm3301.h +1 -1
  159. esphome/components/hte501/sensor.py +6 -6
  160. esphome/components/http_request/__init__.py +39 -6
  161. esphome/components/http_request/http_request.cpp +20 -0
  162. esphome/components/http_request/http_request.h +57 -15
  163. esphome/components/http_request/http_request_arduino.cpp +22 -6
  164. esphome/components/http_request/http_request_arduino.h +4 -3
  165. esphome/components/http_request/http_request_host.cpp +141 -0
  166. esphome/components/http_request/http_request_host.h +37 -0
  167. esphome/components/http_request/http_request_idf.cpp +35 -3
  168. esphome/components/http_request/http_request_idf.h +10 -3
  169. esphome/components/http_request/httplib.h +9691 -0
  170. esphome/components/http_request/update/__init__.py +11 -8
  171. esphome/components/hyt271/sensor.py +6 -6
  172. esphome/components/i2c/i2c.h +4 -0
  173. esphome/components/i2c/i2c_bus_esp_idf.cpp +1 -1
  174. esphome/components/i2s_audio/__init__.py +131 -22
  175. esphome/components/i2s_audio/i2s_audio.h +44 -4
  176. esphome/components/i2s_audio/media_player/__init__.py +19 -9
  177. esphome/components/i2s_audio/microphone/__init__.py +63 -5
  178. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +351 -61
  179. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +40 -6
  180. esphome/components/i2s_audio/speaker/__init__.py +31 -5
  181. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +155 -19
  182. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +17 -4
  183. esphome/components/ili9xxx/ili9xxx_init.h +1 -1
  184. esphome/components/image/__init__.py +37 -17
  185. esphome/components/image/image.cpp +25 -8
  186. esphome/components/internal_temperature/internal_temperature.cpp +6 -4
  187. esphome/components/key_collector/__init__.py +35 -0
  188. esphome/components/key_collector/key_collector.cpp +8 -0
  189. esphome/components/key_collector/key_collector.h +10 -0
  190. esphome/components/kuntze/kuntze.cpp +2 -1
  191. esphome/components/ld2410/ld2410.h +1 -1
  192. esphome/components/ld2450/ld2450.h +1 -1
  193. esphome/components/light/__init__.py +57 -0
  194. esphome/components/lock/__init__.py +51 -4
  195. esphome/components/lock/automation.h +2 -13
  196. esphome/components/logger/__init__.py +22 -0
  197. esphome/components/logger/logger.cpp +154 -103
  198. esphome/components/logger/logger.h +211 -36
  199. esphome/components/logger/task_log_buffer.cpp +138 -0
  200. esphome/components/logger/task_log_buffer.h +69 -0
  201. esphome/components/lvgl/__init__.py +13 -5
  202. esphome/components/lvgl/automation.py +50 -1
  203. esphome/components/lvgl/defines.py +0 -1
  204. esphome/components/lvgl/lvgl_esphome.cpp +5 -1
  205. esphome/components/lvgl/text/__init__.py +1 -2
  206. esphome/components/mapping/__init__.py +134 -0
  207. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -1
  208. esphome/components/max7219digit/max7219digit.cpp +28 -27
  209. esphome/components/mdns/__init__.py +11 -5
  210. esphome/components/mdns/mdns_component.cpp +11 -5
  211. esphome/components/mdns/mdns_component.h +3 -2
  212. esphome/components/mdns/mdns_esp32.cpp +4 -3
  213. esphome/components/mdns/mdns_esp8266.cpp +4 -2
  214. esphome/components/mdns/mdns_libretiny.cpp +4 -2
  215. esphome/components/mdns/mdns_rp2040.cpp +4 -2
  216. esphome/components/media_player/__init__.py +33 -1
  217. esphome/components/mhz19/sensor.py +11 -7
  218. esphome/components/micro_wake_word/__init__.py +99 -31
  219. esphome/components/micro_wake_word/automation.h +54 -0
  220. esphome/components/micro_wake_word/micro_wake_word.cpp +331 -319
  221. esphome/components/micro_wake_word/micro_wake_word.h +58 -105
  222. esphome/components/micro_wake_word/preprocessor_settings.h +19 -2
  223. esphome/components/micro_wake_word/streaming_model.cpp +158 -41
  224. esphome/components/micro_wake_word/streaming_model.h +85 -13
  225. esphome/components/microphone/__init__.py +139 -9
  226. esphome/components/microphone/automation.h +14 -2
  227. esphome/components/microphone/microphone.cpp +21 -0
  228. esphome/components/microphone/microphone.h +14 -5
  229. esphome/components/microphone/microphone_source.cpp +95 -0
  230. esphome/components/microphone/microphone_source.h +80 -0
  231. esphome/components/mics_4514/sensor.py +25 -14
  232. esphome/components/midea/climate.py +3 -4
  233. esphome/components/midea_ir/climate.py +3 -5
  234. esphome/components/mipi_spi/__init__.py +15 -0
  235. esphome/components/mipi_spi/display.py +474 -0
  236. esphome/components/mipi_spi/mipi_spi.cpp +481 -0
  237. esphome/components/mipi_spi/mipi_spi.h +171 -0
  238. esphome/components/mipi_spi/models/__init__.py +65 -0
  239. esphome/components/mipi_spi/models/amoled.py +72 -0
  240. esphome/components/mipi_spi/models/commands.py +82 -0
  241. esphome/components/mipi_spi/models/cyd.py +10 -0
  242. esphome/components/mipi_spi/models/ili.py +749 -0
  243. esphome/components/mipi_spi/models/jc.py +260 -0
  244. esphome/components/mipi_spi/models/lanbon.py +15 -0
  245. esphome/components/mipi_spi/models/lilygo.py +60 -0
  246. esphome/components/mipi_spi/models/waveshare.py +139 -0
  247. esphome/components/mitsubishi/climate.py +2 -5
  248. esphome/components/mitsubishi/mitsubishi.cpp +9 -9
  249. esphome/components/mixer/speaker/mixer_speaker.cpp +12 -22
  250. esphome/components/mixer/speaker/mixer_speaker.h +1 -3
  251. esphome/components/mlx90393/sensor.py +5 -0
  252. esphome/components/mlx90393/sensor_mlx90393.cpp +195 -13
  253. esphome/components/mlx90393/sensor_mlx90393.h +21 -4
  254. esphome/components/modbus/modbus.cpp +2 -1
  255. esphome/components/mqtt/__init__.py +1 -1
  256. esphome/components/mqtt/mqtt_client.cpp +6 -2
  257. esphome/components/mqtt/mqtt_const.h +4 -0
  258. esphome/components/mqtt/mqtt_fan.cpp +39 -0
  259. esphome/components/mqtt/mqtt_fan.h +2 -0
  260. esphome/components/ms5611/sensor.py +6 -6
  261. esphome/components/ms8607/sensor.py +3 -3
  262. esphome/components/network/__init__.py +1 -1
  263. esphome/components/nextion/base_component.py +17 -16
  264. esphome/components/nextion/display.py +11 -2
  265. esphome/components/nextion/nextion.cpp +39 -1
  266. esphome/components/nextion/nextion.h +50 -0
  267. esphome/components/noblex/climate.py +2 -9
  268. esphome/components/number/__init__.py +12 -9
  269. esphome/components/one_wire/one_wire_bus.cpp +14 -10
  270. esphome/components/one_wire/one_wire_bus.h +14 -8
  271. esphome/components/online_image/bmp_image.cpp +48 -11
  272. esphome/components/online_image/bmp_image.h +2 -0
  273. esphome/components/opentherm/binary_sensor/__init__.py +2 -4
  274. esphome/components/opentherm/number/__init__.py +11 -20
  275. esphome/components/opentherm/sensor/__init__.py +3 -3
  276. esphome/components/opentherm/switch/__init__.py +3 -5
  277. esphome/components/output/lock/__init__.py +11 -9
  278. esphome/components/packages/__init__.py +33 -31
  279. esphome/components/packet_transport/__init__.py +201 -0
  280. esphome/components/packet_transport/binary_sensor.py +19 -0
  281. esphome/components/packet_transport/packet_transport.cpp +534 -0
  282. esphome/components/packet_transport/packet_transport.h +154 -0
  283. esphome/components/packet_transport/sensor.py +19 -0
  284. esphome/components/pca9685/pca9685_output.cpp +2 -1
  285. esphome/components/pid/climate.py +2 -4
  286. esphome/components/pm2005/__init__.py +1 -0
  287. esphome/components/pm2005/pm2005.cpp +123 -0
  288. esphome/components/pm2005/pm2005.h +46 -0
  289. esphome/components/pm2005/sensor.py +86 -0
  290. esphome/components/pmsa003i/pmsa003i.cpp +43 -16
  291. esphome/components/pmsa003i/pmsa003i.h +25 -25
  292. esphome/components/pmsx003/pmsx003.cpp +195 -230
  293. esphome/components/pmsx003/pmsx003.h +51 -33
  294. esphome/components/pmsx003/sensor.py +21 -11
  295. esphome/components/pn7150/pn7150.h +2 -2
  296. esphome/components/pn7160/pn7160.h +2 -2
  297. esphome/components/prometheus/prometheus_handler.cpp +174 -0
  298. esphome/components/prometheus/prometheus_handler.h +17 -0
  299. esphome/components/psram/__init__.py +7 -5
  300. esphome/components/pulse_meter/pulse_meter_sensor.cpp +32 -12
  301. esphome/components/pulse_meter/pulse_meter_sensor.h +5 -5
  302. esphome/components/pzem004t/pzem004t.cpp +2 -1
  303. esphome/components/qspi_dbi/__init__.py +0 -1
  304. esphome/components/qspi_dbi/display.py +2 -1
  305. esphome/components/qspi_dbi/models.py +1 -2
  306. esphome/components/remote_base/__init__.py +91 -0
  307. esphome/components/remote_base/beo4_protocol.cpp +153 -0
  308. esphome/components/remote_base/beo4_protocol.h +43 -0
  309. esphome/components/remote_base/gobox_protocol.cpp +131 -0
  310. esphome/components/remote_base/gobox_protocol.h +54 -0
  311. esphome/components/remote_receiver/remote_receiver_esp32.cpp +16 -9
  312. esphome/components/resampler/speaker/resampler_speaker.cpp +12 -10
  313. esphome/components/resampler/speaker/resampler_speaker.h +1 -1
  314. esphome/components/rf_bridge/rf_bridge.cpp +2 -1
  315. esphome/components/scd30/sensor.py +2 -3
  316. esphome/components/scd4x/sensor.py +4 -5
  317. esphome/components/sdp3x/sensor.py +2 -1
  318. esphome/components/sds011/sds011.cpp +2 -1
  319. esphome/components/select/__init__.py +19 -20
  320. esphome/components/sen5x/sen5x.cpp +55 -36
  321. esphome/components/sen5x/sensor.py +1 -1
  322. esphome/components/senseair/sensor.py +3 -3
  323. esphome/components/sensor/__init__.py +158 -14
  324. esphome/components/sensor/filter.cpp +23 -0
  325. esphome/components/sensor/filter.h +22 -0
  326. esphome/components/sgp30/sensor.py +14 -16
  327. esphome/components/sgp4x/sensor.py +1 -1
  328. esphome/components/sht4x/sht4x.cpp +43 -22
  329. esphome/components/sht4x/sht4x.h +1 -1
  330. esphome/components/shtcx/sensor.py +6 -6
  331. esphome/components/slow_pwm/slow_pwm_output.cpp +2 -1
  332. esphome/components/sml/text_sensor/__init__.py +4 -6
  333. esphome/components/sound_level/__init__.py +0 -0
  334. esphome/components/sound_level/sensor.py +97 -0
  335. esphome/components/sound_level/sound_level.cpp +194 -0
  336. esphome/components/sound_level/sound_level.h +73 -0
  337. esphome/components/speaker/media_player/__init__.py +4 -8
  338. esphome/components/speaker/media_player/speaker_media_player.cpp +0 -18
  339. esphome/components/speaker/media_player/speaker_media_player.h +0 -11
  340. esphome/components/speaker/speaker.h +4 -7
  341. esphome/components/speed/fan/__init__.py +17 -16
  342. esphome/components/spi/spi.h +11 -1
  343. esphome/components/sprinkler/__init__.py +18 -19
  344. esphome/components/sprinkler/sprinkler.cpp +6 -5
  345. esphome/components/switch/__init__.py +32 -42
  346. esphome/components/syslog/__init__.py +41 -0
  347. esphome/components/syslog/esphome_syslog.cpp +49 -0
  348. esphome/components/syslog/esphome_syslog.h +27 -0
  349. esphome/components/t6615/sensor.py +3 -3
  350. esphome/components/t6615/t6615.cpp +2 -1
  351. esphome/components/tca9555/tca9555.cpp +11 -6
  352. esphome/components/tcl112/climate.py +2 -9
  353. esphome/components/template/alarm_control_panel/__init__.py +7 -6
  354. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +21 -17
  355. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +2 -1
  356. esphome/components/template/cover/__init__.py +27 -21
  357. esphome/components/template/fan/__init__.py +14 -12
  358. esphome/components/template/lock/__init__.py +20 -25
  359. esphome/components/template/lock/automation.h +18 -0
  360. esphome/components/template/text/__init__.py +4 -3
  361. esphome/components/template/valve/__init__.py +32 -21
  362. esphome/components/template/valve/automation.h +24 -0
  363. esphome/components/text/__init__.py +32 -1
  364. esphome/components/text_sensor/__init__.py +24 -29
  365. esphome/components/thermostat/climate.py +5 -5
  366. esphome/components/time_based/cover.py +17 -16
  367. esphome/components/time_based/time_based_cover.cpp +2 -1
  368. esphome/components/tm1638/switch/__init__.py +10 -7
  369. esphome/components/tormatic/cover.py +4 -5
  370. esphome/components/toshiba/climate.py +3 -5
  371. esphome/components/touchscreen/touchscreen.cpp +3 -1
  372. esphome/components/tuya/climate/__init__.py +5 -6
  373. esphome/components/tuya/cover/__init__.py +6 -11
  374. esphome/components/tuya/select/__init__.py +15 -5
  375. esphome/components/tuya/select/tuya_select.cpp +6 -1
  376. esphome/components/tuya/select/tuya_select.h +5 -1
  377. esphome/components/uart/packet_transport/__init__.py +20 -0
  378. esphome/components/uart/packet_transport/uart_transport.cpp +88 -0
  379. esphome/components/uart/packet_transport/uart_transport.h +41 -0
  380. esphome/components/uart/switch/uart_switch.cpp +2 -1
  381. esphome/components/udp/__init__.py +126 -128
  382. esphome/components/udp/automation.h +40 -0
  383. esphome/components/udp/binary_sensor.py +3 -25
  384. esphome/components/udp/packet_transport/__init__.py +29 -0
  385. esphome/components/udp/packet_transport/udp_transport.cpp +36 -0
  386. esphome/components/udp/packet_transport/udp_transport.h +28 -0
  387. esphome/components/udp/sensor.py +3 -25
  388. esphome/components/udp/udp_component.cpp +26 -470
  389. esphome/components/udp/udp_component.h +21 -128
  390. esphome/components/update/__init__.py +31 -1
  391. esphome/components/uponor_smatrix/climate/__init__.py +4 -9
  392. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +2 -1
  393. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  394. esphome/components/uptime/text_sensor/__init__.py +47 -7
  395. esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +12 -7
  396. esphome/components/uptime/text_sensor/uptime_text_sensor.h +19 -0
  397. esphome/components/valve/__init__.py +34 -3
  398. esphome/components/valve/automation.h +1 -19
  399. esphome/components/vl53l0x/sensor.py +11 -0
  400. esphome/components/vl53l0x/vl53l0x_sensor.cpp +5 -1
  401. esphome/components/vl53l0x/vl53l0x_sensor.h +2 -1
  402. esphome/components/voice_assistant/__init__.py +36 -10
  403. esphome/components/voice_assistant/voice_assistant.cpp +170 -144
  404. esphome/components/voice_assistant/voice_assistant.h +26 -25
  405. esphome/components/waveshare_epaper/display.py +6 -0
  406. esphome/components/waveshare_epaper/waveshare_epaper.cpp +439 -37
  407. esphome/components/waveshare_epaper/waveshare_epaper.h +60 -11
  408. esphome/components/weikai/weikai.cpp +0 -52
  409. esphome/components/whirlpool/climate.py +3 -5
  410. esphome/components/whynter/climate.py +3 -5
  411. esphome/components/xpt2046/touchscreen/xpt2046.cpp +1 -1
  412. esphome/components/yashima/climate.py +6 -6
  413. esphome/components/zhlt01/climate.py +2 -7
  414. esphome/config.py +13 -13
  415. esphome/config_validation.py +38 -58
  416. esphome/const.py +15 -1
  417. esphome/core/__init__.py +2 -0
  418. esphome/core/application.cpp +27 -10
  419. esphome/core/application.h +9 -1
  420. esphome/core/automation.h +4 -3
  421. esphome/core/component.cpp +28 -7
  422. esphome/core/component.h +10 -1
  423. esphome/core/defines.h +23 -17
  424. esphome/core/doxygen.h +13 -0
  425. esphome/core/macros.h +4 -0
  426. esphome/core/scheduler.cpp +7 -1
  427. esphome/cpp_generator.py +6 -2
  428. esphome/dashboard/web_server.py +3 -3
  429. esphome/helpers.py +39 -0
  430. esphome/loader.py +4 -0
  431. esphome/log.py +15 -19
  432. esphome/mqtt.py +23 -10
  433. esphome/platformio_api.py +1 -1
  434. esphome/schema_extractors.py +0 -1
  435. esphome/voluptuous_schema.py +3 -1
  436. esphome/vscode.py +15 -0
  437. esphome/wizard.py +47 -37
  438. esphome/zeroconf.py +7 -3
  439. {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/METADATA +10 -11
  440. {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/RECORD +444 -383
  441. {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/WHEEL +1 -1
  442. {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/entry_points.txt +0 -0
  443. {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/licenses/LICENSE +0 -0
  444. {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/top_level.txt +0 -0
@@ -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,6 +1,7 @@
1
1
  #include "current_based_cover.h"
2
2
  #include "esphome/core/hal.h"
3
3
  #include "esphome/core/log.h"
4
+ #include "esphome/core/application.h"
4
5
  #include <cfloat>
5
6
 
6
7
  namespace esphome {
@@ -60,7 +61,7 @@ void CurrentBasedCover::loop() {
60
61
  if (this->current_operation == COVER_OPERATION_IDLE)
61
62
  return;
62
63
 
63
- const uint32_t now = millis();
64
+ const uint32_t now = App.get_loop_component_start_time();
64
65
 
65
66
  if (this->current_operation == COVER_OPERATION_OPENING) {
66
67
  if (this->malfunction_detection_ && this->is_closing_()) { // Malfunction
@@ -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.climate_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.climate_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.climate_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 "daly_bms.h"
2
2
  #include <vector>
3
3
  #include "esphome/core/log.h"
4
+ #include "esphome/core/application.h"
4
5
 
5
6
  namespace esphome {
6
7
  namespace daly_bms {
@@ -32,7 +33,7 @@ void DalyBmsComponent::update() {
32
33
  }
33
34
 
34
35
  void DalyBmsComponent::loop() {
35
- const uint32_t now = millis();
36
+ const uint32_t now = App.get_loop_component_start_time();
36
37
  if (this->receiving_ && (now - this->last_transmission_ >= 200)) {
37
38
  // last transmission too long ago. Reset RX index.
38
39
  ESP_LOGW(TAG, "Last transmission too long ago. Reset RX index.");
@@ -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)
@@ -68,7 +70,7 @@ void DebugComponent::loop() {
68
70
  #ifdef USE_SENSOR
69
71
  // calculate loop time - from last call to this one
70
72
  if (this->loop_time_sensor_ != nullptr) {
71
- uint32_t now = millis();
73
+ uint32_t now = App.get_loop_component_start_time();
72
74
  uint32_t loop_time = now - this->last_loop_timetag_;
73
75
  this->max_loop_time_ = std::max(this->max_loop_time_, loop_time);
74
76
  this->last_loop_timetag_ = now;
@@ -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_();
@@ -36,7 +36,13 @@ class DebugComponent : public PollingComponent {
36
36
  #ifdef USE_ESP32
37
37
  void set_psram_sensor(sensor::Sensor *psram_sensor) { this->psram_sensor_ = psram_sensor; }
38
38
  #endif // USE_ESP32
39
+ void set_cpu_frequency_sensor(sensor::Sensor *cpu_frequency_sensor) {
40
+ this->cpu_frequency_sensor_ = cpu_frequency_sensor;
41
+ }
39
42
  #endif // USE_SENSOR
43
+ #ifdef USE_ESP32
44
+ void on_shutdown() override;
45
+ #endif // USE_ESP32
40
46
  protected:
41
47
  uint32_t free_heap_{};
42
48
 
@@ -53,6 +59,7 @@ class DebugComponent : public PollingComponent {
53
59
  #ifdef USE_ESP32
54
60
  sensor::Sensor *psram_sensor_{nullptr};
55
61
  #endif // USE_ESP32
62
+ sensor::Sensor *cpu_frequency_sensor_{nullptr};
56
63
  #endif // USE_SENSOR
57
64
 
58
65
  #ifdef USE_ESP32
@@ -75,6 +82,7 @@ class DebugComponent : public PollingComponent {
75
82
  #endif // USE_TEXT_SENSOR
76
83
 
77
84
  std::string get_reset_reason_();
85
+ std::string get_wakeup_cause_();
78
86
  uint32_t get_free_heap_();
79
87
  void get_device_info_(std::string &device_info);
80
88
  void update_platform_();