esphome 2025.7.5__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 (756) 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 +102 -52
  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/fs3000/fs3000.cpp +0 -2
  209. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  210. esphome/components/ft63x6/ft63x6.cpp +0 -1
  211. esphome/components/gdk101/gdk101.cpp +0 -1
  212. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  213. esphome/components/gl_r01_i2c/sensor.py +1 -1
  214. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  215. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  216. esphome/components/gpio_expander/cached_gpio.h +24 -15
  217. esphome/components/gps/__init__.py +6 -2
  218. esphome/components/gps/gps.cpp +50 -49
  219. esphome/components/gps/gps.h +4 -8
  220. esphome/components/gps/time/gps_time.cpp +3 -9
  221. esphome/components/gps/time/gps_time.h +4 -7
  222. esphome/components/graph/__init__.py +1 -1
  223. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  224. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  225. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  227. esphome/components/haier/climate.py +5 -10
  228. esphome/components/haier/haier_base.cpp +0 -1
  229. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  230. esphome/components/hdc1080/hdc1080.cpp +0 -2
  231. esphome/components/heatpumpir/climate.py +2 -2
  232. esphome/components/hlw8012/hlw8012.cpp +0 -1
  233. esphome/components/hm3301/hm3301.cpp +0 -1
  234. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  235. esphome/components/homeassistant/__init__.py +1 -0
  236. esphome/components/homeassistant/number/__init__.py +1 -0
  237. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  238. esphome/components/homeassistant/switch/__init__.py +1 -0
  239. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  240. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  241. esphome/components/host/__init__.py +2 -0
  242. esphome/components/hte501/hte501.cpp +0 -1
  243. esphome/components/http_request/__init__.py +2 -3
  244. esphome/components/http_request/http_request_idf.cpp +2 -2
  245. esphome/components/htu21d/htu21d.cpp +0 -2
  246. esphome/components/htu31d/htu31d.cpp +0 -2
  247. esphome/components/hx711/hx711.cpp +0 -1
  248. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  249. esphome/components/hydreon_rgxx/sensor.py +4 -5
  250. esphome/components/i2c/i2c_bus.h +1 -1
  251. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  252. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  253. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  254. esphome/components/i2s_audio/__init__.py +6 -5
  255. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  256. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  257. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  258. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +0 -1
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +2 -2
  260. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  262. esphome/components/ili9xxx/display.py +4 -3
  263. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  264. esphome/components/image/__init__.py +123 -92
  265. esphome/components/improv_serial/__init__.py +7 -8
  266. esphome/components/ina219/ina219.cpp +0 -1
  267. esphome/components/ina226/ina226.cpp +0 -2
  268. esphome/components/ina260/ina260.cpp +0 -2
  269. esphome/components/ina2xx_base/__init__.py +2 -5
  270. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  271. esphome/components/ina3221/ina3221.cpp +0 -1
  272. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  273. esphome/components/interval/interval.h +5 -9
  274. esphome/components/json/__init__.py +1 -1
  275. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  276. esphome/components/lc709203f/lc709203f.cpp +0 -2
  277. esphome/components/lcd_gpio/display.py +1 -3
  278. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  279. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  280. esphome/components/ld2410/__init__.py +4 -6
  281. esphome/components/ld2410/binary_sensor.py +4 -0
  282. esphome/components/ld2410/ld2410.cpp +56 -100
  283. esphome/components/ld2410/ld2410.h +17 -15
  284. esphome/components/ld2410/sensor.py +24 -10
  285. esphome/components/ld2412/__init__.py +46 -0
  286. esphome/components/ld2412/binary_sensor.py +70 -0
  287. esphome/components/ld2412/button/__init__.py +74 -0
  288. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  289. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  290. esphome/components/ld2412/button/query_button.cpp +9 -0
  291. esphome/components/ld2412/button/query_button.h +18 -0
  292. esphome/components/ld2412/button/restart_button.cpp +9 -0
  293. esphome/components/ld2412/button/restart_button.h +18 -0
  294. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  296. esphome/components/ld2412/ld2412.cpp +861 -0
  297. esphome/components/ld2412/ld2412.h +141 -0
  298. esphome/components/ld2412/number/__init__.py +126 -0
  299. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  300. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  301. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  302. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  303. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  305. esphome/components/ld2412/select/__init__.py +82 -0
  306. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  307. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  308. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  309. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  310. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  311. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  312. esphome/components/ld2412/sensor.py +124 -0
  313. esphome/components/ld2412/switch/__init__.py +45 -0
  314. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  316. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  318. esphome/components/ld2412/text_sensor.py +34 -0
  319. esphome/components/ld2420/ld2420.cpp +0 -1
  320. esphome/components/ld2450/__init__.py +3 -4
  321. esphome/components/ld2450/binary_sensor.py +3 -0
  322. esphome/components/ld2450/ld2450.cpp +77 -165
  323. esphome/components/ld2450/ld2450.h +26 -54
  324. esphome/components/ld2450/sensor.py +120 -6
  325. esphome/components/ld2450/text_sensor.py +5 -4
  326. esphome/components/ld24xx/__init__.py +1 -0
  327. esphome/components/ld24xx/ld24xx.h +65 -0
  328. esphome/components/ledc/ledc_output.cpp +0 -1
  329. esphome/components/libretiny/__init__.py +2 -0
  330. esphome/components/light/__init__.py +0 -1
  331. esphome/components/light/effects.py +70 -45
  332. esphome/components/light/light_call.cpp +101 -66
  333. esphome/components/light/light_color_values.h +16 -11
  334. esphome/components/light/light_json_schema.cpp +46 -44
  335. esphome/components/light/light_state.cpp +8 -11
  336. esphome/components/light/light_traits.h +17 -0
  337. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  338. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  339. esphome/components/lock/__init__.py +0 -1
  340. esphome/components/logger/__init__.py +31 -9
  341. esphome/components/logger/logger.cpp +12 -7
  342. esphome/components/logger/logger.h +25 -14
  343. esphome/components/logger/logger_esp32.cpp +2 -7
  344. esphome/components/logger/logger_esp8266.cpp +2 -4
  345. esphome/components/logger/logger_host.cpp +2 -4
  346. esphome/components/logger/logger_libretiny.cpp +2 -4
  347. esphome/components/logger/logger_rp2040.cpp +2 -4
  348. esphome/components/logger/logger_zephyr.cpp +86 -0
  349. esphome/components/logger/select/logger_level_select.cpp +2 -4
  350. esphome/components/logger/select/logger_level_select.h +2 -4
  351. esphome/components/logger/task_log_buffer.cpp +2 -4
  352. esphome/components/logger/task_log_buffer.h +2 -4
  353. esphome/components/lps22/sensor.py +5 -5
  354. esphome/components/ltr390/ltr390.cpp +0 -2
  355. esphome/components/ltr501/ltr501.cpp +0 -1
  356. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  357. esphome/components/lvgl/__init__.py +14 -13
  358. esphome/components/lvgl/automation.py +2 -4
  359. esphome/components/lvgl/defines.py +0 -2
  360. esphome/components/lvgl/helpers.py +1 -1
  361. esphome/components/lvgl/lv_validation.py +7 -4
  362. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  363. esphome/components/lvgl/styles.py +2 -2
  364. esphome/components/lvgl/types.py +1 -1
  365. esphome/components/lvgl/widgets/__init__.py +2 -2
  366. esphome/components/lvgl/widgets/arc.py +14 -11
  367. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  368. esphome/components/lvgl/widgets/qrcode.py +7 -7
  369. esphome/components/lvgl/widgets/spinner.py +6 -6
  370. esphome/components/lvgl/widgets/switch.py +2 -2
  371. esphome/components/lvgl/widgets/tabview.py +3 -3
  372. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  373. esphome/components/matrix_keypad/__init__.py +4 -3
  374. esphome/components/max17043/max17043.cpp +0 -2
  375. esphome/components/max31855/max31855.cpp +1 -4
  376. esphome/components/max31856/max31856.cpp +0 -4
  377. esphome/components/max31865/max31865.cpp +0 -1
  378. esphome/components/max44009/max44009.cpp +0 -1
  379. esphome/components/max6675/max6675.cpp +1 -4
  380. esphome/components/max6956/max6956.cpp +0 -1
  381. esphome/components/max7219/max7219.cpp +0 -1
  382. esphome/components/max7219digit/display.py +1 -1
  383. esphome/components/max7219digit/max7219digit.cpp +0 -1
  384. esphome/components/max9611/max9611.cpp +0 -1
  385. esphome/components/mcp23008/__init__.py +1 -1
  386. esphome/components/mcp23008/mcp23008.cpp +0 -1
  387. esphome/components/mcp23016/mcp23016.cpp +0 -1
  388. esphome/components/mcp23017/__init__.py +1 -1
  389. esphome/components/mcp23017/mcp23017.cpp +0 -1
  390. esphome/components/mcp23s08/__init__.py +1 -1
  391. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  392. esphome/components/mcp23s17/__init__.py +1 -1
  393. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  394. esphome/components/mcp23x08_base/__init__.py +2 -0
  395. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  396. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  397. esphome/components/mcp23x17_base/__init__.py +2 -0
  398. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  399. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  400. esphome/components/mcp23xxx_base/__init__.py +11 -5
  401. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  402. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  403. esphome/components/mcp3008/mcp3008.cpp +1 -4
  404. esphome/components/mcp3204/mcp3204.cpp +1 -4
  405. esphome/components/mcp4461/mcp4461.cpp +0 -1
  406. esphome/components/mcp4725/mcp4725.cpp +0 -1
  407. esphome/components/mcp4728/mcp4728.cpp +0 -1
  408. esphome/components/mcp9600/mcp9600.cpp +0 -2
  409. esphome/components/mcp9808/mcp9808.cpp +0 -2
  410. esphome/components/mdns/__init__.py +3 -0
  411. esphome/components/mdns/mdns_component.cpp +2 -0
  412. esphome/components/mdns/mdns_component.h +4 -0
  413. esphome/components/media_player/__init__.py +40 -0
  414. esphome/components/media_player/automation.h +16 -0
  415. esphome/components/media_player/media_player.cpp +13 -0
  416. esphome/components/media_player/media_player.h +50 -3
  417. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  418. esphome/components/mics_4514/mics_4514.cpp +1 -6
  419. esphome/components/midea/ir_transmitter.h +4 -4
  420. esphome/components/mipi/__init__.py +416 -0
  421. esphome/components/mipi_dsi/__init__.py +5 -0
  422. esphome/components/mipi_dsi/display.py +233 -0
  423. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  424. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  425. esphome/components/mipi_dsi/models/__init__.py +0 -0
  426. esphome/components/mipi_dsi/models/guition.py +38 -0
  427. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  428. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  429. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  430. esphome/components/mipi_spi/__init__.py +0 -9
  431. esphome/components/mipi_spi/display.py +220 -256
  432. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  433. esphome/components/mipi_spi/mipi_spi.h +556 -108
  434. esphome/components/mipi_spi/models/__init__.py +0 -65
  435. esphome/components/mipi_spi/models/adafruit.py +30 -0
  436. esphome/components/mipi_spi/models/amoled.py +41 -5
  437. esphome/components/mipi_spi/models/ili.py +5 -5
  438. esphome/components/mipi_spi/models/jc.py +1 -3
  439. esphome/components/mipi_spi/models/lilygo.py +1 -1
  440. esphome/components/mipi_spi/models/waveshare.py +16 -1
  441. esphome/components/mixer/speaker/__init__.py +4 -5
  442. esphome/components/mlx90393/sensor.py +7 -5
  443. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  444. esphome/components/mlx90614/mlx90614.cpp +0 -1
  445. esphome/components/mmc5603/mmc5603.cpp +0 -1
  446. esphome/components/mmc5983/mmc5983.cpp +0 -2
  447. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  448. esphome/components/mpr121/__init__.py +7 -6
  449. esphome/components/mpr121/mpr121.cpp +0 -1
  450. esphome/components/mpu6050/mpu6050.cpp +0 -1
  451. esphome/components/mpu6886/mpu6886.cpp +0 -1
  452. esphome/components/mqtt/__init__.py +1 -2
  453. esphome/components/mqtt/mqtt_button.cpp +1 -1
  454. esphome/components/mqtt/mqtt_client.cpp +0 -1
  455. esphome/components/mqtt/mqtt_component.cpp +8 -14
  456. esphome/components/mqtt/mqtt_component.h +0 -7
  457. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  458. esphome/components/mqtt/mqtt_sensor.h +0 -1
  459. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  461. esphome/components/ms5611/ms5611.cpp +0 -1
  462. esphome/components/ms8607/ms8607.cpp +0 -1
  463. esphome/components/msa3xx/msa3xx.cpp +0 -2
  464. esphome/components/my9231/my9231.cpp +0 -2
  465. esphome/components/nau7802/nau7802.cpp +0 -1
  466. esphome/components/neopixelbus/light.py +3 -0
  467. esphome/components/network/util.cpp +29 -0
  468. esphome/components/nextion/nextion.cpp +2 -2
  469. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  470. esphome/components/npi19/npi19.cpp +0 -2
  471. esphome/components/nrf52/__init__.py +223 -0
  472. esphome/components/nrf52/boards.py +34 -0
  473. esphome/components/nrf52/const.py +18 -0
  474. esphome/components/nrf52/gpio.py +79 -0
  475. esphome/components/number/__init__.py +2 -1
  476. esphome/components/one_wire/__init__.py +1 -2
  477. esphome/components/one_wire/one_wire.cpp +0 -2
  478. esphome/components/one_wire/one_wire.h +0 -2
  479. esphome/components/opentherm/hub.cpp +0 -1
  480. esphome/components/opentherm/number/__init__.py +2 -2
  481. esphome/components/openthread/__init__.py +2 -3
  482. esphome/components/openthread/openthread.cpp +30 -13
  483. esphome/components/openthread/openthread.h +3 -0
  484. esphome/components/openthread/openthread_esp.cpp +3 -1
  485. esphome/components/opt3001/sensor.py +2 -6
  486. esphome/components/output/__init__.py +38 -0
  487. esphome/components/output/automation.h +24 -0
  488. esphome/components/output/switch/output_switch.cpp +0 -2
  489. esphome/components/packages/__init__.py +1 -2
  490. esphome/components/packet_transport/__init__.py +4 -3
  491. esphome/components/pca6416a/pca6416a.cpp +0 -1
  492. esphome/components/pca9554/pca9554.cpp +0 -1
  493. esphome/components/pca9685/pca9685_output.cpp +0 -2
  494. esphome/components/pcf85063/pcf85063.cpp +0 -1
  495. esphome/components/pcf8563/pcf8563.cpp +0 -1
  496. esphome/components/pcf8574/pcf8574.cpp +0 -1
  497. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  498. esphome/components/pipsolar/pipsolar.cpp +54 -42
  499. esphome/components/pipsolar/pipsolar.h +5 -4
  500. esphome/components/pipsolar/sensor/__init__.py +1 -1
  501. esphome/components/pm2005/pm2005.cpp +0 -1
  502. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  503. esphome/components/pmwcs3/sensor.py +1 -2
  504. esphome/components/pn532/pn532.cpp +0 -2
  505. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  506. esphome/components/power_supply/power_supply.cpp +7 -10
  507. esphome/components/power_supply/power_supply.h +1 -1
  508. esphome/components/psram/__init__.py +6 -1
  509. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  510. esphome/components/pulse_counter/sensor.py +9 -6
  511. esphome/components/pylontech/pylontech.cpp +0 -1
  512. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  513. esphome/components/qmp6988/qmp6988.cpp +0 -2
  514. esphome/components/qspi_dbi/display.py +2 -3
  515. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  516. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  517. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  518. esphome/components/rc522/rc522.cpp +9 -31
  519. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  520. esphome/components/remote_base/__init__.py +5 -6
  521. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  522. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  523. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  524. esphome/components/remote_transmitter/__init__.py +26 -0
  525. esphome/components/remote_transmitter/automation.h +18 -0
  526. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  527. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  528. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  529. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  530. esphome/components/resampler/speaker/__init__.py +4 -5
  531. esphome/components/rf_bridge/__init__.py +4 -8
  532. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  533. esphome/components/rp2040/__init__.py +3 -1
  534. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  535. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  536. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  537. esphome/components/rpi_dpi_rgb/display.py +13 -15
  538. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  539. esphome/components/runtime_stats/__init__.py +34 -0
  540. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  541. esphome/components/runtime_stats/runtime_stats.h +132 -0
  542. esphome/components/scd30/scd30.cpp +0 -2
  543. esphome/components/scd30/sensor.py +1 -2
  544. esphome/components/scd4x/scd4x.cpp +0 -1
  545. esphome/components/scd4x/sensor.py +1 -3
  546. esphome/components/sdl/display.py +3 -1
  547. esphome/components/sdl/sdl_esphome.cpp +0 -2
  548. esphome/components/sdp3x/sdp3x.cpp +0 -2
  549. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  550. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  551. esphome/components/select/__init__.py +2 -3
  552. esphome/components/select/select_traits.cpp +1 -1
  553. esphome/components/select/select_traits.h +1 -1
  554. esphome/components/sen0321/sen0321.cpp +0 -1
  555. esphome/components/sen5x/sen5x.cpp +0 -2
  556. esphome/components/senseair/senseair.cpp +7 -3
  557. esphome/components/senseair/senseair.h +11 -0
  558. esphome/components/sensor/__init__.py +36 -4
  559. esphome/components/sensor/filter.cpp +49 -10
  560. esphome/components/sensor/filter.h +22 -7
  561. esphome/components/sensor/sensor.cpp +0 -1
  562. esphome/components/sensor/sensor.h +0 -9
  563. esphome/components/sfa30/sfa30.cpp +0 -4
  564. esphome/components/sgp30/sgp30.cpp +0 -2
  565. esphome/components/sgp4x/sensor.py +1 -1
  566. esphome/components/sgp4x/sgp4x.cpp +0 -2
  567. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  568. esphome/components/sht3xd/sht3xd.cpp +0 -2
  569. esphome/components/sht4x/sht4x.cpp +0 -2
  570. esphome/components/shtcx/shtcx.cpp +0 -1
  571. esphome/components/sim800l/__init__.py +2 -4
  572. esphome/components/sm16716/sm16716.cpp +0 -1
  573. esphome/components/sm2135/sm2135.cpp +0 -1
  574. esphome/components/sm2235/sm2235.cpp +0 -1
  575. esphome/components/sm2335/sm2335.cpp +0 -1
  576. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  577. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  578. esphome/components/sntp/sntp_component.cpp +0 -1
  579. esphome/components/sound_level/sensor.py +1 -1
  580. esphome/components/speaker/media_player/__init__.py +21 -33
  581. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  582. esphome/components/spi/__init__.py +29 -13
  583. esphome/components/spi/spi.cpp +0 -2
  584. esphome/components/spi_device/spi_device.cpp +1 -4
  585. esphome/components/sprinkler/__init__.py +4 -4
  586. esphome/components/sps30/sps30.cpp +0 -1
  587. esphome/components/ssd1306_base/__init__.py +11 -11
  588. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  589. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  590. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  591. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  592. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  593. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  594. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  595. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  596. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  597. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  598. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  599. esphome/components/st7701s/display.py +10 -14
  600. esphome/components/st7701s/st7701s.cpp +0 -3
  601. esphome/components/st7735/st7735.cpp +0 -1
  602. esphome/components/st7789v/st7789v.cpp +0 -1
  603. esphome/components/st7920/st7920.cpp +0 -1
  604. esphome/components/status_led/light/status_led_light.cpp +0 -2
  605. esphome/components/status_led/status_led.cpp +0 -1
  606. esphome/components/stepper/__init__.py +2 -4
  607. esphome/components/sts3x/sts3x.cpp +0 -1
  608. esphome/components/substitutions/__init__.py +10 -16
  609. esphome/components/substitutions/jinja.py +24 -1
  610. esphome/components/sun/__init__.py +2 -3
  611. esphome/components/switch/__init__.py +31 -1
  612. esphome/components/switch/automation.h +24 -0
  613. esphome/components/switch/switch.cpp +8 -0
  614. esphome/components/switch/switch.h +8 -0
  615. esphome/components/sx126x/sx126x.cpp +0 -2
  616. esphome/components/sx127x/sx127x.cpp +0 -2
  617. esphome/components/sx1509/__init__.py +7 -5
  618. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  619. esphome/components/sx1509/sx1509.cpp +0 -2
  620. esphome/components/syslog/esphome_syslog.cpp +1 -1
  621. esphome/components/tc74/tc74.cpp +0 -1
  622. esphome/components/tca9548a/tca9548a.cpp +0 -1
  623. esphome/components/tca9555/tca9555.cpp +0 -1
  624. esphome/components/tcs34725/tcs34725.cpp +0 -1
  625. esphome/components/tee501/tee501.cpp +0 -1
  626. esphome/components/tem3200/tem3200.cpp +0 -2
  627. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  628. esphome/components/template/cover/template_cover.cpp +0 -1
  629. esphome/components/template/select/template_select.cpp +0 -1
  630. esphome/components/template/text/template_text.cpp +0 -2
  631. esphome/components/template/valve/template_valve.cpp +0 -1
  632. esphome/components/text/__init__.py +0 -1
  633. esphome/components/text/text_traits.h +2 -0
  634. esphome/components/text_sensor/__init__.py +2 -1
  635. esphome/components/text_sensor/text_sensor.cpp +0 -2
  636. esphome/components/text_sensor/text_sensor.h +0 -8
  637. esphome/components/thermostat/climate.py +4 -4
  638. esphome/components/time/__init__.py +7 -4
  639. esphome/components/time/real_time_clock.cpp +16 -3
  640. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  641. esphome/components/tlc5947/tlc5947.cpp +0 -2
  642. esphome/components/tlc5971/tlc5971.cpp +0 -2
  643. esphome/components/tm1621/tm1621.cpp +0 -2
  644. esphome/components/tm1637/tm1637.cpp +0 -2
  645. esphome/components/tm1638/tm1638.cpp +0 -2
  646. esphome/components/tm1651/__init__.py +45 -48
  647. esphome/components/tm1651/tm1651.cpp +213 -47
  648. esphome/components/tm1651/tm1651.h +37 -32
  649. esphome/components/tmp117/tmp117.cpp +0 -2
  650. esphome/components/tsl2561/tsl2561.cpp +0 -1
  651. esphome/components/tsl2591/tsl2591.cpp +0 -1
  652. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  653. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  654. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  655. esphome/components/tuya/climate/__init__.py +9 -10
  656. esphome/components/tuya/number/__init__.py +8 -6
  657. esphome/components/tx20/tx20.cpp +0 -1
  658. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  659. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  660. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  661. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  662. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  663. esphome/components/udp/__init__.py +1 -1
  664. esphome/components/ufire_ec/sensor.py +1 -2
  665. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  666. esphome/components/ufire_ise/sensor.py +1 -2
  667. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  668. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  669. esphome/components/update/__init__.py +0 -1
  670. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  671. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  672. esphome/components/usb_host/usb_host_client.cpp +0 -1
  673. esphome/components/usb_host/usb_host_component.cpp +0 -1
  674. esphome/components/valve/__init__.py +0 -1
  675. esphome/components/veml3235/veml3235.cpp +0 -3
  676. esphome/components/veml7700/veml7700.cpp +0 -2
  677. esphome/components/version/version_text_sensor.cpp +0 -1
  678. esphome/components/version/version_text_sensor.h +0 -1
  679. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  680. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  681. esphome/components/web_server/__init__.py +13 -0
  682. esphome/components/web_server/web_server.cpp +188 -353
  683. esphome/components/web_server/web_server.h +61 -1
  684. esphome/components/web_server_base/__init__.py +1 -1
  685. esphome/components/web_server_base/web_server_base.cpp +2 -0
  686. esphome/components/web_server_base/web_server_base.h +6 -0
  687. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  688. esphome/components/web_server_idf/web_server_idf.h +2 -0
  689. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  690. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  691. esphome/components/wifi/__init__.py +17 -43
  692. esphome/components/wifi/wifi_component.cpp +100 -36
  693. esphome/components/wifi/wifi_component.h +5 -1
  694. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  695. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  696. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  697. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  698. esphome/components/wireguard/wireguard.cpp +0 -2
  699. esphome/components/x9c/x9c.cpp +0 -2
  700. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  701. esphome/components/xl9535/xl9535.cpp +0 -2
  702. esphome/components/zephyr/__init__.py +252 -0
  703. esphome/components/zephyr/const.py +16 -0
  704. esphome/components/zephyr/core.cpp +90 -0
  705. esphome/components/zephyr/gpio.cpp +120 -0
  706. esphome/components/zephyr/gpio.h +38 -0
  707. esphome/components/zephyr/pre_build.py.script +4 -0
  708. esphome/components/zephyr/preferences.cpp +156 -0
  709. esphome/components/zephyr/preferences.h +13 -0
  710. esphome/config.py +38 -16
  711. esphome/config_helpers.py +1 -2
  712. esphome/config_validation.py +12 -16
  713. esphome/const.py +26 -1
  714. esphome/core/__init__.py +92 -51
  715. esphome/core/application.cpp +75 -21
  716. esphome/core/application.h +106 -171
  717. esphome/core/color.h +10 -0
  718. esphome/core/component.cpp +41 -25
  719. esphome/core/component.h +9 -6
  720. esphome/core/component_iterator.cpp +61 -261
  721. esphome/core/component_iterator.h +15 -0
  722. esphome/core/config.py +26 -11
  723. esphome/core/defines.h +40 -2
  724. esphome/core/entity_base.h +18 -0
  725. esphome/core/entity_helpers.py +45 -10
  726. esphome/core/helpers.cpp +8 -15
  727. esphome/core/helpers.h +60 -6
  728. esphome/core/lock_free_queue.h +1 -1
  729. esphome/core/scheduler.cpp +311 -77
  730. esphome/core/scheduler.h +141 -28
  731. esphome/cpp_generator.py +2 -6
  732. esphome/cpp_helpers.py +1 -1
  733. esphome/dashboard/dashboard.py +2 -3
  734. esphome/dashboard/dns.py +2 -8
  735. esphome/dashboard/web_server.py +34 -19
  736. esphome/espota2.py +1 -4
  737. esphome/git.py +3 -1
  738. esphome/helpers.py +23 -4
  739. esphome/log.py +3 -1
  740. esphome/mqtt.py +3 -5
  741. esphome/platformio_api.py +7 -4
  742. esphome/types.py +12 -0
  743. esphome/util.py +20 -8
  744. esphome/voluptuous_schema.py +4 -3
  745. esphome/vscode.py +1 -2
  746. esphome/wizard.py +1 -4
  747. esphome/writer.py +16 -108
  748. esphome/yaml_util.py +7 -5
  749. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
  750. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/RECORD +755 -675
  751. esphome/components/mipi_spi/models/commands.py +0 -82
  752. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  753. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
  754. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
  755. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
  756. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
@@ -1062,12 +1062,11 @@ def validate_raw_alternating(value):
1062
1062
  last_negative = None
1063
1063
  for i, val in enumerate(value):
1064
1064
  this_negative = val < 0
1065
- if i != 0:
1066
- if this_negative == last_negative:
1067
- raise cv.Invalid(
1068
- f"Values must alternate between being positive and negative, please see index {i} and {i + 1}",
1069
- [i],
1070
- )
1065
+ if i != 0 and this_negative == last_negative:
1066
+ raise cv.Invalid(
1067
+ f"Values must alternate between being positive and negative, please see index {i} and {i + 1}",
1068
+ [i],
1069
+ )
1071
1070
  last_negative = this_negative
1072
1071
  return value
1073
1072
 
@@ -38,7 +38,6 @@ static bool IRAM_ATTR HOT rmt_callback(rmt_channel_handle_t channel, const rmt_r
38
38
  }
39
39
 
40
40
  void RemoteReceiverComponent::setup() {
41
- ESP_LOGCONFIG(TAG, "Running setup");
42
41
  rmt_rx_channel_config_t channel;
43
42
  memset(&channel, 0, sizeof(channel));
44
43
  channel.clk_src = RMT_CLK_SRC_DEFAULT;
@@ -31,7 +31,6 @@ void IRAM_ATTR HOT RemoteReceiverComponentStore::gpio_intr(RemoteReceiverCompone
31
31
  }
32
32
 
33
33
  void RemoteReceiverComponent::setup() {
34
- ESP_LOGCONFIG(TAG, "Running setup");
35
34
  this->pin_->setup();
36
35
  auto &s = this->store_;
37
36
  s.filter_us = this->filter_us_;
@@ -31,7 +31,6 @@ void IRAM_ATTR HOT RemoteReceiverComponentStore::gpio_intr(RemoteReceiverCompone
31
31
  }
32
32
 
33
33
  void RemoteReceiverComponent::setup() {
34
- ESP_LOGCONFIG(TAG, "Running setup");
35
34
  this->pin_->setup();
36
35
  auto &s = this->store_;
37
36
  s.filter_us = this->filter_us_;
@@ -13,6 +13,7 @@ from esphome.const import (
13
13
  CONF_PIN,
14
14
  CONF_RMT_SYMBOLS,
15
15
  CONF_USE_DMA,
16
+ CONF_VALUE,
16
17
  PlatformFramework,
17
18
  )
18
19
  from esphome.core import CORE
@@ -22,11 +23,17 @@ AUTO_LOAD = ["remote_base"]
22
23
  CONF_EOT_LEVEL = "eot_level"
23
24
  CONF_ON_TRANSMIT = "on_transmit"
24
25
  CONF_ON_COMPLETE = "on_complete"
26
+ CONF_TRANSMITTER_ID = remote_base.CONF_TRANSMITTER_ID
25
27
 
26
28
  remote_transmitter_ns = cg.esphome_ns.namespace("remote_transmitter")
27
29
  RemoteTransmitterComponent = remote_transmitter_ns.class_(
28
30
  "RemoteTransmitterComponent", remote_base.RemoteTransmitterBase, cg.Component
29
31
  )
32
+ DigitalWriteAction = remote_transmitter_ns.class_(
33
+ "DigitalWriteAction",
34
+ automation.Action,
35
+ cg.Parented.template(RemoteTransmitterComponent),
36
+ )
30
37
 
31
38
  MULTI_CONF = True
32
39
  CONFIG_SCHEMA = cv.Schema(
@@ -63,6 +70,25 @@ CONFIG_SCHEMA = cv.Schema(
63
70
  }
64
71
  ).extend(cv.COMPONENT_SCHEMA)
65
72
 
73
+ DIGITAL_WRITE_ACTION_SCHEMA = cv.maybe_simple_value(
74
+ {
75
+ cv.GenerateID(CONF_TRANSMITTER_ID): cv.use_id(RemoteTransmitterComponent),
76
+ cv.Required(CONF_VALUE): cv.templatable(cv.boolean),
77
+ },
78
+ key=CONF_VALUE,
79
+ )
80
+
81
+
82
+ @automation.register_action(
83
+ "remote_transmitter.digital_write", DigitalWriteAction, DIGITAL_WRITE_ACTION_SCHEMA
84
+ )
85
+ async def digital_write_action_to_code(config, action_id, template_arg, args):
86
+ var = cg.new_Pvariable(action_id, template_arg)
87
+ await cg.register_parented(var, config[CONF_TRANSMITTER_ID])
88
+ template_ = await cg.templatable(config[CONF_VALUE], args, bool)
89
+ cg.add(var.set_value(template_))
90
+ return var
91
+
66
92
 
67
93
  async def to_code(config):
68
94
  pin = await cg.gpio_pin_expression(config[CONF_PIN])
@@ -0,0 +1,18 @@
1
+ #pragma once
2
+
3
+ #include "esphome/components/remote_transmitter/remote_transmitter.h"
4
+ #include "esphome/core/automation.h"
5
+ #include "esphome/core/component.h"
6
+ #include "esphome/core/helpers.h"
7
+
8
+ namespace esphome {
9
+ namespace remote_transmitter {
10
+
11
+ template<typename... Ts> class DigitalWriteAction : public Action<Ts...>, public Parented<RemoteTransmitterComponent> {
12
+ public:
13
+ TEMPLATABLE_VALUE(bool, value)
14
+ void play(Ts... x) override { this->parent_->digital_write(this->value_.value(x...)); }
15
+ };
16
+
17
+ } // namespace remote_transmitter
18
+ } // namespace esphome
@@ -30,10 +30,11 @@ class RemoteTransmitterComponent : public remote_base::RemoteTransmitterBase,
30
30
 
31
31
  void set_carrier_duty_percent(uint8_t carrier_duty_percent) { this->carrier_duty_percent_ = carrier_duty_percent; }
32
32
 
33
+ void digital_write(bool value);
34
+
33
35
  #if defined(USE_ESP32)
34
36
  void set_with_dma(bool with_dma) { this->with_dma_ = with_dma; }
35
37
  void set_eot_level(bool eot_level) { this->eot_level_ = eot_level; }
36
- void digital_write(bool value);
37
38
  #endif
38
39
 
39
40
  Trigger<> *get_transmit_trigger() const { return this->transmit_trigger_; };
@@ -11,7 +11,6 @@ namespace remote_transmitter {
11
11
  static const char *const TAG = "remote_transmitter";
12
12
 
13
13
  void RemoteTransmitterComponent::setup() {
14
- ESP_LOGCONFIG(TAG, "Running setup");
15
14
  this->inverted_ = this->pin_->is_inverted();
16
15
  this->configure_rmt_();
17
16
  }
@@ -73,6 +73,8 @@ void RemoteTransmitterComponent::space_(uint32_t usec) {
73
73
  this->target_time_ += usec;
74
74
  }
75
75
 
76
+ void RemoteTransmitterComponent::digital_write(bool value) { this->pin_->digital_write(value); }
77
+
76
78
  void RemoteTransmitterComponent::send_internal(uint32_t send_times, uint32_t send_wait) {
77
79
  ESP_LOGD(TAG, "Sending remote code");
78
80
  uint32_t on_time, off_time;
@@ -75,6 +75,8 @@ void RemoteTransmitterComponent::space_(uint32_t usec) {
75
75
  this->target_time_ += usec;
76
76
  }
77
77
 
78
+ void RemoteTransmitterComponent::digital_write(bool value) { this->pin_->digital_write(value); }
79
+
78
80
  void RemoteTransmitterComponent::send_internal(uint32_t send_times, uint32_t send_wait) {
79
81
  ESP_LOGD(TAG, "Sending remote code");
80
82
  uint32_t on_time, off_time;
@@ -90,11 +90,10 @@ async def to_code(config):
90
90
 
91
91
  if task_stack_in_psram := config.get(CONF_TASK_STACK_IN_PSRAM):
92
92
  cg.add(var.set_task_stack_in_psram(task_stack_in_psram))
93
- if task_stack_in_psram:
94
- if config[CONF_TASK_STACK_IN_PSRAM]:
95
- esp32.add_idf_sdkconfig_option(
96
- "CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY", True
97
- )
93
+ if task_stack_in_psram and config[CONF_TASK_STACK_IN_PSRAM]:
94
+ esp32.add_idf_sdkconfig_option(
95
+ "CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY", True
96
+ )
98
97
 
99
98
  cg.add(var.set_target_bits_per_sample(config[CONF_BITS_PER_SAMPLE]))
100
99
  cg.add(var.set_target_sample_rate(config[CONF_SAMPLE_RATE]))
@@ -136,8 +136,7 @@ RFBRIDGE_ID_SCHEMA = cv.Schema({cv.GenerateID(): cv.use_id(RFBridgeComponent)})
136
136
  @automation.register_action("rf_bridge.learn", RFBridgeLearnAction, RFBRIDGE_ID_SCHEMA)
137
137
  async def rf_bridge_learnx_to_code(config, action_id, template_args, args):
138
138
  paren = await cg.get_variable(config[CONF_ID])
139
- var = cg.new_Pvariable(action_id, template_args, paren)
140
- return var
139
+ return cg.new_Pvariable(action_id, template_args, paren)
141
140
 
142
141
 
143
142
  @automation.register_action(
@@ -149,8 +148,7 @@ async def rf_bridge_start_advanced_sniffing_to_code(
149
148
  config, action_id, template_args, args
150
149
  ):
151
150
  paren = await cg.get_variable(config[CONF_ID])
152
- var = cg.new_Pvariable(action_id, template_args, paren)
153
- return var
151
+ return cg.new_Pvariable(action_id, template_args, paren)
154
152
 
155
153
 
156
154
  @automation.register_action(
@@ -162,8 +160,7 @@ async def rf_bridge_stop_advanced_sniffing_to_code(
162
160
  config, action_id, template_args, args
163
161
  ):
164
162
  paren = await cg.get_variable(config[CONF_ID])
165
- var = cg.new_Pvariable(action_id, template_args, paren)
166
- return var
163
+ return cg.new_Pvariable(action_id, template_args, paren)
167
164
 
168
165
 
169
166
  @automation.register_action(
@@ -175,8 +172,7 @@ async def rf_bridge_start_bucket_sniffing_to_code(
175
172
  config, action_id, template_args, args
176
173
  ):
177
174
  paren = await cg.get_variable(config[CONF_ID])
178
- var = cg.new_Pvariable(action_id, template_args, paren)
179
- return var
175
+ return cg.new_Pvariable(action_id, template_args, paren)
180
176
 
181
177
 
182
178
  RFBRIDGE_SEND_ADVANCED_CODE_SCHEMA = cv.Schema(
@@ -129,8 +129,6 @@ void IRAM_ATTR HOT RotaryEncoderSensorStore::gpio_intr(RotaryEncoderSensorStore
129
129
  }
130
130
 
131
131
  void RotaryEncoderSensor::setup() {
132
- ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
133
-
134
132
  int32_t initial_value = 0;
135
133
  switch (this->restore_mode_) {
136
134
  case ROTARY_ENCODER_RESTORE_DEFAULT_ZERO:
@@ -16,6 +16,7 @@ from esphome.const import (
16
16
  KEY_TARGET_FRAMEWORK,
17
17
  KEY_TARGET_PLATFORM,
18
18
  PLATFORM_RP2040,
19
+ ThreadModel,
19
20
  )
20
21
  from esphome.core import CORE, EsphomeError, coroutine_with_priority
21
22
  from esphome.helpers import copy_file_if_changed, mkdir_p, read_file, write_file
@@ -171,6 +172,7 @@ async def to_code(config):
171
172
  cg.set_cpp_standard("gnu++20")
172
173
  cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
173
174
  cg.add_define("ESPHOME_VARIANT", "RP2040")
175
+ cg.add_define(ThreadModel.SINGLE)
174
176
 
175
177
  cg.add_platformio_option("extra_scripts", ["post:post_build.py"])
176
178
 
@@ -204,7 +206,7 @@ def add_pio_file(component: str, key: str, data: str):
204
206
  cv.validate_id_name(key)
205
207
  except cv.Invalid as e:
206
208
  raise EsphomeError(
207
- f"[{component}] Invalid PIO key: {key}. Allowed characters: [{ascii_letters}{digits}_]\nPlease report an issue https://github.com/esphome/issues"
209
+ f"[{component}] Invalid PIO key: {key}. Allowed characters: [{ascii_letters}{digits}_]\nPlease report an issue https://github.com/esphome/esphome/issues"
208
210
  ) from e
209
211
  CORE.data[KEY_RP2040][KEY_PIO_FILES][key] = data
210
212
 
@@ -40,8 +40,6 @@ void RP2040PIOLEDStripLightOutput::dma_write_complete_handler_() {
40
40
  }
41
41
 
42
42
  void RP2040PIOLEDStripLightOutput::setup() {
43
- ESP_LOGCONFIG(TAG, "Running setup");
44
-
45
43
  size_t buffer_size = this->get_buffer_size_();
46
44
 
47
45
  RAMAllocator<uint8_t> allocator;
@@ -125,8 +125,7 @@ writezero:
125
125
 
126
126
  def time_to_cycles(time_us):
127
127
  cycles_per_us = 57.5
128
- cycles = round(float(time_us) * cycles_per_us)
129
- return cycles
128
+ return round(float(time_us) * cycles_per_us)
130
129
 
131
130
 
132
131
  CONF_PIO = "pio"
@@ -16,11 +16,7 @@ namespace rp2040_pwm {
16
16
 
17
17
  static const char *const TAG = "rp2040_pwm";
18
18
 
19
- void RP2040PWM::setup() {
20
- ESP_LOGCONFIG(TAG, "Running setup");
21
-
22
- this->setup_pwm_();
23
- }
19
+ void RP2040PWM::setup() { this->setup_pwm_(); }
24
20
 
25
21
  void RP2040PWM::setup_pwm_() {
26
22
  pwm_config config = pwm_get_default_config();
@@ -2,6 +2,18 @@ from esphome import pins
2
2
  import esphome.codegen as cg
3
3
  from esphome.components import display
4
4
  from esphome.components.esp32 import const, only_on_variant
5
+ from esphome.components.mipi import (
6
+ CONF_DE_PIN,
7
+ CONF_HSYNC_BACK_PORCH,
8
+ CONF_HSYNC_FRONT_PORCH,
9
+ CONF_HSYNC_PULSE_WIDTH,
10
+ CONF_PCLK_FREQUENCY,
11
+ CONF_PCLK_INVERTED,
12
+ CONF_PCLK_PIN,
13
+ CONF_VSYNC_BACK_PORCH,
14
+ CONF_VSYNC_FRONT_PORCH,
15
+ CONF_VSYNC_PULSE_WIDTH,
16
+ )
5
17
  import esphome.config_validation as cv
6
18
  from esphome.const import (
7
19
  CONF_BLUE,
@@ -27,18 +39,6 @@ from esphome.const import (
27
39
 
28
40
  DEPENDENCIES = ["esp32"]
29
41
 
30
- CONF_DE_PIN = "de_pin"
31
- CONF_PCLK_PIN = "pclk_pin"
32
-
33
- CONF_HSYNC_FRONT_PORCH = "hsync_front_porch"
34
- CONF_HSYNC_PULSE_WIDTH = "hsync_pulse_width"
35
- CONF_HSYNC_BACK_PORCH = "hsync_back_porch"
36
- CONF_VSYNC_FRONT_PORCH = "vsync_front_porch"
37
- CONF_VSYNC_PULSE_WIDTH = "vsync_pulse_width"
38
- CONF_VSYNC_BACK_PORCH = "vsync_back_porch"
39
- CONF_PCLK_FREQUENCY = "pclk_frequency"
40
- CONF_PCLK_INVERTED = "pclk_inverted"
41
-
42
42
  rpi_dpi_rgb_ns = cg.esphome_ns.namespace("rpi_dpi_rgb")
43
43
  RPI_DPI_RGB = rpi_dpi_rgb_ns.class_("RpiDpiRgb", display.Display, cg.Component)
44
44
  ColorOrder = display.display_ns.enum("ColorMode")
@@ -140,7 +140,6 @@ async def to_code(config):
140
140
  cg.add(var.set_vsync_front_porch(config[CONF_VSYNC_FRONT_PORCH]))
141
141
  cg.add(var.set_pclk_inverted(config[CONF_PCLK_INVERTED]))
142
142
  cg.add(var.set_pclk_frequency(config[CONF_PCLK_FREQUENCY]))
143
- index = 0
144
143
  dpins = []
145
144
  if CONF_RED in config[CONF_DATA_PINS]:
146
145
  red_pins = config[CONF_DATA_PINS][CONF_RED]
@@ -158,10 +157,9 @@ async def to_code(config):
158
157
  dpins = dpins[8:16] + dpins[0:8]
159
158
  else:
160
159
  dpins = config[CONF_DATA_PINS]
161
- for pin in dpins:
160
+ for index, pin in enumerate(dpins):
162
161
  data_pin = await cg.gpio_pin_expression(pin)
163
162
  cg.add(var.add_data_pin(data_pin, index))
164
- index += 1
165
163
 
166
164
  if enable_pin := config.get(CONF_ENABLE_PIN):
167
165
  enable = await cg.gpio_pin_expression(enable_pin)
@@ -6,7 +6,6 @@ namespace esphome {
6
6
  namespace rpi_dpi_rgb {
7
7
 
8
8
  void RpiDpiRgb::setup() {
9
- ESP_LOGCONFIG(TAG, "Running setup");
10
9
  this->reset_display_();
11
10
  esp_lcd_rgb_panel_config_t config{};
12
11
  config.flags.fb_in_psram = 1;
@@ -23,7 +22,6 @@ void RpiDpiRgb::setup() {
23
22
  config.timings.flags.pclk_active_neg = this->pclk_inverted_;
24
23
  config.timings.pclk_hz = this->pclk_frequency_;
25
24
  config.clk_src = LCD_CLK_SRC_PLL160M;
26
- config.psram_trans_align = 64;
27
25
  size_t data_pin_count = sizeof(this->data_pins_) / sizeof(this->data_pins_[0]);
28
26
  for (size_t i = 0; i != data_pin_count; i++) {
29
27
  config.data_gpio_nums[i] = this->data_pins_[i]->get_pin();
@@ -42,7 +40,6 @@ void RpiDpiRgb::setup() {
42
40
  }
43
41
  ESP_ERROR_CHECK(esp_lcd_panel_reset(this->handle_));
44
42
  ESP_ERROR_CHECK(esp_lcd_panel_init(this->handle_));
45
- ESP_LOGCONFIG(TAG, "RPI_DPI_RGB setup complete");
46
43
  }
47
44
  void RpiDpiRgb::loop() {
48
45
  if (this->handle_ != nullptr)
@@ -0,0 +1,34 @@
1
+ """
2
+ Runtime statistics component for ESPHome.
3
+ """
4
+
5
+ import esphome.codegen as cg
6
+ import esphome.config_validation as cv
7
+ from esphome.const import CONF_ID
8
+
9
+ CODEOWNERS = ["@bdraco"]
10
+
11
+ CONF_LOG_INTERVAL = "log_interval"
12
+
13
+ runtime_stats_ns = cg.esphome_ns.namespace("runtime_stats")
14
+ RuntimeStatsCollector = runtime_stats_ns.class_("RuntimeStatsCollector")
15
+
16
+ CONFIG_SCHEMA = cv.Schema(
17
+ {
18
+ cv.GenerateID(): cv.declare_id(RuntimeStatsCollector),
19
+ cv.Optional(
20
+ CONF_LOG_INTERVAL, default="60s"
21
+ ): cv.positive_time_period_milliseconds,
22
+ }
23
+ )
24
+
25
+
26
+ async def to_code(config):
27
+ """Generate code for the runtime statistics component."""
28
+ # Define USE_RUNTIME_STATS when this component is used
29
+ cg.add_define("USE_RUNTIME_STATS")
30
+
31
+ # Create the runtime stats instance (constructor sets global_runtime_stats)
32
+ var = cg.new_Pvariable(config[CONF_ID])
33
+
34
+ cg.add(var.set_log_interval(config[CONF_LOG_INTERVAL]))
@@ -0,0 +1,102 @@
1
+ #include "runtime_stats.h"
2
+
3
+ #ifdef USE_RUNTIME_STATS
4
+
5
+ #include "esphome/core/component.h"
6
+ #include <algorithm>
7
+
8
+ namespace esphome {
9
+
10
+ namespace runtime_stats {
11
+
12
+ RuntimeStatsCollector::RuntimeStatsCollector() : log_interval_(60000), next_log_time_(0) {
13
+ global_runtime_stats = this;
14
+ }
15
+
16
+ void RuntimeStatsCollector::record_component_time(Component *component, uint32_t duration_ms, uint32_t current_time) {
17
+ if (component == nullptr)
18
+ return;
19
+
20
+ // Check if we have cached the name for this component
21
+ auto name_it = this->component_names_cache_.find(component);
22
+ if (name_it == this->component_names_cache_.end()) {
23
+ // First time seeing this component, cache its name
24
+ const char *source = component->get_component_source();
25
+ this->component_names_cache_[component] = source;
26
+ this->component_stats_[source].record_time(duration_ms);
27
+ } else {
28
+ this->component_stats_[name_it->second].record_time(duration_ms);
29
+ }
30
+
31
+ if (this->next_log_time_ == 0) {
32
+ this->next_log_time_ = current_time + this->log_interval_;
33
+ return;
34
+ }
35
+ }
36
+
37
+ void RuntimeStatsCollector::log_stats_() {
38
+ ESP_LOGI(TAG, "Component Runtime Statistics");
39
+ ESP_LOGI(TAG, "Period stats (last %" PRIu32 "ms):", this->log_interval_);
40
+
41
+ // First collect stats we want to display
42
+ std::vector<ComponentStatPair> stats_to_display;
43
+
44
+ for (const auto &it : this->component_stats_) {
45
+ const ComponentRuntimeStats &stats = it.second;
46
+ if (stats.get_period_count() > 0) {
47
+ ComponentStatPair pair = {it.first, &stats};
48
+ stats_to_display.push_back(pair);
49
+ }
50
+ }
51
+
52
+ // Sort by period runtime (descending)
53
+ std::sort(stats_to_display.begin(), stats_to_display.end(), std::greater<ComponentStatPair>());
54
+
55
+ // Log top components by period runtime
56
+ for (const auto &it : stats_to_display) {
57
+ const char *source = it.name;
58
+ const ComponentRuntimeStats *stats = it.stats;
59
+
60
+ ESP_LOGI(TAG, " %s: count=%" PRIu32 ", avg=%.2fms, max=%" PRIu32 "ms, total=%" PRIu32 "ms", source,
61
+ stats->get_period_count(), stats->get_period_avg_time_ms(), stats->get_period_max_time_ms(),
62
+ stats->get_period_time_ms());
63
+ }
64
+
65
+ // Log total stats since boot
66
+ ESP_LOGI(TAG, "Total stats (since boot):");
67
+
68
+ // Re-sort by total runtime for all-time stats
69
+ std::sort(stats_to_display.begin(), stats_to_display.end(),
70
+ [](const ComponentStatPair &a, const ComponentStatPair &b) {
71
+ return a.stats->get_total_time_ms() > b.stats->get_total_time_ms();
72
+ });
73
+
74
+ for (const auto &it : stats_to_display) {
75
+ const char *source = it.name;
76
+ const ComponentRuntimeStats *stats = it.stats;
77
+
78
+ ESP_LOGI(TAG, " %s: count=%" PRIu32 ", avg=%.2fms, max=%" PRIu32 "ms, total=%" PRIu32 "ms", source,
79
+ stats->get_total_count(), stats->get_total_avg_time_ms(), stats->get_total_max_time_ms(),
80
+ stats->get_total_time_ms());
81
+ }
82
+ }
83
+
84
+ void RuntimeStatsCollector::process_pending_stats(uint32_t current_time) {
85
+ if (this->next_log_time_ == 0)
86
+ return;
87
+
88
+ if (current_time >= this->next_log_time_) {
89
+ this->log_stats_();
90
+ this->reset_stats_();
91
+ this->next_log_time_ = current_time + this->log_interval_;
92
+ }
93
+ }
94
+
95
+ } // namespace runtime_stats
96
+
97
+ runtime_stats::RuntimeStatsCollector *global_runtime_stats =
98
+ nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
99
+
100
+ } // namespace esphome
101
+
102
+ #endif // USE_RUNTIME_STATS
@@ -0,0 +1,132 @@
1
+ #pragma once
2
+
3
+ #include "esphome/core/defines.h"
4
+
5
+ #ifdef USE_RUNTIME_STATS
6
+
7
+ #include <map>
8
+ #include <vector>
9
+ #include <cstdint>
10
+ #include <cstring>
11
+ #include "esphome/core/helpers.h"
12
+ #include "esphome/core/log.h"
13
+
14
+ namespace esphome {
15
+
16
+ class Component; // Forward declaration
17
+
18
+ namespace runtime_stats {
19
+
20
+ static const char *const TAG = "runtime_stats";
21
+
22
+ class ComponentRuntimeStats {
23
+ public:
24
+ ComponentRuntimeStats()
25
+ : period_count_(0),
26
+ period_time_ms_(0),
27
+ period_max_time_ms_(0),
28
+ total_count_(0),
29
+ total_time_ms_(0),
30
+ total_max_time_ms_(0) {}
31
+
32
+ void record_time(uint32_t duration_ms) {
33
+ // Update period counters
34
+ this->period_count_++;
35
+ this->period_time_ms_ += duration_ms;
36
+ if (duration_ms > this->period_max_time_ms_)
37
+ this->period_max_time_ms_ = duration_ms;
38
+
39
+ // Update total counters
40
+ this->total_count_++;
41
+ this->total_time_ms_ += duration_ms;
42
+ if (duration_ms > this->total_max_time_ms_)
43
+ this->total_max_time_ms_ = duration_ms;
44
+ }
45
+
46
+ void reset_period_stats() {
47
+ this->period_count_ = 0;
48
+ this->period_time_ms_ = 0;
49
+ this->period_max_time_ms_ = 0;
50
+ }
51
+
52
+ // Period stats (reset each logging interval)
53
+ uint32_t get_period_count() const { return this->period_count_; }
54
+ uint32_t get_period_time_ms() const { return this->period_time_ms_; }
55
+ uint32_t get_period_max_time_ms() const { return this->period_max_time_ms_; }
56
+ float get_period_avg_time_ms() const {
57
+ return this->period_count_ > 0 ? this->period_time_ms_ / static_cast<float>(this->period_count_) : 0.0f;
58
+ }
59
+
60
+ // Total stats (persistent until reboot)
61
+ uint32_t get_total_count() const { return this->total_count_; }
62
+ uint32_t get_total_time_ms() const { return this->total_time_ms_; }
63
+ uint32_t get_total_max_time_ms() const { return this->total_max_time_ms_; }
64
+ float get_total_avg_time_ms() const {
65
+ return this->total_count_ > 0 ? this->total_time_ms_ / static_cast<float>(this->total_count_) : 0.0f;
66
+ }
67
+
68
+ protected:
69
+ // Period stats (reset each logging interval)
70
+ uint32_t period_count_;
71
+ uint32_t period_time_ms_;
72
+ uint32_t period_max_time_ms_;
73
+
74
+ // Total stats (persistent until reboot)
75
+ uint32_t total_count_;
76
+ uint32_t total_time_ms_;
77
+ uint32_t total_max_time_ms_;
78
+ };
79
+
80
+ // For sorting components by run time
81
+ struct ComponentStatPair {
82
+ const char *name;
83
+ const ComponentRuntimeStats *stats;
84
+
85
+ bool operator>(const ComponentStatPair &other) const {
86
+ // Sort by period time as that's what we're displaying in the logs
87
+ return stats->get_period_time_ms() > other.stats->get_period_time_ms();
88
+ }
89
+ };
90
+
91
+ class RuntimeStatsCollector {
92
+ public:
93
+ RuntimeStatsCollector();
94
+
95
+ void set_log_interval(uint32_t log_interval) { this->log_interval_ = log_interval; }
96
+ uint32_t get_log_interval() const { return this->log_interval_; }
97
+
98
+ void record_component_time(Component *component, uint32_t duration_ms, uint32_t current_time);
99
+
100
+ // Process any pending stats printing (should be called after component loop)
101
+ void process_pending_stats(uint32_t current_time);
102
+
103
+ protected:
104
+ void log_stats_();
105
+
106
+ void reset_stats_() {
107
+ for (auto &it : this->component_stats_) {
108
+ it.second.reset_period_stats();
109
+ }
110
+ }
111
+
112
+ // Use const char* keys for efficiency
113
+ // Custom comparator for const char* keys in map
114
+ // Without this, std::map would compare pointer addresses instead of string contents,
115
+ // causing identical component names at different addresses to be treated as different keys
116
+ struct CStrCompare {
117
+ bool operator()(const char *a, const char *b) const { return std::strcmp(a, b) < 0; }
118
+ };
119
+ std::map<const char *, ComponentRuntimeStats, CStrCompare> component_stats_;
120
+ std::map<Component *, const char *> component_names_cache_;
121
+ uint32_t log_interval_;
122
+ uint32_t next_log_time_;
123
+ };
124
+
125
+ } // namespace runtime_stats
126
+
127
+ extern runtime_stats::RuntimeStatsCollector
128
+ *global_runtime_stats; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
129
+
130
+ } // namespace esphome
131
+
132
+ #endif // USE_RUNTIME_STATS
@@ -26,8 +26,6 @@ static const uint16_t SCD30_CMD_TEMPERATURE_OFFSET = 0x5403;
26
26
  static const uint16_t SCD30_CMD_SOFT_RESET = 0xD304;
27
27
 
28
28
  void SCD30Component::setup() {
29
- ESP_LOGCONFIG(TAG, "Running setup");
30
-
31
29
  #ifdef USE_ESP8266
32
30
  Wire.setClockStretchLimit(150000);
33
31
  #endif
@@ -3,6 +3,7 @@ import esphome.codegen as cg
3
3
  from esphome.components import i2c, sensirion_common, sensor
4
4
  import esphome.config_validation as cv
5
5
  from esphome.const import (
6
+ CONF_ALTITUDE_COMPENSATION,
6
7
  CONF_AMBIENT_PRESSURE_COMPENSATION,
7
8
  CONF_AUTOMATIC_SELF_CALIBRATION,
8
9
  CONF_CO2,
@@ -35,8 +36,6 @@ ForceRecalibrationWithReference = scd30_ns.class_(
35
36
  "ForceRecalibrationWithReference", automation.Action
36
37
  )
37
38
 
38
- CONF_ALTITUDE_COMPENSATION = "altitude_compensation"
39
-
40
39
  CONFIG_SCHEMA = (
41
40
  cv.Schema(
42
41
  {
@@ -27,7 +27,6 @@ static const uint16_t SCD4X_CMD_GET_FEATURESET = 0x202f;
27
27
  static const float SCD4X_TEMPERATURE_OFFSET_MULTIPLIER = (1 << 16) / 175.0f;
28
28
 
29
29
  void SCD4XComponent::setup() {
30
- ESP_LOGCONFIG(TAG, "Running setup");
31
30
  // the sensor needs 1000 ms to enter the idle state
32
31
  this->set_timeout(1000, [this]() {
33
32
  this->status_clear_error();