esphome 2025.7.4__py3-none-any.whl → 2025.8.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (754) hide show
  1. esphome/__main__.py +189 -82
  2. esphome/automation.py +2 -4
  3. esphome/build_gen/__init__.py +0 -0
  4. esphome/build_gen/platformio.py +102 -0
  5. esphome/components/a4988/a4988.cpp +0 -1
  6. esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
  7. esphome/components/absolute_humidity/sensor.py +2 -2
  8. esphome/components/adc/__init__.py +123 -85
  9. esphome/components/adc/adc_sensor.h +98 -35
  10. esphome/components/adc/adc_sensor_common.cpp +10 -4
  11. esphome/components/adc/adc_sensor_esp32.cpp +291 -123
  12. esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
  13. esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
  14. esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
  15. esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
  16. esphome/components/adc/sensor.py +61 -27
  17. esphome/components/adc128s102/adc128s102.cpp +1 -4
  18. esphome/components/ade7880/sensor.py +75 -49
  19. esphome/components/ads1115/ads1115.cpp +0 -1
  20. esphome/components/ads1118/ads1118.cpp +0 -1
  21. esphome/components/ags10/ags10.cpp +0 -4
  22. esphome/components/aht10/aht10.cpp +0 -4
  23. esphome/components/aic3204/aic3204.cpp +0 -2
  24. esphome/components/airthings_wave_plus/__init__.py +1 -1
  25. esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
  26. esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
  27. esphome/components/airthings_wave_plus/sensor.py +55 -28
  28. esphome/components/alarm_control_panel/__init__.py +4 -9
  29. esphome/components/am2315c/am2315c.cpp +0 -2
  30. esphome/components/am2320/am2320.cpp +0 -1
  31. esphome/components/animation/__init__.py +14 -11
  32. esphome/components/apds9306/apds9306.cpp +0 -4
  33. esphome/components/apds9960/apds9960.cpp +0 -1
  34. esphome/components/api/__init__.py +29 -4
  35. esphome/components/api/api_connection.cpp +378 -401
  36. esphome/components/api/api_connection.h +112 -56
  37. esphome/components/api/api_frame_helper.cpp +69 -896
  38. esphome/components/api/api_frame_helper.h +31 -126
  39. esphome/components/api/api_frame_helper_noise.cpp +583 -0
  40. esphome/components/api/api_frame_helper_noise.h +68 -0
  41. esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
  42. esphome/components/api/api_frame_helper_plaintext.h +53 -0
  43. esphome/components/api/api_noise_context.h +2 -4
  44. esphome/components/api/api_pb2.cpp +1601 -1808
  45. esphome/components/api/api_pb2.h +367 -323
  46. esphome/components/api/api_pb2_dump.cpp +1137 -3466
  47. esphome/components/api/api_pb2_includes.h +34 -0
  48. esphome/components/api/api_pb2_service.cpp +94 -105
  49. esphome/components/api/api_pb2_service.h +27 -16
  50. esphome/components/api/api_server.cpp +18 -17
  51. esphome/components/api/api_server.h +8 -5
  52. esphome/components/api/client.py +16 -8
  53. esphome/components/api/custom_api_device.h +68 -14
  54. esphome/components/api/homeassistant_service.h +24 -19
  55. esphome/components/api/list_entities.cpp +3 -5
  56. esphome/components/api/list_entities.h +2 -4
  57. esphome/components/api/proto.cpp +3 -5
  58. esphome/components/api/proto.h +239 -274
  59. esphome/components/api/subscribe_state.cpp +2 -4
  60. esphome/components/api/subscribe_state.h +2 -4
  61. esphome/components/api/user_services.cpp +2 -4
  62. esphome/components/api/user_services.h +8 -8
  63. esphome/components/as3935/as3935.cpp +0 -2
  64. esphome/components/as3935_spi/as3935_spi.cpp +0 -2
  65. esphome/components/as5600/__init__.py +1 -1
  66. esphome/components/as5600/as5600.cpp +0 -2
  67. esphome/components/as5600/sensor/__init__.py +0 -1
  68. esphome/components/as7341/as7341.cpp +0 -1
  69. esphome/components/async_tcp/__init__.py +1 -1
  70. esphome/components/at581x/at581x.cpp +1 -1
  71. esphome/components/atm90e26/atm90e26.cpp +0 -1
  72. esphome/components/atm90e32/atm90e32.cpp +488 -118
  73. esphome/components/atm90e32/atm90e32.h +44 -5
  74. esphome/components/audio/audio.h +2 -2
  75. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
  76. esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
  77. esphome/components/bh1750/bh1750.cpp +0 -1
  78. esphome/components/binary_sensor/__init__.py +14 -12
  79. esphome/components/ble_client/__init__.py +4 -7
  80. esphome/components/bluetooth_proxy/__init__.py +40 -3
  81. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +387 -82
  82. esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
  83. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
  84. esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
  85. esphome/components/bme280_base/bme280_base.cpp +15 -16
  86. esphome/components/bme680/bme680.cpp +2 -3
  87. esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
  88. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
  89. esphome/components/bmi160/bmi160.cpp +0 -1
  90. esphome/components/bmp085/bmp085.cpp +0 -1
  91. esphome/components/bmp280_base/bmp280_base.cpp +13 -14
  92. esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
  93. esphome/components/bmp581/bmp581.cpp +0 -2
  94. esphome/components/bp1658cj/bp1658cj.cpp +0 -1
  95. esphome/components/bp5758d/bp5758d.cpp +0 -1
  96. esphome/components/button/__init__.py +0 -1
  97. esphome/components/canbus/__init__.py +2 -3
  98. esphome/components/canbus/canbus.cpp +0 -1
  99. esphome/components/cap1188/cap1188.cpp +0 -2
  100. esphome/components/captive_portal/__init__.py +1 -1
  101. esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
  102. esphome/components/ch422g/ch422g.cpp +0 -1
  103. esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
  104. esphome/components/climate/__init__.py +0 -1
  105. esphome/components/climate/climate_traits.h +24 -0
  106. esphome/components/cm1106/cm1106.cpp +0 -1
  107. esphome/components/const/__init__.py +6 -0
  108. esphome/components/cover/__init__.py +0 -1
  109. esphome/components/cover/cover.cpp +9 -13
  110. esphome/components/cs5460a/cs5460a.cpp +0 -2
  111. esphome/components/cse7761/cse7761.cpp +0 -1
  112. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
  113. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
  114. esphome/components/dac7678/dac7678_output.cpp +0 -2
  115. esphome/components/dallas_temp/dallas_temp.cpp +0 -1
  116. esphome/components/datetime/__init__.py +0 -2
  117. esphome/components/debug/__init__.py +15 -1
  118. esphome/components/debug/debug_zephyr.cpp +281 -0
  119. esphome/components/debug/sensor.py +2 -1
  120. esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
  121. esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
  122. esphome/components/dfrobot_sen0395/__init__.py +1 -2
  123. esphome/components/dht/dht.cpp +0 -1
  124. esphome/components/dht12/dht12.cpp +0 -1
  125. esphome/components/display/__init__.py +16 -3
  126. esphome/components/display_menu_base/__init__.py +1 -1
  127. esphome/components/dps310/dps310.cpp +0 -2
  128. esphome/components/ds1307/ds1307.cpp +0 -1
  129. esphome/components/ds2484/ds2484.cpp +0 -1
  130. esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
  131. esphome/components/ee895/ee895.cpp +0 -1
  132. esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
  133. esphome/components/emc2101/emc2101.cpp +0 -2
  134. esphome/components/ens160_base/ens160_base.cpp +0 -2
  135. esphome/components/ens210/ens210.cpp +0 -1
  136. esphome/components/es7210/es7210.cpp +0 -2
  137. esphome/components/es7243e/es7243e.cpp +0 -2
  138. esphome/components/es8156/es8156.cpp +0 -2
  139. esphome/components/es8311/es8311.cpp +0 -2
  140. esphome/components/es8388/es8388.cpp +0 -2
  141. esphome/components/esp32/__init__.py +199 -58
  142. esphome/components/esp32/boards.py +17 -0
  143. esphome/components/esp32/gpio.cpp +0 -1
  144. esphome/components/esp32/gpio.py +1 -2
  145. esphome/components/esp32/gpio_esp32_h2.py +2 -7
  146. esphome/components/esp32/gpio_esp32_p4.py +2 -7
  147. esphome/components/esp32/post_build.py.script +112 -61
  148. esphome/components/esp32_ble/__init__.py +40 -2
  149. esphome/components/esp32_ble/ble.cpp +12 -8
  150. esphome/components/esp32_ble/ble.h +18 -18
  151. esphome/components/esp32_ble/ble_advertising.cpp +5 -5
  152. esphome/components/esp32_ble/ble_advertising.h +7 -5
  153. esphome/components/esp32_ble/ble_event.h +2 -4
  154. esphome/components/esp32_ble/ble_scan_result.h +2 -4
  155. esphome/components/esp32_ble/ble_uuid.cpp +5 -5
  156. esphome/components/esp32_ble/ble_uuid.h +6 -5
  157. esphome/components/esp32_ble_beacon/__init__.py +4 -0
  158. esphome/components/esp32_ble_client/__init__.py +1 -1
  159. esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
  160. esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
  161. esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
  162. esphome/components/esp32_ble_client/ble_client_base.h +17 -6
  163. esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
  164. esphome/components/esp32_ble_client/ble_service.cpp +4 -4
  165. esphome/components/esp32_ble_client/ble_service.h +6 -4
  166. esphome/components/esp32_ble_server/__init__.py +15 -12
  167. esphome/components/esp32_ble_tracker/__init__.py +79 -11
  168. esphome/components/esp32_ble_tracker/automation.h +4 -4
  169. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
  170. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
  171. esphome/components/esp32_camera/__init__.py +13 -1
  172. esphome/components/esp32_camera/esp32_camera.cpp +7 -2
  173. esphome/components/esp32_camera/esp32_camera.h +1 -0
  174. esphome/components/esp32_dac/esp32_dac.cpp +3 -19
  175. esphome/components/esp32_dac/esp32_dac.h +4 -8
  176. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
  177. esphome/components/esp32_rmt_led_strip/light.py +1 -1
  178. esphome/components/esp32_touch/__init__.py +2 -3
  179. esphome/components/esp32_touch/esp32_touch.h +9 -6
  180. esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
  181. esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
  182. esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
  183. esphome/components/esp8266/__init__.py +3 -1
  184. esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
  185. esphome/components/esphome/ota/__init__.py +1 -2
  186. esphome/components/esphome/ota/ota_esphome.cpp +150 -77
  187. esphome/components/esphome/ota/ota_esphome.h +8 -1
  188. esphome/components/espnow/__init__.py +309 -0
  189. esphome/components/espnow/automation.h +175 -0
  190. esphome/components/espnow/espnow_component.cpp +468 -0
  191. esphome/components/espnow/espnow_component.h +183 -0
  192. esphome/components/espnow/espnow_err.h +19 -0
  193. esphome/components/espnow/espnow_packet.h +166 -0
  194. esphome/components/ethernet/__init__.py +7 -1
  195. esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
  196. esphome/components/ethernet/ethernet_component.cpp +0 -1
  197. esphome/components/ethernet/ethernet_component.h +4 -0
  198. esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
  199. esphome/components/event/__init__.py +0 -1
  200. esphome/components/factory_reset/__init__.py +92 -0
  201. esphome/components/factory_reset/factory_reset.cpp +76 -0
  202. esphome/components/factory_reset/factory_reset.h +43 -0
  203. esphome/components/fan/__init__.py +0 -1
  204. esphome/components/fan/fan_traits.h +16 -0
  205. esphome/components/fastled_base/fastled_light.cpp +0 -1
  206. esphome/components/fastled_spi/light.py +1 -3
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
  208. esphome/components/font/__init__.py +9 -1
  209. esphome/components/fs3000/fs3000.cpp +0 -2
  210. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  211. esphome/components/ft63x6/ft63x6.cpp +0 -1
  212. esphome/components/gdk101/gdk101.cpp +0 -1
  213. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  214. esphome/components/gl_r01_i2c/sensor.py +1 -1
  215. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  216. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  217. esphome/components/gpio_expander/cached_gpio.h +24 -15
  218. esphome/components/gps/__init__.py +6 -2
  219. esphome/components/gps/gps.cpp +50 -49
  220. esphome/components/gps/gps.h +4 -8
  221. esphome/components/gps/time/gps_time.cpp +3 -9
  222. esphome/components/gps/time/gps_time.h +4 -7
  223. esphome/components/graph/__init__.py +1 -1
  224. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  225. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  227. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  228. esphome/components/haier/climate.py +5 -10
  229. esphome/components/haier/haier_base.cpp +0 -1
  230. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  231. esphome/components/hdc1080/hdc1080.cpp +0 -2
  232. esphome/components/heatpumpir/climate.py +2 -2
  233. esphome/components/hlw8012/hlw8012.cpp +0 -1
  234. esphome/components/hm3301/hm3301.cpp +0 -1
  235. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  236. esphome/components/homeassistant/__init__.py +1 -0
  237. esphome/components/homeassistant/number/__init__.py +1 -0
  238. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  239. esphome/components/homeassistant/switch/__init__.py +1 -0
  240. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  241. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  242. esphome/components/host/__init__.py +2 -0
  243. esphome/components/hte501/hte501.cpp +0 -1
  244. esphome/components/http_request/__init__.py +2 -3
  245. esphome/components/http_request/http_request_idf.cpp +2 -2
  246. esphome/components/htu21d/htu21d.cpp +0 -2
  247. esphome/components/htu31d/htu31d.cpp +0 -2
  248. esphome/components/hx711/hx711.cpp +0 -1
  249. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  250. esphome/components/hydreon_rgxx/sensor.py +4 -5
  251. esphome/components/i2c/i2c_bus.h +1 -1
  252. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  253. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  254. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  255. esphome/components/i2s_audio/__init__.py +6 -5
  256. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  257. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  258. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +46 -19
  260. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -3
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  262. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  263. esphome/components/ili9xxx/display.py +4 -3
  264. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  265. esphome/components/image/__init__.py +123 -92
  266. esphome/components/improv_serial/__init__.py +7 -8
  267. esphome/components/ina219/ina219.cpp +0 -1
  268. esphome/components/ina226/ina226.cpp +0 -2
  269. esphome/components/ina260/ina260.cpp +0 -2
  270. esphome/components/ina2xx_base/__init__.py +2 -5
  271. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  272. esphome/components/ina3221/ina3221.cpp +0 -1
  273. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  274. esphome/components/interval/interval.h +5 -9
  275. esphome/components/json/__init__.py +1 -1
  276. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  277. esphome/components/lc709203f/lc709203f.cpp +0 -2
  278. esphome/components/lcd_gpio/display.py +1 -3
  279. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  280. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  281. esphome/components/ld2410/__init__.py +4 -6
  282. esphome/components/ld2410/binary_sensor.py +4 -0
  283. esphome/components/ld2410/ld2410.cpp +56 -100
  284. esphome/components/ld2410/ld2410.h +17 -15
  285. esphome/components/ld2410/sensor.py +24 -10
  286. esphome/components/ld2412/__init__.py +46 -0
  287. esphome/components/ld2412/binary_sensor.py +70 -0
  288. esphome/components/ld2412/button/__init__.py +74 -0
  289. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  290. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  291. esphome/components/ld2412/button/query_button.cpp +9 -0
  292. esphome/components/ld2412/button/query_button.h +18 -0
  293. esphome/components/ld2412/button/restart_button.cpp +9 -0
  294. esphome/components/ld2412/button/restart_button.h +18 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  296. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  297. esphome/components/ld2412/ld2412.cpp +861 -0
  298. esphome/components/ld2412/ld2412.h +141 -0
  299. esphome/components/ld2412/number/__init__.py +126 -0
  300. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  301. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  302. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  303. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  305. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  306. esphome/components/ld2412/select/__init__.py +82 -0
  307. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  308. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  309. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  310. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  311. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  312. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  313. esphome/components/ld2412/sensor.py +124 -0
  314. esphome/components/ld2412/switch/__init__.py +45 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  316. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  318. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  319. esphome/components/ld2412/text_sensor.py +34 -0
  320. esphome/components/ld2420/ld2420.cpp +0 -1
  321. esphome/components/ld2450/__init__.py +3 -4
  322. esphome/components/ld2450/binary_sensor.py +3 -0
  323. esphome/components/ld2450/ld2450.cpp +77 -165
  324. esphome/components/ld2450/ld2450.h +26 -54
  325. esphome/components/ld2450/sensor.py +120 -6
  326. esphome/components/ld2450/text_sensor.py +5 -4
  327. esphome/components/ld24xx/__init__.py +1 -0
  328. esphome/components/ld24xx/ld24xx.h +65 -0
  329. esphome/components/ledc/ledc_output.cpp +0 -1
  330. esphome/components/libretiny/__init__.py +2 -0
  331. esphome/components/light/__init__.py +0 -1
  332. esphome/components/light/effects.py +70 -45
  333. esphome/components/light/light_call.cpp +101 -66
  334. esphome/components/light/light_color_values.h +16 -11
  335. esphome/components/light/light_json_schema.cpp +46 -44
  336. esphome/components/light/light_state.cpp +8 -11
  337. esphome/components/light/light_traits.h +17 -0
  338. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  339. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  340. esphome/components/lock/__init__.py +0 -1
  341. esphome/components/logger/__init__.py +31 -9
  342. esphome/components/logger/logger.cpp +12 -7
  343. esphome/components/logger/logger.h +25 -14
  344. esphome/components/logger/logger_esp32.cpp +2 -7
  345. esphome/components/logger/logger_esp8266.cpp +2 -4
  346. esphome/components/logger/logger_host.cpp +2 -4
  347. esphome/components/logger/logger_libretiny.cpp +2 -4
  348. esphome/components/logger/logger_rp2040.cpp +2 -4
  349. esphome/components/logger/logger_zephyr.cpp +86 -0
  350. esphome/components/logger/select/logger_level_select.cpp +2 -4
  351. esphome/components/logger/select/logger_level_select.h +2 -4
  352. esphome/components/logger/task_log_buffer.cpp +2 -4
  353. esphome/components/logger/task_log_buffer.h +2 -4
  354. esphome/components/lps22/sensor.py +5 -5
  355. esphome/components/ltr390/ltr390.cpp +0 -2
  356. esphome/components/ltr501/ltr501.cpp +0 -1
  357. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  358. esphome/components/lvgl/__init__.py +14 -13
  359. esphome/components/lvgl/automation.py +2 -4
  360. esphome/components/lvgl/defines.py +0 -2
  361. esphome/components/lvgl/helpers.py +1 -1
  362. esphome/components/lvgl/lv_validation.py +7 -4
  363. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  364. esphome/components/lvgl/styles.py +2 -2
  365. esphome/components/lvgl/types.py +1 -1
  366. esphome/components/lvgl/widgets/__init__.py +2 -2
  367. esphome/components/lvgl/widgets/arc.py +14 -11
  368. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  369. esphome/components/lvgl/widgets/qrcode.py +7 -7
  370. esphome/components/lvgl/widgets/spinner.py +6 -6
  371. esphome/components/lvgl/widgets/switch.py +2 -2
  372. esphome/components/lvgl/widgets/tabview.py +3 -3
  373. esphome/components/lvgl/widgets/tileview.py +15 -7
  374. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  375. esphome/components/matrix_keypad/__init__.py +4 -3
  376. esphome/components/max17043/max17043.cpp +0 -2
  377. esphome/components/max31855/max31855.cpp +1 -4
  378. esphome/components/max31856/max31856.cpp +0 -4
  379. esphome/components/max31865/max31865.cpp +0 -1
  380. esphome/components/max44009/max44009.cpp +0 -1
  381. esphome/components/max6675/max6675.cpp +1 -4
  382. esphome/components/max6956/max6956.cpp +0 -1
  383. esphome/components/max7219/max7219.cpp +0 -1
  384. esphome/components/max7219digit/display.py +1 -1
  385. esphome/components/max7219digit/max7219digit.cpp +0 -1
  386. esphome/components/max9611/max9611.cpp +0 -1
  387. esphome/components/mcp23008/__init__.py +1 -1
  388. esphome/components/mcp23008/mcp23008.cpp +0 -1
  389. esphome/components/mcp23016/mcp23016.cpp +0 -1
  390. esphome/components/mcp23017/__init__.py +1 -1
  391. esphome/components/mcp23017/mcp23017.cpp +0 -1
  392. esphome/components/mcp23s08/__init__.py +1 -1
  393. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  394. esphome/components/mcp23s17/__init__.py +1 -1
  395. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  396. esphome/components/mcp23x08_base/__init__.py +2 -0
  397. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  398. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  399. esphome/components/mcp23x17_base/__init__.py +2 -0
  400. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  401. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  402. esphome/components/mcp23xxx_base/__init__.py +11 -5
  403. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  404. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  405. esphome/components/mcp3008/mcp3008.cpp +1 -4
  406. esphome/components/mcp3204/mcp3204.cpp +1 -4
  407. esphome/components/mcp4461/mcp4461.cpp +0 -1
  408. esphome/components/mcp4725/mcp4725.cpp +0 -1
  409. esphome/components/mcp4728/mcp4728.cpp +0 -1
  410. esphome/components/mcp9600/mcp9600.cpp +0 -2
  411. esphome/components/mcp9808/mcp9808.cpp +0 -2
  412. esphome/components/mdns/__init__.py +3 -0
  413. esphome/components/mdns/mdns_component.cpp +2 -0
  414. esphome/components/mdns/mdns_component.h +4 -0
  415. esphome/components/media_player/__init__.py +40 -0
  416. esphome/components/media_player/automation.h +16 -0
  417. esphome/components/media_player/media_player.cpp +13 -0
  418. esphome/components/media_player/media_player.h +50 -3
  419. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  420. esphome/components/mics_4514/mics_4514.cpp +1 -6
  421. esphome/components/midea/ir_transmitter.h +4 -4
  422. esphome/components/mipi/__init__.py +416 -0
  423. esphome/components/mipi_dsi/__init__.py +5 -0
  424. esphome/components/mipi_dsi/display.py +233 -0
  425. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  426. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  427. esphome/components/mipi_dsi/models/__init__.py +0 -0
  428. esphome/components/mipi_dsi/models/guition.py +38 -0
  429. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  430. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  431. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  432. esphome/components/mipi_spi/__init__.py +0 -9
  433. esphome/components/mipi_spi/display.py +220 -256
  434. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  435. esphome/components/mipi_spi/mipi_spi.h +556 -108
  436. esphome/components/mipi_spi/models/__init__.py +0 -65
  437. esphome/components/mipi_spi/models/adafruit.py +30 -0
  438. esphome/components/mipi_spi/models/amoled.py +41 -5
  439. esphome/components/mipi_spi/models/ili.py +5 -5
  440. esphome/components/mipi_spi/models/jc.py +1 -3
  441. esphome/components/mipi_spi/models/lilygo.py +1 -1
  442. esphome/components/mipi_spi/models/waveshare.py +16 -1
  443. esphome/components/mixer/speaker/__init__.py +4 -5
  444. esphome/components/mlx90393/sensor.py +7 -5
  445. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  446. esphome/components/mlx90614/mlx90614.cpp +0 -1
  447. esphome/components/mmc5603/mmc5603.cpp +0 -1
  448. esphome/components/mmc5983/mmc5983.cpp +0 -2
  449. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  450. esphome/components/mpr121/__init__.py +7 -6
  451. esphome/components/mpr121/mpr121.cpp +0 -1
  452. esphome/components/mpu6050/mpu6050.cpp +0 -1
  453. esphome/components/mpu6886/mpu6886.cpp +0 -1
  454. esphome/components/mqtt/__init__.py +1 -2
  455. esphome/components/mqtt/mqtt_button.cpp +1 -1
  456. esphome/components/mqtt/mqtt_client.cpp +0 -1
  457. esphome/components/mqtt/mqtt_component.cpp +8 -14
  458. esphome/components/mqtt/mqtt_component.h +0 -7
  459. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_sensor.h +0 -1
  461. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  462. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  463. esphome/components/ms5611/ms5611.cpp +0 -1
  464. esphome/components/ms8607/ms8607.cpp +0 -1
  465. esphome/components/msa3xx/msa3xx.cpp +0 -2
  466. esphome/components/my9231/my9231.cpp +0 -2
  467. esphome/components/nau7802/nau7802.cpp +0 -1
  468. esphome/components/neopixelbus/light.py +3 -0
  469. esphome/components/network/util.cpp +29 -0
  470. esphome/components/nextion/nextion.cpp +0 -1
  471. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  472. esphome/components/npi19/npi19.cpp +0 -2
  473. esphome/components/nrf52/__init__.py +223 -0
  474. esphome/components/nrf52/boards.py +34 -0
  475. esphome/components/nrf52/const.py +18 -0
  476. esphome/components/nrf52/gpio.py +79 -0
  477. esphome/components/number/__init__.py +2 -1
  478. esphome/components/one_wire/__init__.py +1 -2
  479. esphome/components/one_wire/one_wire.cpp +0 -2
  480. esphome/components/one_wire/one_wire.h +0 -2
  481. esphome/components/opentherm/hub.cpp +0 -1
  482. esphome/components/opentherm/number/__init__.py +2 -2
  483. esphome/components/openthread/__init__.py +2 -3
  484. esphome/components/openthread/openthread.cpp +30 -13
  485. esphome/components/openthread/openthread.h +3 -0
  486. esphome/components/openthread/openthread_esp.cpp +3 -1
  487. esphome/components/opt3001/sensor.py +2 -6
  488. esphome/components/output/__init__.py +38 -0
  489. esphome/components/output/automation.h +24 -0
  490. esphome/components/output/switch/output_switch.cpp +0 -2
  491. esphome/components/packages/__init__.py +1 -2
  492. esphome/components/packet_transport/__init__.py +4 -3
  493. esphome/components/pca6416a/pca6416a.cpp +0 -1
  494. esphome/components/pca9554/pca9554.cpp +0 -1
  495. esphome/components/pca9685/pca9685_output.cpp +0 -2
  496. esphome/components/pcf85063/pcf85063.cpp +0 -1
  497. esphome/components/pcf8563/pcf8563.cpp +0 -1
  498. esphome/components/pcf8574/pcf8574.cpp +0 -1
  499. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  500. esphome/components/pipsolar/sensor/__init__.py +1 -1
  501. esphome/components/pm2005/pm2005.cpp +0 -1
  502. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  503. esphome/components/pmwcs3/sensor.py +1 -2
  504. esphome/components/pn532/pn532.cpp +0 -2
  505. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  506. esphome/components/power_supply/power_supply.cpp +7 -10
  507. esphome/components/power_supply/power_supply.h +1 -1
  508. esphome/components/psram/__init__.py +2 -1
  509. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  510. esphome/components/pulse_counter/sensor.py +9 -6
  511. esphome/components/pylontech/pylontech.cpp +0 -1
  512. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  513. esphome/components/qmp6988/qmp6988.cpp +0 -2
  514. esphome/components/qspi_dbi/display.py +2 -3
  515. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  516. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  517. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  518. esphome/components/rc522/rc522.cpp +9 -31
  519. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  520. esphome/components/remote_base/__init__.py +5 -6
  521. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  522. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  523. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  524. esphome/components/remote_transmitter/__init__.py +26 -0
  525. esphome/components/remote_transmitter/automation.h +18 -0
  526. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  527. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  528. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  529. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  530. esphome/components/resampler/speaker/__init__.py +4 -5
  531. esphome/components/rf_bridge/__init__.py +4 -8
  532. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  533. esphome/components/rp2040/__init__.py +3 -1
  534. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  535. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  536. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  537. esphome/components/rpi_dpi_rgb/display.py +13 -15
  538. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  539. esphome/components/runtime_stats/__init__.py +34 -0
  540. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  541. esphome/components/runtime_stats/runtime_stats.h +132 -0
  542. esphome/components/scd30/scd30.cpp +0 -2
  543. esphome/components/scd30/sensor.py +1 -2
  544. esphome/components/scd4x/scd4x.cpp +0 -1
  545. esphome/components/scd4x/sensor.py +1 -3
  546. esphome/components/sdl/display.py +3 -1
  547. esphome/components/sdl/sdl_esphome.cpp +0 -2
  548. esphome/components/sdp3x/sdp3x.cpp +0 -2
  549. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  550. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  551. esphome/components/select/__init__.py +2 -3
  552. esphome/components/select/select_traits.cpp +1 -1
  553. esphome/components/select/select_traits.h +1 -1
  554. esphome/components/sen0321/sen0321.cpp +0 -1
  555. esphome/components/sen5x/sen5x.cpp +0 -2
  556. esphome/components/sensor/__init__.py +36 -4
  557. esphome/components/sensor/filter.cpp +49 -10
  558. esphome/components/sensor/filter.h +22 -7
  559. esphome/components/sensor/sensor.cpp +0 -1
  560. esphome/components/sensor/sensor.h +0 -9
  561. esphome/components/sfa30/sfa30.cpp +0 -4
  562. esphome/components/sgp30/sgp30.cpp +0 -2
  563. esphome/components/sgp4x/sensor.py +1 -1
  564. esphome/components/sgp4x/sgp4x.cpp +0 -2
  565. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  566. esphome/components/sht3xd/sht3xd.cpp +0 -2
  567. esphome/components/sht4x/sht4x.cpp +0 -2
  568. esphome/components/shtcx/shtcx.cpp +0 -1
  569. esphome/components/sim800l/__init__.py +2 -4
  570. esphome/components/sm16716/sm16716.cpp +0 -1
  571. esphome/components/sm2135/sm2135.cpp +0 -1
  572. esphome/components/sm2235/sm2235.cpp +0 -1
  573. esphome/components/sm2335/sm2335.cpp +0 -1
  574. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  575. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  576. esphome/components/sntp/sntp_component.cpp +0 -1
  577. esphome/components/sound_level/sensor.py +1 -1
  578. esphome/components/speaker/media_player/__init__.py +21 -33
  579. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  580. esphome/components/spi/__init__.py +29 -13
  581. esphome/components/spi/spi.cpp +0 -2
  582. esphome/components/spi_device/spi_device.cpp +1 -4
  583. esphome/components/sprinkler/__init__.py +4 -4
  584. esphome/components/sps30/sps30.cpp +0 -1
  585. esphome/components/ssd1306_base/__init__.py +11 -11
  586. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  587. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  588. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  589. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  590. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  591. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  592. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  593. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  594. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  595. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  596. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  597. esphome/components/st7701s/display.py +10 -14
  598. esphome/components/st7701s/st7701s.cpp +0 -3
  599. esphome/components/st7735/st7735.cpp +0 -1
  600. esphome/components/st7789v/st7789v.cpp +0 -1
  601. esphome/components/st7920/st7920.cpp +0 -1
  602. esphome/components/status_led/light/status_led_light.cpp +0 -2
  603. esphome/components/status_led/status_led.cpp +0 -1
  604. esphome/components/stepper/__init__.py +2 -4
  605. esphome/components/sts3x/sts3x.cpp +0 -1
  606. esphome/components/substitutions/__init__.py +10 -16
  607. esphome/components/substitutions/jinja.py +24 -1
  608. esphome/components/sun/__init__.py +2 -3
  609. esphome/components/switch/__init__.py +31 -1
  610. esphome/components/switch/automation.h +24 -0
  611. esphome/components/switch/switch.cpp +8 -0
  612. esphome/components/switch/switch.h +8 -0
  613. esphome/components/sx126x/sx126x.cpp +0 -2
  614. esphome/components/sx127x/sx127x.cpp +0 -2
  615. esphome/components/sx1509/__init__.py +7 -5
  616. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  617. esphome/components/sx1509/sx1509.cpp +0 -2
  618. esphome/components/syslog/esphome_syslog.cpp +1 -1
  619. esphome/components/tc74/tc74.cpp +0 -1
  620. esphome/components/tca9548a/tca9548a.cpp +0 -1
  621. esphome/components/tca9555/tca9555.cpp +0 -1
  622. esphome/components/tcs34725/tcs34725.cpp +0 -1
  623. esphome/components/tee501/tee501.cpp +0 -1
  624. esphome/components/tem3200/tem3200.cpp +0 -2
  625. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  626. esphome/components/template/cover/template_cover.cpp +0 -1
  627. esphome/components/template/select/template_select.cpp +0 -1
  628. esphome/components/template/text/template_text.cpp +0 -2
  629. esphome/components/template/valve/template_valve.cpp +0 -1
  630. esphome/components/text/__init__.py +0 -1
  631. esphome/components/text/text_traits.h +2 -0
  632. esphome/components/text_sensor/__init__.py +2 -1
  633. esphome/components/text_sensor/text_sensor.cpp +0 -2
  634. esphome/components/text_sensor/text_sensor.h +0 -8
  635. esphome/components/thermostat/climate.py +4 -4
  636. esphome/components/time/__init__.py +7 -4
  637. esphome/components/time/real_time_clock.cpp +16 -3
  638. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  639. esphome/components/tlc5947/tlc5947.cpp +0 -2
  640. esphome/components/tlc5971/tlc5971.cpp +0 -2
  641. esphome/components/tm1621/tm1621.cpp +0 -2
  642. esphome/components/tm1637/tm1637.cpp +0 -2
  643. esphome/components/tm1638/tm1638.cpp +0 -2
  644. esphome/components/tm1651/__init__.py +45 -48
  645. esphome/components/tm1651/tm1651.cpp +213 -47
  646. esphome/components/tm1651/tm1651.h +37 -32
  647. esphome/components/tmp117/tmp117.cpp +0 -2
  648. esphome/components/tsl2561/tsl2561.cpp +0 -1
  649. esphome/components/tsl2591/tsl2591.cpp +0 -1
  650. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  651. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  652. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  653. esphome/components/tuya/climate/__init__.py +9 -10
  654. esphome/components/tuya/number/__init__.py +8 -6
  655. esphome/components/tx20/tx20.cpp +0 -1
  656. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  657. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  658. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  659. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  660. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  661. esphome/components/udp/__init__.py +1 -1
  662. esphome/components/ufire_ec/sensor.py +1 -2
  663. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  664. esphome/components/ufire_ise/sensor.py +1 -2
  665. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  666. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  667. esphome/components/update/__init__.py +0 -1
  668. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  669. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  670. esphome/components/usb_host/usb_host_client.cpp +0 -1
  671. esphome/components/usb_host/usb_host_component.cpp +0 -1
  672. esphome/components/valve/__init__.py +0 -1
  673. esphome/components/veml3235/veml3235.cpp +0 -3
  674. esphome/components/veml7700/veml7700.cpp +0 -2
  675. esphome/components/version/version_text_sensor.cpp +0 -1
  676. esphome/components/version/version_text_sensor.h +0 -1
  677. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  678. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  679. esphome/components/web_server/__init__.py +13 -0
  680. esphome/components/web_server/web_server.cpp +187 -352
  681. esphome/components/web_server/web_server.h +61 -1
  682. esphome/components/web_server_base/__init__.py +1 -1
  683. esphome/components/web_server_base/web_server_base.cpp +2 -0
  684. esphome/components/web_server_base/web_server_base.h +6 -0
  685. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  686. esphome/components/web_server_idf/web_server_idf.h +2 -0
  687. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  688. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  689. esphome/components/wifi/__init__.py +8 -43
  690. esphome/components/wifi/wifi_component.cpp +100 -36
  691. esphome/components/wifi/wifi_component.h +5 -1
  692. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  693. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  694. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  695. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  696. esphome/components/wireguard/wireguard.cpp +0 -2
  697. esphome/components/x9c/x9c.cpp +0 -2
  698. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  699. esphome/components/xl9535/xl9535.cpp +0 -2
  700. esphome/components/zephyr/__init__.py +252 -0
  701. esphome/components/zephyr/const.py +16 -0
  702. esphome/components/zephyr/core.cpp +90 -0
  703. esphome/components/zephyr/gpio.cpp +120 -0
  704. esphome/components/zephyr/gpio.h +38 -0
  705. esphome/components/zephyr/pre_build.py.script +4 -0
  706. esphome/components/zephyr/preferences.cpp +156 -0
  707. esphome/components/zephyr/preferences.h +13 -0
  708. esphome/config.py +38 -16
  709. esphome/config_helpers.py +1 -2
  710. esphome/config_validation.py +8 -15
  711. esphome/const.py +26 -1
  712. esphome/core/__init__.py +88 -51
  713. esphome/core/application.cpp +75 -21
  714. esphome/core/application.h +106 -171
  715. esphome/core/color.h +10 -0
  716. esphome/core/component.cpp +41 -25
  717. esphome/core/component.h +9 -6
  718. esphome/core/component_iterator.cpp +61 -261
  719. esphome/core/component_iterator.h +15 -0
  720. esphome/core/config.py +26 -11
  721. esphome/core/defines.h +40 -2
  722. esphome/core/entity_base.h +18 -0
  723. esphome/core/entity_helpers.py +41 -6
  724. esphome/core/helpers.cpp +8 -15
  725. esphome/core/helpers.h +60 -6
  726. esphome/core/lock_free_queue.h +1 -1
  727. esphome/core/scheduler.cpp +277 -74
  728. esphome/core/scheduler.h +89 -27
  729. esphome/cpp_generator.py +2 -6
  730. esphome/cpp_helpers.py +1 -1
  731. esphome/dashboard/dashboard.py +2 -3
  732. esphome/dashboard/dns.py +2 -8
  733. esphome/dashboard/web_server.py +34 -19
  734. esphome/espota2.py +1 -4
  735. esphome/git.py +3 -1
  736. esphome/helpers.py +23 -4
  737. esphome/log.py +3 -1
  738. esphome/mqtt.py +3 -5
  739. esphome/platformio_api.py +7 -4
  740. esphome/types.py +12 -0
  741. esphome/util.py +20 -8
  742. esphome/voluptuous_schema.py +4 -3
  743. esphome/vscode.py +1 -2
  744. esphome/wizard.py +1 -4
  745. esphome/writer.py +5 -107
  746. esphome/yaml_util.py +7 -5
  747. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/METADATA +12 -13
  748. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/RECORD +753 -673
  749. esphome/components/mipi_spi/models/commands.py +0 -82
  750. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  751. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/WHEEL +0 -0
  752. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/entry_points.txt +0 -0
  753. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/licenses/LICENSE +0 -0
  754. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/top_level.txt +0 -0
esphome/__main__.py CHANGED
@@ -2,12 +2,14 @@
2
2
  import argparse
3
3
  from datetime import datetime
4
4
  import functools
5
+ import getpass
5
6
  import importlib
6
7
  import logging
7
8
  import os
8
9
  import re
9
10
  import sys
10
11
  import time
12
+ from typing import Protocol
11
13
 
12
14
  import argcomplete
13
15
 
@@ -34,6 +36,7 @@ from esphome.const import (
34
36
  CONF_PORT,
35
37
  CONF_SUBSTITUTIONS,
36
38
  CONF_TOPIC,
39
+ ENV_NOGITIGNORE,
37
40
  PLATFORM_ESP32,
38
41
  PLATFORM_ESP8266,
39
42
  PLATFORM_RP2040,
@@ -42,6 +45,7 @@ from esphome.const import (
42
45
  from esphome.core import CORE, EsphomeError, coroutine
43
46
  from esphome.helpers import get_bool_env, indent, is_ip_address
44
47
  from esphome.log import AnsiFore, color, setup_log
48
+ from esphome.types import ConfigType
45
49
  from esphome.util import (
46
50
  get_serial_ports,
47
51
  list_yaml_files,
@@ -53,6 +57,23 @@ from esphome.util import (
53
57
  _LOGGER = logging.getLogger(__name__)
54
58
 
55
59
 
60
+ class ArgsProtocol(Protocol):
61
+ device: list[str] | None
62
+ reset: bool
63
+ username: str | None
64
+ password: str | None
65
+ client_id: str | None
66
+ topic: str | None
67
+ file: str | None
68
+ no_logs: bool
69
+ only_generate: bool
70
+ show_secrets: bool
71
+ dashboard: bool
72
+ configuration: str
73
+ name: str
74
+ upload_speed: str | None
75
+
76
+
56
77
  def choose_prompt(options, purpose: str = None):
57
78
  if not options:
58
79
  raise EsphomeError(
@@ -86,30 +107,54 @@ def choose_prompt(options, purpose: str = None):
86
107
 
87
108
 
88
109
  def choose_upload_log_host(
89
- default, check_default, show_ota, show_mqtt, show_api, purpose: str = None
90
- ):
91
- options = []
92
- for port in get_serial_ports():
93
- options.append((f"{port.path} ({port.description})", port.path))
94
- if default == "SERIAL":
95
- return choose_prompt(options, purpose=purpose)
110
+ default: list[str] | str | None,
111
+ check_default: str | None,
112
+ show_ota: bool,
113
+ show_mqtt: bool,
114
+ show_api: bool,
115
+ purpose: str | None = None,
116
+ ) -> list[str]:
117
+ # Convert to list for uniform handling
118
+ defaults = [default] if isinstance(default, str) else default or []
119
+
120
+ # If devices specified, resolve them
121
+ if defaults:
122
+ resolved: list[str] = []
123
+ for device in defaults:
124
+ if device == "SERIAL":
125
+ serial_ports = get_serial_ports()
126
+ if not serial_ports:
127
+ _LOGGER.warning("No serial ports found, skipping SERIAL device")
128
+ continue
129
+ options = [
130
+ (f"{port.path} ({port.description})", port.path)
131
+ for port in serial_ports
132
+ ]
133
+ resolved.append(choose_prompt(options, purpose=purpose))
134
+ elif device == "OTA":
135
+ if (show_ota and "ota" in CORE.config) or (
136
+ show_api and "api" in CORE.config
137
+ ):
138
+ resolved.append(CORE.address)
139
+ elif show_mqtt and has_mqtt_logging():
140
+ resolved.append("MQTT")
141
+ else:
142
+ resolved.append(device)
143
+ return resolved
144
+
145
+ # No devices specified, show interactive chooser
146
+ options = [
147
+ (f"{port.path} ({port.description})", port.path) for port in get_serial_ports()
148
+ ]
96
149
  if (show_ota and "ota" in CORE.config) or (show_api and "api" in CORE.config):
97
150
  options.append((f"Over The Air ({CORE.address})", CORE.address))
98
- if default == "OTA":
99
- return CORE.address
100
- if (
101
- show_mqtt
102
- and (mqtt_config := CORE.config.get(CONF_MQTT))
103
- and mqtt_logging_enabled(mqtt_config)
104
- ):
151
+ if show_mqtt and has_mqtt_logging():
152
+ mqtt_config = CORE.config[CONF_MQTT]
105
153
  options.append((f"MQTT ({mqtt_config[CONF_BROKER]})", "MQTT"))
106
- if default == "OTA":
107
- return "MQTT"
108
- if default is not None:
109
- return default
154
+
110
155
  if check_default is not None and check_default in [opt[1] for opt in options]:
111
- return check_default
112
- return choose_prompt(options, purpose=purpose)
156
+ return [check_default]
157
+ return [choose_prompt(options, purpose=purpose)]
113
158
 
114
159
 
115
160
  def mqtt_logging_enabled(mqtt_config):
@@ -118,12 +163,17 @@ def mqtt_logging_enabled(mqtt_config):
118
163
  return False
119
164
  if CONF_TOPIC not in log_topic:
120
165
  return False
121
- if log_topic.get(CONF_LEVEL, None) == "NONE":
122
- return False
123
- return True
166
+ return log_topic.get(CONF_LEVEL, None) != "NONE"
167
+
168
+
169
+ def has_mqtt_logging() -> bool:
170
+ """Check if MQTT logging is available."""
171
+ return (mqtt_config := CORE.config.get(CONF_MQTT)) and mqtt_logging_enabled(
172
+ mqtt_config
173
+ )
124
174
 
125
175
 
126
- def get_port_type(port):
176
+ def get_port_type(port: str) -> str:
127
177
  if port.startswith("/") or port.startswith("COM"):
128
178
  return "SERIAL"
129
179
  if port == "MQTT":
@@ -131,7 +181,7 @@ def get_port_type(port):
131
181
  return "NETWORK"
132
182
 
133
183
 
134
- def run_miniterm(config, port, args):
184
+ def run_miniterm(config: ConfigType, port: str, args) -> int:
135
185
  from aioesphomeapi import LogParser
136
186
  import serial
137
187
 
@@ -208,12 +258,15 @@ def wrap_to_code(name, comp):
208
258
  return wrapped
209
259
 
210
260
 
211
- def write_cpp(config):
261
+ def write_cpp(config: ConfigType) -> int:
262
+ if not get_bool_env(ENV_NOGITIGNORE):
263
+ writer.write_gitignore()
264
+
212
265
  generate_cpp_contents(config)
213
266
  return write_cpp_file()
214
267
 
215
268
 
216
- def generate_cpp_contents(config):
269
+ def generate_cpp_contents(config: ConfigType) -> None:
217
270
  _LOGGER.info("Generating C++ source...")
218
271
 
219
272
  for name, component, conf in iter_component_configs(CORE.config):
@@ -224,15 +277,18 @@ def generate_cpp_contents(config):
224
277
  CORE.flush_tasks()
225
278
 
226
279
 
227
- def write_cpp_file():
228
- writer.write_platformio_project()
229
-
280
+ def write_cpp_file() -> int:
230
281
  code_s = indent(CORE.cpp_main_section)
231
282
  writer.write_cpp(code_s)
283
+
284
+ from esphome.build_gen import platformio
285
+
286
+ platformio.write_project()
287
+
232
288
  return 0
233
289
 
234
290
 
235
- def compile_program(args, config):
291
+ def compile_program(args: ArgsProtocol, config: ConfigType) -> int:
236
292
  from esphome import platformio_api
237
293
 
238
294
  _LOGGER.info("Compiling app...")
@@ -243,7 +299,9 @@ def compile_program(args, config):
243
299
  return 0 if idedata is not None else 1
244
300
 
245
301
 
246
- def upload_using_esptool(config, port, file, speed):
302
+ def upload_using_esptool(
303
+ config: ConfigType, port: str, file: str, speed: int
304
+ ) -> str | int:
247
305
  from esphome import platformio_api
248
306
 
249
307
  first_baudrate = speed or config[CONF_ESPHOME][CONF_PLATFORMIO_OPTIONS].get(
@@ -271,20 +329,20 @@ def upload_using_esptool(config, port, file, speed):
271
329
 
272
330
  def run_esptool(baud_rate):
273
331
  cmd = [
274
- "esptool.py",
332
+ "esptool",
275
333
  "--before",
276
- "default_reset",
334
+ "default-reset",
277
335
  "--after",
278
- "hard_reset",
336
+ "hard-reset",
279
337
  "--baud",
280
338
  str(baud_rate),
281
339
  "--port",
282
340
  port,
283
341
  "--chip",
284
342
  mcu,
285
- "write_flash",
343
+ "write-flash",
286
344
  "-z",
287
- "--flash_size",
345
+ "--flash-size",
288
346
  "detect",
289
347
  ]
290
348
  for img in flash_images:
@@ -308,7 +366,7 @@ def upload_using_esptool(config, port, file, speed):
308
366
  return run_esptool(115200)
309
367
 
310
368
 
311
- def upload_using_platformio(config, port):
369
+ def upload_using_platformio(config: ConfigType, port: str):
312
370
  from esphome import platformio_api
313
371
 
314
372
  upload_args = ["-t", "upload", "-t", "nobuild"]
@@ -317,7 +375,7 @@ def upload_using_platformio(config, port):
317
375
  return platformio_api.run_platformio_cli_run(config, CORE.verbose, *upload_args)
318
376
 
319
377
 
320
- def check_permissions(port):
378
+ def check_permissions(port: str):
321
379
  if os.name == "posix" and get_port_type(port) == "SERIAL":
322
380
  # Check if we can open selected serial port
323
381
  if not os.access(port, os.F_OK):
@@ -330,12 +388,12 @@ def check_permissions(port):
330
388
  raise EsphomeError(
331
389
  "You do not have read or write permission on the selected serial port. "
332
390
  "To resolve this issue, you can add your user to the dialout group "
333
- f"by running the following command: sudo usermod -a -G dialout {os.getlogin()}. "
391
+ f"by running the following command: sudo usermod -a -G dialout {getpass.getuser()}. "
334
392
  "You will need to log out & back in or reboot to activate the new group access."
335
393
  )
336
394
 
337
395
 
338
- def upload_program(config, args, host):
396
+ def upload_program(config: ConfigType, args: ArgsProtocol, host: str) -> int | str:
339
397
  try:
340
398
  module = importlib.import_module("esphome.components." + CORE.target_platform)
341
399
  if getattr(module, "upload_program")(config, args, host):
@@ -350,7 +408,7 @@ def upload_program(config, args, host):
350
408
  return upload_using_esptool(config, host, file, args.upload_speed)
351
409
 
352
410
  if CORE.target_platform in (PLATFORM_RP2040):
353
- return upload_using_platformio(config, args.device)
411
+ return upload_using_platformio(config, host)
354
412
 
355
413
  if CORE.is_libretiny:
356
414
  return upload_using_platformio(config, host)
@@ -373,9 +431,12 @@ def upload_program(config, args, host):
373
431
  remote_port = int(ota_conf[CONF_PORT])
374
432
  password = ota_conf.get(CONF_PASSWORD, "")
375
433
 
434
+ # Check if we should use MQTT for address resolution
435
+ # This happens when no device was specified, or the current host is "MQTT"/"OTA"
436
+ devices: list[str] = args.device or []
376
437
  if (
377
438
  CONF_MQTT in config # pylint: disable=too-many-boolean-expressions
378
- and (not args.device or args.device in ("MQTT", "OTA"))
439
+ and (not devices or host in ("MQTT", "OTA"))
379
440
  and (
380
441
  ((config[CONF_MDNS][CONF_DISABLED]) and not is_ip_address(CORE.address))
381
442
  or get_port_type(host) == "MQTT"
@@ -393,23 +454,28 @@ def upload_program(config, args, host):
393
454
  return espota2.run_ota(host, remote_port, password, CORE.firmware_bin)
394
455
 
395
456
 
396
- def show_logs(config, args, port):
457
+ def show_logs(config: ConfigType, args: ArgsProtocol, devices: list[str]) -> int | None:
397
458
  if "logger" not in config:
398
459
  raise EsphomeError("Logger is not configured!")
460
+
461
+ port = devices[0]
462
+
399
463
  if get_port_type(port) == "SERIAL":
400
464
  check_permissions(port)
401
465
  return run_miniterm(config, port, args)
402
466
  if get_port_type(port) == "NETWORK" and "api" in config:
467
+ addresses_to_use = devices
403
468
  if config[CONF_MDNS][CONF_DISABLED] and CONF_MQTT in config:
404
469
  from esphome import mqtt
405
470
 
406
- port = mqtt.get_esphome_device_ip(
471
+ mqtt_address = mqtt.get_esphome_device_ip(
407
472
  config, args.username, args.password, args.client_id
408
473
  )[0]
474
+ addresses_to_use = [mqtt_address]
409
475
 
410
476
  from esphome.components.api.client import run_logs
411
477
 
412
- return run_logs(config, port)
478
+ return run_logs(config, addresses_to_use)
413
479
  if get_port_type(port) == "MQTT" and "mqtt" in config:
414
480
  from esphome import mqtt
415
481
 
@@ -420,7 +486,7 @@ def show_logs(config, args, port):
420
486
  raise EsphomeError("No remote or local logging method configured (api/mqtt/logger)")
421
487
 
422
488
 
423
- def clean_mqtt(config, args):
489
+ def clean_mqtt(config: ConfigType, args: ArgsProtocol) -> int | None:
424
490
  from esphome import mqtt
425
491
 
426
492
  return mqtt.clear_topic(
@@ -428,13 +494,13 @@ def clean_mqtt(config, args):
428
494
  )
429
495
 
430
496
 
431
- def command_wizard(args):
497
+ def command_wizard(args: ArgsProtocol) -> int | None:
432
498
  from esphome import wizard
433
499
 
434
500
  return wizard.wizard(args.configuration)
435
501
 
436
502
 
437
- def command_config(args, config):
503
+ def command_config(args: ArgsProtocol, config: ConfigType) -> int | None:
438
504
  if not CORE.verbose:
439
505
  config = strip_default_ids(config)
440
506
  output = yaml_util.dump(config, args.show_secrets)
@@ -449,7 +515,7 @@ def command_config(args, config):
449
515
  return 0
450
516
 
451
517
 
452
- def command_vscode(args):
518
+ def command_vscode(args: ArgsProtocol) -> int | None:
453
519
  from esphome import vscode
454
520
 
455
521
  logging.disable(logging.INFO)
@@ -457,7 +523,7 @@ def command_vscode(args):
457
523
  vscode.read_config(args)
458
524
 
459
525
 
460
- def command_compile(args, config):
526
+ def command_compile(args: ArgsProtocol, config: ConfigType) -> int | None:
461
527
  exit_code = write_cpp(config)
462
528
  if exit_code != 0:
463
529
  return exit_code
@@ -471,8 +537,9 @@ def command_compile(args, config):
471
537
  return 0
472
538
 
473
539
 
474
- def command_upload(args, config):
475
- port = choose_upload_log_host(
540
+ def command_upload(args: ArgsProtocol, config: ConfigType) -> int | None:
541
+ # Get devices, resolving special identifiers like OTA
542
+ devices = choose_upload_log_host(
476
543
  default=args.device,
477
544
  check_default=None,
478
545
  show_ota=True,
@@ -480,14 +547,22 @@ def command_upload(args, config):
480
547
  show_api=False,
481
548
  purpose="uploading",
482
549
  )
483
- exit_code = upload_program(config, args, port)
484
- if exit_code != 0:
485
- return exit_code
486
- _LOGGER.info("Successfully uploaded program.")
487
- return 0
550
+
551
+ # Try each device until one succeeds
552
+ exit_code = 1
553
+ for device in devices:
554
+ _LOGGER.info("Uploading to %s", device)
555
+ exit_code = upload_program(config, args, device)
556
+ if exit_code == 0:
557
+ _LOGGER.info("Successfully uploaded program.")
558
+ return 0
559
+ if len(devices) > 1:
560
+ _LOGGER.warning("Failed to upload to %s", device)
561
+
562
+ return exit_code
488
563
 
489
564
 
490
- def command_discover(args, config):
565
+ def command_discover(args: ArgsProtocol, config: ConfigType) -> int | None:
491
566
  if "mqtt" in config:
492
567
  from esphome import mqtt
493
568
 
@@ -496,8 +571,9 @@ def command_discover(args, config):
496
571
  raise EsphomeError("No discover method configured (mqtt)")
497
572
 
498
573
 
499
- def command_logs(args, config):
500
- port = choose_upload_log_host(
574
+ def command_logs(args: ArgsProtocol, config: ConfigType) -> int | None:
575
+ # Get devices, resolving special identifiers like OTA
576
+ devices = choose_upload_log_host(
501
577
  default=args.device,
502
578
  check_default=None,
503
579
  show_ota=False,
@@ -505,10 +581,10 @@ def command_logs(args, config):
505
581
  show_api=True,
506
582
  purpose="logging",
507
583
  )
508
- return show_logs(config, args, port)
584
+ return show_logs(config, args, devices)
509
585
 
510
586
 
511
- def command_run(args, config):
587
+ def command_run(args: ArgsProtocol, config: ConfigType) -> int | None:
512
588
  exit_code = write_cpp(config)
513
589
  if exit_code != 0:
514
590
  return exit_code
@@ -525,7 +601,8 @@ def command_run(args, config):
525
601
  program_path = idedata.raw["prog_path"]
526
602
  return run_external_process(program_path)
527
603
 
528
- port = choose_upload_log_host(
604
+ # Get devices, resolving special identifiers like OTA
605
+ devices = choose_upload_log_host(
529
606
  default=args.device,
530
607
  check_default=None,
531
608
  show_ota=True,
@@ -533,39 +610,53 @@ def command_run(args, config):
533
610
  show_api=True,
534
611
  purpose="uploading",
535
612
  )
536
- exit_code = upload_program(config, args, port)
537
- if exit_code != 0:
613
+
614
+ # Try each device for upload until one succeeds
615
+ successful_device: str | None = None
616
+ for device in devices:
617
+ _LOGGER.info("Uploading to %s", device)
618
+ exit_code = upload_program(config, args, device)
619
+ if exit_code == 0:
620
+ _LOGGER.info("Successfully uploaded program.")
621
+ successful_device = device
622
+ break
623
+ if len(devices) > 1:
624
+ _LOGGER.warning("Failed to upload to %s", device)
625
+
626
+ if successful_device is None:
538
627
  return exit_code
539
- _LOGGER.info("Successfully uploaded program.")
628
+
540
629
  if args.no_logs:
541
630
  return 0
542
- port = choose_upload_log_host(
543
- default=args.device,
544
- check_default=port,
631
+
632
+ # For logs, prefer the device we successfully uploaded to
633
+ devices = choose_upload_log_host(
634
+ default=successful_device,
635
+ check_default=successful_device,
545
636
  show_ota=False,
546
637
  show_mqtt=True,
547
638
  show_api=True,
548
639
  purpose="logging",
549
640
  )
550
- return show_logs(config, args, port)
641
+ return show_logs(config, args, devices)
551
642
 
552
643
 
553
- def command_clean_mqtt(args, config):
644
+ def command_clean_mqtt(args: ArgsProtocol, config: ConfigType) -> int | None:
554
645
  return clean_mqtt(config, args)
555
646
 
556
647
 
557
- def command_mqtt_fingerprint(args, config):
648
+ def command_mqtt_fingerprint(args: ArgsProtocol, config: ConfigType) -> int | None:
558
649
  from esphome import mqtt
559
650
 
560
651
  return mqtt.get_fingerprint(config)
561
652
 
562
653
 
563
- def command_version(args):
654
+ def command_version(args: ArgsProtocol) -> int | None:
564
655
  safe_print(f"Version: {const.__version__}")
565
656
  return 0
566
657
 
567
658
 
568
- def command_clean(args, config):
659
+ def command_clean(args: ArgsProtocol, config: ConfigType) -> int | None:
569
660
  try:
570
661
  writer.clean_build()
571
662
  except OSError as err:
@@ -575,13 +666,13 @@ def command_clean(args, config):
575
666
  return 0
576
667
 
577
668
 
578
- def command_dashboard(args):
669
+ def command_dashboard(args: ArgsProtocol) -> int | None:
579
670
  from esphome.dashboard import dashboard
580
671
 
581
672
  return dashboard.start_dashboard(args)
582
673
 
583
674
 
584
- def command_update_all(args):
675
+ def command_update_all(args: ArgsProtocol) -> int | None:
585
676
  import click
586
677
 
587
678
  success = {}
@@ -628,7 +719,7 @@ def command_update_all(args):
628
719
  return failed
629
720
 
630
721
 
631
- def command_idedata(args, config):
722
+ def command_idedata(args: ArgsProtocol, config: ConfigType) -> int:
632
723
  import json
633
724
 
634
725
  from esphome import platformio_api
@@ -644,7 +735,7 @@ def command_idedata(args, config):
644
735
  return 0
645
736
 
646
737
 
647
- def command_rename(args, config):
738
+ def command_rename(args: ArgsProtocol, config: ConfigType) -> int | None:
648
739
  for c in args.name:
649
740
  if c not in ALLOWED_NAME_CHARS:
650
741
  print(
@@ -761,6 +852,12 @@ POST_CONFIG_ACTIONS = {
761
852
  "discover": command_discover,
762
853
  }
763
854
 
855
+ SIMPLE_CONFIG_ACTIONS = [
856
+ "clean",
857
+ "clean-mqtt",
858
+ "config",
859
+ ]
860
+
764
861
 
765
862
  def parse_args(argv):
766
863
  options_parser = argparse.ArgumentParser(add_help=False)
@@ -848,7 +945,8 @@ def parse_args(argv):
848
945
  )
849
946
  parser_upload.add_argument(
850
947
  "--device",
851
- help="Manually specify the serial port/address to use, for example /dev/ttyUSB0.",
948
+ action="append",
949
+ help="Manually specify the serial port/address to use, for example /dev/ttyUSB0. Can be specified multiple times for fallback addresses.",
852
950
  )
853
951
  parser_upload.add_argument(
854
952
  "--upload_speed",
@@ -870,7 +968,8 @@ def parse_args(argv):
870
968
  )
871
969
  parser_logs.add_argument(
872
970
  "--device",
873
- help="Manually specify the serial port/address to use, for example /dev/ttyUSB0.",
971
+ action="append",
972
+ help="Manually specify the serial port/address to use, for example /dev/ttyUSB0. Can be specified multiple times for fallback addresses.",
874
973
  )
875
974
  parser_logs.add_argument(
876
975
  "--reset",
@@ -899,7 +998,8 @@ def parse_args(argv):
899
998
  )
900
999
  parser_run.add_argument(
901
1000
  "--device",
902
- help="Manually specify the serial port/address to use, for example /dev/ttyUSB0.",
1001
+ action="append",
1002
+ help="Manually specify the serial port/address to use, for example /dev/ttyUSB0. Can be specified multiple times for fallback addresses.",
903
1003
  )
904
1004
  parser_run.add_argument(
905
1005
  "--upload_speed",
@@ -1026,6 +1126,13 @@ def parse_args(argv):
1026
1126
  arguments = argv[1:]
1027
1127
 
1028
1128
  argcomplete.autocomplete(parser)
1129
+
1130
+ if len(arguments) > 0 and arguments[0] in SIMPLE_CONFIG_ACTIONS:
1131
+ args, unknown_args = parser.parse_known_args(arguments)
1132
+ if unknown_args:
1133
+ _LOGGER.warning("Ignored unrecognized arguments: %s", unknown_args)
1134
+ return args
1135
+
1029
1136
  return parser.parse_args(arguments)
1030
1137
 
1031
1138
 
esphome/automation.py CHANGED
@@ -391,8 +391,7 @@ async def build_action(full_config, template_arg, args):
391
391
  )
392
392
  action_id = full_config[CONF_TYPE_ID]
393
393
  builder = registry_entry.coroutine_fun
394
- ret = await builder(config, action_id, template_arg, args)
395
- return ret
394
+ return await builder(config, action_id, template_arg, args)
396
395
 
397
396
 
398
397
  async def build_action_list(config, templ, arg_type):
@@ -409,8 +408,7 @@ async def build_condition(full_config, template_arg, args):
409
408
  )
410
409
  action_id = full_config[CONF_TYPE_ID]
411
410
  builder = registry_entry.coroutine_fun
412
- ret = await builder(config, action_id, template_arg, args)
413
- return ret
411
+ return await builder(config, action_id, template_arg, args)
414
412
 
415
413
 
416
414
  async def build_condition_list(config, templ, args):
File without changes