esphome 2025.7.4__py3-none-any.whl → 2025.8.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 (758) hide show
  1. esphome/__main__.py +190 -83
  2. esphome/automation.py +2 -4
  3. esphome/build_gen/__init__.py +0 -0
  4. esphome/build_gen/platformio.py +102 -0
  5. esphome/components/a4988/a4988.cpp +0 -1
  6. esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
  7. esphome/components/absolute_humidity/sensor.py +2 -2
  8. esphome/components/adc/__init__.py +123 -85
  9. esphome/components/adc/adc_sensor.h +98 -35
  10. esphome/components/adc/adc_sensor_common.cpp +10 -4
  11. esphome/components/adc/adc_sensor_esp32.cpp +291 -123
  12. esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
  13. esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
  14. esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
  15. esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
  16. esphome/components/adc/sensor.py +61 -27
  17. esphome/components/adc128s102/adc128s102.cpp +1 -4
  18. esphome/components/ade7880/sensor.py +75 -49
  19. esphome/components/ads1115/ads1115.cpp +0 -1
  20. esphome/components/ads1118/ads1118.cpp +0 -1
  21. esphome/components/ags10/ags10.cpp +0 -4
  22. esphome/components/aht10/aht10.cpp +0 -4
  23. esphome/components/aic3204/aic3204.cpp +0 -2
  24. esphome/components/airthings_wave_plus/__init__.py +1 -1
  25. esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
  26. esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
  27. esphome/components/airthings_wave_plus/sensor.py +55 -28
  28. esphome/components/alarm_control_panel/__init__.py +4 -9
  29. esphome/components/am2315c/am2315c.cpp +0 -2
  30. esphome/components/am2320/am2320.cpp +0 -1
  31. esphome/components/animation/__init__.py +14 -11
  32. esphome/components/apds9306/apds9306.cpp +0 -4
  33. esphome/components/apds9960/apds9960.cpp +0 -1
  34. esphome/components/api/__init__.py +29 -4
  35. esphome/components/api/api_connection.cpp +378 -401
  36. esphome/components/api/api_connection.h +112 -56
  37. esphome/components/api/api_frame_helper.cpp +69 -896
  38. esphome/components/api/api_frame_helper.h +31 -126
  39. esphome/components/api/api_frame_helper_noise.cpp +583 -0
  40. esphome/components/api/api_frame_helper_noise.h +68 -0
  41. esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
  42. esphome/components/api/api_frame_helper_plaintext.h +53 -0
  43. esphome/components/api/api_noise_context.h +2 -4
  44. esphome/components/api/api_pb2.cpp +1601 -1808
  45. esphome/components/api/api_pb2.h +367 -323
  46. esphome/components/api/api_pb2_dump.cpp +1137 -3466
  47. esphome/components/api/api_pb2_includes.h +34 -0
  48. esphome/components/api/api_pb2_service.cpp +94 -105
  49. esphome/components/api/api_pb2_service.h +27 -16
  50. esphome/components/api/api_server.cpp +18 -17
  51. esphome/components/api/api_server.h +8 -5
  52. esphome/components/api/client.py +16 -8
  53. esphome/components/api/custom_api_device.h +68 -14
  54. esphome/components/api/homeassistant_service.h +24 -19
  55. esphome/components/api/list_entities.cpp +3 -5
  56. esphome/components/api/list_entities.h +2 -4
  57. esphome/components/api/proto.cpp +3 -5
  58. esphome/components/api/proto.h +239 -274
  59. esphome/components/api/subscribe_state.cpp +2 -4
  60. esphome/components/api/subscribe_state.h +2 -4
  61. esphome/components/api/user_services.cpp +2 -4
  62. esphome/components/api/user_services.h +8 -8
  63. esphome/components/as3935/as3935.cpp +0 -2
  64. esphome/components/as3935_spi/as3935_spi.cpp +0 -2
  65. esphome/components/as5600/__init__.py +1 -1
  66. esphome/components/as5600/as5600.cpp +0 -2
  67. esphome/components/as5600/sensor/__init__.py +0 -1
  68. esphome/components/as7341/as7341.cpp +0 -1
  69. esphome/components/async_tcp/__init__.py +1 -1
  70. esphome/components/at581x/at581x.cpp +1 -1
  71. esphome/components/atm90e26/atm90e26.cpp +0 -1
  72. esphome/components/atm90e32/atm90e32.cpp +475 -116
  73. esphome/components/atm90e32/atm90e32.h +43 -5
  74. esphome/components/audio/audio.h +2 -2
  75. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
  76. esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
  77. esphome/components/bh1750/bh1750.cpp +0 -1
  78. esphome/components/binary_sensor/__init__.py +14 -12
  79. esphome/components/ble_client/__init__.py +4 -7
  80. esphome/components/bluetooth_proxy/__init__.py +40 -3
  81. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +392 -81
  82. esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
  83. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
  84. esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
  85. esphome/components/bme280_base/bme280_base.cpp +15 -16
  86. esphome/components/bme680/bme680.cpp +2 -3
  87. esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
  88. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
  89. esphome/components/bmi160/bmi160.cpp +0 -1
  90. esphome/components/bmp085/bmp085.cpp +0 -1
  91. esphome/components/bmp280_base/bmp280_base.cpp +13 -14
  92. esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
  93. esphome/components/bmp581/bmp581.cpp +0 -2
  94. esphome/components/bp1658cj/bp1658cj.cpp +0 -1
  95. esphome/components/bp5758d/bp5758d.cpp +0 -1
  96. esphome/components/button/__init__.py +0 -1
  97. esphome/components/canbus/__init__.py +2 -3
  98. esphome/components/canbus/canbus.cpp +0 -1
  99. esphome/components/cap1188/cap1188.cpp +0 -2
  100. esphome/components/captive_portal/__init__.py +1 -1
  101. esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
  102. esphome/components/ch422g/ch422g.cpp +0 -1
  103. esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
  104. esphome/components/climate/__init__.py +0 -1
  105. esphome/components/climate/climate_traits.h +24 -0
  106. esphome/components/cm1106/cm1106.cpp +0 -1
  107. esphome/components/const/__init__.py +6 -0
  108. esphome/components/cover/__init__.py +0 -1
  109. esphome/components/cover/cover.cpp +9 -13
  110. esphome/components/cs5460a/cs5460a.cpp +0 -2
  111. esphome/components/cse7761/cse7761.cpp +0 -1
  112. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
  113. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
  114. esphome/components/dac7678/dac7678_output.cpp +0 -2
  115. esphome/components/dallas_temp/dallas_temp.cpp +0 -1
  116. esphome/components/datetime/__init__.py +0 -2
  117. esphome/components/debug/__init__.py +15 -1
  118. esphome/components/debug/debug_zephyr.cpp +281 -0
  119. esphome/components/debug/sensor.py +2 -1
  120. esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
  121. esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
  122. esphome/components/dfrobot_sen0395/__init__.py +1 -2
  123. esphome/components/dht/dht.cpp +0 -1
  124. esphome/components/dht12/dht12.cpp +0 -1
  125. esphome/components/display/__init__.py +16 -3
  126. esphome/components/display_menu_base/__init__.py +1 -1
  127. esphome/components/dps310/dps310.cpp +0 -2
  128. esphome/components/ds1307/ds1307.cpp +0 -1
  129. esphome/components/ds2484/ds2484.cpp +0 -1
  130. esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
  131. esphome/components/ee895/ee895.cpp +0 -1
  132. esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
  133. esphome/components/emc2101/emc2101.cpp +0 -2
  134. esphome/components/ens160_base/ens160_base.cpp +0 -2
  135. esphome/components/ens210/ens210.cpp +0 -1
  136. esphome/components/es7210/es7210.cpp +0 -2
  137. esphome/components/es7243e/es7243e.cpp +0 -2
  138. esphome/components/es8156/es8156.cpp +0 -2
  139. esphome/components/es8311/es8311.cpp +0 -2
  140. esphome/components/es8388/es8388.cpp +0 -2
  141. esphome/components/esp32/__init__.py +203 -60
  142. esphome/components/esp32/boards.py +17 -0
  143. esphome/components/esp32/gpio.cpp +0 -1
  144. esphome/components/esp32/gpio.py +1 -2
  145. esphome/components/esp32/gpio_esp32_h2.py +2 -7
  146. esphome/components/esp32/gpio_esp32_p4.py +2 -7
  147. esphome/components/esp32/post_build.py.script +112 -61
  148. esphome/components/esp32_ble/__init__.py +41 -2
  149. esphome/components/esp32_ble/ble.cpp +14 -10
  150. esphome/components/esp32_ble/ble.h +18 -18
  151. esphome/components/esp32_ble/ble_advertising.cpp +5 -5
  152. esphome/components/esp32_ble/ble_advertising.h +7 -5
  153. esphome/components/esp32_ble/ble_event.h +139 -73
  154. esphome/components/esp32_ble/ble_scan_result.h +2 -4
  155. esphome/components/esp32_ble/ble_uuid.cpp +5 -5
  156. esphome/components/esp32_ble/ble_uuid.h +6 -5
  157. esphome/components/esp32_ble_beacon/__init__.py +4 -0
  158. esphome/components/esp32_ble_client/__init__.py +1 -1
  159. esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
  160. esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
  161. esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
  162. esphome/components/esp32_ble_client/ble_client_base.h +17 -6
  163. esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
  164. esphome/components/esp32_ble_client/ble_service.cpp +4 -4
  165. esphome/components/esp32_ble_client/ble_service.h +6 -4
  166. esphome/components/esp32_ble_server/__init__.py +15 -12
  167. esphome/components/esp32_ble_tracker/__init__.py +79 -11
  168. esphome/components/esp32_ble_tracker/automation.h +4 -4
  169. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
  170. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
  171. esphome/components/esp32_camera/__init__.py +13 -1
  172. esphome/components/esp32_camera/esp32_camera.cpp +7 -2
  173. esphome/components/esp32_camera/esp32_camera.h +1 -0
  174. esphome/components/esp32_dac/esp32_dac.cpp +3 -19
  175. esphome/components/esp32_dac/esp32_dac.h +4 -8
  176. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
  177. esphome/components/esp32_rmt_led_strip/light.py +1 -1
  178. esphome/components/esp32_touch/__init__.py +2 -3
  179. esphome/components/esp32_touch/esp32_touch.h +9 -6
  180. esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
  181. esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
  182. esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
  183. esphome/components/esp8266/__init__.py +3 -1
  184. esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
  185. esphome/components/esphome/ota/__init__.py +1 -2
  186. esphome/components/esphome/ota/ota_esphome.cpp +150 -77
  187. esphome/components/esphome/ota/ota_esphome.h +8 -1
  188. esphome/components/espnow/__init__.py +309 -0
  189. esphome/components/espnow/automation.h +175 -0
  190. esphome/components/espnow/espnow_component.cpp +468 -0
  191. esphome/components/espnow/espnow_component.h +183 -0
  192. esphome/components/espnow/espnow_err.h +19 -0
  193. esphome/components/espnow/espnow_packet.h +166 -0
  194. esphome/components/ethernet/__init__.py +7 -1
  195. esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
  196. esphome/components/ethernet/ethernet_component.cpp +0 -1
  197. esphome/components/ethernet/ethernet_component.h +4 -0
  198. esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
  199. esphome/components/event/__init__.py +0 -1
  200. esphome/components/factory_reset/__init__.py +92 -0
  201. esphome/components/factory_reset/factory_reset.cpp +76 -0
  202. esphome/components/factory_reset/factory_reset.h +43 -0
  203. esphome/components/fan/__init__.py +0 -1
  204. esphome/components/fan/fan_traits.h +16 -0
  205. esphome/components/fastled_base/fastled_light.cpp +0 -1
  206. esphome/components/fastled_spi/light.py +1 -3
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
  208. esphome/components/font/__init__.py +9 -1
  209. esphome/components/fs3000/fs3000.cpp +0 -2
  210. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  211. esphome/components/ft63x6/ft63x6.cpp +0 -1
  212. esphome/components/gdk101/gdk101.cpp +0 -1
  213. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  214. esphome/components/gl_r01_i2c/sensor.py +1 -1
  215. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  216. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  217. esphome/components/gpio_expander/cached_gpio.h +24 -15
  218. esphome/components/gps/__init__.py +6 -2
  219. esphome/components/gps/gps.cpp +50 -49
  220. esphome/components/gps/gps.h +4 -8
  221. esphome/components/gps/time/gps_time.cpp +3 -9
  222. esphome/components/gps/time/gps_time.h +4 -7
  223. esphome/components/graph/__init__.py +1 -1
  224. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  225. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  227. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  228. esphome/components/haier/climate.py +5 -10
  229. esphome/components/haier/haier_base.cpp +0 -1
  230. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  231. esphome/components/hdc1080/hdc1080.cpp +0 -2
  232. esphome/components/heatpumpir/climate.py +2 -2
  233. esphome/components/hlw8012/hlw8012.cpp +0 -1
  234. esphome/components/hm3301/hm3301.cpp +0 -1
  235. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  236. esphome/components/homeassistant/__init__.py +1 -0
  237. esphome/components/homeassistant/number/__init__.py +1 -0
  238. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  239. esphome/components/homeassistant/switch/__init__.py +1 -0
  240. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  241. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  242. esphome/components/host/__init__.py +2 -0
  243. esphome/components/hte501/hte501.cpp +0 -1
  244. esphome/components/http_request/__init__.py +2 -3
  245. esphome/components/http_request/http_request_idf.cpp +2 -2
  246. esphome/components/htu21d/htu21d.cpp +0 -2
  247. esphome/components/htu31d/htu31d.cpp +0 -2
  248. esphome/components/hx711/hx711.cpp +0 -1
  249. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  250. esphome/components/hydreon_rgxx/sensor.py +4 -5
  251. esphome/components/i2c/i2c_bus.h +1 -1
  252. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  253. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  254. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  255. esphome/components/i2s_audio/__init__.py +6 -5
  256. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  257. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  258. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +46 -19
  260. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -3
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  262. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  263. esphome/components/ili9xxx/display.py +4 -3
  264. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  265. esphome/components/image/__init__.py +123 -92
  266. esphome/components/improv_serial/__init__.py +7 -8
  267. esphome/components/ina219/ina219.cpp +0 -1
  268. esphome/components/ina226/ina226.cpp +0 -2
  269. esphome/components/ina260/ina260.cpp +0 -2
  270. esphome/components/ina2xx_base/__init__.py +2 -5
  271. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  272. esphome/components/ina3221/ina3221.cpp +0 -1
  273. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  274. esphome/components/interval/interval.h +5 -9
  275. esphome/components/json/__init__.py +1 -1
  276. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  277. esphome/components/lc709203f/lc709203f.cpp +0 -2
  278. esphome/components/lcd_gpio/display.py +1 -3
  279. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  280. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  281. esphome/components/ld2410/__init__.py +4 -6
  282. esphome/components/ld2410/binary_sensor.py +4 -0
  283. esphome/components/ld2410/ld2410.cpp +56 -100
  284. esphome/components/ld2410/ld2410.h +17 -15
  285. esphome/components/ld2410/sensor.py +24 -10
  286. esphome/components/ld2412/__init__.py +46 -0
  287. esphome/components/ld2412/binary_sensor.py +70 -0
  288. esphome/components/ld2412/button/__init__.py +74 -0
  289. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  290. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  291. esphome/components/ld2412/button/query_button.cpp +9 -0
  292. esphome/components/ld2412/button/query_button.h +18 -0
  293. esphome/components/ld2412/button/restart_button.cpp +9 -0
  294. esphome/components/ld2412/button/restart_button.h +18 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  296. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  297. esphome/components/ld2412/ld2412.cpp +861 -0
  298. esphome/components/ld2412/ld2412.h +141 -0
  299. esphome/components/ld2412/number/__init__.py +126 -0
  300. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  301. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  302. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  303. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  305. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  306. esphome/components/ld2412/select/__init__.py +82 -0
  307. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  308. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  309. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  310. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  311. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  312. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  313. esphome/components/ld2412/sensor.py +124 -0
  314. esphome/components/ld2412/switch/__init__.py +45 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  316. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  318. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  319. esphome/components/ld2412/text_sensor.py +34 -0
  320. esphome/components/ld2420/ld2420.cpp +0 -1
  321. esphome/components/ld2450/__init__.py +3 -4
  322. esphome/components/ld2450/binary_sensor.py +3 -0
  323. esphome/components/ld2450/ld2450.cpp +77 -165
  324. esphome/components/ld2450/ld2450.h +26 -54
  325. esphome/components/ld2450/sensor.py +120 -6
  326. esphome/components/ld2450/text_sensor.py +5 -4
  327. esphome/components/ld24xx/__init__.py +1 -0
  328. esphome/components/ld24xx/ld24xx.h +65 -0
  329. esphome/components/ledc/ledc_output.cpp +0 -1
  330. esphome/components/libretiny/__init__.py +2 -0
  331. esphome/components/light/__init__.py +0 -1
  332. esphome/components/light/effects.py +70 -45
  333. esphome/components/light/light_call.cpp +101 -66
  334. esphome/components/light/light_color_values.h +16 -11
  335. esphome/components/light/light_json_schema.cpp +46 -44
  336. esphome/components/light/light_state.cpp +8 -11
  337. esphome/components/light/light_traits.h +17 -0
  338. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  339. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  340. esphome/components/lock/__init__.py +0 -1
  341. esphome/components/logger/__init__.py +31 -9
  342. esphome/components/logger/logger.cpp +12 -7
  343. esphome/components/logger/logger.h +25 -14
  344. esphome/components/logger/logger_esp32.cpp +2 -7
  345. esphome/components/logger/logger_esp8266.cpp +2 -4
  346. esphome/components/logger/logger_host.cpp +2 -4
  347. esphome/components/logger/logger_libretiny.cpp +2 -4
  348. esphome/components/logger/logger_rp2040.cpp +2 -4
  349. esphome/components/logger/logger_zephyr.cpp +86 -0
  350. esphome/components/logger/select/logger_level_select.cpp +2 -4
  351. esphome/components/logger/select/logger_level_select.h +2 -4
  352. esphome/components/logger/task_log_buffer.cpp +2 -4
  353. esphome/components/logger/task_log_buffer.h +2 -4
  354. esphome/components/lps22/sensor.py +5 -5
  355. esphome/components/ltr390/ltr390.cpp +0 -2
  356. esphome/components/ltr501/ltr501.cpp +0 -1
  357. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  358. esphome/components/lvgl/__init__.py +14 -13
  359. esphome/components/lvgl/automation.py +2 -4
  360. esphome/components/lvgl/defines.py +0 -2
  361. esphome/components/lvgl/helpers.py +1 -1
  362. esphome/components/lvgl/lv_validation.py +7 -4
  363. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  364. esphome/components/lvgl/styles.py +2 -2
  365. esphome/components/lvgl/types.py +1 -1
  366. esphome/components/lvgl/widgets/__init__.py +2 -2
  367. esphome/components/lvgl/widgets/arc.py +14 -11
  368. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  369. esphome/components/lvgl/widgets/qrcode.py +7 -7
  370. esphome/components/lvgl/widgets/spinner.py +6 -6
  371. esphome/components/lvgl/widgets/switch.py +2 -2
  372. esphome/components/lvgl/widgets/tabview.py +3 -3
  373. esphome/components/lvgl/widgets/tileview.py +15 -7
  374. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  375. esphome/components/matrix_keypad/__init__.py +4 -3
  376. esphome/components/max17043/max17043.cpp +0 -2
  377. esphome/components/max31855/max31855.cpp +1 -4
  378. esphome/components/max31856/max31856.cpp +0 -4
  379. esphome/components/max31865/max31865.cpp +0 -1
  380. esphome/components/max44009/max44009.cpp +0 -1
  381. esphome/components/max6675/max6675.cpp +1 -4
  382. esphome/components/max6956/max6956.cpp +0 -1
  383. esphome/components/max7219/max7219.cpp +0 -1
  384. esphome/components/max7219digit/display.py +1 -1
  385. esphome/components/max7219digit/max7219digit.cpp +0 -1
  386. esphome/components/max9611/max9611.cpp +0 -1
  387. esphome/components/mcp23008/__init__.py +1 -1
  388. esphome/components/mcp23008/mcp23008.cpp +0 -1
  389. esphome/components/mcp23016/mcp23016.cpp +0 -1
  390. esphome/components/mcp23017/__init__.py +1 -1
  391. esphome/components/mcp23017/mcp23017.cpp +0 -1
  392. esphome/components/mcp23s08/__init__.py +1 -1
  393. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  394. esphome/components/mcp23s17/__init__.py +1 -1
  395. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  396. esphome/components/mcp23x08_base/__init__.py +2 -0
  397. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  398. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  399. esphome/components/mcp23x17_base/__init__.py +2 -0
  400. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  401. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  402. esphome/components/mcp23xxx_base/__init__.py +11 -5
  403. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  404. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  405. esphome/components/mcp3008/mcp3008.cpp +1 -4
  406. esphome/components/mcp3204/mcp3204.cpp +1 -4
  407. esphome/components/mcp4461/mcp4461.cpp +0 -1
  408. esphome/components/mcp4725/mcp4725.cpp +0 -1
  409. esphome/components/mcp4728/mcp4728.cpp +0 -1
  410. esphome/components/mcp9600/mcp9600.cpp +0 -2
  411. esphome/components/mcp9808/mcp9808.cpp +0 -2
  412. esphome/components/mdns/__init__.py +3 -0
  413. esphome/components/mdns/mdns_component.cpp +2 -0
  414. esphome/components/mdns/mdns_component.h +4 -0
  415. esphome/components/media_player/__init__.py +40 -0
  416. esphome/components/media_player/automation.h +16 -0
  417. esphome/components/media_player/media_player.cpp +13 -0
  418. esphome/components/media_player/media_player.h +50 -3
  419. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  420. esphome/components/mics_4514/mics_4514.cpp +1 -6
  421. esphome/components/midea/ir_transmitter.h +4 -4
  422. esphome/components/mipi/__init__.py +416 -0
  423. esphome/components/mipi_dsi/__init__.py +5 -0
  424. esphome/components/mipi_dsi/display.py +233 -0
  425. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  426. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  427. esphome/components/mipi_dsi/models/__init__.py +0 -0
  428. esphome/components/mipi_dsi/models/guition.py +38 -0
  429. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  430. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  431. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  432. esphome/components/mipi_spi/__init__.py +0 -9
  433. esphome/components/mipi_spi/display.py +220 -256
  434. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  435. esphome/components/mipi_spi/mipi_spi.h +556 -108
  436. esphome/components/mipi_spi/models/__init__.py +0 -65
  437. esphome/components/mipi_spi/models/adafruit.py +30 -0
  438. esphome/components/mipi_spi/models/amoled.py +41 -5
  439. esphome/components/mipi_spi/models/ili.py +5 -5
  440. esphome/components/mipi_spi/models/jc.py +1 -3
  441. esphome/components/mipi_spi/models/lilygo.py +1 -1
  442. esphome/components/mipi_spi/models/waveshare.py +16 -1
  443. esphome/components/mixer/speaker/__init__.py +4 -5
  444. esphome/components/mlx90393/sensor.py +7 -5
  445. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  446. esphome/components/mlx90614/mlx90614.cpp +0 -1
  447. esphome/components/mmc5603/mmc5603.cpp +0 -1
  448. esphome/components/mmc5983/mmc5983.cpp +0 -2
  449. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  450. esphome/components/mpr121/__init__.py +7 -6
  451. esphome/components/mpr121/mpr121.cpp +0 -1
  452. esphome/components/mpu6050/mpu6050.cpp +0 -1
  453. esphome/components/mpu6886/mpu6886.cpp +0 -1
  454. esphome/components/mqtt/__init__.py +1 -2
  455. esphome/components/mqtt/mqtt_button.cpp +1 -1
  456. esphome/components/mqtt/mqtt_client.cpp +0 -1
  457. esphome/components/mqtt/mqtt_component.cpp +8 -14
  458. esphome/components/mqtt/mqtt_component.h +0 -7
  459. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_sensor.h +0 -1
  461. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  462. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  463. esphome/components/ms5611/ms5611.cpp +0 -1
  464. esphome/components/ms8607/ms8607.cpp +0 -1
  465. esphome/components/msa3xx/msa3xx.cpp +0 -2
  466. esphome/components/my9231/my9231.cpp +0 -2
  467. esphome/components/nau7802/nau7802.cpp +0 -1
  468. esphome/components/neopixelbus/light.py +3 -0
  469. esphome/components/network/util.cpp +29 -0
  470. esphome/components/nextion/nextion.cpp +2 -2
  471. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  472. esphome/components/npi19/npi19.cpp +0 -2
  473. esphome/components/nrf52/__init__.py +223 -0
  474. esphome/components/nrf52/boards.py +34 -0
  475. esphome/components/nrf52/const.py +18 -0
  476. esphome/components/nrf52/gpio.py +79 -0
  477. esphome/components/number/__init__.py +2 -1
  478. esphome/components/one_wire/__init__.py +1 -2
  479. esphome/components/one_wire/one_wire.cpp +0 -2
  480. esphome/components/one_wire/one_wire.h +0 -2
  481. esphome/components/opentherm/hub.cpp +0 -1
  482. esphome/components/opentherm/number/__init__.py +2 -2
  483. esphome/components/openthread/__init__.py +2 -3
  484. esphome/components/openthread/openthread.cpp +30 -13
  485. esphome/components/openthread/openthread.h +3 -0
  486. esphome/components/openthread/openthread_esp.cpp +3 -1
  487. esphome/components/opt3001/sensor.py +2 -6
  488. esphome/components/output/__init__.py +38 -0
  489. esphome/components/output/automation.h +24 -0
  490. esphome/components/output/switch/output_switch.cpp +0 -2
  491. esphome/components/packages/__init__.py +1 -2
  492. esphome/components/packet_transport/__init__.py +4 -3
  493. esphome/components/pca6416a/pca6416a.cpp +0 -1
  494. esphome/components/pca9554/pca9554.cpp +0 -1
  495. esphome/components/pca9685/pca9685_output.cpp +0 -2
  496. esphome/components/pcf85063/pcf85063.cpp +0 -1
  497. esphome/components/pcf8563/pcf8563.cpp +0 -1
  498. esphome/components/pcf8574/pcf8574.cpp +0 -1
  499. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  500. esphome/components/pipsolar/pipsolar.cpp +54 -42
  501. esphome/components/pipsolar/pipsolar.h +5 -4
  502. esphome/components/pipsolar/sensor/__init__.py +1 -1
  503. esphome/components/pm2005/pm2005.cpp +0 -1
  504. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  505. esphome/components/pmwcs3/sensor.py +1 -2
  506. esphome/components/pn532/pn532.cpp +0 -2
  507. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  508. esphome/components/power_supply/power_supply.cpp +7 -10
  509. esphome/components/power_supply/power_supply.h +1 -1
  510. esphome/components/psram/__init__.py +6 -1
  511. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  512. esphome/components/pulse_counter/sensor.py +9 -6
  513. esphome/components/pylontech/pylontech.cpp +0 -1
  514. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  515. esphome/components/qmp6988/qmp6988.cpp +0 -2
  516. esphome/components/qspi_dbi/display.py +2 -3
  517. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  518. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  519. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  520. esphome/components/rc522/rc522.cpp +9 -31
  521. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  522. esphome/components/remote_base/__init__.py +5 -6
  523. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  524. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  525. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  526. esphome/components/remote_transmitter/__init__.py +26 -0
  527. esphome/components/remote_transmitter/automation.h +18 -0
  528. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  529. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  530. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  531. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  532. esphome/components/resampler/speaker/__init__.py +4 -5
  533. esphome/components/rf_bridge/__init__.py +4 -8
  534. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  535. esphome/components/rp2040/__init__.py +3 -1
  536. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  537. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  538. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  539. esphome/components/rpi_dpi_rgb/display.py +13 -15
  540. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  541. esphome/components/runtime_stats/__init__.py +34 -0
  542. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  543. esphome/components/runtime_stats/runtime_stats.h +132 -0
  544. esphome/components/scd30/scd30.cpp +0 -2
  545. esphome/components/scd30/sensor.py +1 -2
  546. esphome/components/scd4x/scd4x.cpp +0 -1
  547. esphome/components/scd4x/sensor.py +1 -3
  548. esphome/components/sdl/display.py +3 -1
  549. esphome/components/sdl/sdl_esphome.cpp +0 -2
  550. esphome/components/sdp3x/sdp3x.cpp +0 -2
  551. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  552. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  553. esphome/components/select/__init__.py +2 -3
  554. esphome/components/select/select_traits.cpp +1 -1
  555. esphome/components/select/select_traits.h +1 -1
  556. esphome/components/sen0321/sen0321.cpp +0 -1
  557. esphome/components/sen5x/sen5x.cpp +0 -2
  558. esphome/components/senseair/senseair.cpp +7 -3
  559. esphome/components/senseair/senseair.h +11 -0
  560. esphome/components/sensor/__init__.py +36 -4
  561. esphome/components/sensor/filter.cpp +49 -10
  562. esphome/components/sensor/filter.h +22 -7
  563. esphome/components/sensor/sensor.cpp +0 -1
  564. esphome/components/sensor/sensor.h +0 -9
  565. esphome/components/sfa30/sfa30.cpp +0 -4
  566. esphome/components/sgp30/sgp30.cpp +0 -2
  567. esphome/components/sgp4x/sensor.py +1 -1
  568. esphome/components/sgp4x/sgp4x.cpp +0 -2
  569. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  570. esphome/components/sht3xd/sht3xd.cpp +0 -2
  571. esphome/components/sht4x/sht4x.cpp +0 -2
  572. esphome/components/shtcx/shtcx.cpp +0 -1
  573. esphome/components/sim800l/__init__.py +2 -4
  574. esphome/components/sm16716/sm16716.cpp +0 -1
  575. esphome/components/sm2135/sm2135.cpp +0 -1
  576. esphome/components/sm2235/sm2235.cpp +0 -1
  577. esphome/components/sm2335/sm2335.cpp +0 -1
  578. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  579. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  580. esphome/components/sntp/sntp_component.cpp +0 -1
  581. esphome/components/sound_level/sensor.py +1 -1
  582. esphome/components/speaker/media_player/__init__.py +21 -33
  583. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  584. esphome/components/spi/__init__.py +29 -13
  585. esphome/components/spi/spi.cpp +0 -2
  586. esphome/components/spi_device/spi_device.cpp +1 -4
  587. esphome/components/sprinkler/__init__.py +4 -4
  588. esphome/components/sps30/sps30.cpp +0 -1
  589. esphome/components/ssd1306_base/__init__.py +11 -11
  590. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  591. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  592. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  593. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  594. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  595. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  596. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  597. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  598. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  599. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  600. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  601. esphome/components/st7701s/display.py +10 -14
  602. esphome/components/st7701s/st7701s.cpp +0 -3
  603. esphome/components/st7735/st7735.cpp +0 -1
  604. esphome/components/st7789v/st7789v.cpp +0 -1
  605. esphome/components/st7920/st7920.cpp +0 -1
  606. esphome/components/status_led/light/status_led_light.cpp +0 -2
  607. esphome/components/status_led/status_led.cpp +0 -1
  608. esphome/components/stepper/__init__.py +2 -4
  609. esphome/components/sts3x/sts3x.cpp +0 -1
  610. esphome/components/substitutions/__init__.py +10 -16
  611. esphome/components/substitutions/jinja.py +24 -1
  612. esphome/components/sun/__init__.py +2 -3
  613. esphome/components/switch/__init__.py +31 -1
  614. esphome/components/switch/automation.h +24 -0
  615. esphome/components/switch/switch.cpp +8 -0
  616. esphome/components/switch/switch.h +8 -0
  617. esphome/components/sx126x/sx126x.cpp +0 -2
  618. esphome/components/sx127x/sx127x.cpp +0 -2
  619. esphome/components/sx1509/__init__.py +7 -5
  620. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  621. esphome/components/sx1509/sx1509.cpp +0 -2
  622. esphome/components/syslog/esphome_syslog.cpp +1 -1
  623. esphome/components/tc74/tc74.cpp +0 -1
  624. esphome/components/tca9548a/tca9548a.cpp +0 -1
  625. esphome/components/tca9555/tca9555.cpp +0 -1
  626. esphome/components/tcs34725/tcs34725.cpp +0 -1
  627. esphome/components/tee501/tee501.cpp +0 -1
  628. esphome/components/tem3200/tem3200.cpp +0 -2
  629. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  630. esphome/components/template/cover/template_cover.cpp +0 -1
  631. esphome/components/template/select/template_select.cpp +0 -1
  632. esphome/components/template/text/template_text.cpp +0 -2
  633. esphome/components/template/valve/template_valve.cpp +0 -1
  634. esphome/components/text/__init__.py +0 -1
  635. esphome/components/text/text_traits.h +2 -0
  636. esphome/components/text_sensor/__init__.py +2 -1
  637. esphome/components/text_sensor/text_sensor.cpp +0 -2
  638. esphome/components/text_sensor/text_sensor.h +0 -8
  639. esphome/components/thermostat/climate.py +4 -4
  640. esphome/components/time/__init__.py +7 -4
  641. esphome/components/time/real_time_clock.cpp +16 -3
  642. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  643. esphome/components/tlc5947/tlc5947.cpp +0 -2
  644. esphome/components/tlc5971/tlc5971.cpp +0 -2
  645. esphome/components/tm1621/tm1621.cpp +0 -2
  646. esphome/components/tm1637/tm1637.cpp +0 -2
  647. esphome/components/tm1638/tm1638.cpp +0 -2
  648. esphome/components/tm1651/__init__.py +45 -48
  649. esphome/components/tm1651/tm1651.cpp +213 -47
  650. esphome/components/tm1651/tm1651.h +37 -32
  651. esphome/components/tmp117/tmp117.cpp +0 -2
  652. esphome/components/tsl2561/tsl2561.cpp +0 -1
  653. esphome/components/tsl2591/tsl2591.cpp +0 -1
  654. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  655. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  656. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  657. esphome/components/tuya/climate/__init__.py +9 -10
  658. esphome/components/tuya/number/__init__.py +8 -6
  659. esphome/components/tx20/tx20.cpp +0 -1
  660. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  661. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  662. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  663. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  664. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  665. esphome/components/udp/__init__.py +1 -1
  666. esphome/components/ufire_ec/sensor.py +1 -2
  667. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  668. esphome/components/ufire_ise/sensor.py +1 -2
  669. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  670. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  671. esphome/components/update/__init__.py +0 -1
  672. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  673. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  674. esphome/components/usb_host/usb_host_client.cpp +0 -1
  675. esphome/components/usb_host/usb_host_component.cpp +0 -1
  676. esphome/components/valve/__init__.py +0 -1
  677. esphome/components/veml3235/veml3235.cpp +0 -3
  678. esphome/components/veml7700/veml7700.cpp +0 -2
  679. esphome/components/version/version_text_sensor.cpp +0 -1
  680. esphome/components/version/version_text_sensor.h +0 -1
  681. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  682. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  683. esphome/components/web_server/__init__.py +13 -0
  684. esphome/components/web_server/web_server.cpp +188 -353
  685. esphome/components/web_server/web_server.h +61 -1
  686. esphome/components/web_server_base/__init__.py +1 -1
  687. esphome/components/web_server_base/web_server_base.cpp +2 -0
  688. esphome/components/web_server_base/web_server_base.h +6 -0
  689. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  690. esphome/components/web_server_idf/web_server_idf.h +2 -0
  691. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  692. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  693. esphome/components/wifi/__init__.py +17 -43
  694. esphome/components/wifi/wifi_component.cpp +100 -36
  695. esphome/components/wifi/wifi_component.h +5 -1
  696. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  697. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  698. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  699. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  700. esphome/components/wireguard/wireguard.cpp +0 -2
  701. esphome/components/x9c/x9c.cpp +0 -2
  702. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  703. esphome/components/xl9535/xl9535.cpp +0 -2
  704. esphome/components/zephyr/__init__.py +252 -0
  705. esphome/components/zephyr/const.py +16 -0
  706. esphome/components/zephyr/core.cpp +90 -0
  707. esphome/components/zephyr/gpio.cpp +120 -0
  708. esphome/components/zephyr/gpio.h +38 -0
  709. esphome/components/zephyr/pre_build.py.script +4 -0
  710. esphome/components/zephyr/preferences.cpp +156 -0
  711. esphome/components/zephyr/preferences.h +13 -0
  712. esphome/config.py +38 -16
  713. esphome/config_helpers.py +1 -2
  714. esphome/config_validation.py +12 -16
  715. esphome/const.py +26 -1
  716. esphome/core/__init__.py +92 -51
  717. esphome/core/application.cpp +75 -21
  718. esphome/core/application.h +106 -171
  719. esphome/core/color.h +10 -0
  720. esphome/core/component.cpp +41 -25
  721. esphome/core/component.h +9 -6
  722. esphome/core/component_iterator.cpp +61 -261
  723. esphome/core/component_iterator.h +15 -0
  724. esphome/core/config.py +26 -11
  725. esphome/core/defines.h +40 -2
  726. esphome/core/entity_base.h +18 -0
  727. esphome/core/entity_helpers.py +45 -10
  728. esphome/core/helpers.cpp +8 -15
  729. esphome/core/helpers.h +60 -6
  730. esphome/core/lock_free_queue.h +1 -1
  731. esphome/core/scheduler.cpp +311 -77
  732. esphome/core/scheduler.h +141 -28
  733. esphome/cpp_generator.py +2 -6
  734. esphome/cpp_helpers.py +1 -1
  735. esphome/dashboard/dashboard.py +2 -3
  736. esphome/dashboard/dns.py +2 -8
  737. esphome/dashboard/web_server.py +34 -19
  738. esphome/espota2.py +1 -4
  739. esphome/git.py +3 -1
  740. esphome/helpers.py +23 -4
  741. esphome/log.py +3 -1
  742. esphome/mqtt.py +3 -5
  743. esphome/platformio_api.py +7 -4
  744. esphome/types.py +12 -0
  745. esphome/util.py +20 -8
  746. esphome/voluptuous_schema.py +4 -3
  747. esphome/vscode.py +1 -2
  748. esphome/wizard.py +1 -4
  749. esphome/writer.py +16 -108
  750. esphome/yaml_util.py +7 -5
  751. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
  752. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/RECORD +757 -677
  753. esphome/components/mipi_spi/models/commands.py +0 -82
  754. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  755. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
  756. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
  757. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
  758. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
@@ -40,17 +40,21 @@ void HomeassistantSwitch::write_state(bool state) {
40
40
  return;
41
41
  }
42
42
 
43
+ static constexpr auto SERVICE_ON = StringRef::from_lit("homeassistant.turn_on");
44
+ static constexpr auto SERVICE_OFF = StringRef::from_lit("homeassistant.turn_off");
45
+ static constexpr auto ENTITY_ID_KEY = StringRef::from_lit("entity_id");
46
+
43
47
  api::HomeassistantServiceResponse resp;
44
48
  if (state) {
45
- resp.service = "homeassistant.turn_on";
49
+ resp.set_service(SERVICE_ON);
46
50
  } else {
47
- resp.service = "homeassistant.turn_off";
51
+ resp.set_service(SERVICE_OFF);
48
52
  }
49
53
 
50
- api::HomeassistantServiceMap entity_id_kv;
51
- entity_id_kv.key = "entity_id";
54
+ resp.data.emplace_back();
55
+ auto &entity_id_kv = resp.data.back();
56
+ entity_id_kv.set_key(ENTITY_ID_KEY);
52
57
  entity_id_kv.value = this->entity_id_;
53
- resp.data.push_back(entity_id_kv);
54
58
 
55
59
  api::global_api_server->send_homeassistant_service_call(resp);
56
60
  }
@@ -9,10 +9,7 @@ static const char *const TAG = "honeywellabp";
9
9
  const float MIN_COUNT = 1638.4; // 1638 counts (10% of 2^14 counts or 0x0666)
10
10
  const float MAX_COUNT = 14745.6; // 14745 counts (90% of 2^14 counts or 0x3999)
11
11
 
12
- void HONEYWELLABPSensor::setup() {
13
- ESP_LOGD(TAG, "Setting up Honeywell ABP Sensor ");
14
- this->spi_setup();
15
- }
12
+ void HONEYWELLABPSensor::setup() { this->spi_setup(); }
16
13
 
17
14
  uint8_t HONEYWELLABPSensor::readsensor_() {
18
15
  // Polls the sensor for new data.
@@ -7,6 +7,7 @@ from esphome.const import (
7
7
  KEY_TARGET_FRAMEWORK,
8
8
  KEY_TARGET_PLATFORM,
9
9
  PLATFORM_HOST,
10
+ ThreadModel,
10
11
  )
11
12
  from esphome.core import CORE
12
13
 
@@ -43,6 +44,7 @@ async def to_code(config):
43
44
  cg.add_define("USE_ESPHOME_HOST_MAC_ADDRESS", config[CONF_MAC_ADDRESS].parts)
44
45
  cg.add_build_flag("-std=gnu++20")
45
46
  cg.add_define("ESPHOME_BOARD", "host")
47
+ cg.add_define(ThreadModel.MULTI_ATOMICS)
46
48
  cg.add_platformio_option("platform", "platformio/native")
47
49
  cg.add_platformio_option("lib_ldf_mode", "off")
48
50
  cg.add_platformio_option("lib_compat_mode", "strict")
@@ -8,7 +8,6 @@ namespace hte501 {
8
8
  static const char *const TAG = "hte501";
9
9
 
10
10
  void HTE501Component::setup() {
11
- ESP_LOGCONFIG(TAG, "Running setup");
12
11
  uint8_t address[] = {0x70, 0x29};
13
12
  this->write(address, 2, false);
14
13
  uint8_t identification[9];
@@ -70,9 +70,8 @@ def validate_url(value):
70
70
  def validate_ssl_verification(config):
71
71
  error_message = ""
72
72
 
73
- if CORE.is_esp32:
74
- if not CORE.using_esp_idf and config[CONF_VERIFY_SSL]:
75
- error_message = "ESPHome supports certificate verification only via ESP-IDF"
73
+ if CORE.is_esp32 and not CORE.using_esp_idf and config[CONF_VERIFY_SSL]:
74
+ error_message = "ESPHome supports certificate verification only via ESP-IDF"
76
75
 
77
76
  if CORE.is_rp2040 and config[CONF_VERIFY_SSL]:
78
77
  error_message = "ESPHome does not support certificate verification on RP2040"
@@ -157,8 +157,8 @@ std::shared_ptr<HttpContainer> HttpRequestIDF::perform(std::string url, std::str
157
157
  container->status_code = esp_http_client_get_status_code(client);
158
158
  container->feed_wdt();
159
159
  container->set_response_headers(user_data.response_headers);
160
+ container->duration_ms = millis() - start;
160
161
  if (is_success(container->status_code)) {
161
- container->duration_ms = millis() - start;
162
162
  return container;
163
163
  }
164
164
 
@@ -191,8 +191,8 @@ std::shared_ptr<HttpContainer> HttpRequestIDF::perform(std::string url, std::str
191
191
  container->feed_wdt();
192
192
  container->status_code = esp_http_client_get_status_code(client);
193
193
  container->feed_wdt();
194
+ container->duration_ms = millis() - start;
194
195
  if (is_success(container->status_code)) {
195
- container->duration_ms = millis() - start;
196
196
  return container;
197
197
  }
198
198
 
@@ -18,8 +18,6 @@ static const uint8_t HTU21D_READHEATER_REG_CMD = 0x11; /**< Read Heater Control
18
18
  static const uint8_t HTU21D_REG_HTRE_BIT = 0x02; /**< Control Register Heater Bit */
19
19
 
20
20
  void HTU21DComponent::setup() {
21
- ESP_LOGCONFIG(TAG, "Running setup");
22
-
23
21
  if (!this->write_bytes(HTU21D_REGISTER_RESET, nullptr, 0)) {
24
22
  this->mark_failed();
25
23
  return;
@@ -75,8 +75,6 @@ uint8_t compute_crc(uint32_t value) {
75
75
  * I2C.
76
76
  */
77
77
  void HTU31DComponent::setup() {
78
- ESP_LOGCONFIG(TAG, "Running setup");
79
-
80
78
  if (!this->reset_()) {
81
79
  this->mark_failed();
82
80
  return;
@@ -8,7 +8,6 @@ namespace hx711 {
8
8
  static const char *const TAG = "hx711";
9
9
 
10
10
  void HX711Sensor::setup() {
11
- ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
12
11
  this->sck_pin_->setup();
13
12
  this->dout_pin_->setup();
14
13
  this->sck_pin_->digital_write(false);
@@ -41,7 +41,6 @@ void HydreonRGxxComponent::dump_config() {
41
41
  }
42
42
 
43
43
  void HydreonRGxxComponent::setup() {
44
- ESP_LOGCONFIG(TAG, "Running setup");
45
44
  while (this->available() != 0) {
46
45
  this->read();
47
46
  }
@@ -66,11 +66,10 @@ PROTOCOL_NAMES = {
66
66
 
67
67
  def _validate(config):
68
68
  for conf, models in SUPPORTED_OPTIONS.items():
69
- if conf in config:
70
- if config[CONF_MODEL] not in models:
71
- raise cv.Invalid(
72
- f"{conf} is only available on {' and '.join(models)}, not {config[CONF_MODEL]}"
73
- )
69
+ if conf in config and config[CONF_MODEL] not in models:
70
+ raise cv.Invalid(
71
+ f"{conf} is only available on {' and '.join(models)}, not {config[CONF_MODEL]}"
72
+ )
74
73
  return config
75
74
 
76
75
 
@@ -94,7 +94,7 @@ class I2CBus {
94
94
  protected:
95
95
  /// @brief Scans the I2C bus for devices. Devices presence is kept in an array of std::pair
96
96
  /// that contains the address and the corresponding bool presence flag.
97
- void i2c_scan_() {
97
+ virtual void i2c_scan() {
98
98
  for (uint8_t address = 8; address < 120; address++) {
99
99
  auto err = writev(address, nullptr, 0);
100
100
  if (err == ERROR_OK) {
@@ -13,7 +13,6 @@ namespace i2c {
13
13
  static const char *const TAG = "i2c.arduino";
14
14
 
15
15
  void ArduinoI2CBus::setup() {
16
- ESP_LOGCONFIG(TAG, "Running setup");
17
16
  recover_();
18
17
 
19
18
  #if defined(USE_ESP32)
@@ -42,7 +41,7 @@ void ArduinoI2CBus::setup() {
42
41
  this->initialized_ = true;
43
42
  if (this->scan_) {
44
43
  ESP_LOGV(TAG, "Scanning bus for active devices");
45
- this->i2c_scan_();
44
+ this->i2c_scan();
46
45
  }
47
46
  }
48
47
 
@@ -1,6 +1,7 @@
1
1
  #ifdef USE_ESP_IDF
2
2
 
3
3
  #include "i2c_bus_esp_idf.h"
4
+ #include <driver/gpio.h>
4
5
  #include <cinttypes>
5
6
  #include <cstring>
6
7
  #include "esphome/core/application.h"
@@ -18,22 +19,72 @@ namespace i2c {
18
19
  static const char *const TAG = "i2c.idf";
19
20
 
20
21
  void IDFI2CBus::setup() {
21
- ESP_LOGCONFIG(TAG, "Running setup");
22
22
  static i2c_port_t next_port = I2C_NUM_0;
23
- port_ = next_port;
24
- #if SOC_HP_I2C_NUM > 1
25
- next_port = (next_port == I2C_NUM_0) ? I2C_NUM_1 : I2C_NUM_MAX;
23
+ this->port_ = next_port;
24
+ if (this->port_ == I2C_NUM_MAX) {
25
+ ESP_LOGE(TAG, "No more than %u buses supported", I2C_NUM_MAX);
26
+ this->mark_failed();
27
+ return;
28
+ }
29
+
30
+ if (this->timeout_ > 13000) {
31
+ ESP_LOGW(TAG, "Using max allowed timeout: 13 ms");
32
+ this->timeout_ = 13000;
33
+ }
34
+
35
+ this->recover_();
36
+
37
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
38
+ next_port = (i2c_port_t) (next_port + 1);
39
+
40
+ i2c_master_bus_config_t bus_conf{};
41
+ memset(&bus_conf, 0, sizeof(bus_conf));
42
+ bus_conf.sda_io_num = gpio_num_t(sda_pin_);
43
+ bus_conf.scl_io_num = gpio_num_t(scl_pin_);
44
+ bus_conf.i2c_port = this->port_;
45
+ bus_conf.glitch_ignore_cnt = 7;
46
+ #if SOC_LP_I2C_SUPPORTED
47
+ if (this->port_ < SOC_HP_I2C_NUM) {
48
+ bus_conf.clk_source = I2C_CLK_SRC_DEFAULT;
49
+ } else {
50
+ bus_conf.lp_source_clk = LP_I2C_SCLK_DEFAULT;
51
+ }
26
52
  #else
27
- next_port = I2C_NUM_MAX;
53
+ bus_conf.clk_source = I2C_CLK_SRC_DEFAULT;
28
54
  #endif
55
+ bus_conf.flags.enable_internal_pullup = sda_pullup_enabled_ || scl_pullup_enabled_;
56
+ esp_err_t err = i2c_new_master_bus(&bus_conf, &this->bus_);
57
+ if (err != ESP_OK) {
58
+ ESP_LOGW(TAG, "i2c_new_master_bus failed: %s", esp_err_to_name(err));
59
+ this->mark_failed();
60
+ return;
61
+ }
29
62
 
30
- if (port_ == I2C_NUM_MAX) {
31
- ESP_LOGE(TAG, "No more than %u buses supported", SOC_HP_I2C_NUM);
63
+ i2c_device_config_t dev_conf{};
64
+ memset(&dev_conf, 0, sizeof(dev_conf));
65
+ dev_conf.dev_addr_length = I2C_ADDR_BIT_LEN_7;
66
+ dev_conf.device_address = I2C_DEVICE_ADDRESS_NOT_USED;
67
+ dev_conf.scl_speed_hz = this->frequency_;
68
+ dev_conf.scl_wait_us = this->timeout_;
69
+ err = i2c_master_bus_add_device(this->bus_, &dev_conf, &this->dev_);
70
+ if (err != ESP_OK) {
71
+ ESP_LOGW(TAG, "i2c_master_bus_add_device failed: %s", esp_err_to_name(err));
32
72
  this->mark_failed();
33
73
  return;
34
74
  }
35
75
 
36
- recover_();
76
+ this->initialized_ = true;
77
+
78
+ if (this->scan_) {
79
+ ESP_LOGV(TAG, "Scanning for devices");
80
+ this->i2c_scan();
81
+ }
82
+ #else
83
+ #if SOC_HP_I2C_NUM > 1
84
+ next_port = (next_port == I2C_NUM_0) ? I2C_NUM_1 : I2C_NUM_MAX;
85
+ #else
86
+ next_port = I2C_NUM_MAX;
87
+ #endif
37
88
 
38
89
  i2c_config_t conf{};
39
90
  memset(&conf, 0, sizeof(conf));
@@ -53,11 +104,7 @@ void IDFI2CBus::setup() {
53
104
  this->mark_failed();
54
105
  return;
55
106
  }
56
- if (timeout_ > 0) { // if timeout specified in yaml:
57
- if (timeout_ > 13000) {
58
- ESP_LOGW(TAG, "i2c timeout of %" PRIu32 "us greater than max of 13ms on esp-idf, setting to max", timeout_);
59
- timeout_ = 13000;
60
- }
107
+ if (timeout_ > 0) {
61
108
  err = i2c_set_timeout(port_, timeout_ * 80); // unit: APB 80MHz clock cycle
62
109
  if (err != ESP_OK) {
63
110
  ESP_LOGW(TAG, "i2c_set_timeout failed: %s", esp_err_to_name(err));
@@ -73,12 +120,15 @@ void IDFI2CBus::setup() {
73
120
  this->mark_failed();
74
121
  return;
75
122
  }
123
+
76
124
  initialized_ = true;
77
125
  if (this->scan_) {
78
126
  ESP_LOGV(TAG, "Scanning bus for active devices");
79
- this->i2c_scan_();
127
+ this->i2c_scan();
80
128
  }
129
+ #endif
81
130
  }
131
+
82
132
  void IDFI2CBus::dump_config() {
83
133
  ESP_LOGCONFIG(TAG, "I2C Bus:");
84
134
  ESP_LOGCONFIG(TAG,
@@ -101,13 +151,13 @@ void IDFI2CBus::dump_config() {
101
151
  break;
102
152
  }
103
153
  if (this->scan_) {
104
- ESP_LOGI(TAG, "Results from bus scan:");
154
+ ESP_LOGCONFIG(TAG, "Results from bus scan:");
105
155
  if (scan_results_.empty()) {
106
- ESP_LOGI(TAG, "Found no devices");
156
+ ESP_LOGCONFIG(TAG, "Found no devices");
107
157
  } else {
108
158
  for (const auto &s : scan_results_) {
109
159
  if (s.second) {
110
- ESP_LOGI(TAG, "Found device at address 0x%02X", s.first);
160
+ ESP_LOGCONFIG(TAG, "Found device at address 0x%02X", s.first);
111
161
  } else {
112
162
  ESP_LOGE(TAG, "Unknown error at address 0x%02X", s.first);
113
163
  }
@@ -116,6 +166,17 @@ void IDFI2CBus::dump_config() {
116
166
  }
117
167
  }
118
168
 
169
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
170
+ void IDFI2CBus::i2c_scan() {
171
+ for (uint8_t address = 8; address < 120; address++) {
172
+ auto err = i2c_master_probe(this->bus_, address, 20);
173
+ if (err == ESP_OK) {
174
+ this->scan_results_.emplace_back(address, true);
175
+ }
176
+ }
177
+ }
178
+ #endif
179
+
119
180
  ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
120
181
  // logging is only enabled with vv level, if warnings are shown the caller
121
182
  // should log them
@@ -123,6 +184,74 @@ ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
123
184
  ESP_LOGVV(TAG, "i2c bus not initialized!");
124
185
  return ERROR_NOT_INITIALIZED;
125
186
  }
187
+
188
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
189
+ i2c_operation_job_t jobs[cnt + 4];
190
+ uint8_t read = (address << 1) | I2C_MASTER_READ;
191
+ size_t last = 0, num = 0;
192
+
193
+ jobs[num].command = I2C_MASTER_CMD_START;
194
+ num++;
195
+
196
+ jobs[num].command = I2C_MASTER_CMD_WRITE;
197
+ jobs[num].write.ack_check = true;
198
+ jobs[num].write.data = &read;
199
+ jobs[num].write.total_bytes = 1;
200
+ num++;
201
+
202
+ // find the last valid index
203
+ for (size_t i = 0; i < cnt; i++) {
204
+ const auto &buf = buffers[i];
205
+ if (buf.len == 0) {
206
+ continue;
207
+ }
208
+ last = i;
209
+ }
210
+
211
+ for (size_t i = 0; i < cnt; i++) {
212
+ const auto &buf = buffers[i];
213
+ if (buf.len == 0) {
214
+ continue;
215
+ }
216
+ if (i == last) {
217
+ // the last byte read before stop should always be a nack,
218
+ // split the last read if len is larger than 1
219
+ if (buf.len > 1) {
220
+ jobs[num].command = I2C_MASTER_CMD_READ;
221
+ jobs[num].read.ack_value = I2C_ACK_VAL;
222
+ jobs[num].read.data = (uint8_t *) buf.data;
223
+ jobs[num].read.total_bytes = buf.len - 1;
224
+ num++;
225
+ }
226
+ jobs[num].command = I2C_MASTER_CMD_READ;
227
+ jobs[num].read.ack_value = I2C_NACK_VAL;
228
+ jobs[num].read.data = (uint8_t *) buf.data + buf.len - 1;
229
+ jobs[num].read.total_bytes = 1;
230
+ num++;
231
+ } else {
232
+ jobs[num].command = I2C_MASTER_CMD_READ;
233
+ jobs[num].read.ack_value = I2C_ACK_VAL;
234
+ jobs[num].read.data = (uint8_t *) buf.data;
235
+ jobs[num].read.total_bytes = buf.len;
236
+ num++;
237
+ }
238
+ }
239
+
240
+ jobs[num].command = I2C_MASTER_CMD_STOP;
241
+ num++;
242
+
243
+ esp_err_t err = i2c_master_execute_defined_operations(this->dev_, jobs, num, 20);
244
+ if (err == ESP_ERR_INVALID_STATE) {
245
+ ESP_LOGVV(TAG, "RX from %02X failed: not acked", address);
246
+ return ERROR_NOT_ACKNOWLEDGED;
247
+ } else if (err == ESP_ERR_TIMEOUT) {
248
+ ESP_LOGVV(TAG, "RX from %02X failed: timeout", address);
249
+ return ERROR_TIMEOUT;
250
+ } else if (err != ESP_OK) {
251
+ ESP_LOGVV(TAG, "RX from %02X failed: %s", address, esp_err_to_name(err));
252
+ return ERROR_UNKNOWN;
253
+ }
254
+ #else
126
255
  i2c_cmd_handle_t cmd = i2c_cmd_link_create();
127
256
  esp_err_t err = i2c_master_start(cmd);
128
257
  if (err != ESP_OK) {
@@ -168,6 +297,7 @@ ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
168
297
  ESP_LOGVV(TAG, "RX from %02X failed: %s", address, esp_err_to_name(err));
169
298
  return ERROR_UNKNOWN;
170
299
  }
300
+ #endif
171
301
 
172
302
  #ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
173
303
  char debug_buf[4];
@@ -185,6 +315,7 @@ ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
185
315
 
186
316
  return ERROR_OK;
187
317
  }
318
+
188
319
  ErrorCode IDFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt, bool stop) {
189
320
  // logging is only enabled with vv level, if warnings are shown the caller
190
321
  // should log them
@@ -207,6 +338,49 @@ ErrorCode IDFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt, b
207
338
  ESP_LOGVV(TAG, "0x%02X TX %s", address, debug_hex.c_str());
208
339
  #endif
209
340
 
341
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
342
+ i2c_operation_job_t jobs[cnt + 3];
343
+ uint8_t write = (address << 1) | I2C_MASTER_WRITE;
344
+ size_t num = 0;
345
+
346
+ jobs[num].command = I2C_MASTER_CMD_START;
347
+ num++;
348
+
349
+ jobs[num].command = I2C_MASTER_CMD_WRITE;
350
+ jobs[num].write.ack_check = true;
351
+ jobs[num].write.data = &write;
352
+ jobs[num].write.total_bytes = 1;
353
+ num++;
354
+
355
+ for (size_t i = 0; i < cnt; i++) {
356
+ const auto &buf = buffers[i];
357
+ if (buf.len == 0) {
358
+ continue;
359
+ }
360
+ jobs[num].command = I2C_MASTER_CMD_WRITE;
361
+ jobs[num].write.ack_check = true;
362
+ jobs[num].write.data = (uint8_t *) buf.data;
363
+ jobs[num].write.total_bytes = buf.len;
364
+ num++;
365
+ }
366
+
367
+ if (stop) {
368
+ jobs[num].command = I2C_MASTER_CMD_STOP;
369
+ num++;
370
+ }
371
+
372
+ esp_err_t err = i2c_master_execute_defined_operations(this->dev_, jobs, num, 20);
373
+ if (err == ESP_ERR_INVALID_STATE) {
374
+ ESP_LOGVV(TAG, "TX to %02X failed: not acked", address);
375
+ return ERROR_NOT_ACKNOWLEDGED;
376
+ } else if (err == ESP_ERR_TIMEOUT) {
377
+ ESP_LOGVV(TAG, "TX to %02X failed: timeout", address);
378
+ return ERROR_TIMEOUT;
379
+ } else if (err != ESP_OK) {
380
+ ESP_LOGVV(TAG, "TX to %02X failed: %s", address, esp_err_to_name(err));
381
+ return ERROR_UNKNOWN;
382
+ }
383
+ #else
210
384
  i2c_cmd_handle_t cmd = i2c_cmd_link_create();
211
385
  esp_err_t err = i2c_master_start(cmd);
212
386
  if (err != ESP_OK) {
@@ -252,6 +426,7 @@ ErrorCode IDFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt, b
252
426
  ESP_LOGVV(TAG, "TX to %02X failed: %s", address, esp_err_to_name(err));
253
427
  return ERROR_UNKNOWN;
254
428
  }
429
+ #endif
255
430
  return ERROR_OK;
256
431
  }
257
432
 
@@ -2,9 +2,14 @@
2
2
 
3
3
  #ifdef USE_ESP_IDF
4
4
 
5
- #include <driver/i2c.h>
5
+ #include "esp_idf_version.h"
6
6
  #include "esphome/core/component.h"
7
7
  #include "i2c_bus.h"
8
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
9
+ #include <driver/i2c_master.h>
10
+ #else
11
+ #include <driver/i2c.h>
12
+ #endif
8
13
 
9
14
  namespace esphome {
10
15
  namespace i2c {
@@ -38,6 +43,11 @@ class IDFI2CBus : public InternalI2CBus, public Component {
38
43
  RecoveryCode recovery_result_;
39
44
 
40
45
  protected:
46
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
47
+ i2c_master_dev_handle_t dev_;
48
+ i2c_master_bus_handle_t bus_;
49
+ void i2c_scan() override;
50
+ #endif
41
51
  i2c_port_t port_;
42
52
  uint8_t sda_pin_;
43
53
  bool sda_pullup_enabled_;
@@ -1,6 +1,6 @@
1
1
  from esphome import pins
2
2
  import esphome.codegen as cg
3
- from esphome.components.esp32 import get_esp32_variant
3
+ from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant
4
4
  from esphome.components.esp32.const import (
5
5
  VARIANT_ESP32,
6
6
  VARIANT_ESP32C3,
@@ -243,10 +243,7 @@ def _final_validate(_):
243
243
 
244
244
 
245
245
  def use_legacy():
246
- if CORE.using_esp_idf:
247
- if not _use_legacy_driver:
248
- return False
249
- return True
246
+ return not (CORE.using_esp_idf and not _use_legacy_driver)
250
247
 
251
248
 
252
249
  FINAL_VALIDATE_SCHEMA = _final_validate
@@ -258,6 +255,10 @@ async def to_code(config):
258
255
  if use_legacy():
259
256
  cg.add_define("USE_I2S_LEGACY")
260
257
 
258
+ # Helps avoid callbacks being skipped due to processor load
259
+ if CORE.using_esp_idf:
260
+ add_idf_sdkconfig_option("CONFIG_I2S_ISR_IRAM_SAFE", True)
261
+
261
262
  cg.add(var.set_lrclk_pin(config[CONF_I2S_LRCLK_PIN]))
262
263
  if CONF_I2S_BCLK_PIN in config:
263
264
  cg.add(var.set_bclk_pin(config[CONF_I2S_BCLK_PIN]))
@@ -10,8 +10,6 @@ namespace i2s_audio {
10
10
  static const char *const TAG = "i2s_audio";
11
11
 
12
12
  void I2SAudioComponent::setup() {
13
- ESP_LOGCONFIG(TAG, "Running setup");
14
-
15
13
  static i2s_port_t next_port_num = I2S_NUM_0;
16
14
  if (next_port_num >= SOC_I2S_NUM) {
17
15
  ESP_LOGE(TAG, "Too many components");
@@ -119,10 +119,7 @@ void I2SAudioMediaPlayer::set_volume_(float volume, bool publish) {
119
119
  this->volume = volume;
120
120
  }
121
121
 
122
- void I2SAudioMediaPlayer::setup() {
123
- ESP_LOGCONFIG(TAG, "Running setup");
124
- this->state = media_player::MEDIA_PLAYER_STATE_IDLE;
125
- }
122
+ void I2SAudioMediaPlayer::setup() { this->state = media_player::MEDIA_PLAYER_STATE_IDLE; }
126
123
 
127
124
  void I2SAudioMediaPlayer::loop() {
128
125
  switch (this->i2s_state_) {
@@ -44,9 +44,8 @@ PDM_VARIANTS = [esp32.const.VARIANT_ESP32, esp32.const.VARIANT_ESP32S3]
44
44
  def _validate_esp32_variant(config):
45
45
  variant = esp32.get_esp32_variant()
46
46
  if config[CONF_ADC_TYPE] == "external":
47
- if config[CONF_PDM]:
48
- if variant not in PDM_VARIANTS:
49
- raise cv.Invalid(f"{variant} does not support PDM")
47
+ if config[CONF_PDM] and variant not in PDM_VARIANTS:
48
+ raise cv.Invalid(f"{variant} does not support PDM")
50
49
  return config
51
50
  if config[CONF_ADC_TYPE] == "internal":
52
51
  if variant not in INTERNAL_ADC_VARIANTS:
@@ -122,9 +121,8 @@ CONFIG_SCHEMA = cv.All(
122
121
 
123
122
 
124
123
  def _final_validate(config):
125
- if not use_legacy():
126
- if config[CONF_ADC_TYPE] == "internal":
127
- raise cv.Invalid("Internal ADC is only compatible with legacy i2s driver.")
124
+ if not use_legacy() and config[CONF_ADC_TYPE] == "internal":
125
+ raise cv.Invalid("Internal ADC is only compatible with legacy i2s driver.")
128
126
 
129
127
 
130
128
  FINAL_VALIDATE_SCHEMA = _final_validate
@@ -24,9 +24,6 @@ static const uint32_t READ_DURATION_MS = 16;
24
24
  static const size_t TASK_STACK_SIZE = 4096;
25
25
  static const ssize_t TASK_PRIORITY = 23;
26
26
 
27
- // Use an exponential moving average to correct a DC offset with weight factor 1/1000
28
- static const int32_t DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR = 1000;
29
-
30
27
  static const char *const TAG = "i2s_audio.microphone";
31
28
 
32
29
  enum MicrophoneEventGroupBits : uint32_t {
@@ -40,7 +37,6 @@ enum MicrophoneEventGroupBits : uint32_t {
40
37
  };
41
38
 
42
39
  void I2SAudioMicrophone::setup() {
43
- ESP_LOGCONFIG(TAG, "Running setup");
44
40
  #ifdef USE_I2S_LEGACY
45
41
  #if SOC_I2S_SUPPORTS_ADC
46
42
  if (this->adc_) {
@@ -382,26 +378,57 @@ void I2SAudioMicrophone::mic_task(void *params) {
382
378
  }
383
379
 
384
380
  void I2SAudioMicrophone::fix_dc_offset_(std::vector<uint8_t> &data) {
381
+ /**
382
+ * From https://www.musicdsp.org/en/latest/Filters/135-dc-filter.html:
383
+ *
384
+ * y(n) = x(n) - x(n-1) + R * y(n-1)
385
+ * R = 1 - (pi * 2 * frequency / samplerate)
386
+ *
387
+ * From https://en.wikipedia.org/wiki/Hearing_range:
388
+ * The human range is commonly given as 20Hz up.
389
+ *
390
+ * From https://en.wikipedia.org/wiki/High-resolution_audio:
391
+ * A reasonable upper bound for sample rate seems to be 96kHz.
392
+ *
393
+ * Calculate R value for 20Hz on a 96kHz sample rate:
394
+ * R = 1 - (pi * 2 * 20 / 96000)
395
+ * R = 0.9986910031
396
+ *
397
+ * Transform floating point to bit-shifting approximation:
398
+ * output = input - prev_input + R * prev_output
399
+ * output = input - prev_input + (prev_output - (prev_output >> S))
400
+ *
401
+ * Approximate bit-shift value S from R:
402
+ * R = 1 - (1 >> S)
403
+ * R = 1 - (1 / 2^S)
404
+ * R = 1 - 2^-S
405
+ * 0.9986910031 = 1 - 2^-S
406
+ * S = 9.57732 ~= 10
407
+ *
408
+ * Actual R from S:
409
+ * R = 1 - 2^-10 = 0.9990234375
410
+ *
411
+ * Confirm this has effect outside human hearing on 96000kHz sample:
412
+ * 0.9990234375 = 1 - (pi * 2 * f / 96000)
413
+ * f = 14.9208Hz
414
+ *
415
+ * Confirm this has effect outside human hearing on PDM 16kHz sample:
416
+ * 0.9990234375 = 1 - (pi * 2 * f / 16000)
417
+ * f = 2.4868Hz
418
+ *
419
+ */
420
+ const uint8_t dc_filter_shift = 10;
385
421
  const size_t bytes_per_sample = this->audio_stream_info_.samples_to_bytes(1);
386
422
  const uint32_t total_samples = this->audio_stream_info_.bytes_to_samples(data.size());
387
-
388
- if (total_samples == 0) {
389
- return;
390
- }
391
-
392
- int64_t offset_accumulator = 0;
393
423
  for (uint32_t sample_index = 0; sample_index < total_samples; ++sample_index) {
394
424
  const uint32_t byte_index = sample_index * bytes_per_sample;
395
- int32_t sample = audio::unpack_audio_sample_to_q31(&data[byte_index], bytes_per_sample);
396
- offset_accumulator += sample;
397
- sample -= this->dc_offset_;
398
- audio::pack_q31_as_audio_sample(sample, &data[byte_index], bytes_per_sample);
425
+ int32_t input = audio::unpack_audio_sample_to_q31(&data[byte_index], bytes_per_sample);
426
+ int32_t output = input - this->dc_offset_prev_input_ +
427
+ (this->dc_offset_prev_output_ - (this->dc_offset_prev_output_ >> dc_filter_shift));
428
+ this->dc_offset_prev_input_ = input;
429
+ this->dc_offset_prev_output_ = output;
430
+ audio::pack_q31_as_audio_sample(output, &data[byte_index], bytes_per_sample);
399
431
  }
400
-
401
- const int32_t new_offset = offset_accumulator / total_samples;
402
- this->dc_offset_ = new_offset / DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR +
403
- (DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR - 1) * this->dc_offset_ /
404
- DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR;
405
432
  }
406
433
 
407
434
  size_t I2SAudioMicrophone::read_(uint8_t *buf, size_t len, TickType_t ticks_to_wait) {