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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) hide show
  1. esphome/__main__.py +16 -14
  2. esphome/components/ac_dimmer/ac_dimmer.cpp +3 -2
  3. esphome/components/adc/__init__.py +51 -34
  4. esphome/components/airthings_wave_base/__init__.py +1 -1
  5. esphome/components/alarm_control_panel/__init__.py +37 -2
  6. esphome/components/am43/cover/__init__.py +4 -5
  7. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +6 -4
  8. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +4 -5
  9. esphome/components/analog_threshold/binary_sensor.py +10 -8
  10. esphome/components/anova/climate.py +4 -5
  11. esphome/components/api/__init__.py +25 -8
  12. esphome/components/api/api_connection.cpp +416 -662
  13. esphome/components/api/api_connection.h +256 -57
  14. esphome/components/api/api_frame_helper.cpp +232 -177
  15. esphome/components/api/api_frame_helper.h +61 -8
  16. esphome/components/api/api_noise_context.h +13 -4
  17. esphome/components/api/api_pb2.cpp +1422 -1
  18. esphome/components/api/api_pb2.h +255 -1
  19. esphome/components/api/api_pb2_service.cpp +162 -49
  20. esphome/components/api/api_pb2_service.h +90 -51
  21. esphome/components/api/api_pb2_size.h +361 -0
  22. esphome/components/api/api_server.cpp +110 -34
  23. esphome/components/api/api_server.h +8 -0
  24. esphome/components/api/proto.h +86 -17
  25. esphome/components/as3935_i2c/as3935_i2c.h +0 -3
  26. esphome/components/as7341/as7341.h +1 -1
  27. esphome/components/at581x/at581x.h +4 -4
  28. esphome/components/atm90e32/__init__.py +1 -0
  29. esphome/components/atm90e32/atm90e32.cpp +576 -199
  30. esphome/components/atm90e32/atm90e32.h +128 -31
  31. esphome/components/atm90e32/atm90e32_reg.h +4 -2
  32. esphome/components/atm90e32/button/__init__.py +62 -10
  33. esphome/components/atm90e32/button/atm90e32_button.cpp +63 -4
  34. esphome/components/atm90e32/button/atm90e32_button.h +36 -4
  35. esphome/components/atm90e32/number/__init__.py +130 -0
  36. esphome/components/atm90e32/number/atm90e32_number.h +16 -0
  37. esphome/components/atm90e32/sensor.py +21 -4
  38. esphome/components/atm90e32/text_sensor/__init__.py +48 -0
  39. esphome/components/audio/__init__.py +96 -49
  40. esphome/components/audio/audio.h +48 -0
  41. esphome/components/audio/audio_decoder.cpp +1 -1
  42. esphome/components/audio/audio_resampler.cpp +2 -0
  43. esphome/components/audio/audio_resampler.h +1 -0
  44. esphome/components/ballu/climate.py +2 -9
  45. esphome/components/bang_bang/climate.py +5 -6
  46. esphome/components/bedjet/bedjet_hub.cpp +1 -0
  47. esphome/components/bedjet/climate/__init__.py +3 -8
  48. esphome/components/bedjet/fan/__init__.py +2 -11
  49. esphome/components/binary/fan/__init__.py +13 -16
  50. esphome/components/binary_sensor/__init__.py +13 -10
  51. esphome/components/bl0906/constants.h +16 -16
  52. esphome/components/ble_client/text_sensor/__init__.py +3 -5
  53. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +4 -6
  54. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +136 -21
  55. esphome/components/bluetooth_proxy/bluetooth_proxy.h +7 -0
  56. esphome/components/button/__init__.py +11 -8
  57. esphome/components/canbus/canbus.cpp +3 -0
  58. esphome/components/canbus/canbus.h +16 -0
  59. esphome/components/ccs811/sensor.py +9 -6
  60. esphome/components/climate/__init__.py +35 -2
  61. esphome/components/climate/climate_mode.h +1 -1
  62. esphome/components/climate/climate_traits.h +63 -57
  63. esphome/components/climate_ir/__init__.py +57 -17
  64. esphome/components/climate_ir_lg/climate.py +2 -5
  65. esphome/components/climate_ir_lg/climate_ir_lg.cpp +7 -7
  66. esphome/components/climate_ir_lg/climate_ir_lg.h +1 -1
  67. esphome/components/color/__init__.py +2 -0
  68. esphome/components/const/__init__.py +5 -0
  69. esphome/components/coolix/climate.py +2 -9
  70. esphome/components/copy/cover/__init__.py +10 -9
  71. esphome/components/copy/fan/__init__.py +11 -9
  72. esphome/components/copy/lock/__init__.py +11 -9
  73. esphome/components/copy/text/__init__.py +9 -6
  74. esphome/components/cover/__init__.py +37 -2
  75. esphome/components/cse7766/cse7766.cpp +2 -1
  76. esphome/components/cst226/binary_sensor/__init__.py +28 -0
  77. esphome/components/cst226/binary_sensor/cs226_button.h +22 -0
  78. esphome/components/cst226/binary_sensor/cstt6_button.cpp +19 -0
  79. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +27 -5
  80. esphome/components/cst226/touchscreen/cst226_touchscreen.h +10 -10
  81. esphome/components/current_based/cover.py +37 -36
  82. esphome/components/current_based/current_based_cover.cpp +2 -1
  83. esphome/components/daikin/climate.py +2 -9
  84. esphome/components/daikin/daikin.cpp +15 -9
  85. esphome/components/daikin/daikin.h +5 -5
  86. esphome/components/daikin_arc/climate.py +2 -7
  87. esphome/components/daikin_brc/climate.py +3 -5
  88. esphome/components/dallas_temp/dallas_temp.cpp +17 -24
  89. esphome/components/dallas_temp/dallas_temp.h +0 -1
  90. esphome/components/daly_bms/daly_bms.cpp +2 -1
  91. esphome/components/debug/debug_component.cpp +6 -1
  92. esphome/components/debug/debug_component.h +8 -0
  93. esphome/components/debug/debug_esp32.cpp +109 -254
  94. esphome/components/debug/sensor.py +14 -0
  95. esphome/components/deep_sleep/deep_sleep_esp32.cpp +13 -1
  96. esphome/components/delonghi/climate.py +2 -9
  97. esphome/components/demo/__init__.py +18 -20
  98. esphome/components/dfrobot_sen0395/switch/__init__.py +21 -22
  99. esphome/components/display/rect.cpp +4 -9
  100. esphome/components/display/rect.h +1 -1
  101. esphome/components/dps310/sensor.py +6 -6
  102. esphome/components/ee895/sensor.py +9 -9
  103. esphome/components/emmeti/climate.py +2 -9
  104. esphome/components/endstop/cover.py +17 -16
  105. esphome/components/endstop/endstop_cover.cpp +2 -1
  106. esphome/components/ens160_base/__init__.py +12 -9
  107. esphome/components/esp32/__init__.py +60 -3
  108. esphome/components/esp32/core.cpp +11 -5
  109. esphome/components/esp32/gpio.cpp +86 -24
  110. esphome/components/esp32/gpio.py +15 -16
  111. esphome/components/esp32/gpio_esp32.py +1 -2
  112. esphome/components/esp32/gpio_esp32_c2.py +1 -1
  113. esphome/components/esp32/gpio_esp32_c3.py +1 -1
  114. esphome/components/esp32/gpio_esp32_c6.py +1 -1
  115. esphome/components/esp32/gpio_esp32_h2.py +1 -1
  116. esphome/components/esp32_ble/ble.cpp +1 -8
  117. esphome/components/esp32_ble/ble.h +5 -3
  118. esphome/components/esp32_ble/ble_advertising.cpp +2 -1
  119. esphome/components/esp32_ble/ble_advertising.h +1 -0
  120. esphome/components/esp32_ble_server/__init__.py +3 -0
  121. esphome/components/esp32_ble_tracker/__init__.py +7 -1
  122. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +192 -118
  123. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +29 -3
  124. esphome/components/esp32_camera/__init__.py +1 -1
  125. esphome/components/esp32_camera/esp32_camera.cpp +2 -10
  126. esphome/components/esp32_camera/esp32_camera.h +1 -1
  127. esphome/components/esp32_can/esp32_can.cpp +1 -1
  128. esphome/components/esp32_improv/esp32_improv_component.cpp +1 -1
  129. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -1
  130. esphome/components/esp32_rmt_led_strip/led_strip.h +7 -5
  131. esphome/components/esp32_rmt_led_strip/light.py +9 -1
  132. esphome/components/esp32_touch/esp32_touch.cpp +1 -1
  133. esphome/components/esp8266/gpio.cpp +69 -8
  134. esphome/components/ethernet/ethernet_component.cpp +1 -1
  135. esphome/components/event/__init__.py +13 -10
  136. esphome/components/factory_reset/switch/__init__.py +7 -21
  137. esphome/components/fan/__init__.py +52 -5
  138. esphome/components/fastled_base/__init__.py +1 -4
  139. esphome/components/fastled_base/fastled_light.cpp +1 -1
  140. esphome/components/feedback/cover.py +38 -33
  141. esphome/components/feedback/feedback_cover.cpp +2 -1
  142. esphome/components/fujitsu_general/climate.py +2 -9
  143. esphome/components/gcja5/gcja5.cpp +2 -1
  144. esphome/components/gpio/one_wire/gpio_one_wire.cpp +45 -43
  145. esphome/components/gpio/one_wire/gpio_one_wire.h +2 -1
  146. esphome/components/gpio_expander/cached_gpio.h +22 -7
  147. esphome/components/gps/__init__.py +47 -17
  148. esphome/components/gps/gps.cpp +42 -23
  149. esphome/components/gps/gps.h +17 -13
  150. esphome/components/graph/__init__.py +1 -2
  151. esphome/components/gree/climate.py +4 -6
  152. esphome/components/gree/gree.cpp +16 -2
  153. esphome/components/gree/gree.h +2 -2
  154. esphome/components/growatt_solar/growatt_solar.cpp +2 -1
  155. esphome/components/haier/climate.py +37 -34
  156. esphome/components/hbridge/fan/__init__.py +19 -17
  157. esphome/components/he60r/cover.py +4 -5
  158. esphome/components/heatpumpir/climate.py +3 -6
  159. esphome/components/hitachi_ac344/climate.py +2 -9
  160. esphome/components/hitachi_ac424/climate.py +2 -9
  161. esphome/components/hlw8012/hlw8012.cpp +1 -1
  162. esphome/components/hm3301/hm3301.h +1 -1
  163. esphome/components/hte501/sensor.py +6 -6
  164. esphome/components/http_request/__init__.py +39 -6
  165. esphome/components/http_request/http_request.cpp +20 -0
  166. esphome/components/http_request/http_request.h +57 -15
  167. esphome/components/http_request/http_request_arduino.cpp +22 -6
  168. esphome/components/http_request/http_request_arduino.h +4 -3
  169. esphome/components/http_request/http_request_host.cpp +141 -0
  170. esphome/components/http_request/http_request_host.h +37 -0
  171. esphome/components/http_request/http_request_idf.cpp +35 -3
  172. esphome/components/http_request/http_request_idf.h +10 -3
  173. esphome/components/http_request/httplib.h +9691 -0
  174. esphome/components/http_request/update/__init__.py +11 -8
  175. esphome/components/hyt271/sensor.py +6 -6
  176. esphome/components/i2c/i2c.h +4 -0
  177. esphome/components/i2c/i2c_bus_esp_idf.cpp +1 -1
  178. esphome/components/i2s_audio/__init__.py +131 -22
  179. esphome/components/i2s_audio/i2s_audio.h +44 -4
  180. esphome/components/i2s_audio/media_player/__init__.py +19 -9
  181. esphome/components/i2s_audio/microphone/__init__.py +63 -5
  182. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +351 -61
  183. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +40 -6
  184. esphome/components/i2s_audio/speaker/__init__.py +31 -5
  185. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +155 -19
  186. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +17 -4
  187. esphome/components/ili9xxx/ili9xxx_init.h +1 -1
  188. esphome/components/image/__init__.py +37 -17
  189. esphome/components/image/image.cpp +25 -8
  190. esphome/components/internal_temperature/internal_temperature.cpp +6 -4
  191. esphome/components/key_collector/__init__.py +35 -0
  192. esphome/components/key_collector/key_collector.cpp +8 -0
  193. esphome/components/key_collector/key_collector.h +10 -0
  194. esphome/components/kuntze/kuntze.cpp +2 -1
  195. esphome/components/ld2410/ld2410.h +1 -1
  196. esphome/components/ld2450/ld2450.h +1 -1
  197. esphome/components/light/__init__.py +57 -0
  198. esphome/components/lock/__init__.py +51 -4
  199. esphome/components/lock/automation.h +2 -13
  200. esphome/components/logger/__init__.py +22 -0
  201. esphome/components/logger/logger.cpp +154 -103
  202. esphome/components/logger/logger.h +211 -36
  203. esphome/components/logger/task_log_buffer.cpp +138 -0
  204. esphome/components/logger/task_log_buffer.h +69 -0
  205. esphome/components/lvgl/__init__.py +13 -5
  206. esphome/components/lvgl/automation.py +50 -1
  207. esphome/components/lvgl/defines.py +0 -1
  208. esphome/components/lvgl/lv_validation.py +10 -1
  209. esphome/components/lvgl/lvgl_esphome.cpp +5 -1
  210. esphome/components/lvgl/schemas.py +14 -14
  211. esphome/components/lvgl/text/__init__.py +1 -2
  212. esphome/components/lvgl/widgets/arc.py +7 -6
  213. esphome/components/lvgl/widgets/buttonmatrix.py +3 -3
  214. esphome/components/lvgl/widgets/checkbox.py +2 -2
  215. esphome/components/lvgl/widgets/dropdown.py +2 -1
  216. esphome/components/lvgl/widgets/img.py +15 -12
  217. esphome/components/mapping/__init__.py +134 -0
  218. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -1
  219. esphome/components/max7219digit/max7219digit.cpp +28 -27
  220. esphome/components/mdns/__init__.py +11 -5
  221. esphome/components/mdns/mdns_component.cpp +11 -5
  222. esphome/components/mdns/mdns_component.h +3 -2
  223. esphome/components/mdns/mdns_esp32.cpp +4 -3
  224. esphome/components/mdns/mdns_esp8266.cpp +4 -2
  225. esphome/components/mdns/mdns_libretiny.cpp +4 -2
  226. esphome/components/mdns/mdns_rp2040.cpp +4 -2
  227. esphome/components/media_player/__init__.py +40 -6
  228. esphome/components/mhz19/sensor.py +11 -7
  229. esphome/components/micro_wake_word/__init__.py +99 -31
  230. esphome/components/micro_wake_word/automation.h +54 -0
  231. esphome/components/micro_wake_word/micro_wake_word.cpp +331 -319
  232. esphome/components/micro_wake_word/micro_wake_word.h +58 -105
  233. esphome/components/micro_wake_word/preprocessor_settings.h +19 -2
  234. esphome/components/micro_wake_word/streaming_model.cpp +158 -41
  235. esphome/components/micro_wake_word/streaming_model.h +85 -13
  236. esphome/components/microphone/__init__.py +139 -9
  237. esphome/components/microphone/automation.h +14 -2
  238. esphome/components/microphone/microphone.cpp +21 -0
  239. esphome/components/microphone/microphone.h +14 -5
  240. esphome/components/microphone/microphone_source.cpp +95 -0
  241. esphome/components/microphone/microphone_source.h +80 -0
  242. esphome/components/mics_4514/sensor.py +25 -14
  243. esphome/components/midea/climate.py +3 -4
  244. esphome/components/midea_ir/climate.py +3 -5
  245. esphome/components/mipi_spi/__init__.py +15 -0
  246. esphome/components/mipi_spi/display.py +474 -0
  247. esphome/components/mipi_spi/mipi_spi.cpp +481 -0
  248. esphome/components/mipi_spi/mipi_spi.h +171 -0
  249. esphome/components/mipi_spi/models/__init__.py +65 -0
  250. esphome/components/mipi_spi/models/amoled.py +72 -0
  251. esphome/components/mipi_spi/models/commands.py +82 -0
  252. esphome/components/mipi_spi/models/cyd.py +10 -0
  253. esphome/components/mipi_spi/models/ili.py +749 -0
  254. esphome/components/mipi_spi/models/jc.py +260 -0
  255. esphome/components/mipi_spi/models/lanbon.py +15 -0
  256. esphome/components/mipi_spi/models/lilygo.py +60 -0
  257. esphome/components/mipi_spi/models/waveshare.py +139 -0
  258. esphome/components/mitsubishi/climate.py +2 -5
  259. esphome/components/mitsubishi/mitsubishi.cpp +9 -9
  260. esphome/components/mixer/speaker/mixer_speaker.cpp +12 -22
  261. esphome/components/mixer/speaker/mixer_speaker.h +1 -3
  262. esphome/components/mlx90393/sensor.py +5 -0
  263. esphome/components/mlx90393/sensor_mlx90393.cpp +195 -13
  264. esphome/components/mlx90393/sensor_mlx90393.h +21 -4
  265. esphome/components/modbus/modbus.cpp +2 -1
  266. esphome/components/mqtt/__init__.py +1 -1
  267. esphome/components/mqtt/mqtt_client.cpp +6 -2
  268. esphome/components/mqtt/mqtt_const.h +4 -0
  269. esphome/components/mqtt/mqtt_fan.cpp +39 -0
  270. esphome/components/mqtt/mqtt_fan.h +2 -0
  271. esphome/components/ms5611/sensor.py +6 -6
  272. esphome/components/ms8607/sensor.py +3 -3
  273. esphome/components/network/__init__.py +1 -1
  274. esphome/components/nextion/base_component.py +17 -16
  275. esphome/components/nextion/display.py +11 -2
  276. esphome/components/nextion/nextion.cpp +39 -1
  277. esphome/components/nextion/nextion.h +50 -0
  278. esphome/components/noblex/climate.py +2 -9
  279. esphome/components/number/__init__.py +12 -9
  280. esphome/components/one_wire/one_wire_bus.cpp +14 -10
  281. esphome/components/one_wire/one_wire_bus.h +14 -8
  282. esphome/components/online_image/bmp_image.cpp +48 -11
  283. esphome/components/online_image/bmp_image.h +2 -0
  284. esphome/components/opentherm/binary_sensor/__init__.py +2 -4
  285. esphome/components/opentherm/number/__init__.py +11 -20
  286. esphome/components/opentherm/sensor/__init__.py +3 -3
  287. esphome/components/opentherm/switch/__init__.py +3 -5
  288. esphome/components/output/lock/__init__.py +11 -9
  289. esphome/components/packages/__init__.py +33 -31
  290. esphome/components/packet_transport/__init__.py +201 -0
  291. esphome/components/packet_transport/binary_sensor.py +19 -0
  292. esphome/components/packet_transport/packet_transport.cpp +534 -0
  293. esphome/components/packet_transport/packet_transport.h +154 -0
  294. esphome/components/packet_transport/sensor.py +19 -0
  295. esphome/components/pca9685/pca9685_output.cpp +2 -1
  296. esphome/components/pid/climate.py +2 -4
  297. esphome/components/pm2005/__init__.py +1 -0
  298. esphome/components/pm2005/pm2005.cpp +123 -0
  299. esphome/components/pm2005/pm2005.h +46 -0
  300. esphome/components/pm2005/sensor.py +86 -0
  301. esphome/components/pmsa003i/pmsa003i.cpp +43 -16
  302. esphome/components/pmsa003i/pmsa003i.h +25 -25
  303. esphome/components/pmsx003/pmsx003.cpp +195 -230
  304. esphome/components/pmsx003/pmsx003.h +51 -33
  305. esphome/components/pmsx003/sensor.py +21 -11
  306. esphome/components/pn7150/pn7150.h +2 -2
  307. esphome/components/pn7160/pn7160.h +2 -2
  308. esphome/components/prometheus/prometheus_handler.cpp +174 -0
  309. esphome/components/prometheus/prometheus_handler.h +17 -0
  310. esphome/components/psram/__init__.py +7 -5
  311. esphome/components/pulse_meter/pulse_meter_sensor.cpp +32 -12
  312. esphome/components/pulse_meter/pulse_meter_sensor.h +5 -5
  313. esphome/components/pzem004t/pzem004t.cpp +2 -1
  314. esphome/components/qspi_dbi/__init__.py +0 -1
  315. esphome/components/qspi_dbi/display.py +2 -1
  316. esphome/components/qspi_dbi/models.py +1 -2
  317. esphome/components/remote_base/__init__.py +91 -0
  318. esphome/components/remote_base/beo4_protocol.cpp +153 -0
  319. esphome/components/remote_base/beo4_protocol.h +43 -0
  320. esphome/components/remote_base/gobox_protocol.cpp +131 -0
  321. esphome/components/remote_base/gobox_protocol.h +54 -0
  322. esphome/components/remote_receiver/remote_receiver_esp32.cpp +16 -9
  323. esphome/components/resampler/speaker/resampler_speaker.cpp +12 -10
  324. esphome/components/resampler/speaker/resampler_speaker.h +1 -1
  325. esphome/components/rf_bridge/rf_bridge.cpp +2 -1
  326. esphome/components/scd30/sensor.py +2 -3
  327. esphome/components/scd4x/sensor.py +4 -5
  328. esphome/components/sdp3x/sensor.py +2 -1
  329. esphome/components/sds011/sds011.cpp +2 -1
  330. esphome/components/select/__init__.py +19 -20
  331. esphome/components/sen5x/sen5x.cpp +55 -36
  332. esphome/components/sen5x/sensor.py +1 -1
  333. esphome/components/senseair/sensor.py +3 -3
  334. esphome/components/sensor/__init__.py +158 -14
  335. esphome/components/sensor/filter.cpp +23 -0
  336. esphome/components/sensor/filter.h +22 -0
  337. esphome/components/sgp30/sensor.py +14 -16
  338. esphome/components/sgp4x/sensor.py +1 -1
  339. esphome/components/sht4x/sht4x.cpp +43 -22
  340. esphome/components/sht4x/sht4x.h +1 -1
  341. esphome/components/shtcx/sensor.py +6 -6
  342. esphome/components/slow_pwm/slow_pwm_output.cpp +2 -1
  343. esphome/components/sml/text_sensor/__init__.py +4 -6
  344. esphome/components/sound_level/__init__.py +0 -0
  345. esphome/components/sound_level/sensor.py +97 -0
  346. esphome/components/sound_level/sound_level.cpp +194 -0
  347. esphome/components/sound_level/sound_level.h +73 -0
  348. esphome/components/speaker/media_player/__init__.py +4 -8
  349. esphome/components/speaker/media_player/speaker_media_player.cpp +0 -18
  350. esphome/components/speaker/media_player/speaker_media_player.h +0 -11
  351. esphome/components/speaker/speaker.h +4 -7
  352. esphome/components/speed/fan/__init__.py +17 -16
  353. esphome/components/spi/spi.h +11 -1
  354. esphome/components/sprinkler/__init__.py +18 -19
  355. esphome/components/sprinkler/sprinkler.cpp +6 -5
  356. esphome/components/switch/__init__.py +32 -42
  357. esphome/components/syslog/__init__.py +41 -0
  358. esphome/components/syslog/esphome_syslog.cpp +49 -0
  359. esphome/components/syslog/esphome_syslog.h +27 -0
  360. esphome/components/t6615/sensor.py +3 -3
  361. esphome/components/t6615/t6615.cpp +2 -1
  362. esphome/components/tca9555/tca9555.cpp +11 -6
  363. esphome/components/tcl112/climate.py +2 -9
  364. esphome/components/template/alarm_control_panel/__init__.py +7 -6
  365. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +21 -17
  366. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +2 -1
  367. esphome/components/template/cover/__init__.py +27 -21
  368. esphome/components/template/fan/__init__.py +14 -12
  369. esphome/components/template/lock/__init__.py +20 -25
  370. esphome/components/template/lock/automation.h +18 -0
  371. esphome/components/template/text/__init__.py +4 -3
  372. esphome/components/template/valve/__init__.py +32 -21
  373. esphome/components/template/valve/automation.h +24 -0
  374. esphome/components/text/__init__.py +32 -1
  375. esphome/components/text_sensor/__init__.py +24 -29
  376. esphome/components/thermostat/climate.py +5 -5
  377. esphome/components/time_based/cover.py +17 -16
  378. esphome/components/time_based/time_based_cover.cpp +2 -1
  379. esphome/components/tm1638/switch/__init__.py +10 -7
  380. esphome/components/tormatic/cover.py +4 -5
  381. esphome/components/toshiba/climate.py +3 -5
  382. esphome/components/touchscreen/touchscreen.cpp +3 -1
  383. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  384. esphome/components/tuya/climate/__init__.py +5 -6
  385. esphome/components/tuya/cover/__init__.py +6 -11
  386. esphome/components/tuya/select/__init__.py +15 -5
  387. esphome/components/tuya/select/tuya_select.cpp +6 -1
  388. esphome/components/tuya/select/tuya_select.h +5 -1
  389. esphome/components/uart/packet_transport/__init__.py +20 -0
  390. esphome/components/uart/packet_transport/uart_transport.cpp +88 -0
  391. esphome/components/uart/packet_transport/uart_transport.h +41 -0
  392. esphome/components/uart/switch/uart_switch.cpp +2 -1
  393. esphome/components/udp/__init__.py +126 -128
  394. esphome/components/udp/automation.h +40 -0
  395. esphome/components/udp/binary_sensor.py +3 -25
  396. esphome/components/udp/packet_transport/__init__.py +29 -0
  397. esphome/components/udp/packet_transport/udp_transport.cpp +36 -0
  398. esphome/components/udp/packet_transport/udp_transport.h +28 -0
  399. esphome/components/udp/sensor.py +3 -25
  400. esphome/components/udp/udp_component.cpp +26 -470
  401. esphome/components/udp/udp_component.h +21 -128
  402. esphome/components/update/__init__.py +31 -1
  403. esphome/components/uponor_smatrix/climate/__init__.py +4 -9
  404. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +2 -1
  405. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  406. esphome/components/uptime/text_sensor/__init__.py +47 -7
  407. esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +12 -7
  408. esphome/components/uptime/text_sensor/uptime_text_sensor.h +19 -0
  409. esphome/components/valve/__init__.py +34 -3
  410. esphome/components/valve/automation.h +1 -19
  411. esphome/components/vl53l0x/sensor.py +11 -0
  412. esphome/components/vl53l0x/vl53l0x_sensor.cpp +5 -1
  413. esphome/components/vl53l0x/vl53l0x_sensor.h +2 -1
  414. esphome/components/voice_assistant/__init__.py +36 -10
  415. esphome/components/voice_assistant/voice_assistant.cpp +170 -144
  416. esphome/components/voice_assistant/voice_assistant.h +26 -25
  417. esphome/components/waveshare_epaper/display.py +6 -0
  418. esphome/components/waveshare_epaper/waveshare_epaper.cpp +439 -37
  419. esphome/components/waveshare_epaper/waveshare_epaper.h +60 -11
  420. esphome/components/weikai/weikai.cpp +0 -52
  421. esphome/components/whirlpool/climate.py +3 -5
  422. esphome/components/whynter/climate.py +3 -5
  423. esphome/components/xpt2046/touchscreen/xpt2046.cpp +1 -1
  424. esphome/components/yashima/climate.py +6 -6
  425. esphome/components/zhlt01/climate.py +2 -7
  426. esphome/config.py +13 -13
  427. esphome/config_validation.py +38 -58
  428. esphome/const.py +15 -1
  429. esphome/core/__init__.py +2 -0
  430. esphome/core/application.cpp +27 -10
  431. esphome/core/application.h +9 -1
  432. esphome/core/automation.h +4 -3
  433. esphome/core/component.cpp +28 -7
  434. esphome/core/component.h +10 -1
  435. esphome/core/defines.h +23 -17
  436. esphome/core/doxygen.h +13 -0
  437. esphome/core/macros.h +4 -0
  438. esphome/core/scheduler.cpp +7 -1
  439. esphome/cpp_generator.py +6 -2
  440. esphome/dashboard/web_server.py +3 -3
  441. esphome/helpers.py +39 -0
  442. esphome/loader.py +4 -0
  443. esphome/log.py +15 -19
  444. esphome/mqtt.py +23 -10
  445. esphome/platformio_api.py +1 -1
  446. esphome/schema_extractors.py +0 -1
  447. esphome/voluptuous_schema.py +3 -1
  448. esphome/vscode.py +15 -0
  449. esphome/wizard.py +47 -37
  450. esphome/zeroconf.py +7 -3
  451. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/METADATA +10 -11
  452. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/RECORD +456 -396
  453. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/WHEEL +1 -1
  454. esphome/components/esp32_ble/const_esp32c6.h +0 -74
  455. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/entry_points.txt +0 -0
  456. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/licenses/LICENSE +0 -0
  457. {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,260 @@
1
+ from esphome.components.spi import TYPE_QUAD
2
+ import esphome.config_validation as cv
3
+ from esphome.const import CONF_IGNORE_STRAPPING_WARNING, CONF_NUMBER
4
+
5
+ from .. import MODE_RGB
6
+ from . import DriverChip
7
+
8
+ AXS15231 = DriverChip(
9
+ "AXS15231",
10
+ draw_rounding=8,
11
+ swap_xy=cv.UNDEFINED,
12
+ color_order=MODE_RGB,
13
+ bus_mode=TYPE_QUAD,
14
+ initsequence=(
15
+ (0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA5),
16
+ (0xC1, 0x33),
17
+ (0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00),
18
+ ),
19
+ )
20
+
21
+ AXS15231.extend(
22
+ "JC3248W535",
23
+ width=320,
24
+ height=480,
25
+ cs_pin={CONF_NUMBER: 45, CONF_IGNORE_STRAPPING_WARNING: True},
26
+ data_rate="40MHz",
27
+ )
28
+
29
+ DriverChip(
30
+ "JC3636W518",
31
+ height=360,
32
+ width=360,
33
+ offset_height=1,
34
+ draw_rounding=1,
35
+ cs_pin=10,
36
+ reset_pin=47,
37
+ invert_colors=True,
38
+ color_order=MODE_RGB,
39
+ bus_mode=TYPE_QUAD,
40
+ data_rate="40MHz",
41
+ initsequence=(
42
+ (0xF0, 0x08),
43
+ (0xF2, 0x08),
44
+ (0x9B, 0x51),
45
+ (0x86, 0x53),
46
+ (0xF2, 0x80),
47
+ (0xF0, 0x00),
48
+ (0xF0, 0x01),
49
+ (0xF1, 0x01),
50
+ (0xB0, 0x54),
51
+ (0xB1, 0x3F),
52
+ (0xB2, 0x2A),
53
+ (0xB4, 0x46),
54
+ (0xB5, 0x34),
55
+ (0xB6, 0xD5),
56
+ (0xB7, 0x30),
57
+ (0xBA, 0x00),
58
+ (0xBB, 0x08),
59
+ (0xBC, 0x08),
60
+ (0xBD, 0x00),
61
+ (0xC0, 0x80),
62
+ (0xC1, 0x10),
63
+ (0xC2, 0x37),
64
+ (0xC3, 0x80),
65
+ (0xC4, 0x10),
66
+ (0xC5, 0x37),
67
+ (0xC6, 0xA9),
68
+ (0xC7, 0x41),
69
+ (0xC8, 0x51),
70
+ (0xC9, 0xA9),
71
+ (0xCA, 0x41),
72
+ (0xCB, 0x51),
73
+ (0xD0, 0x91),
74
+ (0xD1, 0x68),
75
+ (0xD2, 0x69),
76
+ (0xF5, 0x00, 0xA5),
77
+ (0xDD, 0x3F),
78
+ (0xDE, 0x3F),
79
+ (0xF1, 0x10),
80
+ (0xF0, 0x00),
81
+ (0xF0, 0x02),
82
+ (
83
+ 0xE0,
84
+ 0x70,
85
+ 0x09,
86
+ 0x12,
87
+ 0x0C,
88
+ 0x0B,
89
+ 0x27,
90
+ 0x38,
91
+ 0x54,
92
+ 0x4E,
93
+ 0x19,
94
+ 0x15,
95
+ 0x15,
96
+ 0x2C,
97
+ 0x2F,
98
+ ),
99
+ (
100
+ 0xE1,
101
+ 0x70,
102
+ 0x08,
103
+ 0x11,
104
+ 0x0C,
105
+ 0x0B,
106
+ 0x27,
107
+ 0x38,
108
+ 0x43,
109
+ 0x4C,
110
+ 0x18,
111
+ 0x14,
112
+ 0x14,
113
+ 0x2B,
114
+ 0x2D,
115
+ ),
116
+ (0xF0, 0x10),
117
+ (0xF3, 0x10),
118
+ (0xE0, 0x08),
119
+ (0xE1, 0x00),
120
+ (0xE2, 0x00),
121
+ (0xE3, 0x00),
122
+ (0xE4, 0xE0),
123
+ (0xE5, 0x06),
124
+ (0xE6, 0x21),
125
+ (0xE7, 0x00),
126
+ (0xE8, 0x05),
127
+ (0xE9, 0x82),
128
+ (0xEA, 0xDF),
129
+ (0xEB, 0x89),
130
+ (0xEC, 0x20),
131
+ (0xED, 0x14),
132
+ (0xEE, 0xFF),
133
+ (0xEF, 0x00),
134
+ (0xF8, 0xFF),
135
+ (0xF9, 0x00),
136
+ (0xFA, 0x00),
137
+ (0xFB, 0x30),
138
+ (0xFC, 0x00),
139
+ (0xFD, 0x00),
140
+ (0xFE, 0x00),
141
+ (0xFF, 0x00),
142
+ (0x60, 0x42),
143
+ (0x61, 0xE0),
144
+ (0x62, 0x40),
145
+ (0x63, 0x40),
146
+ (0x64, 0x02),
147
+ (0x65, 0x00),
148
+ (0x66, 0x40),
149
+ (0x67, 0x03),
150
+ (0x68, 0x00),
151
+ (0x69, 0x00),
152
+ (0x6A, 0x00),
153
+ (0x6B, 0x00),
154
+ (0x70, 0x42),
155
+ (0x71, 0xE0),
156
+ (0x72, 0x40),
157
+ (0x73, 0x40),
158
+ (0x74, 0x02),
159
+ (0x75, 0x00),
160
+ (0x76, 0x40),
161
+ (0x77, 0x03),
162
+ (0x78, 0x00),
163
+ (0x79, 0x00),
164
+ (0x7A, 0x00),
165
+ (0x7B, 0x00),
166
+ (0x80, 0x48),
167
+ (0x81, 0x00),
168
+ (0x82, 0x05),
169
+ (0x83, 0x02),
170
+ (0x84, 0xDD),
171
+ (0x85, 0x00),
172
+ (0x86, 0x00),
173
+ (0x87, 0x00),
174
+ (0x88, 0x48),
175
+ (0x89, 0x00),
176
+ (0x8A, 0x07),
177
+ (0x8B, 0x02),
178
+ (0x8C, 0xDF),
179
+ (0x8D, 0x00),
180
+ (0x8E, 0x00),
181
+ (0x8F, 0x00),
182
+ (0x90, 0x48),
183
+ (0x91, 0x00),
184
+ (0x92, 0x09),
185
+ (0x93, 0x02),
186
+ (0x94, 0xE1),
187
+ (0x95, 0x00),
188
+ (0x96, 0x00),
189
+ (0x97, 0x00),
190
+ (0x98, 0x48),
191
+ (0x99, 0x00),
192
+ (0x9A, 0x0B),
193
+ (0x9B, 0x02),
194
+ (0x9C, 0xE3),
195
+ (0x9D, 0x00),
196
+ (0x9E, 0x00),
197
+ (0x9F, 0x00),
198
+ (0xA0, 0x48),
199
+ (0xA1, 0x00),
200
+ (0xA2, 0x04),
201
+ (0xA3, 0x02),
202
+ (0xA4, 0xDC),
203
+ (0xA5, 0x00),
204
+ (0xA6, 0x00),
205
+ (0xA7, 0x00),
206
+ (0xA8, 0x48),
207
+ (0xA9, 0x00),
208
+ (0xAA, 0x06),
209
+ (0xAB, 0x02),
210
+ (0xAC, 0xDE),
211
+ (0xAD, 0x00),
212
+ (0xAE, 0x00),
213
+ (0xAF, 0x00),
214
+ (0xB0, 0x48),
215
+ (0xB1, 0x00),
216
+ (0xB2, 0x08),
217
+ (0xB3, 0x02),
218
+ (0xB4, 0xE0),
219
+ (0xB5, 0x00),
220
+ (0xB6, 0x00),
221
+ (0xB7, 0x00),
222
+ (0xB8, 0x48),
223
+ (0xB9, 0x00),
224
+ (0xBA, 0x0A),
225
+ (0xBB, 0x02),
226
+ (0xBC, 0xE2),
227
+ (0xBD, 0x00),
228
+ (0xBE, 0x00),
229
+ (0xBF, 0x00),
230
+ (0xC0, 0x12),
231
+ (0xC1, 0xAA),
232
+ (0xC2, 0x65),
233
+ (0xC3, 0x74),
234
+ (0xC4, 0x47),
235
+ (0xC5, 0x56),
236
+ (0xC6, 0x00),
237
+ (0xC7, 0x88),
238
+ (0xC8, 0x99),
239
+ (0xC9, 0x33),
240
+ (0xD0, 0x21),
241
+ (0xD1, 0xAA),
242
+ (0xD2, 0x65),
243
+ (0xD3, 0x74),
244
+ (0xD4, 0x47),
245
+ (0xD5, 0x56),
246
+ (0xD6, 0x00),
247
+ (0xD7, 0x88),
248
+ (0xD8, 0x99),
249
+ (0xD9, 0x33),
250
+ (0xF3, 0x01),
251
+ (0xF0, 0x00),
252
+ (0xF0, 0x01),
253
+ (0xF1, 0x01),
254
+ (0xA0, 0x0B),
255
+ (0xA3, 0x2A),
256
+ (0xA5, 0xC3),
257
+ ),
258
+ )
259
+
260
+ models = {}
@@ -0,0 +1,15 @@
1
+ from .ili import ST7789V
2
+
3
+ ST7789V.extend(
4
+ "LANBON-L8",
5
+ width=240,
6
+ height=320,
7
+ mirror_x=True,
8
+ mirror_y=True,
9
+ data_rate="80MHz",
10
+ cs_pin=22,
11
+ dc_pin=21,
12
+ reset_pin=18,
13
+ )
14
+
15
+ models = {}
@@ -0,0 +1,60 @@
1
+ from esphome.components.spi import TYPE_OCTAL
2
+
3
+ from .. import MODE_BGR
4
+ from .ili import ST7789V, ST7796
5
+
6
+ ST7789V.extend(
7
+ "T-EMBED",
8
+ width=170,
9
+ height=320,
10
+ offset_width=35,
11
+ color_order=MODE_BGR,
12
+ invert_colors=True,
13
+ draw_rounding=1,
14
+ cs_pin=10,
15
+ dc_pin=13,
16
+ reset_pin=9,
17
+ data_rate="80MHz",
18
+ )
19
+
20
+ ST7789V.extend(
21
+ "T-DISPLAY",
22
+ height=240,
23
+ width=135,
24
+ offset_width=52,
25
+ offset_height=40,
26
+ draw_rounding=1,
27
+ cs_pin=5,
28
+ dc_pin=16,
29
+ invert_colors=True,
30
+ )
31
+ ST7789V.extend(
32
+ "T-DISPLAY-S3",
33
+ height=320,
34
+ width=170,
35
+ offset_width=35,
36
+ color_order=MODE_BGR,
37
+ invert_colors=True,
38
+ draw_rounding=1,
39
+ dc_pin=7,
40
+ cs_pin=6,
41
+ reset_pin=5,
42
+ enable_pin=[9, 15],
43
+ data_rate="10MHz",
44
+ bus_mode=TYPE_OCTAL,
45
+ )
46
+
47
+ ST7796.extend(
48
+ "T-DISPLAY-S3-PRO",
49
+ width=222,
50
+ height=480,
51
+ offset_width=49,
52
+ draw_rounding=1,
53
+ cs_pin=39,
54
+ reset_pin=47,
55
+ dc_pin=9,
56
+ backlight_pin=48,
57
+ invert_colors=True,
58
+ )
59
+
60
+ models = {}
@@ -0,0 +1,139 @@
1
+ from . import DriverChip
2
+ from .ili import ILI9488_A
3
+
4
+ DriverChip(
5
+ "WAVESHARE-4-TFT",
6
+ width=320,
7
+ height=480,
8
+ invert_colors=True,
9
+ spi_16=True,
10
+ initsequence=(
11
+ (
12
+ 0xF9,
13
+ 0x00,
14
+ 0x08,
15
+ ),
16
+ (
17
+ 0xC0,
18
+ 0x19,
19
+ 0x1A,
20
+ ),
21
+ (
22
+ 0xC1,
23
+ 0x45,
24
+ 0x00,
25
+ ),
26
+ (
27
+ 0xC2,
28
+ 0x33,
29
+ ),
30
+ (
31
+ 0xC5,
32
+ 0x00,
33
+ 0x28,
34
+ ),
35
+ (
36
+ 0xB1,
37
+ 0xA0,
38
+ 0x11,
39
+ ),
40
+ (
41
+ 0xB4,
42
+ 0x02,
43
+ ),
44
+ (
45
+ 0xB6,
46
+ 0x00,
47
+ 0x42,
48
+ 0x3B,
49
+ ),
50
+ (
51
+ 0xB7,
52
+ 0x07,
53
+ ),
54
+ (
55
+ 0xE0,
56
+ 0x1F,
57
+ 0x25,
58
+ 0x22,
59
+ 0x0B,
60
+ 0x06,
61
+ 0x0A,
62
+ 0x4E,
63
+ 0xC6,
64
+ 0x39,
65
+ 0x00,
66
+ 0x00,
67
+ 0x00,
68
+ 0x00,
69
+ 0x00,
70
+ 0x00,
71
+ ),
72
+ (
73
+ 0xE1,
74
+ 0x1F,
75
+ 0x3F,
76
+ 0x3F,
77
+ 0x0F,
78
+ 0x1F,
79
+ 0x0F,
80
+ 0x46,
81
+ 0x49,
82
+ 0x31,
83
+ 0x05,
84
+ 0x09,
85
+ 0x03,
86
+ 0x1C,
87
+ 0x1A,
88
+ 0x00,
89
+ ),
90
+ (
91
+ 0xF1,
92
+ 0x36,
93
+ 0x04,
94
+ 0x00,
95
+ 0x3C,
96
+ 0x0F,
97
+ 0x0F,
98
+ 0xA4,
99
+ 0x02,
100
+ ),
101
+ (
102
+ 0xF2,
103
+ 0x18,
104
+ 0xA3,
105
+ 0x12,
106
+ 0x02,
107
+ 0x32,
108
+ 0x12,
109
+ 0xFF,
110
+ 0x32,
111
+ 0x00,
112
+ ),
113
+ (
114
+ 0xF4,
115
+ 0x40,
116
+ 0x00,
117
+ 0x08,
118
+ 0x91,
119
+ 0x04,
120
+ ),
121
+ (
122
+ 0xF8,
123
+ 0x21,
124
+ 0x04,
125
+ ),
126
+ ),
127
+ )
128
+
129
+ ILI9488_A.extend(
130
+ "PICO-RESTOUCH-LCD-3.5",
131
+ spi_16=True,
132
+ pixel_mode="16bit",
133
+ mirror_x=True,
134
+ dc_pin=33,
135
+ cs_pin=34,
136
+ reset_pin=40,
137
+ data_rate="20MHz",
138
+ invert_colors=True,
139
+ )
@@ -1,7 +1,6 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import climate_ir
3
3
  import esphome.config_validation as cv
4
- from esphome.const import CONF_ID
5
4
 
6
5
  CODEOWNERS = ["@RubyBailey"]
7
6
  AUTO_LOAD = ["climate_ir"]
@@ -44,9 +43,8 @@ VERTICAL_DIRECTIONS = {
44
43
  }
45
44
 
46
45
 
47
- CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
46
+ CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(MitsubishiClimate).extend(
48
47
  {
49
- cv.GenerateID(): cv.declare_id(MitsubishiClimate),
50
48
  cv.Optional(CONF_SET_FAN_MODE, default="3levels"): cv.enum(SETFANMODE),
51
49
  cv.Optional(CONF_SUPPORTS_DRY, default=False): cv.boolean,
52
50
  cv.Optional(CONF_SUPPORTS_FAN_ONLY, default=False): cv.boolean,
@@ -61,8 +59,7 @@ CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
61
59
 
62
60
 
63
61
  async def to_code(config):
64
- var = cg.new_Pvariable(config[CONF_ID])
65
- await climate_ir.register_climate_ir(var, config)
62
+ var = await climate_ir.new_climate_ir(config)
66
63
 
67
64
  cg.add(var.set_fan_mode(config[CONF_SET_FAN_MODE]))
68
65
  cg.add(var.set_supports_dry(config[CONF_SUPPORTS_DRY]))
@@ -25,8 +25,8 @@ const uint8_t MITSUBISHI_FAN_AUTO = 0x00;
25
25
 
26
26
  const uint8_t MITSUBISHI_VERTICAL_VANE_SWING = 0x38;
27
27
 
28
- // const uint8_t MITSUBISHI_AUTO = 0X80;
29
- const uint8_t MITSUBISHI_OTHERWISE = 0X40;
28
+ // const uint8_t MITSUBISHI_AUTO = 0x80;
29
+ const uint8_t MITSUBISHI_OTHERWISE = 0x40;
30
30
  const uint8_t MITSUBISHI_POWERFUL = 0x08;
31
31
 
32
32
  // Optional presets used to enable some model features
@@ -42,13 +42,13 @@ const uint16_t MITSUBISHI_HEADER_SPACE = 1700;
42
42
  const uint16_t MITSUBISHI_MIN_GAP = 17500;
43
43
 
44
44
  // Marker bytes
45
- const uint8_t MITSUBISHI_BYTE00 = 0X23;
46
- const uint8_t MITSUBISHI_BYTE01 = 0XCB;
47
- const uint8_t MITSUBISHI_BYTE02 = 0X26;
48
- const uint8_t MITSUBISHI_BYTE03 = 0X01;
49
- const uint8_t MITSUBISHI_BYTE04 = 0X00;
50
- const uint8_t MITSUBISHI_BYTE13 = 0X00;
51
- const uint8_t MITSUBISHI_BYTE16 = 0X00;
45
+ const uint8_t MITSUBISHI_BYTE00 = 0x23;
46
+ const uint8_t MITSUBISHI_BYTE01 = 0xCB;
47
+ const uint8_t MITSUBISHI_BYTE02 = 0x26;
48
+ const uint8_t MITSUBISHI_BYTE03 = 0x01;
49
+ const uint8_t MITSUBISHI_BYTE04 = 0x00;
50
+ const uint8_t MITSUBISHI_BYTE13 = 0x00;
51
+ const uint8_t MITSUBISHI_BYTE16 = 0x00;
52
52
 
53
53
  climate::ClimateTraits MitsubishiClimate::traits() {
54
54
  auto traits = climate::ClimateTraits();
@@ -53,14 +53,15 @@ void SourceSpeaker::dump_config() {
53
53
  }
54
54
 
55
55
  void SourceSpeaker::setup() {
56
- this->parent_->get_output_speaker()->add_audio_output_callback(
57
- [this](uint32_t new_playback_ms, uint32_t remainder_us, uint32_t pending_ms, uint32_t write_timestamp) {
58
- uint32_t personal_playback_ms = std::min(new_playback_ms, this->pending_playback_ms_);
59
- if (personal_playback_ms > 0) {
60
- this->pending_playback_ms_ -= personal_playback_ms;
61
- this->audio_output_callback_(personal_playback_ms, remainder_us, this->pending_playback_ms_, write_timestamp);
62
- }
63
- });
56
+ this->parent_->get_output_speaker()->add_audio_output_callback([this](uint32_t new_frames, int64_t write_timestamp) {
57
+ // The SourceSpeaker may not have included any audio in the mixed output, so verify there were pending frames
58
+ uint32_t speakers_playback_frames = std::min(new_frames, this->pending_playback_frames_);
59
+ this->pending_playback_frames_ -= speakers_playback_frames;
60
+
61
+ if (speakers_playback_frames > 0) {
62
+ this->audio_output_callback_(speakers_playback_frames, write_timestamp);
63
+ }
64
+ });
64
65
  }
65
66
 
66
67
  void SourceSpeaker::loop() {
@@ -153,6 +154,7 @@ esp_err_t SourceSpeaker::start_() {
153
154
  }
154
155
  }
155
156
 
157
+ this->pending_playback_frames_ = 0; // reset
156
158
  return this->parent_->start(this->audio_stream_info_);
157
159
  }
158
160
 
@@ -542,11 +544,7 @@ void MixerSpeaker::audio_mixer_task(void *params) {
542
544
 
543
545
  // Update source speaker buffer length
544
546
  transfer_buffers_with_data[0]->decrease_buffer_length(active_stream_info.frames_to_bytes(frames_to_mix));
545
- speakers_with_data[0]->accumulated_frames_read_ += frames_to_mix;
546
-
547
- // Add new audio duration to the source speaker pending playback
548
- speakers_with_data[0]->pending_playback_ms_ +=
549
- active_stream_info.frames_to_milliseconds_with_remainder(&speakers_with_data[0]->accumulated_frames_read_);
547
+ speakers_with_data[0]->pending_playback_frames_ += frames_to_mix;
550
548
 
551
549
  // Update output transfer buffer length
552
550
  output_transfer_buffer->increase_buffer_length(
@@ -586,10 +584,6 @@ void MixerSpeaker::audio_mixer_task(void *params) {
586
584
  reinterpret_cast<int16_t *>(output_transfer_buffer->get_buffer_end()),
587
585
  this_mixer->audio_stream_info_.value(), frames_to_mix);
588
586
 
589
- speakers_with_data[i]->pending_playback_ms_ +=
590
- speakers_with_data[i]->get_audio_stream_info().frames_to_milliseconds_with_remainder(
591
- &speakers_with_data[i]->accumulated_frames_read_);
592
-
593
587
  if (i != transfer_buffers_with_data.size() - 1) {
594
588
  // Need to mix more streams together, point primary buffer and stream info to the already mixed output
595
589
  primary_buffer = reinterpret_cast<int16_t *>(output_transfer_buffer->get_buffer_end());
@@ -601,11 +595,7 @@ void MixerSpeaker::audio_mixer_task(void *params) {
601
595
  for (int i = 0; i < transfer_buffers_with_data.size(); ++i) {
602
596
  transfer_buffers_with_data[i]->decrease_buffer_length(
603
597
  speakers_with_data[i]->get_audio_stream_info().frames_to_bytes(frames_to_mix));
604
- speakers_with_data[i]->accumulated_frames_read_ += frames_to_mix;
605
-
606
- speakers_with_data[i]->pending_playback_ms_ +=
607
- speakers_with_data[i]->get_audio_stream_info().frames_to_milliseconds_with_remainder(
608
- &speakers_with_data[i]->accumulated_frames_read_);
598
+ speakers_with_data[i]->pending_playback_frames_ += frames_to_mix;
609
599
  }
610
600
 
611
601
  // Update output transfer buffer length
@@ -114,9 +114,7 @@ class SourceSpeaker : public speaker::Speaker, public Component {
114
114
  uint32_t ducking_transition_samples_remaining_{0};
115
115
  uint32_t samples_per_ducking_step_{0};
116
116
 
117
- uint32_t accumulated_frames_read_{0};
118
-
119
- uint32_t pending_playback_ms_{0};
117
+ uint32_t pending_playback_frames_{0};
120
118
  };
121
119
 
122
120
  class MixerSpeaker : public Component {
@@ -63,6 +63,11 @@ def _validate(config):
63
63
  raise cv.Invalid(
64
64
  f"{axis}: {CONF_RESOLUTION} cannot be {res} with {CONF_TEMPERATURE_COMPENSATION} enabled"
65
65
  )
66
+ if config[CONF_HALLCONF] == 0xC:
67
+ if (config[CONF_OVERSAMPLING], config[CONF_FILTER]) in [(0, 0), (1, 0), (0, 1)]:
68
+ raise cv.Invalid(
69
+ f"{CONF_OVERSAMPLING}=={config[CONF_OVERSAMPLING]} and {CONF_FILTER}=={config[CONF_FILTER]} not allowed with {CONF_HALLCONF}=={config[CONF_HALLCONF]:#02x}"
70
+ )
66
71
  return config
67
72
 
68
73