esphome 2025.7.5__py3-none-any.whl → 2025.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (756) hide show
  1. esphome/__main__.py +190 -83
  2. esphome/automation.py +2 -4
  3. esphome/build_gen/__init__.py +0 -0
  4. esphome/build_gen/platformio.py +102 -0
  5. esphome/components/a4988/a4988.cpp +0 -1
  6. esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
  7. esphome/components/absolute_humidity/sensor.py +2 -2
  8. esphome/components/adc/__init__.py +123 -85
  9. esphome/components/adc/adc_sensor.h +98 -35
  10. esphome/components/adc/adc_sensor_common.cpp +10 -4
  11. esphome/components/adc/adc_sensor_esp32.cpp +291 -123
  12. esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
  13. esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
  14. esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
  15. esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
  16. esphome/components/adc/sensor.py +61 -27
  17. esphome/components/adc128s102/adc128s102.cpp +1 -4
  18. esphome/components/ade7880/sensor.py +75 -49
  19. esphome/components/ads1115/ads1115.cpp +0 -1
  20. esphome/components/ads1118/ads1118.cpp +0 -1
  21. esphome/components/ags10/ags10.cpp +0 -4
  22. esphome/components/aht10/aht10.cpp +0 -4
  23. esphome/components/aic3204/aic3204.cpp +0 -2
  24. esphome/components/airthings_wave_plus/__init__.py +1 -1
  25. esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
  26. esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
  27. esphome/components/airthings_wave_plus/sensor.py +55 -28
  28. esphome/components/alarm_control_panel/__init__.py +4 -9
  29. esphome/components/am2315c/am2315c.cpp +0 -2
  30. esphome/components/am2320/am2320.cpp +0 -1
  31. esphome/components/animation/__init__.py +14 -11
  32. esphome/components/apds9306/apds9306.cpp +0 -4
  33. esphome/components/apds9960/apds9960.cpp +0 -1
  34. esphome/components/api/__init__.py +29 -4
  35. esphome/components/api/api_connection.cpp +378 -401
  36. esphome/components/api/api_connection.h +102 -52
  37. esphome/components/api/api_frame_helper.cpp +69 -896
  38. esphome/components/api/api_frame_helper.h +31 -126
  39. esphome/components/api/api_frame_helper_noise.cpp +583 -0
  40. esphome/components/api/api_frame_helper_noise.h +68 -0
  41. esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
  42. esphome/components/api/api_frame_helper_plaintext.h +53 -0
  43. esphome/components/api/api_noise_context.h +2 -4
  44. esphome/components/api/api_pb2.cpp +1601 -1808
  45. esphome/components/api/api_pb2.h +367 -323
  46. esphome/components/api/api_pb2_dump.cpp +1137 -3466
  47. esphome/components/api/api_pb2_includes.h +34 -0
  48. esphome/components/api/api_pb2_service.cpp +94 -105
  49. esphome/components/api/api_pb2_service.h +27 -16
  50. esphome/components/api/api_server.cpp +18 -17
  51. esphome/components/api/api_server.h +8 -5
  52. esphome/components/api/client.py +16 -8
  53. esphome/components/api/custom_api_device.h +68 -14
  54. esphome/components/api/homeassistant_service.h +24 -19
  55. esphome/components/api/list_entities.cpp +3 -5
  56. esphome/components/api/list_entities.h +2 -4
  57. esphome/components/api/proto.cpp +3 -5
  58. esphome/components/api/proto.h +239 -274
  59. esphome/components/api/subscribe_state.cpp +2 -4
  60. esphome/components/api/subscribe_state.h +2 -4
  61. esphome/components/api/user_services.cpp +2 -4
  62. esphome/components/api/user_services.h +8 -8
  63. esphome/components/as3935/as3935.cpp +0 -2
  64. esphome/components/as3935_spi/as3935_spi.cpp +0 -2
  65. esphome/components/as5600/__init__.py +1 -1
  66. esphome/components/as5600/as5600.cpp +0 -2
  67. esphome/components/as5600/sensor/__init__.py +0 -1
  68. esphome/components/as7341/as7341.cpp +0 -1
  69. esphome/components/async_tcp/__init__.py +1 -1
  70. esphome/components/at581x/at581x.cpp +1 -1
  71. esphome/components/atm90e26/atm90e26.cpp +0 -1
  72. esphome/components/atm90e32/atm90e32.cpp +475 -116
  73. esphome/components/atm90e32/atm90e32.h +43 -5
  74. esphome/components/audio/audio.h +2 -2
  75. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
  76. esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
  77. esphome/components/bh1750/bh1750.cpp +0 -1
  78. esphome/components/binary_sensor/__init__.py +14 -12
  79. esphome/components/ble_client/__init__.py +4 -7
  80. esphome/components/bluetooth_proxy/__init__.py +40 -3
  81. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +392 -81
  82. esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
  83. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
  84. esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
  85. esphome/components/bme280_base/bme280_base.cpp +15 -16
  86. esphome/components/bme680/bme680.cpp +2 -3
  87. esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
  88. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
  89. esphome/components/bmi160/bmi160.cpp +0 -1
  90. esphome/components/bmp085/bmp085.cpp +0 -1
  91. esphome/components/bmp280_base/bmp280_base.cpp +13 -14
  92. esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
  93. esphome/components/bmp581/bmp581.cpp +0 -2
  94. esphome/components/bp1658cj/bp1658cj.cpp +0 -1
  95. esphome/components/bp5758d/bp5758d.cpp +0 -1
  96. esphome/components/button/__init__.py +0 -1
  97. esphome/components/canbus/__init__.py +2 -3
  98. esphome/components/canbus/canbus.cpp +0 -1
  99. esphome/components/cap1188/cap1188.cpp +0 -2
  100. esphome/components/captive_portal/__init__.py +1 -1
  101. esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
  102. esphome/components/ch422g/ch422g.cpp +0 -1
  103. esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
  104. esphome/components/climate/__init__.py +0 -1
  105. esphome/components/climate/climate_traits.h +24 -0
  106. esphome/components/cm1106/cm1106.cpp +0 -1
  107. esphome/components/const/__init__.py +6 -0
  108. esphome/components/cover/__init__.py +0 -1
  109. esphome/components/cover/cover.cpp +9 -13
  110. esphome/components/cs5460a/cs5460a.cpp +0 -2
  111. esphome/components/cse7761/cse7761.cpp +0 -1
  112. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
  113. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
  114. esphome/components/dac7678/dac7678_output.cpp +0 -2
  115. esphome/components/dallas_temp/dallas_temp.cpp +0 -1
  116. esphome/components/datetime/__init__.py +0 -2
  117. esphome/components/debug/__init__.py +15 -1
  118. esphome/components/debug/debug_zephyr.cpp +281 -0
  119. esphome/components/debug/sensor.py +2 -1
  120. esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
  121. esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
  122. esphome/components/dfrobot_sen0395/__init__.py +1 -2
  123. esphome/components/dht/dht.cpp +0 -1
  124. esphome/components/dht12/dht12.cpp +0 -1
  125. esphome/components/display/__init__.py +16 -3
  126. esphome/components/display_menu_base/__init__.py +1 -1
  127. esphome/components/dps310/dps310.cpp +0 -2
  128. esphome/components/ds1307/ds1307.cpp +0 -1
  129. esphome/components/ds2484/ds2484.cpp +0 -1
  130. esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
  131. esphome/components/ee895/ee895.cpp +0 -1
  132. esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
  133. esphome/components/emc2101/emc2101.cpp +0 -2
  134. esphome/components/ens160_base/ens160_base.cpp +0 -2
  135. esphome/components/ens210/ens210.cpp +0 -1
  136. esphome/components/es7210/es7210.cpp +0 -2
  137. esphome/components/es7243e/es7243e.cpp +0 -2
  138. esphome/components/es8156/es8156.cpp +0 -2
  139. esphome/components/es8311/es8311.cpp +0 -2
  140. esphome/components/es8388/es8388.cpp +0 -2
  141. esphome/components/esp32/__init__.py +203 -60
  142. esphome/components/esp32/boards.py +17 -0
  143. esphome/components/esp32/gpio.cpp +0 -1
  144. esphome/components/esp32/gpio.py +1 -2
  145. esphome/components/esp32/gpio_esp32_h2.py +2 -7
  146. esphome/components/esp32/gpio_esp32_p4.py +2 -7
  147. esphome/components/esp32/post_build.py.script +112 -61
  148. esphome/components/esp32_ble/__init__.py +41 -2
  149. esphome/components/esp32_ble/ble.cpp +14 -10
  150. esphome/components/esp32_ble/ble.h +18 -18
  151. esphome/components/esp32_ble/ble_advertising.cpp +5 -5
  152. esphome/components/esp32_ble/ble_advertising.h +7 -5
  153. esphome/components/esp32_ble/ble_event.h +139 -73
  154. esphome/components/esp32_ble/ble_scan_result.h +2 -4
  155. esphome/components/esp32_ble/ble_uuid.cpp +5 -5
  156. esphome/components/esp32_ble/ble_uuid.h +6 -5
  157. esphome/components/esp32_ble_beacon/__init__.py +4 -0
  158. esphome/components/esp32_ble_client/__init__.py +1 -1
  159. esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
  160. esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
  161. esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
  162. esphome/components/esp32_ble_client/ble_client_base.h +17 -6
  163. esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
  164. esphome/components/esp32_ble_client/ble_service.cpp +4 -4
  165. esphome/components/esp32_ble_client/ble_service.h +6 -4
  166. esphome/components/esp32_ble_server/__init__.py +15 -12
  167. esphome/components/esp32_ble_tracker/__init__.py +79 -11
  168. esphome/components/esp32_ble_tracker/automation.h +4 -4
  169. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
  170. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
  171. esphome/components/esp32_camera/__init__.py +13 -1
  172. esphome/components/esp32_camera/esp32_camera.cpp +7 -2
  173. esphome/components/esp32_camera/esp32_camera.h +1 -0
  174. esphome/components/esp32_dac/esp32_dac.cpp +3 -19
  175. esphome/components/esp32_dac/esp32_dac.h +4 -8
  176. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
  177. esphome/components/esp32_rmt_led_strip/light.py +1 -1
  178. esphome/components/esp32_touch/__init__.py +2 -3
  179. esphome/components/esp32_touch/esp32_touch.h +9 -6
  180. esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
  181. esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
  182. esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
  183. esphome/components/esp8266/__init__.py +3 -1
  184. esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
  185. esphome/components/esphome/ota/__init__.py +1 -2
  186. esphome/components/esphome/ota/ota_esphome.cpp +150 -77
  187. esphome/components/esphome/ota/ota_esphome.h +8 -1
  188. esphome/components/espnow/__init__.py +309 -0
  189. esphome/components/espnow/automation.h +175 -0
  190. esphome/components/espnow/espnow_component.cpp +468 -0
  191. esphome/components/espnow/espnow_component.h +183 -0
  192. esphome/components/espnow/espnow_err.h +19 -0
  193. esphome/components/espnow/espnow_packet.h +166 -0
  194. esphome/components/ethernet/__init__.py +7 -1
  195. esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
  196. esphome/components/ethernet/ethernet_component.cpp +0 -1
  197. esphome/components/ethernet/ethernet_component.h +4 -0
  198. esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
  199. esphome/components/event/__init__.py +0 -1
  200. esphome/components/factory_reset/__init__.py +92 -0
  201. esphome/components/factory_reset/factory_reset.cpp +76 -0
  202. esphome/components/factory_reset/factory_reset.h +43 -0
  203. esphome/components/fan/__init__.py +0 -1
  204. esphome/components/fan/fan_traits.h +16 -0
  205. esphome/components/fastled_base/fastled_light.cpp +0 -1
  206. esphome/components/fastled_spi/light.py +1 -3
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
  208. esphome/components/fs3000/fs3000.cpp +0 -2
  209. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  210. esphome/components/ft63x6/ft63x6.cpp +0 -1
  211. esphome/components/gdk101/gdk101.cpp +0 -1
  212. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  213. esphome/components/gl_r01_i2c/sensor.py +1 -1
  214. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  215. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  216. esphome/components/gpio_expander/cached_gpio.h +24 -15
  217. esphome/components/gps/__init__.py +6 -2
  218. esphome/components/gps/gps.cpp +50 -49
  219. esphome/components/gps/gps.h +4 -8
  220. esphome/components/gps/time/gps_time.cpp +3 -9
  221. esphome/components/gps/time/gps_time.h +4 -7
  222. esphome/components/graph/__init__.py +1 -1
  223. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  224. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  225. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  227. esphome/components/haier/climate.py +5 -10
  228. esphome/components/haier/haier_base.cpp +0 -1
  229. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  230. esphome/components/hdc1080/hdc1080.cpp +0 -2
  231. esphome/components/heatpumpir/climate.py +2 -2
  232. esphome/components/hlw8012/hlw8012.cpp +0 -1
  233. esphome/components/hm3301/hm3301.cpp +0 -1
  234. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  235. esphome/components/homeassistant/__init__.py +1 -0
  236. esphome/components/homeassistant/number/__init__.py +1 -0
  237. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  238. esphome/components/homeassistant/switch/__init__.py +1 -0
  239. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  240. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  241. esphome/components/host/__init__.py +2 -0
  242. esphome/components/hte501/hte501.cpp +0 -1
  243. esphome/components/http_request/__init__.py +2 -3
  244. esphome/components/http_request/http_request_idf.cpp +2 -2
  245. esphome/components/htu21d/htu21d.cpp +0 -2
  246. esphome/components/htu31d/htu31d.cpp +0 -2
  247. esphome/components/hx711/hx711.cpp +0 -1
  248. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  249. esphome/components/hydreon_rgxx/sensor.py +4 -5
  250. esphome/components/i2c/i2c_bus.h +1 -1
  251. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  252. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  253. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  254. esphome/components/i2s_audio/__init__.py +6 -5
  255. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  256. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  257. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  258. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +0 -1
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +2 -2
  260. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  262. esphome/components/ili9xxx/display.py +4 -3
  263. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  264. esphome/components/image/__init__.py +123 -92
  265. esphome/components/improv_serial/__init__.py +7 -8
  266. esphome/components/ina219/ina219.cpp +0 -1
  267. esphome/components/ina226/ina226.cpp +0 -2
  268. esphome/components/ina260/ina260.cpp +0 -2
  269. esphome/components/ina2xx_base/__init__.py +2 -5
  270. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  271. esphome/components/ina3221/ina3221.cpp +0 -1
  272. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  273. esphome/components/interval/interval.h +5 -9
  274. esphome/components/json/__init__.py +1 -1
  275. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  276. esphome/components/lc709203f/lc709203f.cpp +0 -2
  277. esphome/components/lcd_gpio/display.py +1 -3
  278. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  279. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  280. esphome/components/ld2410/__init__.py +4 -6
  281. esphome/components/ld2410/binary_sensor.py +4 -0
  282. esphome/components/ld2410/ld2410.cpp +56 -100
  283. esphome/components/ld2410/ld2410.h +17 -15
  284. esphome/components/ld2410/sensor.py +24 -10
  285. esphome/components/ld2412/__init__.py +46 -0
  286. esphome/components/ld2412/binary_sensor.py +70 -0
  287. esphome/components/ld2412/button/__init__.py +74 -0
  288. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  289. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  290. esphome/components/ld2412/button/query_button.cpp +9 -0
  291. esphome/components/ld2412/button/query_button.h +18 -0
  292. esphome/components/ld2412/button/restart_button.cpp +9 -0
  293. esphome/components/ld2412/button/restart_button.h +18 -0
  294. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  296. esphome/components/ld2412/ld2412.cpp +861 -0
  297. esphome/components/ld2412/ld2412.h +141 -0
  298. esphome/components/ld2412/number/__init__.py +126 -0
  299. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  300. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  301. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  302. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  303. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  305. esphome/components/ld2412/select/__init__.py +82 -0
  306. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  307. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  308. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  309. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  310. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  311. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  312. esphome/components/ld2412/sensor.py +124 -0
  313. esphome/components/ld2412/switch/__init__.py +45 -0
  314. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  316. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  318. esphome/components/ld2412/text_sensor.py +34 -0
  319. esphome/components/ld2420/ld2420.cpp +0 -1
  320. esphome/components/ld2450/__init__.py +3 -4
  321. esphome/components/ld2450/binary_sensor.py +3 -0
  322. esphome/components/ld2450/ld2450.cpp +77 -165
  323. esphome/components/ld2450/ld2450.h +26 -54
  324. esphome/components/ld2450/sensor.py +120 -6
  325. esphome/components/ld2450/text_sensor.py +5 -4
  326. esphome/components/ld24xx/__init__.py +1 -0
  327. esphome/components/ld24xx/ld24xx.h +65 -0
  328. esphome/components/ledc/ledc_output.cpp +0 -1
  329. esphome/components/libretiny/__init__.py +2 -0
  330. esphome/components/light/__init__.py +0 -1
  331. esphome/components/light/effects.py +70 -45
  332. esphome/components/light/light_call.cpp +101 -66
  333. esphome/components/light/light_color_values.h +16 -11
  334. esphome/components/light/light_json_schema.cpp +46 -44
  335. esphome/components/light/light_state.cpp +8 -11
  336. esphome/components/light/light_traits.h +17 -0
  337. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  338. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  339. esphome/components/lock/__init__.py +0 -1
  340. esphome/components/logger/__init__.py +31 -9
  341. esphome/components/logger/logger.cpp +12 -7
  342. esphome/components/logger/logger.h +25 -14
  343. esphome/components/logger/logger_esp32.cpp +2 -7
  344. esphome/components/logger/logger_esp8266.cpp +2 -4
  345. esphome/components/logger/logger_host.cpp +2 -4
  346. esphome/components/logger/logger_libretiny.cpp +2 -4
  347. esphome/components/logger/logger_rp2040.cpp +2 -4
  348. esphome/components/logger/logger_zephyr.cpp +86 -0
  349. esphome/components/logger/select/logger_level_select.cpp +2 -4
  350. esphome/components/logger/select/logger_level_select.h +2 -4
  351. esphome/components/logger/task_log_buffer.cpp +2 -4
  352. esphome/components/logger/task_log_buffer.h +2 -4
  353. esphome/components/lps22/sensor.py +5 -5
  354. esphome/components/ltr390/ltr390.cpp +0 -2
  355. esphome/components/ltr501/ltr501.cpp +0 -1
  356. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  357. esphome/components/lvgl/__init__.py +14 -13
  358. esphome/components/lvgl/automation.py +2 -4
  359. esphome/components/lvgl/defines.py +0 -2
  360. esphome/components/lvgl/helpers.py +1 -1
  361. esphome/components/lvgl/lv_validation.py +7 -4
  362. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  363. esphome/components/lvgl/styles.py +2 -2
  364. esphome/components/lvgl/types.py +1 -1
  365. esphome/components/lvgl/widgets/__init__.py +2 -2
  366. esphome/components/lvgl/widgets/arc.py +14 -11
  367. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  368. esphome/components/lvgl/widgets/qrcode.py +7 -7
  369. esphome/components/lvgl/widgets/spinner.py +6 -6
  370. esphome/components/lvgl/widgets/switch.py +2 -2
  371. esphome/components/lvgl/widgets/tabview.py +3 -3
  372. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  373. esphome/components/matrix_keypad/__init__.py +4 -3
  374. esphome/components/max17043/max17043.cpp +0 -2
  375. esphome/components/max31855/max31855.cpp +1 -4
  376. esphome/components/max31856/max31856.cpp +0 -4
  377. esphome/components/max31865/max31865.cpp +0 -1
  378. esphome/components/max44009/max44009.cpp +0 -1
  379. esphome/components/max6675/max6675.cpp +1 -4
  380. esphome/components/max6956/max6956.cpp +0 -1
  381. esphome/components/max7219/max7219.cpp +0 -1
  382. esphome/components/max7219digit/display.py +1 -1
  383. esphome/components/max7219digit/max7219digit.cpp +0 -1
  384. esphome/components/max9611/max9611.cpp +0 -1
  385. esphome/components/mcp23008/__init__.py +1 -1
  386. esphome/components/mcp23008/mcp23008.cpp +0 -1
  387. esphome/components/mcp23016/mcp23016.cpp +0 -1
  388. esphome/components/mcp23017/__init__.py +1 -1
  389. esphome/components/mcp23017/mcp23017.cpp +0 -1
  390. esphome/components/mcp23s08/__init__.py +1 -1
  391. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  392. esphome/components/mcp23s17/__init__.py +1 -1
  393. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  394. esphome/components/mcp23x08_base/__init__.py +2 -0
  395. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  396. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  397. esphome/components/mcp23x17_base/__init__.py +2 -0
  398. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  399. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  400. esphome/components/mcp23xxx_base/__init__.py +11 -5
  401. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  402. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  403. esphome/components/mcp3008/mcp3008.cpp +1 -4
  404. esphome/components/mcp3204/mcp3204.cpp +1 -4
  405. esphome/components/mcp4461/mcp4461.cpp +0 -1
  406. esphome/components/mcp4725/mcp4725.cpp +0 -1
  407. esphome/components/mcp4728/mcp4728.cpp +0 -1
  408. esphome/components/mcp9600/mcp9600.cpp +0 -2
  409. esphome/components/mcp9808/mcp9808.cpp +0 -2
  410. esphome/components/mdns/__init__.py +3 -0
  411. esphome/components/mdns/mdns_component.cpp +2 -0
  412. esphome/components/mdns/mdns_component.h +4 -0
  413. esphome/components/media_player/__init__.py +40 -0
  414. esphome/components/media_player/automation.h +16 -0
  415. esphome/components/media_player/media_player.cpp +13 -0
  416. esphome/components/media_player/media_player.h +50 -3
  417. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  418. esphome/components/mics_4514/mics_4514.cpp +1 -6
  419. esphome/components/midea/ir_transmitter.h +4 -4
  420. esphome/components/mipi/__init__.py +416 -0
  421. esphome/components/mipi_dsi/__init__.py +5 -0
  422. esphome/components/mipi_dsi/display.py +233 -0
  423. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  424. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  425. esphome/components/mipi_dsi/models/__init__.py +0 -0
  426. esphome/components/mipi_dsi/models/guition.py +38 -0
  427. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  428. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  429. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  430. esphome/components/mipi_spi/__init__.py +0 -9
  431. esphome/components/mipi_spi/display.py +220 -256
  432. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  433. esphome/components/mipi_spi/mipi_spi.h +556 -108
  434. esphome/components/mipi_spi/models/__init__.py +0 -65
  435. esphome/components/mipi_spi/models/adafruit.py +30 -0
  436. esphome/components/mipi_spi/models/amoled.py +41 -5
  437. esphome/components/mipi_spi/models/ili.py +5 -5
  438. esphome/components/mipi_spi/models/jc.py +1 -3
  439. esphome/components/mipi_spi/models/lilygo.py +1 -1
  440. esphome/components/mipi_spi/models/waveshare.py +16 -1
  441. esphome/components/mixer/speaker/__init__.py +4 -5
  442. esphome/components/mlx90393/sensor.py +7 -5
  443. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  444. esphome/components/mlx90614/mlx90614.cpp +0 -1
  445. esphome/components/mmc5603/mmc5603.cpp +0 -1
  446. esphome/components/mmc5983/mmc5983.cpp +0 -2
  447. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  448. esphome/components/mpr121/__init__.py +7 -6
  449. esphome/components/mpr121/mpr121.cpp +0 -1
  450. esphome/components/mpu6050/mpu6050.cpp +0 -1
  451. esphome/components/mpu6886/mpu6886.cpp +0 -1
  452. esphome/components/mqtt/__init__.py +1 -2
  453. esphome/components/mqtt/mqtt_button.cpp +1 -1
  454. esphome/components/mqtt/mqtt_client.cpp +0 -1
  455. esphome/components/mqtt/mqtt_component.cpp +8 -14
  456. esphome/components/mqtt/mqtt_component.h +0 -7
  457. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  458. esphome/components/mqtt/mqtt_sensor.h +0 -1
  459. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  461. esphome/components/ms5611/ms5611.cpp +0 -1
  462. esphome/components/ms8607/ms8607.cpp +0 -1
  463. esphome/components/msa3xx/msa3xx.cpp +0 -2
  464. esphome/components/my9231/my9231.cpp +0 -2
  465. esphome/components/nau7802/nau7802.cpp +0 -1
  466. esphome/components/neopixelbus/light.py +3 -0
  467. esphome/components/network/util.cpp +29 -0
  468. esphome/components/nextion/nextion.cpp +2 -2
  469. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  470. esphome/components/npi19/npi19.cpp +0 -2
  471. esphome/components/nrf52/__init__.py +223 -0
  472. esphome/components/nrf52/boards.py +34 -0
  473. esphome/components/nrf52/const.py +18 -0
  474. esphome/components/nrf52/gpio.py +79 -0
  475. esphome/components/number/__init__.py +2 -1
  476. esphome/components/one_wire/__init__.py +1 -2
  477. esphome/components/one_wire/one_wire.cpp +0 -2
  478. esphome/components/one_wire/one_wire.h +0 -2
  479. esphome/components/opentherm/hub.cpp +0 -1
  480. esphome/components/opentherm/number/__init__.py +2 -2
  481. esphome/components/openthread/__init__.py +2 -3
  482. esphome/components/openthread/openthread.cpp +30 -13
  483. esphome/components/openthread/openthread.h +3 -0
  484. esphome/components/openthread/openthread_esp.cpp +3 -1
  485. esphome/components/opt3001/sensor.py +2 -6
  486. esphome/components/output/__init__.py +38 -0
  487. esphome/components/output/automation.h +24 -0
  488. esphome/components/output/switch/output_switch.cpp +0 -2
  489. esphome/components/packages/__init__.py +1 -2
  490. esphome/components/packet_transport/__init__.py +4 -3
  491. esphome/components/pca6416a/pca6416a.cpp +0 -1
  492. esphome/components/pca9554/pca9554.cpp +0 -1
  493. esphome/components/pca9685/pca9685_output.cpp +0 -2
  494. esphome/components/pcf85063/pcf85063.cpp +0 -1
  495. esphome/components/pcf8563/pcf8563.cpp +0 -1
  496. esphome/components/pcf8574/pcf8574.cpp +0 -1
  497. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  498. esphome/components/pipsolar/pipsolar.cpp +54 -42
  499. esphome/components/pipsolar/pipsolar.h +5 -4
  500. esphome/components/pipsolar/sensor/__init__.py +1 -1
  501. esphome/components/pm2005/pm2005.cpp +0 -1
  502. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  503. esphome/components/pmwcs3/sensor.py +1 -2
  504. esphome/components/pn532/pn532.cpp +0 -2
  505. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  506. esphome/components/power_supply/power_supply.cpp +7 -10
  507. esphome/components/power_supply/power_supply.h +1 -1
  508. esphome/components/psram/__init__.py +6 -1
  509. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  510. esphome/components/pulse_counter/sensor.py +9 -6
  511. esphome/components/pylontech/pylontech.cpp +0 -1
  512. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  513. esphome/components/qmp6988/qmp6988.cpp +0 -2
  514. esphome/components/qspi_dbi/display.py +2 -3
  515. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  516. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  517. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  518. esphome/components/rc522/rc522.cpp +9 -31
  519. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  520. esphome/components/remote_base/__init__.py +5 -6
  521. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  522. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  523. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  524. esphome/components/remote_transmitter/__init__.py +26 -0
  525. esphome/components/remote_transmitter/automation.h +18 -0
  526. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  527. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  528. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  529. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  530. esphome/components/resampler/speaker/__init__.py +4 -5
  531. esphome/components/rf_bridge/__init__.py +4 -8
  532. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  533. esphome/components/rp2040/__init__.py +3 -1
  534. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  535. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  536. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  537. esphome/components/rpi_dpi_rgb/display.py +13 -15
  538. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  539. esphome/components/runtime_stats/__init__.py +34 -0
  540. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  541. esphome/components/runtime_stats/runtime_stats.h +132 -0
  542. esphome/components/scd30/scd30.cpp +0 -2
  543. esphome/components/scd30/sensor.py +1 -2
  544. esphome/components/scd4x/scd4x.cpp +0 -1
  545. esphome/components/scd4x/sensor.py +1 -3
  546. esphome/components/sdl/display.py +3 -1
  547. esphome/components/sdl/sdl_esphome.cpp +0 -2
  548. esphome/components/sdp3x/sdp3x.cpp +0 -2
  549. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  550. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  551. esphome/components/select/__init__.py +2 -3
  552. esphome/components/select/select_traits.cpp +1 -1
  553. esphome/components/select/select_traits.h +1 -1
  554. esphome/components/sen0321/sen0321.cpp +0 -1
  555. esphome/components/sen5x/sen5x.cpp +0 -2
  556. esphome/components/senseair/senseair.cpp +7 -3
  557. esphome/components/senseair/senseair.h +11 -0
  558. esphome/components/sensor/__init__.py +36 -4
  559. esphome/components/sensor/filter.cpp +49 -10
  560. esphome/components/sensor/filter.h +22 -7
  561. esphome/components/sensor/sensor.cpp +0 -1
  562. esphome/components/sensor/sensor.h +0 -9
  563. esphome/components/sfa30/sfa30.cpp +0 -4
  564. esphome/components/sgp30/sgp30.cpp +0 -2
  565. esphome/components/sgp4x/sensor.py +1 -1
  566. esphome/components/sgp4x/sgp4x.cpp +0 -2
  567. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  568. esphome/components/sht3xd/sht3xd.cpp +0 -2
  569. esphome/components/sht4x/sht4x.cpp +0 -2
  570. esphome/components/shtcx/shtcx.cpp +0 -1
  571. esphome/components/sim800l/__init__.py +2 -4
  572. esphome/components/sm16716/sm16716.cpp +0 -1
  573. esphome/components/sm2135/sm2135.cpp +0 -1
  574. esphome/components/sm2235/sm2235.cpp +0 -1
  575. esphome/components/sm2335/sm2335.cpp +0 -1
  576. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  577. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  578. esphome/components/sntp/sntp_component.cpp +0 -1
  579. esphome/components/sound_level/sensor.py +1 -1
  580. esphome/components/speaker/media_player/__init__.py +21 -33
  581. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  582. esphome/components/spi/__init__.py +29 -13
  583. esphome/components/spi/spi.cpp +0 -2
  584. esphome/components/spi_device/spi_device.cpp +1 -4
  585. esphome/components/sprinkler/__init__.py +4 -4
  586. esphome/components/sps30/sps30.cpp +0 -1
  587. esphome/components/ssd1306_base/__init__.py +11 -11
  588. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  589. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  590. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  591. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  592. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  593. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  594. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  595. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  596. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  597. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  598. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  599. esphome/components/st7701s/display.py +10 -14
  600. esphome/components/st7701s/st7701s.cpp +0 -3
  601. esphome/components/st7735/st7735.cpp +0 -1
  602. esphome/components/st7789v/st7789v.cpp +0 -1
  603. esphome/components/st7920/st7920.cpp +0 -1
  604. esphome/components/status_led/light/status_led_light.cpp +0 -2
  605. esphome/components/status_led/status_led.cpp +0 -1
  606. esphome/components/stepper/__init__.py +2 -4
  607. esphome/components/sts3x/sts3x.cpp +0 -1
  608. esphome/components/substitutions/__init__.py +10 -16
  609. esphome/components/substitutions/jinja.py +24 -1
  610. esphome/components/sun/__init__.py +2 -3
  611. esphome/components/switch/__init__.py +31 -1
  612. esphome/components/switch/automation.h +24 -0
  613. esphome/components/switch/switch.cpp +8 -0
  614. esphome/components/switch/switch.h +8 -0
  615. esphome/components/sx126x/sx126x.cpp +0 -2
  616. esphome/components/sx127x/sx127x.cpp +0 -2
  617. esphome/components/sx1509/__init__.py +7 -5
  618. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  619. esphome/components/sx1509/sx1509.cpp +0 -2
  620. esphome/components/syslog/esphome_syslog.cpp +1 -1
  621. esphome/components/tc74/tc74.cpp +0 -1
  622. esphome/components/tca9548a/tca9548a.cpp +0 -1
  623. esphome/components/tca9555/tca9555.cpp +0 -1
  624. esphome/components/tcs34725/tcs34725.cpp +0 -1
  625. esphome/components/tee501/tee501.cpp +0 -1
  626. esphome/components/tem3200/tem3200.cpp +0 -2
  627. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  628. esphome/components/template/cover/template_cover.cpp +0 -1
  629. esphome/components/template/select/template_select.cpp +0 -1
  630. esphome/components/template/text/template_text.cpp +0 -2
  631. esphome/components/template/valve/template_valve.cpp +0 -1
  632. esphome/components/text/__init__.py +0 -1
  633. esphome/components/text/text_traits.h +2 -0
  634. esphome/components/text_sensor/__init__.py +2 -1
  635. esphome/components/text_sensor/text_sensor.cpp +0 -2
  636. esphome/components/text_sensor/text_sensor.h +0 -8
  637. esphome/components/thermostat/climate.py +4 -4
  638. esphome/components/time/__init__.py +7 -4
  639. esphome/components/time/real_time_clock.cpp +16 -3
  640. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  641. esphome/components/tlc5947/tlc5947.cpp +0 -2
  642. esphome/components/tlc5971/tlc5971.cpp +0 -2
  643. esphome/components/tm1621/tm1621.cpp +0 -2
  644. esphome/components/tm1637/tm1637.cpp +0 -2
  645. esphome/components/tm1638/tm1638.cpp +0 -2
  646. esphome/components/tm1651/__init__.py +45 -48
  647. esphome/components/tm1651/tm1651.cpp +213 -47
  648. esphome/components/tm1651/tm1651.h +37 -32
  649. esphome/components/tmp117/tmp117.cpp +0 -2
  650. esphome/components/tsl2561/tsl2561.cpp +0 -1
  651. esphome/components/tsl2591/tsl2591.cpp +0 -1
  652. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  653. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  654. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  655. esphome/components/tuya/climate/__init__.py +9 -10
  656. esphome/components/tuya/number/__init__.py +8 -6
  657. esphome/components/tx20/tx20.cpp +0 -1
  658. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  659. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  660. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  661. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  662. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  663. esphome/components/udp/__init__.py +1 -1
  664. esphome/components/ufire_ec/sensor.py +1 -2
  665. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  666. esphome/components/ufire_ise/sensor.py +1 -2
  667. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  668. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  669. esphome/components/update/__init__.py +0 -1
  670. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  671. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  672. esphome/components/usb_host/usb_host_client.cpp +0 -1
  673. esphome/components/usb_host/usb_host_component.cpp +0 -1
  674. esphome/components/valve/__init__.py +0 -1
  675. esphome/components/veml3235/veml3235.cpp +0 -3
  676. esphome/components/veml7700/veml7700.cpp +0 -2
  677. esphome/components/version/version_text_sensor.cpp +0 -1
  678. esphome/components/version/version_text_sensor.h +0 -1
  679. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  680. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  681. esphome/components/web_server/__init__.py +13 -0
  682. esphome/components/web_server/web_server.cpp +188 -353
  683. esphome/components/web_server/web_server.h +61 -1
  684. esphome/components/web_server_base/__init__.py +1 -1
  685. esphome/components/web_server_base/web_server_base.cpp +2 -0
  686. esphome/components/web_server_base/web_server_base.h +6 -0
  687. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  688. esphome/components/web_server_idf/web_server_idf.h +2 -0
  689. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  690. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  691. esphome/components/wifi/__init__.py +17 -43
  692. esphome/components/wifi/wifi_component.cpp +100 -36
  693. esphome/components/wifi/wifi_component.h +5 -1
  694. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  695. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  696. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  697. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  698. esphome/components/wireguard/wireguard.cpp +0 -2
  699. esphome/components/x9c/x9c.cpp +0 -2
  700. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  701. esphome/components/xl9535/xl9535.cpp +0 -2
  702. esphome/components/zephyr/__init__.py +252 -0
  703. esphome/components/zephyr/const.py +16 -0
  704. esphome/components/zephyr/core.cpp +90 -0
  705. esphome/components/zephyr/gpio.cpp +120 -0
  706. esphome/components/zephyr/gpio.h +38 -0
  707. esphome/components/zephyr/pre_build.py.script +4 -0
  708. esphome/components/zephyr/preferences.cpp +156 -0
  709. esphome/components/zephyr/preferences.h +13 -0
  710. esphome/config.py +38 -16
  711. esphome/config_helpers.py +1 -2
  712. esphome/config_validation.py +12 -16
  713. esphome/const.py +26 -1
  714. esphome/core/__init__.py +92 -51
  715. esphome/core/application.cpp +75 -21
  716. esphome/core/application.h +106 -171
  717. esphome/core/color.h +10 -0
  718. esphome/core/component.cpp +41 -25
  719. esphome/core/component.h +9 -6
  720. esphome/core/component_iterator.cpp +61 -261
  721. esphome/core/component_iterator.h +15 -0
  722. esphome/core/config.py +26 -11
  723. esphome/core/defines.h +40 -2
  724. esphome/core/entity_base.h +18 -0
  725. esphome/core/entity_helpers.py +45 -10
  726. esphome/core/helpers.cpp +8 -15
  727. esphome/core/helpers.h +60 -6
  728. esphome/core/lock_free_queue.h +1 -1
  729. esphome/core/scheduler.cpp +311 -77
  730. esphome/core/scheduler.h +141 -28
  731. esphome/cpp_generator.py +2 -6
  732. esphome/cpp_helpers.py +1 -1
  733. esphome/dashboard/dashboard.py +2 -3
  734. esphome/dashboard/dns.py +2 -8
  735. esphome/dashboard/web_server.py +34 -19
  736. esphome/espota2.py +1 -4
  737. esphome/git.py +3 -1
  738. esphome/helpers.py +23 -4
  739. esphome/log.py +3 -1
  740. esphome/mqtt.py +3 -5
  741. esphome/platformio_api.py +7 -4
  742. esphome/types.py +12 -0
  743. esphome/util.py +20 -8
  744. esphome/voluptuous_schema.py +4 -3
  745. esphome/vscode.py +1 -2
  746. esphome/wizard.py +1 -4
  747. esphome/writer.py +16 -108
  748. esphome/yaml_util.py +7 -5
  749. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
  750. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/RECORD +755 -675
  751. esphome/components/mipi_spi/models/commands.py +0 -82
  752. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  753. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
  754. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
  755. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
  756. {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
@@ -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
 
@@ -703,8 +824,10 @@ async def to_code(config):
703
824
  cg.set_cpp_standard("gnu++20")
704
825
  cg.add_build_flag("-DUSE_ESP32")
705
826
  cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
706
- cg.add_build_flag(f"-DUSE_ESP32_VARIANT_{config[CONF_VARIANT]}")
707
- cg.add_define("ESPHOME_VARIANT", VARIANT_FRIENDLY[config[CONF_VARIANT]])
827
+ variant = config[CONF_VARIANT]
828
+ cg.add_build_flag(f"-DUSE_ESP32_VARIANT_{variant}")
829
+ cg.add_define("ESPHOME_VARIANT", VARIANT_FRIENDLY[variant])
830
+ cg.add_define(ThreadModel.MULTI_ATOMICS)
708
831
 
709
832
  cg.add_platformio_option("lib_ldf_mode", "off")
710
833
  cg.add_platformio_option("lib_compat_mode", "strict")
@@ -737,6 +860,7 @@ async def to_code(config):
737
860
  cg.add_platformio_option(
738
861
  "platform_packages", ["espressif/toolchain-esp32ulp@2.35.0-20220830"]
739
862
  )
863
+ add_idf_sdkconfig_option(f"CONFIG_IDF_TARGET_{variant}", True)
740
864
  add_idf_sdkconfig_option(
741
865
  f"CONFIG_ESPTOOLPY_FLASHSIZE_{config[CONF_FLASH_SIZE]}", True
742
866
  )
@@ -774,6 +898,21 @@ async def to_code(config):
774
898
  add_idf_sdkconfig_option("CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES", False)
775
899
  if not advanced.get(CONF_ENABLE_LWIP_BRIDGE_INTERFACE, False):
776
900
  add_idf_sdkconfig_option("CONFIG_LWIP_BRIDGEIF_MAX_PORTS", 0)
901
+ if advanced.get(CONF_EXECUTE_FROM_PSRAM, False):
902
+ add_idf_sdkconfig_option("CONFIG_SPIRAM_FETCH_INSTRUCTIONS", True)
903
+ add_idf_sdkconfig_option("CONFIG_SPIRAM_RODATA", True)
904
+
905
+ # Apply LWIP core locking for better socket performance
906
+ # This is already enabled by default in Arduino framework, where it provides
907
+ # significant performance benefits. Our benchmarks show socket operations are
908
+ # 24-200% faster with core locking enabled:
909
+ # - select() on 4 sockets: ~190μs (Arduino/core locking) vs ~235μs (ESP-IDF default)
910
+ # - Up to 200% slower under load when all operations queue through tcpip_thread
911
+ # Enabling this makes ESP-IDF socket performance match Arduino framework.
912
+ if advanced.get(CONF_ENABLE_LWIP_TCPIP_CORE_LOCKING, True):
913
+ add_idf_sdkconfig_option("CONFIG_LWIP_TCPIP_CORE_LOCKING", True)
914
+ if advanced.get(CONF_ENABLE_LWIP_CHECK_THREAD_SAFETY, True):
915
+ add_idf_sdkconfig_option("CONFIG_LWIP_CHECK_THREAD_SAFETY", True)
777
916
 
778
917
  cg.add_platformio_option("board_build.partitions", "partitions.csv")
779
918
  if CONF_PARTITIONS in config:
@@ -813,6 +952,10 @@ async def to_code(config):
813
952
  ),
814
953
  )
815
954
 
955
+ add_idf_sdkconfig_option(
956
+ f"CONFIG_LOG_DEFAULT_LEVEL_{conf[CONF_LOG_LEVEL]}", True
957
+ )
958
+
816
959
  for name, value in conf[CONF_SDKCONFIG_OPTIONS].items():
817
960
  add_idf_sdkconfig_option(name, RawSdkconfigValue(value))
818
961
 
@@ -862,7 +1005,7 @@ def get_arduino_partition_csv(flash_size):
862
1005
  eeprom_partition_start = app1_partition_start + app_partition_size
863
1006
  spiffs_partition_start = eeprom_partition_start + eeprom_partition_size
864
1007
 
865
- partition_csv = f"""\
1008
+ return f"""\
866
1009
  nvs, data, nvs, 0x9000, 0x5000,
867
1010
  otadata, data, ota, 0xE000, 0x2000,
868
1011
  app0, app, ota_0, 0x{app0_partition_start:X}, 0x{app_partition_size:X},
@@ -870,20 +1013,18 @@ app1, app, ota_1, 0x{app1_partition_start:X}, 0x{app_partition_size:X},
870
1013
  eeprom, data, 0x99, 0x{eeprom_partition_start:X}, 0x{eeprom_partition_size:X},
871
1014
  spiffs, data, spiffs, 0x{spiffs_partition_start:X}, 0x{spiffs_partition_size:X}
872
1015
  """
873
- return partition_csv
874
1016
 
875
1017
 
876
1018
  def get_idf_partition_csv(flash_size):
877
1019
  app_partition_size = APP_PARTITION_SIZES[flash_size]
878
1020
 
879
- partition_csv = f"""\
1021
+ return f"""\
880
1022
  otadata, data, ota, , 0x2000,
881
1023
  phy_init, data, phy, , 0x1000,
882
1024
  app0, app, ota_0, , 0x{app_partition_size:X},
883
1025
  app1, app, ota_1, , 0x{app_partition_size:X},
884
1026
  nvs, data, nvs, , 0x6D000,
885
1027
  """
886
- return partition_csv
887
1028
 
888
1029
 
889
1030
  def _format_sdkconfig_val(value: SdkconfigValueType) -> str:
@@ -943,14 +1084,16 @@ def _write_idf_component_yml():
943
1084
 
944
1085
  # Called by writer.py
945
1086
  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
- )
1087
+ if (
1088
+ CORE.using_arduino
1089
+ and "partitions.csv" not in CORE.data[KEY_ESP32][KEY_EXTRA_BUILD_FILES]
1090
+ ):
1091
+ write_file_if_changed(
1092
+ CORE.relative_build_path("partitions.csv"),
1093
+ get_arduino_partition_csv(
1094
+ CORE.platformio_options.get("board_upload.flash_size")
1095
+ ),
1096
+ )
954
1097
  if CORE.using_esp_idf:
955
1098
  _write_sdkconfig()
956
1099
  _write_idf_component_yml()
@@ -970,7 +1113,7 @@ def copy_files():
970
1113
  __version__,
971
1114
  )
972
1115
 
973
- for _, file in CORE.data[KEY_ESP32][KEY_EXTRA_BUILD_FILES].items():
1116
+ for file in CORE.data[KEY_ESP32][KEY_EXTRA_BUILD_FILES].values():
974
1117
  if file[KEY_PATH].startswith("http"):
975
1118
  import requests
976
1119
 
@@ -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