esphome 2025.7.4__py3-none-any.whl → 2025.8.0b1__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.

Potentially problematic release.


This version of esphome might be problematic. Click here for more details.

Files changed (754) hide show
  1. esphome/__main__.py +189 -82
  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 +488 -118
  73. esphome/components/atm90e32/atm90e32.h +44 -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 +387 -82
  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 +199 -58
  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 +40 -2
  149. esphome/components/esp32_ble/ble.cpp +12 -8
  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 +2 -4
  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 +0 -1
  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/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 +2 -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/sensor/__init__.py +36 -4
  557. esphome/components/sensor/filter.cpp +49 -10
  558. esphome/components/sensor/filter.h +22 -7
  559. esphome/components/sensor/sensor.cpp +0 -1
  560. esphome/components/sensor/sensor.h +0 -9
  561. esphome/components/sfa30/sfa30.cpp +0 -4
  562. esphome/components/sgp30/sgp30.cpp +0 -2
  563. esphome/components/sgp4x/sensor.py +1 -1
  564. esphome/components/sgp4x/sgp4x.cpp +0 -2
  565. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  566. esphome/components/sht3xd/sht3xd.cpp +0 -2
  567. esphome/components/sht4x/sht4x.cpp +0 -2
  568. esphome/components/shtcx/shtcx.cpp +0 -1
  569. esphome/components/sim800l/__init__.py +2 -4
  570. esphome/components/sm16716/sm16716.cpp +0 -1
  571. esphome/components/sm2135/sm2135.cpp +0 -1
  572. esphome/components/sm2235/sm2235.cpp +0 -1
  573. esphome/components/sm2335/sm2335.cpp +0 -1
  574. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  575. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  576. esphome/components/sntp/sntp_component.cpp +0 -1
  577. esphome/components/sound_level/sensor.py +1 -1
  578. esphome/components/speaker/media_player/__init__.py +21 -33
  579. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  580. esphome/components/spi/__init__.py +29 -13
  581. esphome/components/spi/spi.cpp +0 -2
  582. esphome/components/spi_device/spi_device.cpp +1 -4
  583. esphome/components/sprinkler/__init__.py +4 -4
  584. esphome/components/sps30/sps30.cpp +0 -1
  585. esphome/components/ssd1306_base/__init__.py +11 -11
  586. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  587. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  588. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  589. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  590. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  591. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  592. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  593. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  594. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  595. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  596. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  597. esphome/components/st7701s/display.py +10 -14
  598. esphome/components/st7701s/st7701s.cpp +0 -3
  599. esphome/components/st7735/st7735.cpp +0 -1
  600. esphome/components/st7789v/st7789v.cpp +0 -1
  601. esphome/components/st7920/st7920.cpp +0 -1
  602. esphome/components/status_led/light/status_led_light.cpp +0 -2
  603. esphome/components/status_led/status_led.cpp +0 -1
  604. esphome/components/stepper/__init__.py +2 -4
  605. esphome/components/sts3x/sts3x.cpp +0 -1
  606. esphome/components/substitutions/__init__.py +10 -16
  607. esphome/components/substitutions/jinja.py +24 -1
  608. esphome/components/sun/__init__.py +2 -3
  609. esphome/components/switch/__init__.py +31 -1
  610. esphome/components/switch/automation.h +24 -0
  611. esphome/components/switch/switch.cpp +8 -0
  612. esphome/components/switch/switch.h +8 -0
  613. esphome/components/sx126x/sx126x.cpp +0 -2
  614. esphome/components/sx127x/sx127x.cpp +0 -2
  615. esphome/components/sx1509/__init__.py +7 -5
  616. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  617. esphome/components/sx1509/sx1509.cpp +0 -2
  618. esphome/components/syslog/esphome_syslog.cpp +1 -1
  619. esphome/components/tc74/tc74.cpp +0 -1
  620. esphome/components/tca9548a/tca9548a.cpp +0 -1
  621. esphome/components/tca9555/tca9555.cpp +0 -1
  622. esphome/components/tcs34725/tcs34725.cpp +0 -1
  623. esphome/components/tee501/tee501.cpp +0 -1
  624. esphome/components/tem3200/tem3200.cpp +0 -2
  625. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  626. esphome/components/template/cover/template_cover.cpp +0 -1
  627. esphome/components/template/select/template_select.cpp +0 -1
  628. esphome/components/template/text/template_text.cpp +0 -2
  629. esphome/components/template/valve/template_valve.cpp +0 -1
  630. esphome/components/text/__init__.py +0 -1
  631. esphome/components/text/text_traits.h +2 -0
  632. esphome/components/text_sensor/__init__.py +2 -1
  633. esphome/components/text_sensor/text_sensor.cpp +0 -2
  634. esphome/components/text_sensor/text_sensor.h +0 -8
  635. esphome/components/thermostat/climate.py +4 -4
  636. esphome/components/time/__init__.py +7 -4
  637. esphome/components/time/real_time_clock.cpp +16 -3
  638. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  639. esphome/components/tlc5947/tlc5947.cpp +0 -2
  640. esphome/components/tlc5971/tlc5971.cpp +0 -2
  641. esphome/components/tm1621/tm1621.cpp +0 -2
  642. esphome/components/tm1637/tm1637.cpp +0 -2
  643. esphome/components/tm1638/tm1638.cpp +0 -2
  644. esphome/components/tm1651/__init__.py +45 -48
  645. esphome/components/tm1651/tm1651.cpp +213 -47
  646. esphome/components/tm1651/tm1651.h +37 -32
  647. esphome/components/tmp117/tmp117.cpp +0 -2
  648. esphome/components/tsl2561/tsl2561.cpp +0 -1
  649. esphome/components/tsl2591/tsl2591.cpp +0 -1
  650. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  651. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  652. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  653. esphome/components/tuya/climate/__init__.py +9 -10
  654. esphome/components/tuya/number/__init__.py +8 -6
  655. esphome/components/tx20/tx20.cpp +0 -1
  656. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  657. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  658. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  659. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  660. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  661. esphome/components/udp/__init__.py +1 -1
  662. esphome/components/ufire_ec/sensor.py +1 -2
  663. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  664. esphome/components/ufire_ise/sensor.py +1 -2
  665. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  666. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  667. esphome/components/update/__init__.py +0 -1
  668. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  669. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  670. esphome/components/usb_host/usb_host_client.cpp +0 -1
  671. esphome/components/usb_host/usb_host_component.cpp +0 -1
  672. esphome/components/valve/__init__.py +0 -1
  673. esphome/components/veml3235/veml3235.cpp +0 -3
  674. esphome/components/veml7700/veml7700.cpp +0 -2
  675. esphome/components/version/version_text_sensor.cpp +0 -1
  676. esphome/components/version/version_text_sensor.h +0 -1
  677. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  678. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  679. esphome/components/web_server/__init__.py +13 -0
  680. esphome/components/web_server/web_server.cpp +187 -352
  681. esphome/components/web_server/web_server.h +61 -1
  682. esphome/components/web_server_base/__init__.py +1 -1
  683. esphome/components/web_server_base/web_server_base.cpp +2 -0
  684. esphome/components/web_server_base/web_server_base.h +6 -0
  685. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  686. esphome/components/web_server_idf/web_server_idf.h +2 -0
  687. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  688. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  689. esphome/components/wifi/__init__.py +8 -43
  690. esphome/components/wifi/wifi_component.cpp +100 -36
  691. esphome/components/wifi/wifi_component.h +5 -1
  692. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  693. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  694. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  695. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  696. esphome/components/wireguard/wireguard.cpp +0 -2
  697. esphome/components/x9c/x9c.cpp +0 -2
  698. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  699. esphome/components/xl9535/xl9535.cpp +0 -2
  700. esphome/components/zephyr/__init__.py +252 -0
  701. esphome/components/zephyr/const.py +16 -0
  702. esphome/components/zephyr/core.cpp +90 -0
  703. esphome/components/zephyr/gpio.cpp +120 -0
  704. esphome/components/zephyr/gpio.h +38 -0
  705. esphome/components/zephyr/pre_build.py.script +4 -0
  706. esphome/components/zephyr/preferences.cpp +156 -0
  707. esphome/components/zephyr/preferences.h +13 -0
  708. esphome/config.py +38 -16
  709. esphome/config_helpers.py +1 -2
  710. esphome/config_validation.py +8 -15
  711. esphome/const.py +26 -1
  712. esphome/core/__init__.py +88 -51
  713. esphome/core/application.cpp +75 -21
  714. esphome/core/application.h +106 -171
  715. esphome/core/color.h +10 -0
  716. esphome/core/component.cpp +41 -25
  717. esphome/core/component.h +9 -6
  718. esphome/core/component_iterator.cpp +61 -261
  719. esphome/core/component_iterator.h +15 -0
  720. esphome/core/config.py +26 -11
  721. esphome/core/defines.h +40 -2
  722. esphome/core/entity_base.h +18 -0
  723. esphome/core/entity_helpers.py +41 -6
  724. esphome/core/helpers.cpp +8 -15
  725. esphome/core/helpers.h +60 -6
  726. esphome/core/lock_free_queue.h +1 -1
  727. esphome/core/scheduler.cpp +277 -74
  728. esphome/core/scheduler.h +89 -27
  729. esphome/cpp_generator.py +2 -6
  730. esphome/cpp_helpers.py +1 -1
  731. esphome/dashboard/dashboard.py +2 -3
  732. esphome/dashboard/dns.py +2 -8
  733. esphome/dashboard/web_server.py +34 -19
  734. esphome/espota2.py +1 -4
  735. esphome/git.py +3 -1
  736. esphome/helpers.py +23 -4
  737. esphome/log.py +3 -1
  738. esphome/mqtt.py +3 -5
  739. esphome/platformio_api.py +7 -4
  740. esphome/types.py +12 -0
  741. esphome/util.py +20 -8
  742. esphome/voluptuous_schema.py +4 -3
  743. esphome/vscode.py +1 -2
  744. esphome/wizard.py +1 -4
  745. esphome/writer.py +5 -107
  746. esphome/yaml_util.py +7 -5
  747. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/METADATA +12 -13
  748. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/RECORD +753 -673
  749. esphome/components/mipi_spi/models/commands.py +0 -82
  750. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  751. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/WHEEL +0 -0
  752. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/entry_points.txt +0 -0
  753. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/licenses/LICENSE +0 -0
  754. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/top_level.txt +0 -0
@@ -101,12 +101,9 @@ class Application {
101
101
  arch_init();
102
102
  this->name_add_mac_suffix_ = name_add_mac_suffix;
103
103
  if (name_add_mac_suffix) {
104
- this->name_ = name + "-" + get_mac_address().substr(6);
105
- if (friendly_name.empty()) {
106
- this->friendly_name_ = "";
107
- } else {
108
- this->friendly_name_ = friendly_name + " " + get_mac_address().substr(6);
109
- }
104
+ const std::string mac_suffix = get_mac_address().substr(6);
105
+ this->name_ = name + "-" + mac_suffix;
106
+ this->friendly_name_ = friendly_name.empty() ? "" : friendly_name + " " + mac_suffix;
110
107
  } else {
111
108
  this->name_ = name;
112
109
  this->friendly_name_ = friendly_name;
@@ -214,77 +211,6 @@ class Application {
214
211
  #endif
215
212
 
216
213
  /// Reserve space for components to avoid memory fragmentation
217
- void reserve_components(size_t count) { this->components_.reserve(count); }
218
-
219
- #ifdef USE_BINARY_SENSOR
220
- void reserve_binary_sensor(size_t count) { this->binary_sensors_.reserve(count); }
221
- #endif
222
- #ifdef USE_SWITCH
223
- void reserve_switch(size_t count) { this->switches_.reserve(count); }
224
- #endif
225
- #ifdef USE_BUTTON
226
- void reserve_button(size_t count) { this->buttons_.reserve(count); }
227
- #endif
228
- #ifdef USE_SENSOR
229
- void reserve_sensor(size_t count) { this->sensors_.reserve(count); }
230
- #endif
231
- #ifdef USE_TEXT_SENSOR
232
- void reserve_text_sensor(size_t count) { this->text_sensors_.reserve(count); }
233
- #endif
234
- #ifdef USE_FAN
235
- void reserve_fan(size_t count) { this->fans_.reserve(count); }
236
- #endif
237
- #ifdef USE_COVER
238
- void reserve_cover(size_t count) { this->covers_.reserve(count); }
239
- #endif
240
- #ifdef USE_CLIMATE
241
- void reserve_climate(size_t count) { this->climates_.reserve(count); }
242
- #endif
243
- #ifdef USE_LIGHT
244
- void reserve_light(size_t count) { this->lights_.reserve(count); }
245
- #endif
246
- #ifdef USE_NUMBER
247
- void reserve_number(size_t count) { this->numbers_.reserve(count); }
248
- #endif
249
- #ifdef USE_DATETIME_DATE
250
- void reserve_date(size_t count) { this->dates_.reserve(count); }
251
- #endif
252
- #ifdef USE_DATETIME_TIME
253
- void reserve_time(size_t count) { this->times_.reserve(count); }
254
- #endif
255
- #ifdef USE_DATETIME_DATETIME
256
- void reserve_datetime(size_t count) { this->datetimes_.reserve(count); }
257
- #endif
258
- #ifdef USE_SELECT
259
- void reserve_select(size_t count) { this->selects_.reserve(count); }
260
- #endif
261
- #ifdef USE_TEXT
262
- void reserve_text(size_t count) { this->texts_.reserve(count); }
263
- #endif
264
- #ifdef USE_LOCK
265
- void reserve_lock(size_t count) { this->locks_.reserve(count); }
266
- #endif
267
- #ifdef USE_VALVE
268
- void reserve_valve(size_t count) { this->valves_.reserve(count); }
269
- #endif
270
- #ifdef USE_MEDIA_PLAYER
271
- void reserve_media_player(size_t count) { this->media_players_.reserve(count); }
272
- #endif
273
- #ifdef USE_ALARM_CONTROL_PANEL
274
- void reserve_alarm_control_panel(size_t count) { this->alarm_control_panels_.reserve(count); }
275
- #endif
276
- #ifdef USE_EVENT
277
- void reserve_event(size_t count) { this->events_.reserve(count); }
278
- #endif
279
- #ifdef USE_UPDATE
280
- void reserve_update(size_t count) { this->updates_.reserve(count); }
281
- #endif
282
- #ifdef USE_AREAS
283
- void reserve_area(size_t count) { this->areas_.reserve(count); }
284
- #endif
285
- #ifdef USE_DEVICES
286
- void reserve_device(size_t count) { this->devices_.reserve(count); }
287
- #endif
288
214
 
289
215
  /// Register the component in this Application instance.
290
216
  template<class C> C *register_component(C *c) {
@@ -368,8 +294,19 @@ class Application {
368
294
 
369
295
  uint8_t get_app_state() const { return this->app_state_; }
370
296
 
371
- // Helper macro for entity getter method declarations - reduces code duplication
372
- // When USE_DEVICE_ID is enabled in the future, this can be conditionally compiled to add device_id parameter
297
+ // Helper macro for entity getter method declarations
298
+ #ifdef USE_DEVICES
299
+ #define GET_ENTITY_METHOD(entity_type, entity_name, entities_member) \
300
+ entity_type *get_##entity_name##_by_key(uint32_t key, uint32_t device_id, bool include_internal = false) { \
301
+ for (auto *obj : this->entities_member##_) { \
302
+ if (obj->get_object_id_hash() == key && obj->get_device_id() == device_id && \
303
+ (include_internal || !obj->is_internal())) \
304
+ return obj; \
305
+ } \
306
+ return nullptr; \
307
+ }
308
+ const auto &get_devices() { return this->devices_; }
309
+ #else
373
310
  #define GET_ENTITY_METHOD(entity_type, entity_name, entities_member) \
374
311
  entity_type *get_##entity_name##_by_key(uint32_t key, bool include_internal = false) { \
375
312
  for (auto *obj : this->entities_member##_) { \
@@ -378,100 +315,95 @@ class Application {
378
315
  } \
379
316
  return nullptr; \
380
317
  }
381
-
382
- #ifdef USE_DEVICES
383
- const std::vector<Device *> &get_devices() { return this->devices_; }
384
- #endif
318
+ #endif // USE_DEVICES
385
319
  #ifdef USE_AREAS
386
- const std::vector<Area *> &get_areas() { return this->areas_; }
320
+ const auto &get_areas() { return this->areas_; }
387
321
  #endif
388
322
  #ifdef USE_BINARY_SENSOR
389
- const std::vector<binary_sensor::BinarySensor *> &get_binary_sensors() { return this->binary_sensors_; }
323
+ auto &get_binary_sensors() const { return this->binary_sensors_; }
390
324
  GET_ENTITY_METHOD(binary_sensor::BinarySensor, binary_sensor, binary_sensors)
391
325
  #endif
392
326
  #ifdef USE_SWITCH
393
- const std::vector<switch_::Switch *> &get_switches() { return this->switches_; }
327
+ auto &get_switches() const { return this->switches_; }
394
328
  GET_ENTITY_METHOD(switch_::Switch, switch, switches)
395
329
  #endif
396
330
  #ifdef USE_BUTTON
397
- const std::vector<button::Button *> &get_buttons() { return this->buttons_; }
331
+ auto &get_buttons() const { return this->buttons_; }
398
332
  GET_ENTITY_METHOD(button::Button, button, buttons)
399
333
  #endif
400
334
  #ifdef USE_SENSOR
401
- const std::vector<sensor::Sensor *> &get_sensors() { return this->sensors_; }
335
+ auto &get_sensors() const { return this->sensors_; }
402
336
  GET_ENTITY_METHOD(sensor::Sensor, sensor, sensors)
403
337
  #endif
404
338
  #ifdef USE_TEXT_SENSOR
405
- const std::vector<text_sensor::TextSensor *> &get_text_sensors() { return this->text_sensors_; }
339
+ auto &get_text_sensors() const { return this->text_sensors_; }
406
340
  GET_ENTITY_METHOD(text_sensor::TextSensor, text_sensor, text_sensors)
407
341
  #endif
408
342
  #ifdef USE_FAN
409
- const std::vector<fan::Fan *> &get_fans() { return this->fans_; }
343
+ auto &get_fans() const { return this->fans_; }
410
344
  GET_ENTITY_METHOD(fan::Fan, fan, fans)
411
345
  #endif
412
346
  #ifdef USE_COVER
413
- const std::vector<cover::Cover *> &get_covers() { return this->covers_; }
347
+ auto &get_covers() const { return this->covers_; }
414
348
  GET_ENTITY_METHOD(cover::Cover, cover, covers)
415
349
  #endif
416
350
  #ifdef USE_LIGHT
417
- const std::vector<light::LightState *> &get_lights() { return this->lights_; }
351
+ auto &get_lights() const { return this->lights_; }
418
352
  GET_ENTITY_METHOD(light::LightState, light, lights)
419
353
  #endif
420
354
  #ifdef USE_CLIMATE
421
- const std::vector<climate::Climate *> &get_climates() { return this->climates_; }
355
+ auto &get_climates() const { return this->climates_; }
422
356
  GET_ENTITY_METHOD(climate::Climate, climate, climates)
423
357
  #endif
424
358
  #ifdef USE_NUMBER
425
- const std::vector<number::Number *> &get_numbers() { return this->numbers_; }
359
+ auto &get_numbers() const { return this->numbers_; }
426
360
  GET_ENTITY_METHOD(number::Number, number, numbers)
427
361
  #endif
428
362
  #ifdef USE_DATETIME_DATE
429
- const std::vector<datetime::DateEntity *> &get_dates() { return this->dates_; }
363
+ auto &get_dates() const { return this->dates_; }
430
364
  GET_ENTITY_METHOD(datetime::DateEntity, date, dates)
431
365
  #endif
432
366
  #ifdef USE_DATETIME_TIME
433
- const std::vector<datetime::TimeEntity *> &get_times() { return this->times_; }
367
+ auto &get_times() const { return this->times_; }
434
368
  GET_ENTITY_METHOD(datetime::TimeEntity, time, times)
435
369
  #endif
436
370
  #ifdef USE_DATETIME_DATETIME
437
- const std::vector<datetime::DateTimeEntity *> &get_datetimes() { return this->datetimes_; }
371
+ auto &get_datetimes() const { return this->datetimes_; }
438
372
  GET_ENTITY_METHOD(datetime::DateTimeEntity, datetime, datetimes)
439
373
  #endif
440
374
  #ifdef USE_TEXT
441
- const std::vector<text::Text *> &get_texts() { return this->texts_; }
375
+ auto &get_texts() const { return this->texts_; }
442
376
  GET_ENTITY_METHOD(text::Text, text, texts)
443
377
  #endif
444
378
  #ifdef USE_SELECT
445
- const std::vector<select::Select *> &get_selects() { return this->selects_; }
379
+ auto &get_selects() const { return this->selects_; }
446
380
  GET_ENTITY_METHOD(select::Select, select, selects)
447
381
  #endif
448
382
  #ifdef USE_LOCK
449
- const std::vector<lock::Lock *> &get_locks() { return this->locks_; }
383
+ auto &get_locks() const { return this->locks_; }
450
384
  GET_ENTITY_METHOD(lock::Lock, lock, locks)
451
385
  #endif
452
386
  #ifdef USE_VALVE
453
- const std::vector<valve::Valve *> &get_valves() { return this->valves_; }
387
+ auto &get_valves() const { return this->valves_; }
454
388
  GET_ENTITY_METHOD(valve::Valve, valve, valves)
455
389
  #endif
456
390
  #ifdef USE_MEDIA_PLAYER
457
- const std::vector<media_player::MediaPlayer *> &get_media_players() { return this->media_players_; }
391
+ auto &get_media_players() const { return this->media_players_; }
458
392
  GET_ENTITY_METHOD(media_player::MediaPlayer, media_player, media_players)
459
393
  #endif
460
394
 
461
395
  #ifdef USE_ALARM_CONTROL_PANEL
462
- const std::vector<alarm_control_panel::AlarmControlPanel *> &get_alarm_control_panels() {
463
- return this->alarm_control_panels_;
464
- }
396
+ auto &get_alarm_control_panels() const { return this->alarm_control_panels_; }
465
397
  GET_ENTITY_METHOD(alarm_control_panel::AlarmControlPanel, alarm_control_panel, alarm_control_panels)
466
398
  #endif
467
399
 
468
400
  #ifdef USE_EVENT
469
- const std::vector<event::Event *> &get_events() { return this->events_; }
401
+ auto &get_events() const { return this->events_; }
470
402
  GET_ENTITY_METHOD(event::Event, event, events)
471
403
  #endif
472
404
 
473
405
  #ifdef USE_UPDATE
474
- const std::vector<update::UpdateEntity *> &get_updates() { return this->updates_; }
406
+ auto &get_updates() const { return this->updates_; }
475
407
  GET_ENTITY_METHOD(update::UpdateEntity, update, updates)
476
408
  #endif
477
409
 
@@ -519,12 +451,7 @@ class Application {
519
451
  const char *comment_{nullptr};
520
452
  const char *compilation_time_{nullptr};
521
453
 
522
- // size_t members
523
- size_t dump_config_at_{SIZE_MAX};
524
-
525
- // Vectors (largest members)
526
- std::vector<Component *> components_{};
527
-
454
+ // std::vector (3 pointers each: begin, end, capacity)
528
455
  // Partitioned vector design for looping components
529
456
  // =================================================
530
457
  // Components are partitioned into [active | inactive] sections:
@@ -542,110 +469,118 @@ class Application {
542
469
  // and active_end_ is incremented
543
470
  // - This eliminates branch mispredictions from flag checking in the hot loop
544
471
  std::vector<Component *> looping_components_{};
472
+ #ifdef USE_SOCKET_SELECT_SUPPORT
473
+ std::vector<int> socket_fds_; // Vector of all monitored socket file descriptors
474
+ #endif
475
+
476
+ // std::string members (typically 24-32 bytes each)
477
+ std::string name_;
478
+ std::string friendly_name_;
479
+
480
+ // size_t members
481
+ size_t dump_config_at_{SIZE_MAX};
482
+
483
+ // 4-byte members
484
+ uint32_t last_loop_{0};
485
+ uint32_t loop_component_start_time_{0};
486
+
487
+ #ifdef USE_SOCKET_SELECT_SUPPORT
488
+ int max_fd_{-1}; // Highest file descriptor number for select()
489
+ #endif
490
+
491
+ // 2-byte members (grouped together for alignment)
492
+ uint16_t loop_interval_{16}; // Loop interval in ms (max 65535ms = 65.5 seconds)
493
+ uint16_t looping_components_active_end_{0}; // Index marking end of active components in looping_components_
494
+ uint16_t current_loop_index_{0}; // For safe reentrant modifications during iteration
495
+
496
+ // 1-byte members (grouped together to minimize padding)
497
+ uint8_t app_state_{0};
498
+ bool name_add_mac_suffix_;
499
+ bool in_loop_{false};
500
+ volatile bool has_pending_enable_loop_requests_{false};
501
+
502
+ #ifdef USE_SOCKET_SELECT_SUPPORT
503
+ bool socket_fds_changed_{false}; // Flag to rebuild base_read_fds_ when socket_fds_ changes
504
+ #endif
505
+
506
+ #ifdef USE_SOCKET_SELECT_SUPPORT
507
+ // Variable-sized members
508
+ fd_set base_read_fds_{}; // Cached fd_set rebuilt only when socket_fds_ changes
509
+ fd_set read_fds_{}; // Working fd_set for select(), copied from base_read_fds_
510
+ #endif
511
+
512
+ // StaticVectors (largest members - contain actual array data inline)
513
+ StaticVector<Component *, ESPHOME_COMPONENT_COUNT> components_{};
545
514
 
546
515
  #ifdef USE_DEVICES
547
- std::vector<Device *> devices_{};
516
+ StaticVector<Device *, ESPHOME_DEVICE_COUNT> devices_{};
548
517
  #endif
549
518
  #ifdef USE_AREAS
550
- std::vector<Area *> areas_{};
519
+ StaticVector<Area *, ESPHOME_AREA_COUNT> areas_{};
551
520
  #endif
552
521
  #ifdef USE_BINARY_SENSOR
553
- std::vector<binary_sensor::BinarySensor *> binary_sensors_{};
522
+ StaticVector<binary_sensor::BinarySensor *, ESPHOME_ENTITY_BINARY_SENSOR_COUNT> binary_sensors_{};
554
523
  #endif
555
524
  #ifdef USE_SWITCH
556
- std::vector<switch_::Switch *> switches_{};
525
+ StaticVector<switch_::Switch *, ESPHOME_ENTITY_SWITCH_COUNT> switches_{};
557
526
  #endif
558
527
  #ifdef USE_BUTTON
559
- std::vector<button::Button *> buttons_{};
528
+ StaticVector<button::Button *, ESPHOME_ENTITY_BUTTON_COUNT> buttons_{};
560
529
  #endif
561
530
  #ifdef USE_EVENT
562
- std::vector<event::Event *> events_{};
531
+ StaticVector<event::Event *, ESPHOME_ENTITY_EVENT_COUNT> events_{};
563
532
  #endif
564
533
  #ifdef USE_SENSOR
565
- std::vector<sensor::Sensor *> sensors_{};
534
+ StaticVector<sensor::Sensor *, ESPHOME_ENTITY_SENSOR_COUNT> sensors_{};
566
535
  #endif
567
536
  #ifdef USE_TEXT_SENSOR
568
- std::vector<text_sensor::TextSensor *> text_sensors_{};
537
+ StaticVector<text_sensor::TextSensor *, ESPHOME_ENTITY_TEXT_SENSOR_COUNT> text_sensors_{};
569
538
  #endif
570
539
  #ifdef USE_FAN
571
- std::vector<fan::Fan *> fans_{};
540
+ StaticVector<fan::Fan *, ESPHOME_ENTITY_FAN_COUNT> fans_{};
572
541
  #endif
573
542
  #ifdef USE_COVER
574
- std::vector<cover::Cover *> covers_{};
543
+ StaticVector<cover::Cover *, ESPHOME_ENTITY_COVER_COUNT> covers_{};
575
544
  #endif
576
545
  #ifdef USE_CLIMATE
577
- std::vector<climate::Climate *> climates_{};
546
+ StaticVector<climate::Climate *, ESPHOME_ENTITY_CLIMATE_COUNT> climates_{};
578
547
  #endif
579
548
  #ifdef USE_LIGHT
580
- std::vector<light::LightState *> lights_{};
549
+ StaticVector<light::LightState *, ESPHOME_ENTITY_LIGHT_COUNT> lights_{};
581
550
  #endif
582
551
  #ifdef USE_NUMBER
583
- std::vector<number::Number *> numbers_{};
552
+ StaticVector<number::Number *, ESPHOME_ENTITY_NUMBER_COUNT> numbers_{};
584
553
  #endif
585
554
  #ifdef USE_DATETIME_DATE
586
- std::vector<datetime::DateEntity *> dates_{};
555
+ StaticVector<datetime::DateEntity *, ESPHOME_ENTITY_DATE_COUNT> dates_{};
587
556
  #endif
588
557
  #ifdef USE_DATETIME_TIME
589
- std::vector<datetime::TimeEntity *> times_{};
558
+ StaticVector<datetime::TimeEntity *, ESPHOME_ENTITY_TIME_COUNT> times_{};
590
559
  #endif
591
560
  #ifdef USE_DATETIME_DATETIME
592
- std::vector<datetime::DateTimeEntity *> datetimes_{};
561
+ StaticVector<datetime::DateTimeEntity *, ESPHOME_ENTITY_DATETIME_COUNT> datetimes_{};
593
562
  #endif
594
563
  #ifdef USE_SELECT
595
- std::vector<select::Select *> selects_{};
564
+ StaticVector<select::Select *, ESPHOME_ENTITY_SELECT_COUNT> selects_{};
596
565
  #endif
597
566
  #ifdef USE_TEXT
598
- std::vector<text::Text *> texts_{};
567
+ StaticVector<text::Text *, ESPHOME_ENTITY_TEXT_COUNT> texts_{};
599
568
  #endif
600
569
  #ifdef USE_LOCK
601
- std::vector<lock::Lock *> locks_{};
570
+ StaticVector<lock::Lock *, ESPHOME_ENTITY_LOCK_COUNT> locks_{};
602
571
  #endif
603
572
  #ifdef USE_VALVE
604
- std::vector<valve::Valve *> valves_{};
573
+ StaticVector<valve::Valve *, ESPHOME_ENTITY_VALVE_COUNT> valves_{};
605
574
  #endif
606
575
  #ifdef USE_MEDIA_PLAYER
607
- std::vector<media_player::MediaPlayer *> media_players_{};
576
+ StaticVector<media_player::MediaPlayer *, ESPHOME_ENTITY_MEDIA_PLAYER_COUNT> media_players_{};
608
577
  #endif
609
578
  #ifdef USE_ALARM_CONTROL_PANEL
610
- std::vector<alarm_control_panel::AlarmControlPanel *> alarm_control_panels_{};
579
+ StaticVector<alarm_control_panel::AlarmControlPanel *, ESPHOME_ENTITY_ALARM_CONTROL_PANEL_COUNT>
580
+ alarm_control_panels_{};
611
581
  #endif
612
582
  #ifdef USE_UPDATE
613
- std::vector<update::UpdateEntity *> updates_{};
614
- #endif
615
-
616
- #ifdef USE_SOCKET_SELECT_SUPPORT
617
- std::vector<int> socket_fds_; // Vector of all monitored socket file descriptors
618
- #endif
619
-
620
- // String members
621
- std::string name_;
622
- std::string friendly_name_;
623
-
624
- // 4-byte members
625
- uint32_t last_loop_{0};
626
- uint32_t loop_component_start_time_{0};
627
-
628
- #ifdef USE_SOCKET_SELECT_SUPPORT
629
- int max_fd_{-1}; // Highest file descriptor number for select()
630
- #endif
631
-
632
- // 2-byte members (grouped together for alignment)
633
- uint16_t loop_interval_{16}; // Loop interval in ms (max 65535ms = 65.5 seconds)
634
- uint16_t looping_components_active_end_{0};
635
- uint16_t current_loop_index_{0}; // For safe reentrant modifications during iteration
636
-
637
- // 1-byte members (grouped together to minimize padding)
638
- uint8_t app_state_{0};
639
- bool name_add_mac_suffix_;
640
- bool in_loop_{false};
641
- volatile bool has_pending_enable_loop_requests_{false};
642
-
643
- #ifdef USE_SOCKET_SELECT_SUPPORT
644
- bool socket_fds_changed_{false}; // Flag to rebuild base_read_fds_ when socket_fds_ changes
645
-
646
- // Variable-sized members at end
647
- fd_set base_read_fds_{}; // Cached fd_set rebuilt only when socket_fds_ changes
648
- fd_set read_fds_{}; // Working fd_set for select(), copied from base_read_fds_
583
+ StaticVector<update::UpdateEntity *, ESPHOME_ENTITY_UPDATE_COUNT> updates_{};
649
584
  #endif
650
585
  };
651
586
 
esphome/core/color.h CHANGED
@@ -1,8 +1,13 @@
1
1
  #pragma once
2
2
 
3
+ #include "defines.h"
3
4
  #include "component.h"
4
5
  #include "helpers.h"
5
6
 
7
+ #ifdef USE_LVGL
8
+ #include "esphome/components/lvgl/lvgl_proxy.h"
9
+ #endif // USE_LVGL
10
+
6
11
  namespace esphome {
7
12
 
8
13
  inline static constexpr uint8_t esp_scale8(uint8_t i, uint8_t scale) {
@@ -33,6 +38,11 @@ struct Color {
33
38
  uint32_t raw_32;
34
39
  };
35
40
 
41
+ #ifdef USE_LVGL
42
+ // convenience function for Color to get a lv_color_t representation
43
+ operator lv_color_t() const { return lv_color_make(this->r, this->g, this->b); }
44
+ #endif
45
+
36
46
  inline constexpr Color() ESPHOME_ALWAYS_INLINE : raw_32(0) {} // NOLINT
37
47
  inline constexpr Color(uint8_t red, uint8_t green, uint8_t blue) ESPHOME_ALWAYS_INLINE : r(red),
38
48
  g(green),
@@ -9,10 +9,14 @@
9
9
  #include "esphome/core/hal.h"
10
10
  #include "esphome/core/helpers.h"
11
11
  #include "esphome/core/log.h"
12
+ #ifdef USE_RUNTIME_STATS
13
+ #include "esphome/components/runtime_stats/runtime_stats.h"
14
+ #endif
12
15
 
13
16
  namespace esphome {
14
17
 
15
18
  static const char *const TAG = "component";
19
+ static const char *const UNSPECIFIED_MESSAGE = "unspecified";
16
20
 
17
21
  // Global vectors for component data that doesn't belong in every instance.
18
22
  // Using vector instead of unordered_map for both because:
@@ -129,7 +133,7 @@ void Component::call_dump_config() {
129
133
  this->dump_config();
130
134
  if (this->is_failed()) {
131
135
  // Look up error message from global vector
132
- const char *error_msg = "unspecified";
136
+ const char *error_msg = nullptr;
133
137
  if (component_error_messages) {
134
138
  for (const auto &pair : *component_error_messages) {
135
139
  if (pair.first == this) {
@@ -138,7 +142,8 @@ void Component::call_dump_config() {
138
142
  }
139
143
  }
140
144
  }
141
- ESP_LOGE(TAG, " %s is marked FAILED: %s", this->get_component_source(), error_msg);
145
+ ESP_LOGE(TAG, " %s is marked FAILED: %s", this->get_component_source(),
146
+ error_msg ? error_msg : UNSPECIFIED_MESSAGE);
142
147
  }
143
148
  }
144
149
 
@@ -146,28 +151,33 @@ uint8_t Component::get_component_state() const { return this->component_state_;
146
151
  void Component::call() {
147
152
  uint8_t state = this->component_state_ & COMPONENT_STATE_MASK;
148
153
  switch (state) {
149
- case COMPONENT_STATE_CONSTRUCTION:
154
+ case COMPONENT_STATE_CONSTRUCTION: {
150
155
  // State Construction: Call setup and set state to setup
151
- this->component_state_ &= ~COMPONENT_STATE_MASK;
152
- this->component_state_ |= COMPONENT_STATE_SETUP;
156
+ this->set_component_state_(COMPONENT_STATE_SETUP);
157
+ ESP_LOGV(TAG, "Setup %s", this->get_component_source());
158
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
159
+ uint32_t start_time = millis();
160
+ #endif
153
161
  this->call_setup();
162
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
163
+ uint32_t setup_time = millis() - start_time;
164
+ ESP_LOGCONFIG(TAG, "Setup %s took %ums", this->get_component_source(), (unsigned) setup_time);
165
+ #endif
154
166
  break;
167
+ }
155
168
  case COMPONENT_STATE_SETUP:
156
169
  // State setup: Call first loop and set state to loop
157
- this->component_state_ &= ~COMPONENT_STATE_MASK;
158
- this->component_state_ |= COMPONENT_STATE_LOOP;
170
+ this->set_component_state_(COMPONENT_STATE_LOOP);
159
171
  this->call_loop();
160
172
  break;
161
173
  case COMPONENT_STATE_LOOP:
162
174
  // State loop: Call loop
163
175
  this->call_loop();
164
176
  break;
165
- case COMPONENT_STATE_FAILED: // NOLINT(bugprone-branch-clone)
177
+ case COMPONENT_STATE_FAILED:
166
178
  // State failed: Do nothing
167
- break;
168
- case COMPONENT_STATE_LOOP_DONE: // NOLINT(bugprone-branch-clone)
179
+ case COMPONENT_STATE_LOOP_DONE:
169
180
  // State loop done: Do nothing, component has finished its work
170
- break;
171
181
  default:
172
182
  break;
173
183
  }
@@ -192,25 +202,26 @@ bool Component::should_warn_of_blocking(uint32_t blocking_time) {
192
202
  }
193
203
  void Component::mark_failed() {
194
204
  ESP_LOGE(TAG, "%s was marked as failed", this->get_component_source());
195
- this->component_state_ &= ~COMPONENT_STATE_MASK;
196
- this->component_state_ |= COMPONENT_STATE_FAILED;
205
+ this->set_component_state_(COMPONENT_STATE_FAILED);
197
206
  this->status_set_error();
198
207
  // Also remove from loop since failed components shouldn't loop
199
208
  App.disable_component_loop_(this);
200
209
  }
210
+ void Component::set_component_state_(uint8_t state) {
211
+ this->component_state_ &= ~COMPONENT_STATE_MASK;
212
+ this->component_state_ |= state;
213
+ }
201
214
  void Component::disable_loop() {
202
215
  if ((this->component_state_ & COMPONENT_STATE_MASK) != COMPONENT_STATE_LOOP_DONE) {
203
216
  ESP_LOGVV(TAG, "%s loop disabled", this->get_component_source());
204
- this->component_state_ &= ~COMPONENT_STATE_MASK;
205
- this->component_state_ |= COMPONENT_STATE_LOOP_DONE;
217
+ this->set_component_state_(COMPONENT_STATE_LOOP_DONE);
206
218
  App.disable_component_loop_(this);
207
219
  }
208
220
  }
209
221
  void Component::enable_loop() {
210
222
  if ((this->component_state_ & COMPONENT_STATE_MASK) == COMPONENT_STATE_LOOP_DONE) {
211
223
  ESP_LOGVV(TAG, "%s loop enabled", this->get_component_source());
212
- this->component_state_ &= ~COMPONENT_STATE_MASK;
213
- this->component_state_ |= COMPONENT_STATE_LOOP;
224
+ this->set_component_state_(COMPONENT_STATE_LOOP);
214
225
  App.enable_component_loop_(this);
215
226
  }
216
227
  }
@@ -230,8 +241,7 @@ void IRAM_ATTR HOT Component::enable_loop_soon_any_context() {
230
241
  void Component::reset_to_construction_state() {
231
242
  if ((this->component_state_ & COMPONENT_STATE_MASK) == COMPONENT_STATE_FAILED) {
232
243
  ESP_LOGI(TAG, "%s is being reset to construction state", this->get_component_source());
233
- this->component_state_ &= ~COMPONENT_STATE_MASK;
234
- this->component_state_ |= COMPONENT_STATE_CONSTRUCTION;
244
+ this->set_component_state_(COMPONENT_STATE_CONSTRUCTION);
235
245
  // Clear error status when resetting
236
246
  this->status_clear_error();
237
247
  }
@@ -276,15 +286,15 @@ void Component::status_set_warning(const char *message) {
276
286
  return;
277
287
  this->component_state_ |= STATUS_LED_WARNING;
278
288
  App.app_state_ |= STATUS_LED_WARNING;
279
- ESP_LOGW(TAG, "%s set Warning flag: %s", this->get_component_source(), message);
289
+ ESP_LOGW(TAG, "%s set Warning flag: %s", this->get_component_source(), message ? message : UNSPECIFIED_MESSAGE);
280
290
  }
281
291
  void Component::status_set_error(const char *message) {
282
292
  if ((this->component_state_ & STATUS_LED_ERROR) != 0)
283
293
  return;
284
294
  this->component_state_ |= STATUS_LED_ERROR;
285
295
  App.app_state_ |= STATUS_LED_ERROR;
286
- ESP_LOGE(TAG, "%s set Error flag: %s", this->get_component_source(), message);
287
- if (strcmp(message, "unspecified") != 0) {
296
+ ESP_LOGE(TAG, "%s set Error flag: %s", this->get_component_source(), message ? message : UNSPECIFIED_MESSAGE);
297
+ if (message != nullptr) {
288
298
  // Lazy allocate the error messages vector if needed
289
299
  if (!component_error_messages) {
290
300
  component_error_messages = std::make_unique<std::vector<std::pair<const Component *, const char *>>>();
@@ -370,11 +380,10 @@ bool Component::has_overridden_loop() const {
370
380
  PollingComponent::PollingComponent(uint32_t update_interval) : update_interval_(update_interval) {}
371
381
 
372
382
  void PollingComponent::call_setup() {
383
+ // init the poller before calling setup, allowing setup to cancel it if desired
384
+ this->start_poller();
373
385
  // Let the polling component subclass setup their HW.
374
386
  this->setup();
375
-
376
- // init the poller
377
- this->start_poller();
378
387
  }
379
388
 
380
389
  void PollingComponent::start_poller() {
@@ -396,6 +405,13 @@ uint32_t WarnIfComponentBlockingGuard::finish() {
396
405
  uint32_t curr_time = millis();
397
406
 
398
407
  uint32_t blocking_time = curr_time - this->started_;
408
+
409
+ #ifdef USE_RUNTIME_STATS
410
+ // Record component runtime stats
411
+ if (global_runtime_stats != nullptr) {
412
+ global_runtime_stats->record_component_time(this->component_, blocking_time, curr_time);
413
+ }
414
+ #endif
399
415
  bool should_warn;
400
416
  if (this->component_ != nullptr) {
401
417
  should_warn = this->component_->should_warn_of_blocking(blocking_time);
esphome/core/component.h CHANGED
@@ -202,9 +202,9 @@ class Component {
202
202
 
203
203
  bool status_has_error() const;
204
204
 
205
- void status_set_warning(const char *message = "unspecified");
205
+ void status_set_warning(const char *message = nullptr);
206
206
 
207
- void status_set_error(const char *message = "unspecified");
207
+ void status_set_error(const char *message = nullptr);
208
208
 
209
209
  void status_clear_warning();
210
210
 
@@ -236,6 +236,9 @@ class Component {
236
236
  virtual void call_setup();
237
237
  virtual void call_dump_config();
238
238
 
239
+ /// Helper to set component state (clears state bits and sets new state)
240
+ void set_component_state_(uint8_t state);
241
+
239
242
  /** Set an interval function with a unique name. Empty name means no cancelling possible.
240
243
  *
241
244
  * This will call f every interval ms. Can be cancelled via CancelInterval().
@@ -405,10 +408,10 @@ class Component {
405
408
  const char *component_source_{nullptr};
406
409
  uint16_t warn_if_blocking_over_{WARN_IF_BLOCKING_OVER_MS}; ///< Warn if blocked for this many ms (max 65.5s)
407
410
  /// State of this component - each bit has a purpose:
408
- /// Bits 0-1: Component state (0x00=CONSTRUCTION, 0x01=SETUP, 0x02=LOOP, 0x03=FAILED)
409
- /// Bit 2: STATUS_LED_WARNING
410
- /// Bit 3: STATUS_LED_ERROR
411
- /// Bits 4-7: Unused - reserved for future expansion (50% of the bits are free)
411
+ /// Bits 0-2: Component state (0x00=CONSTRUCTION, 0x01=SETUP, 0x02=LOOP, 0x03=FAILED, 0x04=LOOP_DONE)
412
+ /// Bit 3: STATUS_LED_WARNING
413
+ /// Bit 4: STATUS_LED_ERROR
414
+ /// Bits 5-7: Unused - reserved for future expansion
412
415
  uint8_t component_state_{0x00};
413
416
  volatile bool pending_enable_loop_{false}; ///< ISR-safe flag for enable_loop_soon_any_context
414
417
  };