esphome 2025.7.5__py3-none-any.whl → 2025.8.0b2__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 (752) 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 +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 +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/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 +0 -1
  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/sensor/__init__.py +1 -1
  499. esphome/components/pm2005/pm2005.cpp +0 -1
  500. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  501. esphome/components/pmwcs3/sensor.py +1 -2
  502. esphome/components/pn532/pn532.cpp +0 -2
  503. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  504. esphome/components/power_supply/power_supply.cpp +7 -10
  505. esphome/components/power_supply/power_supply.h +1 -1
  506. esphome/components/psram/__init__.py +6 -1
  507. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  508. esphome/components/pulse_counter/sensor.py +9 -6
  509. esphome/components/pylontech/pylontech.cpp +0 -1
  510. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  511. esphome/components/qmp6988/qmp6988.cpp +0 -2
  512. esphome/components/qspi_dbi/display.py +2 -3
  513. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  514. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  515. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  516. esphome/components/rc522/rc522.cpp +9 -31
  517. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  518. esphome/components/remote_base/__init__.py +5 -6
  519. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  520. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  521. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  522. esphome/components/remote_transmitter/__init__.py +26 -0
  523. esphome/components/remote_transmitter/automation.h +18 -0
  524. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  525. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  526. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  527. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  528. esphome/components/resampler/speaker/__init__.py +4 -5
  529. esphome/components/rf_bridge/__init__.py +4 -8
  530. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  531. esphome/components/rp2040/__init__.py +3 -1
  532. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  533. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  534. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  535. esphome/components/rpi_dpi_rgb/display.py +13 -15
  536. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  537. esphome/components/runtime_stats/__init__.py +34 -0
  538. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  539. esphome/components/runtime_stats/runtime_stats.h +132 -0
  540. esphome/components/scd30/scd30.cpp +0 -2
  541. esphome/components/scd30/sensor.py +1 -2
  542. esphome/components/scd4x/scd4x.cpp +0 -1
  543. esphome/components/scd4x/sensor.py +1 -3
  544. esphome/components/sdl/display.py +3 -1
  545. esphome/components/sdl/sdl_esphome.cpp +0 -2
  546. esphome/components/sdp3x/sdp3x.cpp +0 -2
  547. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  548. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  549. esphome/components/select/__init__.py +2 -3
  550. esphome/components/select/select_traits.cpp +1 -1
  551. esphome/components/select/select_traits.h +1 -1
  552. esphome/components/sen0321/sen0321.cpp +0 -1
  553. esphome/components/sen5x/sen5x.cpp +0 -2
  554. esphome/components/sensor/__init__.py +36 -4
  555. esphome/components/sensor/filter.cpp +49 -10
  556. esphome/components/sensor/filter.h +22 -7
  557. esphome/components/sensor/sensor.cpp +0 -1
  558. esphome/components/sensor/sensor.h +0 -9
  559. esphome/components/sfa30/sfa30.cpp +0 -4
  560. esphome/components/sgp30/sgp30.cpp +0 -2
  561. esphome/components/sgp4x/sensor.py +1 -1
  562. esphome/components/sgp4x/sgp4x.cpp +0 -2
  563. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  564. esphome/components/sht3xd/sht3xd.cpp +0 -2
  565. esphome/components/sht4x/sht4x.cpp +0 -2
  566. esphome/components/shtcx/shtcx.cpp +0 -1
  567. esphome/components/sim800l/__init__.py +2 -4
  568. esphome/components/sm16716/sm16716.cpp +0 -1
  569. esphome/components/sm2135/sm2135.cpp +0 -1
  570. esphome/components/sm2235/sm2235.cpp +0 -1
  571. esphome/components/sm2335/sm2335.cpp +0 -1
  572. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  573. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  574. esphome/components/sntp/sntp_component.cpp +0 -1
  575. esphome/components/sound_level/sensor.py +1 -1
  576. esphome/components/speaker/media_player/__init__.py +21 -33
  577. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  578. esphome/components/spi/__init__.py +29 -13
  579. esphome/components/spi/spi.cpp +0 -2
  580. esphome/components/spi_device/spi_device.cpp +1 -4
  581. esphome/components/sprinkler/__init__.py +4 -4
  582. esphome/components/sps30/sps30.cpp +0 -1
  583. esphome/components/ssd1306_base/__init__.py +11 -11
  584. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  585. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  586. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  587. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  588. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  589. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  590. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  591. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  592. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  593. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  594. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  595. esphome/components/st7701s/display.py +10 -14
  596. esphome/components/st7701s/st7701s.cpp +0 -3
  597. esphome/components/st7735/st7735.cpp +0 -1
  598. esphome/components/st7789v/st7789v.cpp +0 -1
  599. esphome/components/st7920/st7920.cpp +0 -1
  600. esphome/components/status_led/light/status_led_light.cpp +0 -2
  601. esphome/components/status_led/status_led.cpp +0 -1
  602. esphome/components/stepper/__init__.py +2 -4
  603. esphome/components/sts3x/sts3x.cpp +0 -1
  604. esphome/components/substitutions/__init__.py +10 -16
  605. esphome/components/substitutions/jinja.py +24 -1
  606. esphome/components/sun/__init__.py +2 -3
  607. esphome/components/switch/__init__.py +31 -1
  608. esphome/components/switch/automation.h +24 -0
  609. esphome/components/switch/switch.cpp +8 -0
  610. esphome/components/switch/switch.h +8 -0
  611. esphome/components/sx126x/sx126x.cpp +0 -2
  612. esphome/components/sx127x/sx127x.cpp +0 -2
  613. esphome/components/sx1509/__init__.py +7 -5
  614. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  615. esphome/components/sx1509/sx1509.cpp +0 -2
  616. esphome/components/syslog/esphome_syslog.cpp +1 -1
  617. esphome/components/tc74/tc74.cpp +0 -1
  618. esphome/components/tca9548a/tca9548a.cpp +0 -1
  619. esphome/components/tca9555/tca9555.cpp +0 -1
  620. esphome/components/tcs34725/tcs34725.cpp +0 -1
  621. esphome/components/tee501/tee501.cpp +0 -1
  622. esphome/components/tem3200/tem3200.cpp +0 -2
  623. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  624. esphome/components/template/cover/template_cover.cpp +0 -1
  625. esphome/components/template/select/template_select.cpp +0 -1
  626. esphome/components/template/text/template_text.cpp +0 -2
  627. esphome/components/template/valve/template_valve.cpp +0 -1
  628. esphome/components/text/__init__.py +0 -1
  629. esphome/components/text/text_traits.h +2 -0
  630. esphome/components/text_sensor/__init__.py +2 -1
  631. esphome/components/text_sensor/text_sensor.cpp +0 -2
  632. esphome/components/text_sensor/text_sensor.h +0 -8
  633. esphome/components/thermostat/climate.py +4 -4
  634. esphome/components/time/__init__.py +7 -4
  635. esphome/components/time/real_time_clock.cpp +16 -3
  636. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  637. esphome/components/tlc5947/tlc5947.cpp +0 -2
  638. esphome/components/tlc5971/tlc5971.cpp +0 -2
  639. esphome/components/tm1621/tm1621.cpp +0 -2
  640. esphome/components/tm1637/tm1637.cpp +0 -2
  641. esphome/components/tm1638/tm1638.cpp +0 -2
  642. esphome/components/tm1651/__init__.py +45 -48
  643. esphome/components/tm1651/tm1651.cpp +213 -47
  644. esphome/components/tm1651/tm1651.h +37 -32
  645. esphome/components/tmp117/tmp117.cpp +0 -2
  646. esphome/components/tsl2561/tsl2561.cpp +0 -1
  647. esphome/components/tsl2591/tsl2591.cpp +0 -1
  648. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  649. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  650. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  651. esphome/components/tuya/climate/__init__.py +9 -10
  652. esphome/components/tuya/number/__init__.py +8 -6
  653. esphome/components/tx20/tx20.cpp +0 -1
  654. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  655. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  656. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  657. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  658. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  659. esphome/components/udp/__init__.py +1 -1
  660. esphome/components/ufire_ec/sensor.py +1 -2
  661. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  662. esphome/components/ufire_ise/sensor.py +1 -2
  663. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  664. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  665. esphome/components/update/__init__.py +0 -1
  666. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  667. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  668. esphome/components/usb_host/usb_host_client.cpp +0 -1
  669. esphome/components/usb_host/usb_host_component.cpp +0 -1
  670. esphome/components/valve/__init__.py +0 -1
  671. esphome/components/veml3235/veml3235.cpp +0 -3
  672. esphome/components/veml7700/veml7700.cpp +0 -2
  673. esphome/components/version/version_text_sensor.cpp +0 -1
  674. esphome/components/version/version_text_sensor.h +0 -1
  675. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  676. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  677. esphome/components/web_server/__init__.py +13 -0
  678. esphome/components/web_server/web_server.cpp +187 -352
  679. esphome/components/web_server/web_server.h +61 -1
  680. esphome/components/web_server_base/__init__.py +1 -1
  681. esphome/components/web_server_base/web_server_base.cpp +2 -0
  682. esphome/components/web_server_base/web_server_base.h +6 -0
  683. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  684. esphome/components/web_server_idf/web_server_idf.h +2 -0
  685. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  686. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  687. esphome/components/wifi/__init__.py +8 -43
  688. esphome/components/wifi/wifi_component.cpp +100 -36
  689. esphome/components/wifi/wifi_component.h +5 -1
  690. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  691. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  692. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  693. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  694. esphome/components/wireguard/wireguard.cpp +0 -2
  695. esphome/components/x9c/x9c.cpp +0 -2
  696. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  697. esphome/components/xl9535/xl9535.cpp +0 -2
  698. esphome/components/zephyr/__init__.py +252 -0
  699. esphome/components/zephyr/const.py +16 -0
  700. esphome/components/zephyr/core.cpp +90 -0
  701. esphome/components/zephyr/gpio.cpp +120 -0
  702. esphome/components/zephyr/gpio.h +38 -0
  703. esphome/components/zephyr/pre_build.py.script +4 -0
  704. esphome/components/zephyr/preferences.cpp +156 -0
  705. esphome/components/zephyr/preferences.h +13 -0
  706. esphome/config.py +38 -16
  707. esphome/config_helpers.py +1 -2
  708. esphome/config_validation.py +12 -16
  709. esphome/const.py +26 -1
  710. esphome/core/__init__.py +88 -51
  711. esphome/core/application.cpp +75 -21
  712. esphome/core/application.h +106 -171
  713. esphome/core/color.h +10 -0
  714. esphome/core/component.cpp +41 -25
  715. esphome/core/component.h +9 -6
  716. esphome/core/component_iterator.cpp +61 -261
  717. esphome/core/component_iterator.h +15 -0
  718. esphome/core/config.py +26 -11
  719. esphome/core/defines.h +40 -2
  720. esphome/core/entity_base.h +18 -0
  721. esphome/core/entity_helpers.py +45 -10
  722. esphome/core/helpers.cpp +8 -15
  723. esphome/core/helpers.h +60 -6
  724. esphome/core/lock_free_queue.h +1 -1
  725. esphome/core/scheduler.cpp +277 -74
  726. esphome/core/scheduler.h +89 -27
  727. esphome/cpp_generator.py +2 -6
  728. esphome/cpp_helpers.py +1 -1
  729. esphome/dashboard/dashboard.py +2 -3
  730. esphome/dashboard/dns.py +2 -8
  731. esphome/dashboard/web_server.py +34 -19
  732. esphome/espota2.py +1 -4
  733. esphome/git.py +3 -1
  734. esphome/helpers.py +23 -4
  735. esphome/log.py +3 -1
  736. esphome/mqtt.py +3 -5
  737. esphome/platformio_api.py +7 -4
  738. esphome/types.py +12 -0
  739. esphome/util.py +20 -8
  740. esphome/voluptuous_schema.py +4 -3
  741. esphome/vscode.py +1 -2
  742. esphome/wizard.py +1 -4
  743. esphome/writer.py +5 -107
  744. esphome/yaml_util.py +7 -5
  745. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/METADATA +13 -14
  746. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/RECORD +751 -671
  747. esphome/components/mipi_spi/models/commands.py +0 -82
  748. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  749. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/WHEEL +0 -0
  750. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/entry_points.txt +0 -0
  751. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/licenses/LICENSE +0 -0
  752. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/top_level.txt +0 -0
@@ -17,8 +17,6 @@ static const char *const TAG = "es8156";
17
17
  }
18
18
 
19
19
  void ES8156::setup() {
20
- ESP_LOGCONFIG(TAG, "Running setup");
21
-
22
20
  ES8156_ERROR_FAILED(this->write_byte(ES8156_REG02_SCLK_MODE, 0x04));
23
21
  ES8156_ERROR_FAILED(this->write_byte(ES8156_REG20_ANALOG_SYS1, 0x2A));
24
22
  ES8156_ERROR_FAILED(this->write_byte(ES8156_REG21_ANALOG_SYS2, 0x3C));
@@ -22,8 +22,6 @@ static const char *const TAG = "es8311";
22
22
  }
23
23
 
24
24
  void ES8311::setup() {
25
- ESP_LOGCONFIG(TAG, "Running setup");
26
-
27
25
  // Reset
28
26
  ES8311_ERROR_FAILED(this->write_byte(ES8311_REG00_RESET, 0x1F));
29
27
  ES8311_ERROR_FAILED(this->write_byte(ES8311_REG00_RESET, 0x00));
@@ -23,8 +23,6 @@ static const char *const TAG = "es8388";
23
23
  }
24
24
 
25
25
  void ES8388::setup() {
26
- ESP_LOGCONFIG(TAG, "Running setup");
27
-
28
26
  // mute DAC
29
27
  this->set_mute_state_(true);
30
28
 
@@ -15,6 +15,7 @@ from esphome.const import (
15
15
  CONF_FRAMEWORK,
16
16
  CONF_IGNORE_EFUSE_CUSTOM_MAC,
17
17
  CONF_IGNORE_EFUSE_MAC_CRC,
18
+ CONF_LOG_LEVEL,
18
19
  CONF_NAME,
19
20
  CONF_PATH,
20
21
  CONF_PLATFORM_VERSION,
@@ -31,6 +32,7 @@ from esphome.const import (
31
32
  KEY_TARGET_FRAMEWORK,
32
33
  KEY_TARGET_PLATFORM,
33
34
  PLATFORM_ESP32,
35
+ ThreadModel,
34
36
  __version__,
35
37
  )
36
38
  from esphome.core import CORE, HexInt, TimePeriod
@@ -39,7 +41,7 @@ import esphome.final_validate as fv
39
41
  from esphome.helpers import copy_file_if_changed, mkdir_p, write_file_if_changed
40
42
  from esphome.types import ConfigType
41
43
 
42
- from .boards import BOARDS
44
+ from .boards import BOARDS, STANDARD_BOARDS
43
45
  from .const import ( # noqa
44
46
  KEY_BOARD,
45
47
  KEY_COMPONENTS,
@@ -75,8 +77,18 @@ CONF_ASSERTION_LEVEL = "assertion_level"
75
77
  CONF_COMPILER_OPTIMIZATION = "compiler_optimization"
76
78
  CONF_ENABLE_IDF_EXPERIMENTAL_FEATURES = "enable_idf_experimental_features"
77
79
  CONF_ENABLE_LWIP_ASSERT = "enable_lwip_assert"
80
+ CONF_EXECUTE_FROM_PSRAM = "execute_from_psram"
78
81
  CONF_RELEASE = "release"
79
82
 
83
+ LOG_LEVELS_IDF = [
84
+ "NONE",
85
+ "ERROR",
86
+ "WARN",
87
+ "INFO",
88
+ "DEBUG",
89
+ "VERBOSE",
90
+ ]
91
+
80
92
  ASSERTION_LEVELS = {
81
93
  "DISABLE": "CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE",
82
94
  "ENABLE": "CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE",
@@ -309,19 +321,19 @@ def _format_framework_espidf_version(
309
321
 
310
322
  # The default/recommended arduino framework version
311
323
  # - https://github.com/espressif/arduino-esp32/releases
312
- RECOMMENDED_ARDUINO_FRAMEWORK_VERSION = cv.Version(3, 1, 3)
324
+ RECOMMENDED_ARDUINO_FRAMEWORK_VERSION = cv.Version(3, 2, 1)
313
325
  # The platform-espressif32 version to use for arduino frameworks
314
326
  # - https://github.com/pioarduino/platform-espressif32/releases
315
- ARDUINO_PLATFORM_VERSION = cv.Version(53, 3, 13)
327
+ ARDUINO_PLATFORM_VERSION = cv.Version(54, 3, 21, "2")
316
328
 
317
329
  # The default/recommended esp-idf framework version
318
330
  # - https://github.com/espressif/esp-idf/releases
319
331
  # - https://api.registry.platformio.org/v3/packages/platformio/tool/framework-espidf
320
- RECOMMENDED_ESP_IDF_FRAMEWORK_VERSION = cv.Version(5, 3, 2)
332
+ RECOMMENDED_ESP_IDF_FRAMEWORK_VERSION = cv.Version(5, 4, 2)
321
333
  # The platformio/espressif32 version to use for esp-idf frameworks
322
334
  # - https://github.com/platformio/platform-espressif32/releases
323
335
  # - https://api.registry.platformio.org/v3/packages/platformio/platform/espressif32
324
- ESP_IDF_PLATFORM_VERSION = cv.Version(53, 3, 13)
336
+ ESP_IDF_PLATFORM_VERSION = cv.Version(54, 3, 21, "2")
325
337
 
326
338
  # List based on https://registry.platformio.org/tools/platformio/framework-espidf/versions
327
339
  SUPPORTED_PLATFORMIO_ESP_IDF_5X = [
@@ -356,8 +368,8 @@ SUPPORTED_PIOARDUINO_ESP_IDF_5X = [
356
368
  def _arduino_check_versions(value):
357
369
  value = value.copy()
358
370
  lookups = {
359
- "dev": (cv.Version(3, 1, 3), "https://github.com/espressif/arduino-esp32.git"),
360
- "latest": (cv.Version(3, 1, 3), None),
371
+ "dev": (cv.Version(3, 2, 1), "https://github.com/espressif/arduino-esp32.git"),
372
+ "latest": (cv.Version(3, 2, 1), None),
361
373
  "recommended": (RECOMMENDED_ARDUINO_FRAMEWORK_VERSION, None),
362
374
  }
363
375
 
@@ -395,8 +407,8 @@ def _arduino_check_versions(value):
395
407
  def _esp_idf_check_versions(value):
396
408
  value = value.copy()
397
409
  lookups = {
398
- "dev": (cv.Version(5, 3, 2), "https://github.com/espressif/esp-idf.git"),
399
- "latest": (cv.Version(5, 3, 2), None),
410
+ "dev": (cv.Version(5, 4, 2), "https://github.com/espressif/esp-idf.git"),
411
+ "latest": (cv.Version(5, 2, 2), None),
400
412
  "recommended": (RECOMMENDED_ESP_IDF_FRAMEWORK_VERSION, None),
401
413
  }
402
414
 
@@ -467,10 +479,10 @@ def _parse_platform_version(value):
467
479
  try:
468
480
  ver = cv.Version.parse(cv.version_number(value))
469
481
  if ver.major >= 50: # a pioarduino version
470
- if "-" in value:
471
- # maybe a release candidate?...definitely not our default, just use it as-is...
472
- return f"https://github.com/pioarduino/platform-espressif32/releases/download/{value}/platform-espressif32.zip"
473
- return f"https://github.com/pioarduino/platform-espressif32/releases/download/{ver.major}.{ver.minor:02d}.{ver.patch:02d}/platform-espressif32.zip"
482
+ release = f"{ver.major}.{ver.minor:02d}.{ver.patch:02d}"
483
+ if ver.extra:
484
+ release += f"-{ver.extra}"
485
+ return f"https://github.com/pioarduino/platform-espressif32/releases/download/{release}/platform-espressif32.zip"
474
486
  # if platform version is a valid version constraint, prefix the default package
475
487
  cv.platformio_version_constraint(value)
476
488
  return f"platformio/espressif32@{value}"
@@ -487,56 +499,90 @@ def _platform_is_platformio(value):
487
499
 
488
500
 
489
501
  def _detect_variant(value):
490
- board = value[CONF_BOARD]
491
- if board in BOARDS:
492
- variant = BOARDS[board][KEY_VARIANT]
493
- if CONF_VARIANT in value and variant != value[CONF_VARIANT]:
502
+ board = value.get(CONF_BOARD)
503
+ variant = value.get(CONF_VARIANT)
504
+ if variant and board is None:
505
+ # If variant is set, we can derive the board from it
506
+ # variant has already been validated against the known set
507
+ value = value.copy()
508
+ value[CONF_BOARD] = STANDARD_BOARDS[variant]
509
+ elif board in BOARDS:
510
+ variant = variant or BOARDS[board][KEY_VARIANT]
511
+ if variant != BOARDS[board][KEY_VARIANT]:
494
512
  raise cv.Invalid(
495
513
  f"Option '{CONF_VARIANT}' does not match selected board.",
496
514
  path=[CONF_VARIANT],
497
515
  )
498
516
  value = value.copy()
499
517
  value[CONF_VARIANT] = variant
518
+ elif not variant:
519
+ raise cv.Invalid(
520
+ "This board is unknown, if you are sure you want to compile with this board selection, "
521
+ f"override with option '{CONF_VARIANT}'",
522
+ path=[CONF_BOARD],
523
+ )
500
524
  else:
501
- if CONF_VARIANT not in value:
502
- raise cv.Invalid(
503
- "This board is unknown, if you are sure you want to compile with this board selection, "
504
- f"override with option '{CONF_VARIANT}'",
505
- path=[CONF_BOARD],
506
- )
507
525
  _LOGGER.warning(
508
- "This board is unknown. Make sure the chosen chip component is correct.",
526
+ "This board is unknown; the specified variant '%s' will be used but this may not work as expected.",
527
+ variant,
509
528
  )
510
529
  return value
511
530
 
512
531
 
513
532
  def final_validate(config):
514
- if not (
515
- pio_options := fv.full_config.get()[CONF_ESPHOME].get(CONF_PLATFORMIO_OPTIONS)
516
- ):
517
- # Not specified or empty
518
- return config
519
-
520
- pio_flash_size_key = "board_upload.flash_size"
521
- pio_partitions_key = "board_build.partitions"
522
- if CONF_PARTITIONS in config and pio_partitions_key in pio_options:
523
- raise cv.Invalid(
524
- f"Do not specify '{pio_partitions_key}' in '{CONF_PLATFORMIO_OPTIONS}' with '{CONF_PARTITIONS}' in esp32"
525
- )
526
-
527
- if pio_flash_size_key in pio_options:
528
- raise cv.Invalid(
529
- f"Please specify {CONF_FLASH_SIZE} within esp32 configuration only"
530
- )
531
-
533
+ # Imported locally to avoid circular import issues
534
+ from esphome.components.psram import DOMAIN as PSRAM_DOMAIN
535
+
536
+ errs = []
537
+ full_config = fv.full_config.get()
538
+ if pio_options := full_config[CONF_ESPHOME].get(CONF_PLATFORMIO_OPTIONS):
539
+ pio_flash_size_key = "board_upload.flash_size"
540
+ pio_partitions_key = "board_build.partitions"
541
+ if CONF_PARTITIONS in config and pio_partitions_key in pio_options:
542
+ errs.append(
543
+ cv.Invalid(
544
+ f"Do not specify '{pio_partitions_key}' in '{CONF_PLATFORMIO_OPTIONS}' with '{CONF_PARTITIONS}' in esp32"
545
+ )
546
+ )
547
+ if pio_flash_size_key in pio_options:
548
+ errs.append(
549
+ cv.Invalid(
550
+ f"Please specify {CONF_FLASH_SIZE} within esp32 configuration only"
551
+ )
552
+ )
532
553
  if (
533
554
  config[CONF_VARIANT] != VARIANT_ESP32
534
555
  and CONF_ADVANCED in (conf_fw := config[CONF_FRAMEWORK])
535
556
  and CONF_IGNORE_EFUSE_MAC_CRC in conf_fw[CONF_ADVANCED]
536
557
  ):
537
- raise cv.Invalid(
538
- f"{CONF_IGNORE_EFUSE_MAC_CRC} is not supported on {config[CONF_VARIANT]}"
558
+ errs.append(
559
+ cv.Invalid(
560
+ f"'{CONF_IGNORE_EFUSE_MAC_CRC}' is not supported on {config[CONF_VARIANT]}",
561
+ path=[CONF_FRAMEWORK, CONF_ADVANCED, CONF_IGNORE_EFUSE_MAC_CRC],
562
+ )
539
563
  )
564
+ if (
565
+ config.get(CONF_FRAMEWORK, {})
566
+ .get(CONF_ADVANCED, {})
567
+ .get(CONF_EXECUTE_FROM_PSRAM)
568
+ ):
569
+ if config[CONF_VARIANT] != VARIANT_ESP32S3:
570
+ errs.append(
571
+ cv.Invalid(
572
+ f"'{CONF_EXECUTE_FROM_PSRAM}' is only supported on {VARIANT_ESP32S3} variant",
573
+ path=[CONF_FRAMEWORK, CONF_ADVANCED, CONF_EXECUTE_FROM_PSRAM],
574
+ )
575
+ )
576
+ if PSRAM_DOMAIN not in full_config:
577
+ errs.append(
578
+ cv.Invalid(
579
+ f"'{CONF_EXECUTE_FROM_PSRAM}' requires PSRAM to be configured",
580
+ path=[CONF_FRAMEWORK, CONF_ADVANCED, CONF_EXECUTE_FROM_PSRAM],
581
+ )
582
+ )
583
+
584
+ if errs:
585
+ raise cv.MultipleInvalid(errs)
540
586
 
541
587
  return config
542
588
 
@@ -563,6 +609,8 @@ CONF_SDKCONFIG_OPTIONS = "sdkconfig_options"
563
609
  CONF_ENABLE_LWIP_DHCP_SERVER = "enable_lwip_dhcp_server"
564
610
  CONF_ENABLE_LWIP_MDNS_QUERIES = "enable_lwip_mdns_queries"
565
611
  CONF_ENABLE_LWIP_BRIDGE_INTERFACE = "enable_lwip_bridge_interface"
612
+ CONF_ENABLE_LWIP_TCPIP_CORE_LOCKING = "enable_lwip_tcpip_core_locking"
613
+ CONF_ENABLE_LWIP_CHECK_THREAD_SAFETY = "enable_lwip_check_thread_safety"
566
614
 
567
615
 
568
616
  def _validate_idf_component(config: ConfigType) -> ConfigType:
@@ -585,6 +633,9 @@ ESP_IDF_FRAMEWORK_SCHEMA = cv.All(
585
633
  cv.Optional(CONF_SDKCONFIG_OPTIONS, default={}): {
586
634
  cv.string_strict: cv.string_strict
587
635
  },
636
+ cv.Optional(CONF_LOG_LEVEL, default="ERROR"): cv.one_of(
637
+ *LOG_LEVELS_IDF, upper=True
638
+ ),
588
639
  cv.Optional(CONF_ADVANCED, default={}): cv.Schema(
589
640
  {
590
641
  cv.Optional(CONF_ASSERTION_LEVEL): cv.one_of(
@@ -611,6 +662,13 @@ ESP_IDF_FRAMEWORK_SCHEMA = cv.All(
611
662
  cv.Optional(
612
663
  CONF_ENABLE_LWIP_BRIDGE_INTERFACE, default=False
613
664
  ): cv.boolean,
665
+ cv.Optional(
666
+ CONF_ENABLE_LWIP_TCPIP_CORE_LOCKING, default=True
667
+ ): cv.boolean,
668
+ cv.Optional(
669
+ CONF_ENABLE_LWIP_CHECK_THREAD_SAFETY, default=True
670
+ ): cv.boolean,
671
+ cv.Optional(CONF_EXECUTE_FROM_PSRAM): cv.boolean,
614
672
  }
615
673
  ),
616
674
  cv.Optional(CONF_COMPONENTS, default=[]): cv.ensure_list(
@@ -635,6 +693,64 @@ ESP_IDF_FRAMEWORK_SCHEMA = cv.All(
635
693
  )
636
694
 
637
695
 
696
+ class _FrameworkMigrationWarning:
697
+ shown = False
698
+
699
+
700
+ def _show_framework_migration_message(name: str, variant: str) -> None:
701
+ """Show a friendly message about framework migration when defaulting to Arduino."""
702
+ if _FrameworkMigrationWarning.shown:
703
+ return
704
+ _FrameworkMigrationWarning.shown = True
705
+
706
+ from esphome.log import AnsiFore, color
707
+
708
+ message = (
709
+ color(
710
+ AnsiFore.BOLD_CYAN,
711
+ f"💡 IMPORTANT: {name} doesn't have a framework specified!",
712
+ )
713
+ + "\n\n"
714
+ + f"Currently, {variant} defaults to the Arduino framework.\n"
715
+ + color(AnsiFore.YELLOW, "This will change to ESP-IDF in ESPHome 2026.1.0.\n")
716
+ + "\n"
717
+ + "Note: Newer ESP32 variants (C6, H2, P4, etc.) already use ESP-IDF by default.\n"
718
+ + "\n"
719
+ + "Why change? ESP-IDF offers:\n"
720
+ + color(AnsiFore.GREEN, " ✨ Up to 40% smaller binaries\n")
721
+ + color(AnsiFore.GREEN, " 🚀 Better performance and optimization\n")
722
+ + color(AnsiFore.GREEN, " 📦 Custom-built firmware for your exact needs\n")
723
+ + color(
724
+ AnsiFore.GREEN,
725
+ " 🔧 Active development and testing by ESPHome developers\n",
726
+ )
727
+ + "\n"
728
+ + "Trade-offs:\n"
729
+ + color(AnsiFore.YELLOW, " ⏱️ Compile times are ~25% longer\n")
730
+ + color(AnsiFore.YELLOW, " 🔄 Some components need migration\n")
731
+ + "\n"
732
+ + "What should I do?\n"
733
+ + color(AnsiFore.CYAN, " Option 1")
734
+ + ": Migrate to ESP-IDF (recommended)\n"
735
+ + " Add this to your YAML under 'esp32:':\n"
736
+ + color(AnsiFore.WHITE, " framework:\n")
737
+ + color(AnsiFore.WHITE, " type: esp-idf\n")
738
+ + "\n"
739
+ + color(AnsiFore.CYAN, " Option 2")
740
+ + ": Keep using Arduino (still supported)\n"
741
+ + " Add this to your YAML under 'esp32:':\n"
742
+ + color(AnsiFore.WHITE, " framework:\n")
743
+ + color(AnsiFore.WHITE, " type: arduino\n")
744
+ + "\n"
745
+ + "Need help? Check out the migration guide:\n"
746
+ + color(
747
+ AnsiFore.BLUE,
748
+ "https://esphome.io/guides/esp32_arduino_to_idf.html",
749
+ )
750
+ )
751
+ _LOGGER.warning(message)
752
+
753
+
638
754
  def _set_default_framework(config):
639
755
  if CONF_FRAMEWORK not in config:
640
756
  config = config.copy()
@@ -643,6 +759,10 @@ def _set_default_framework(config):
643
759
  if variant in ARDUINO_ALLOWED_VARIANTS:
644
760
  config[CONF_FRAMEWORK] = ARDUINO_FRAMEWORK_SCHEMA({})
645
761
  config[CONF_FRAMEWORK][CONF_TYPE] = FRAMEWORK_ARDUINO
762
+ # Show the migration message
763
+ _show_framework_migration_message(
764
+ config.get(CONF_NAME, "This device"), variant
765
+ )
646
766
  else:
647
767
  config[CONF_FRAMEWORK] = ESP_IDF_FRAMEWORK_SCHEMA({})
648
768
  config[CONF_FRAMEWORK][CONF_TYPE] = FRAMEWORK_ESP_IDF
@@ -676,7 +796,7 @@ CONF_PARTITIONS = "partitions"
676
796
  CONFIG_SCHEMA = cv.All(
677
797
  cv.Schema(
678
798
  {
679
- cv.Required(CONF_BOARD): cv.string_strict,
799
+ cv.Optional(CONF_BOARD): cv.string_strict,
680
800
  cv.Optional(CONF_CPU_FREQUENCY): cv.one_of(
681
801
  *FULL_CPU_FREQUENCIES, upper=True
682
802
  ),
@@ -691,6 +811,7 @@ CONFIG_SCHEMA = cv.All(
691
811
  _detect_variant,
692
812
  _set_default_framework,
693
813
  set_core_data,
814
+ cv.has_at_least_one_key(CONF_BOARD, CONF_VARIANT),
694
815
  )
695
816
 
696
817
 
@@ -705,6 +826,7 @@ async def to_code(config):
705
826
  cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
706
827
  cg.add_build_flag(f"-DUSE_ESP32_VARIANT_{config[CONF_VARIANT]}")
707
828
  cg.add_define("ESPHOME_VARIANT", VARIANT_FRIENDLY[config[CONF_VARIANT]])
829
+ cg.add_define(ThreadModel.MULTI_ATOMICS)
708
830
 
709
831
  cg.add_platformio_option("lib_ldf_mode", "off")
710
832
  cg.add_platformio_option("lib_compat_mode", "strict")
@@ -774,6 +896,21 @@ async def to_code(config):
774
896
  add_idf_sdkconfig_option("CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES", False)
775
897
  if not advanced.get(CONF_ENABLE_LWIP_BRIDGE_INTERFACE, False):
776
898
  add_idf_sdkconfig_option("CONFIG_LWIP_BRIDGEIF_MAX_PORTS", 0)
899
+ if advanced.get(CONF_EXECUTE_FROM_PSRAM, False):
900
+ add_idf_sdkconfig_option("CONFIG_SPIRAM_FETCH_INSTRUCTIONS", True)
901
+ add_idf_sdkconfig_option("CONFIG_SPIRAM_RODATA", True)
902
+
903
+ # Apply LWIP core locking for better socket performance
904
+ # This is already enabled by default in Arduino framework, where it provides
905
+ # significant performance benefits. Our benchmarks show socket operations are
906
+ # 24-200% faster with core locking enabled:
907
+ # - select() on 4 sockets: ~190μs (Arduino/core locking) vs ~235μs (ESP-IDF default)
908
+ # - Up to 200% slower under load when all operations queue through tcpip_thread
909
+ # Enabling this makes ESP-IDF socket performance match Arduino framework.
910
+ if advanced.get(CONF_ENABLE_LWIP_TCPIP_CORE_LOCKING, True):
911
+ add_idf_sdkconfig_option("CONFIG_LWIP_TCPIP_CORE_LOCKING", True)
912
+ if advanced.get(CONF_ENABLE_LWIP_CHECK_THREAD_SAFETY, True):
913
+ add_idf_sdkconfig_option("CONFIG_LWIP_CHECK_THREAD_SAFETY", True)
777
914
 
778
915
  cg.add_platformio_option("board_build.partitions", "partitions.csv")
779
916
  if CONF_PARTITIONS in config:
@@ -813,6 +950,10 @@ async def to_code(config):
813
950
  ),
814
951
  )
815
952
 
953
+ add_idf_sdkconfig_option(
954
+ f"CONFIG_LOG_DEFAULT_LEVEL_{conf[CONF_LOG_LEVEL]}", True
955
+ )
956
+
816
957
  for name, value in conf[CONF_SDKCONFIG_OPTIONS].items():
817
958
  add_idf_sdkconfig_option(name, RawSdkconfigValue(value))
818
959
 
@@ -862,7 +1003,7 @@ def get_arduino_partition_csv(flash_size):
862
1003
  eeprom_partition_start = app1_partition_start + app_partition_size
863
1004
  spiffs_partition_start = eeprom_partition_start + eeprom_partition_size
864
1005
 
865
- partition_csv = f"""\
1006
+ return f"""\
866
1007
  nvs, data, nvs, 0x9000, 0x5000,
867
1008
  otadata, data, ota, 0xE000, 0x2000,
868
1009
  app0, app, ota_0, 0x{app0_partition_start:X}, 0x{app_partition_size:X},
@@ -870,20 +1011,18 @@ app1, app, ota_1, 0x{app1_partition_start:X}, 0x{app_partition_size:X},
870
1011
  eeprom, data, 0x99, 0x{eeprom_partition_start:X}, 0x{eeprom_partition_size:X},
871
1012
  spiffs, data, spiffs, 0x{spiffs_partition_start:X}, 0x{spiffs_partition_size:X}
872
1013
  """
873
- return partition_csv
874
1014
 
875
1015
 
876
1016
  def get_idf_partition_csv(flash_size):
877
1017
  app_partition_size = APP_PARTITION_SIZES[flash_size]
878
1018
 
879
- partition_csv = f"""\
1019
+ return f"""\
880
1020
  otadata, data, ota, , 0x2000,
881
1021
  phy_init, data, phy, , 0x1000,
882
1022
  app0, app, ota_0, , 0x{app_partition_size:X},
883
1023
  app1, app, ota_1, , 0x{app_partition_size:X},
884
1024
  nvs, data, nvs, , 0x6D000,
885
1025
  """
886
- return partition_csv
887
1026
 
888
1027
 
889
1028
  def _format_sdkconfig_val(value: SdkconfigValueType) -> str:
@@ -943,14 +1082,16 @@ def _write_idf_component_yml():
943
1082
 
944
1083
  # Called by writer.py
945
1084
  def copy_files():
946
- if CORE.using_arduino:
947
- if "partitions.csv" not in CORE.data[KEY_ESP32][KEY_EXTRA_BUILD_FILES]:
948
- write_file_if_changed(
949
- CORE.relative_build_path("partitions.csv"),
950
- get_arduino_partition_csv(
951
- CORE.platformio_options.get("board_upload.flash_size")
952
- ),
953
- )
1085
+ if (
1086
+ CORE.using_arduino
1087
+ and "partitions.csv" not in CORE.data[KEY_ESP32][KEY_EXTRA_BUILD_FILES]
1088
+ ):
1089
+ write_file_if_changed(
1090
+ CORE.relative_build_path("partitions.csv"),
1091
+ get_arduino_partition_csv(
1092
+ CORE.platformio_options.get("board_upload.flash_size")
1093
+ ),
1094
+ )
954
1095
  if CORE.using_esp_idf:
955
1096
  _write_sdkconfig()
956
1097
  _write_idf_component_yml()
@@ -970,7 +1111,7 @@ def copy_files():
970
1111
  __version__,
971
1112
  )
972
1113
 
973
- for _, file in CORE.data[KEY_ESP32][KEY_EXTRA_BUILD_FILES].items():
1114
+ for file in CORE.data[KEY_ESP32][KEY_EXTRA_BUILD_FILES].values():
974
1115
  if file[KEY_PATH].startswith("http"):
975
1116
  import requests
976
1117
 
@@ -2,13 +2,30 @@ from .const import (
2
2
  VARIANT_ESP32,
3
3
  VARIANT_ESP32C2,
4
4
  VARIANT_ESP32C3,
5
+ VARIANT_ESP32C5,
5
6
  VARIANT_ESP32C6,
6
7
  VARIANT_ESP32H2,
7
8
  VARIANT_ESP32P4,
8
9
  VARIANT_ESP32S2,
9
10
  VARIANT_ESP32S3,
11
+ VARIANTS,
10
12
  )
11
13
 
14
+ STANDARD_BOARDS = {
15
+ VARIANT_ESP32: "esp32dev",
16
+ VARIANT_ESP32C2: "esp32-c2-devkitm-1",
17
+ VARIANT_ESP32C3: "esp32-c3-devkitm-1",
18
+ VARIANT_ESP32C5: "esp32-c5-devkitc-1",
19
+ VARIANT_ESP32C6: "esp32-c6-devkitm-1",
20
+ VARIANT_ESP32H2: "esp32-h2-devkitm-1",
21
+ VARIANT_ESP32P4: "esp32-p4-evboard",
22
+ VARIANT_ESP32S2: "esp32-s2-kaluga-1",
23
+ VARIANT_ESP32S3: "esp32-s3-devkitc-1",
24
+ }
25
+
26
+ # Make sure not missed here if a new variant added.
27
+ assert all(v in STANDARD_BOARDS for v in VARIANTS)
28
+
12
29
  ESP32_BASE_PINS = {
13
30
  "TX": 1,
14
31
  "RX": 3,
@@ -114,7 +114,6 @@ void ESP32InternalGPIOPin::setup() {
114
114
  if (flags_ & gpio::FLAG_OUTPUT) {
115
115
  gpio_set_drive_capability(pin_, drive_strength_);
116
116
  }
117
- ESP_LOGD(TAG, "rtc: %d", SOC_GPIO_SUPPORT_RTC_INDEPENDENT);
118
117
  }
119
118
 
120
119
  void ESP32InternalGPIOPin::pin_mode(gpio::Flags flags) {
@@ -187,8 +187,7 @@ def validate_supports(value):
187
187
  "Open-drain only works with output mode", [CONF_MODE, CONF_OPEN_DRAIN]
188
188
  )
189
189
 
190
- value = _esp32_validations[variant].usage_validation(value)
191
- return value
190
+ return _esp32_validations[variant].usage_validation(value)
192
191
 
193
192
 
194
193
  # https://docs.espressif.com/projects/esp-idf/en/v3.3.5/api-reference/peripherals/gpio.html#_CPPv416gpio_drive_cap_t
@@ -2,6 +2,7 @@ import logging
2
2
 
3
3
  import esphome.config_validation as cv
4
4
  from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER
5
+ from esphome.pins import check_strapping_pin
5
6
 
6
7
  _ESP32H2_SPI_FLASH_PINS = {6, 7, 15, 16, 17, 18, 19, 20, 21}
7
8
 
@@ -15,13 +16,6 @@ _LOGGER = logging.getLogger(__name__)
15
16
  def esp32_h2_validate_gpio_pin(value):
16
17
  if value < 0 or value > 27:
17
18
  raise cv.Invalid(f"Invalid pin number: {value} (must be 0-27)")
18
- if value in _ESP32H2_STRAPPING_PINS:
19
- _LOGGER.warning(
20
- "GPIO%d is a Strapping PIN and should be avoided.\n"
21
- "Attaching external pullup/down resistors to strapping pins can cause unexpected failures.\n"
22
- "See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins",
23
- value,
24
- )
25
19
  if value in _ESP32H2_SPI_FLASH_PINS:
26
20
  _LOGGER.warning(
27
21
  "GPIO%d is reserved for SPI Flash communication on some ESP32-H2 chip variants.\n"
@@ -49,4 +43,5 @@ def esp32_h2_validate_supports(value):
49
43
  if is_input:
50
44
  # All ESP32 pins support input mode
51
45
  pass
46
+ check_strapping_pin(value, _ESP32H2_STRAPPING_PINS, _LOGGER)
52
47
  return value
@@ -2,6 +2,7 @@ import logging
2
2
 
3
3
  import esphome.config_validation as cv
4
4
  from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER
5
+ from esphome.pins import check_strapping_pin
5
6
 
6
7
  _ESP32P4_USB_JTAG_PINS = {24, 25}
7
8
 
@@ -13,13 +14,6 @@ _LOGGER = logging.getLogger(__name__)
13
14
  def esp32_p4_validate_gpio_pin(value):
14
15
  if value < 0 or value > 54:
15
16
  raise cv.Invalid(f"Invalid pin number: {value} (must be 0-54)")
16
- if value in _ESP32P4_STRAPPING_PINS:
17
- _LOGGER.warning(
18
- "GPIO%d is a Strapping PIN and should be avoided.\n"
19
- "Attaching external pullup/down resistors to strapping pins can cause unexpected failures.\n"
20
- "See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins",
21
- value,
22
- )
23
17
  if value in _ESP32P4_USB_JTAG_PINS:
24
18
  _LOGGER.warning(
25
19
  "GPIO%d is reserved for the USB-Serial-JTAG interface.\n"
@@ -40,4 +34,5 @@ def esp32_p4_validate_supports(value):
40
34
  if is_input:
41
35
  # All ESP32 pins support input mode
42
36
  pass
37
+ check_strapping_pin(value, _ESP32P4_STRAPPING_PINS, _LOGGER)
43
38
  return value