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.
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
@@ -0,0 +1,223 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+
5
+ import esphome.codegen as cg
6
+ from esphome.components.zephyr import (
7
+ copy_files as zephyr_copy_files,
8
+ zephyr_add_pm_static,
9
+ zephyr_set_core_data,
10
+ zephyr_to_code,
11
+ )
12
+ from esphome.components.zephyr.const import (
13
+ BOOTLOADER_MCUBOOT,
14
+ KEY_BOOTLOADER,
15
+ KEY_ZEPHYR,
16
+ )
17
+ import esphome.config_validation as cv
18
+ from esphome.const import (
19
+ CONF_BOARD,
20
+ CONF_FRAMEWORK,
21
+ KEY_CORE,
22
+ KEY_FRAMEWORK_VERSION,
23
+ KEY_TARGET_FRAMEWORK,
24
+ KEY_TARGET_PLATFORM,
25
+ PLATFORM_NRF52,
26
+ ThreadModel,
27
+ )
28
+ from esphome.core import CORE, EsphomeError, coroutine_with_priority
29
+ from esphome.storage_json import StorageJSON
30
+ from esphome.types import ConfigType
31
+
32
+ from .boards import BOARDS_ZEPHYR, BOOTLOADER_CONFIG
33
+ from .const import (
34
+ BOOTLOADER_ADAFRUIT,
35
+ BOOTLOADER_ADAFRUIT_NRF52_SD132,
36
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V6,
37
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V7,
38
+ )
39
+
40
+ # force import gpio to register pin schema
41
+ from .gpio import nrf52_pin_to_code # noqa
42
+
43
+ CODEOWNERS = ["@tomaszduda23"]
44
+ AUTO_LOAD = ["zephyr"]
45
+ IS_TARGET_PLATFORM = True
46
+
47
+
48
+ def set_core_data(config: ConfigType) -> ConfigType:
49
+ zephyr_set_core_data(config)
50
+ CORE.data[KEY_CORE][KEY_TARGET_PLATFORM] = PLATFORM_NRF52
51
+ CORE.data[KEY_CORE][KEY_TARGET_FRAMEWORK] = KEY_ZEPHYR
52
+ CORE.data[KEY_CORE][KEY_FRAMEWORK_VERSION] = cv.Version(2, 6, 1)
53
+
54
+ if config[KEY_BOOTLOADER] in BOOTLOADER_CONFIG:
55
+ zephyr_add_pm_static(BOOTLOADER_CONFIG[config[KEY_BOOTLOADER]])
56
+
57
+ return config
58
+
59
+
60
+ BOOTLOADERS = [
61
+ BOOTLOADER_ADAFRUIT,
62
+ BOOTLOADER_ADAFRUIT_NRF52_SD132,
63
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V6,
64
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V7,
65
+ BOOTLOADER_MCUBOOT,
66
+ ]
67
+
68
+
69
+ def _detect_bootloader(config: ConfigType) -> ConfigType:
70
+ """Detect the bootloader for the given board."""
71
+ config = config.copy()
72
+ bootloaders: list[str] = []
73
+ board = config[CONF_BOARD]
74
+
75
+ if board in BOARDS_ZEPHYR and KEY_BOOTLOADER in BOARDS_ZEPHYR[board]:
76
+ # this board have bootloaders config available
77
+ bootloaders = BOARDS_ZEPHYR[board][KEY_BOOTLOADER]
78
+
79
+ if KEY_BOOTLOADER not in config:
80
+ if bootloaders:
81
+ # there is no bootloader in config -> take first one
82
+ config[KEY_BOOTLOADER] = bootloaders[0]
83
+ else:
84
+ # make mcuboot as default if there is no configuration for that board
85
+ config[KEY_BOOTLOADER] = BOOTLOADER_MCUBOOT
86
+ elif bootloaders and config[KEY_BOOTLOADER] not in bootloaders:
87
+ raise cv.Invalid(
88
+ f"{board} does not support {config[KEY_BOOTLOADER]}, select one of: {', '.join(bootloaders)}"
89
+ )
90
+ return config
91
+
92
+
93
+ CONFIG_SCHEMA = cv.All(
94
+ cv.Schema(
95
+ {
96
+ cv.Required(CONF_BOARD): cv.string_strict,
97
+ cv.Optional(KEY_BOOTLOADER): cv.one_of(*BOOTLOADERS, lower=True),
98
+ }
99
+ ),
100
+ _detect_bootloader,
101
+ set_core_data,
102
+ )
103
+
104
+
105
+ @coroutine_with_priority(1000)
106
+ async def to_code(config: ConfigType) -> None:
107
+ """Convert the configuration to code."""
108
+ cg.add_platformio_option("board", config[CONF_BOARD])
109
+ cg.add_build_flag("-DUSE_NRF52")
110
+ cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
111
+ cg.add_define("ESPHOME_VARIANT", "NRF52")
112
+ # nRF52 processors are single-core
113
+ cg.add_define(ThreadModel.SINGLE)
114
+ cg.add_platformio_option(CONF_FRAMEWORK, CORE.data[KEY_CORE][KEY_TARGET_FRAMEWORK])
115
+ cg.add_platformio_option(
116
+ "platform",
117
+ "https://github.com/tomaszduda23/platform-nordicnrf52/archive/refs/tags/v10.3.0-1.zip",
118
+ )
119
+ cg.add_platformio_option(
120
+ "platform_packages",
121
+ [
122
+ "platformio/framework-zephyr@https://github.com/tomaszduda23/framework-sdk-nrf/archive/refs/tags/v2.6.1-4.zip",
123
+ "platformio/toolchain-gccarmnoneeabi@https://github.com/tomaszduda23/toolchain-sdk-ng/archive/refs/tags/v0.16.1-1.zip",
124
+ ],
125
+ )
126
+
127
+ if config[KEY_BOOTLOADER] == BOOTLOADER_MCUBOOT:
128
+ cg.add_define("USE_BOOTLOADER_MCUBOOT")
129
+ else:
130
+ # make sure that firmware.zip is created
131
+ # for Adafruit_nRF52_Bootloader
132
+ cg.add_platformio_option("board_upload.protocol", "nrfutil")
133
+ cg.add_platformio_option("board_upload.use_1200bps_touch", "true")
134
+ cg.add_platformio_option("board_upload.require_upload_port", "true")
135
+ cg.add_platformio_option("board_upload.wait_for_upload_port", "true")
136
+
137
+ zephyr_to_code(config)
138
+
139
+
140
+ def copy_files() -> None:
141
+ """Copy files to the build directory."""
142
+ zephyr_copy_files()
143
+
144
+
145
+ def get_download_types(storage_json: StorageJSON) -> list[dict[str, str]]:
146
+ """Get the download types for the firmware."""
147
+ types = []
148
+ UF2_PATH = "zephyr/zephyr.uf2"
149
+ DFU_PATH = "firmware.zip"
150
+ HEX_PATH = "zephyr/zephyr.hex"
151
+ HEX_MERGED_PATH = "zephyr/merged.hex"
152
+ APP_IMAGE_PATH = "zephyr/app_update.bin"
153
+ build_dir = Path(storage_json.firmware_bin_path).parent
154
+ if (build_dir / UF2_PATH).is_file():
155
+ types = [
156
+ {
157
+ "title": "UF2 package (recommended)",
158
+ "description": "For flashing via Adafruit nRF52 Bootloader as a flash drive.",
159
+ "file": UF2_PATH,
160
+ "download": f"{storage_json.name}.uf2",
161
+ },
162
+ {
163
+ "title": "DFU package",
164
+ "description": "For flashing via adafruit-nrfutil using USB CDC.",
165
+ "file": DFU_PATH,
166
+ "download": f"dfu-{storage_json.name}.zip",
167
+ },
168
+ ]
169
+ else:
170
+ types = [
171
+ {
172
+ "title": "HEX package",
173
+ "description": "For flashing via pyocd using SWD.",
174
+ "file": (
175
+ HEX_MERGED_PATH
176
+ if (build_dir / HEX_MERGED_PATH).is_file()
177
+ else HEX_PATH
178
+ ),
179
+ "download": f"{storage_json.name}.hex",
180
+ },
181
+ ]
182
+ if (build_dir / APP_IMAGE_PATH).is_file():
183
+ types += [
184
+ {
185
+ "title": "App update package",
186
+ "description": "For flashing via mcumgr-web using BLE or smpclient using USB CDC.",
187
+ "file": APP_IMAGE_PATH,
188
+ "download": f"app-{storage_json.name}.img",
189
+ },
190
+ ]
191
+
192
+ return types
193
+
194
+
195
+ def _upload_using_platformio(
196
+ config: ConfigType, port: str, upload_args: list[str]
197
+ ) -> int | str:
198
+ from esphome import platformio_api
199
+
200
+ if port is not None:
201
+ upload_args += ["--upload-port", port]
202
+ return platformio_api.run_platformio_cli_run(config, CORE.verbose, *upload_args)
203
+
204
+
205
+ def upload_program(config: ConfigType, args, host: str) -> bool:
206
+ from esphome.__main__ import check_permissions, get_port_type
207
+
208
+ result = 0
209
+ handled = False
210
+
211
+ if get_port_type(host) == "SERIAL":
212
+ check_permissions(host)
213
+ result = _upload_using_platformio(config, host, ["-t", "upload"])
214
+ handled = True
215
+
216
+ if host == "PYOCD":
217
+ result = _upload_using_platformio(config, host, ["-t", "flash_pyocd"])
218
+ handled = True
219
+
220
+ if result != 0:
221
+ raise EsphomeError(f"Upload failed with result: {result}")
222
+
223
+ return handled
@@ -0,0 +1,34 @@
1
+ from esphome.components.zephyr import Section
2
+ from esphome.components.zephyr.const import KEY_BOOTLOADER
3
+
4
+ from .const import (
5
+ BOOTLOADER_ADAFRUIT,
6
+ BOOTLOADER_ADAFRUIT_NRF52_SD132,
7
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V6,
8
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V7,
9
+ )
10
+
11
+ BOARDS_ZEPHYR = {
12
+ "adafruit_itsybitsy_nrf52840": {
13
+ KEY_BOOTLOADER: [
14
+ BOOTLOADER_ADAFRUIT,
15
+ BOOTLOADER_ADAFRUIT_NRF52_SD132,
16
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V6,
17
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V7,
18
+ ]
19
+ },
20
+ }
21
+
22
+ # https://github.com/ffenix113/zigbee_home/blob/17bb7b9e9d375e756da9e38913f53303937fb66a/types/board/known_boards.go
23
+ # https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather?view=all#hathach-memory-map
24
+ BOOTLOADER_CONFIG = {
25
+ BOOTLOADER_ADAFRUIT_NRF52_SD132: [
26
+ Section("empty_app_offset", 0x0, 0x26000, "flash_primary"),
27
+ ],
28
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V6: [
29
+ Section("empty_app_offset", 0x0, 0x26000, "flash_primary"),
30
+ ],
31
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V7: [
32
+ Section("empty_app_offset", 0x0, 0x27000, "flash_primary"),
33
+ ],
34
+ }
@@ -0,0 +1,18 @@
1
+ BOOTLOADER_ADAFRUIT = "adafruit"
2
+ BOOTLOADER_ADAFRUIT_NRF52_SD132 = "adafruit_nrf52_sd132"
3
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V6 = "adafruit_nrf52_sd140_v6"
4
+ BOOTLOADER_ADAFRUIT_NRF52_SD140_V7 = "adafruit_nrf52_sd140_v7"
5
+ EXTRA_ADC = [
6
+ "VDD",
7
+ "VDDHDIV5",
8
+ ]
9
+ AIN_TO_GPIO = {
10
+ "AIN0": 2,
11
+ "AIN1": 3,
12
+ "AIN2": 4,
13
+ "AIN3": 5,
14
+ "AIN4": 28,
15
+ "AIN5": 29,
16
+ "AIN6": 30,
17
+ "AIN7": 31,
18
+ }
@@ -0,0 +1,79 @@
1
+ from esphome import pins
2
+ import esphome.codegen as cg
3
+ from esphome.components.zephyr.const import zephyr_ns
4
+ import esphome.config_validation as cv
5
+ from esphome.const import (
6
+ CONF_ANALOG,
7
+ CONF_ID,
8
+ CONF_INVERTED,
9
+ CONF_MODE,
10
+ CONF_NUMBER,
11
+ PLATFORM_NRF52,
12
+ )
13
+
14
+ from .const import AIN_TO_GPIO, EXTRA_ADC
15
+
16
+ ZephyrGPIOPin = zephyr_ns.class_("ZephyrGPIOPin", cg.InternalGPIOPin)
17
+
18
+
19
+ def _translate_pin(value):
20
+ if value in AIN_TO_GPIO:
21
+ return AIN_TO_GPIO[value]
22
+ if isinstance(value, dict) or value is None:
23
+ raise cv.Invalid(
24
+ "This variable only supports pin numbers, not full pin schemas "
25
+ "(with inverted and mode)."
26
+ )
27
+ if isinstance(value, int):
28
+ return value
29
+ try:
30
+ return int(value)
31
+ except ValueError:
32
+ pass
33
+ # e.g. P0.27
34
+ if len(value) >= len("P0.0") and value[0] == "P" and value[2] == ".":
35
+ return cv.int_(value[len("P")].strip()) * 32 + cv.int_(
36
+ value[len("P0.") :].strip()
37
+ )
38
+ raise cv.Invalid(f"Invalid pin: {value}")
39
+
40
+
41
+ def validate_gpio_pin(value):
42
+ if value in EXTRA_ADC:
43
+ return value
44
+ value = _translate_pin(value)
45
+ if value < 0 or value > (32 + 16):
46
+ raise cv.Invalid(f"NRF52: Invalid pin number: {value}")
47
+ return value
48
+
49
+
50
+ def validate_supports(value):
51
+ num = value[CONF_NUMBER]
52
+ mode = value[CONF_MODE]
53
+ is_analog = mode[CONF_ANALOG]
54
+ if is_analog:
55
+ if num in EXTRA_ADC:
56
+ return value
57
+ if num not in AIN_TO_GPIO.values():
58
+ raise cv.Invalid(f"Cannot use {num} as analog pin")
59
+ return value
60
+
61
+
62
+ NRF52_PIN_SCHEMA = cv.All(
63
+ pins.gpio_base_schema(
64
+ ZephyrGPIOPin,
65
+ validate_gpio_pin,
66
+ modes=pins.GPIO_STANDARD_MODES + (CONF_ANALOG,),
67
+ ),
68
+ validate_supports,
69
+ )
70
+
71
+
72
+ @pins.PIN_SCHEMA_REGISTRY.register(PLATFORM_NRF52, NRF52_PIN_SCHEMA)
73
+ async def nrf52_pin_to_code(config):
74
+ var = cg.new_Pvariable(config[CONF_ID])
75
+ num = config[CONF_NUMBER]
76
+ cg.add(var.set_pin(num))
77
+ cg.add(var.set_inverted(config[CONF_INVERTED]))
78
+ cg.add(var.set_flags(pins.gpio_flags_expr(config[CONF_MODE])))
79
+ return var
@@ -19,6 +19,7 @@ from esphome.const import (
19
19
  CONF_UNIT_OF_MEASUREMENT,
20
20
  CONF_VALUE,
21
21
  CONF_WEB_SERVER,
22
+ DEVICE_CLASS_ABSOLUTE_HUMIDITY,
22
23
  DEVICE_CLASS_APPARENT_POWER,
23
24
  DEVICE_CLASS_AQI,
24
25
  DEVICE_CLASS_AREA,
@@ -81,6 +82,7 @@ from esphome.cpp_generator import MockObjClass
81
82
 
82
83
  CODEOWNERS = ["@esphome/core"]
83
84
  DEVICE_CLASSES = [
85
+ DEVICE_CLASS_ABSOLUTE_HUMIDITY,
84
86
  DEVICE_CLASS_APPARENT_POWER,
85
87
  DEVICE_CLASS_AQI,
86
88
  DEVICE_CLASS_AREA,
@@ -321,7 +323,6 @@ async def number_in_range_to_code(config, condition_id, template_arg, args):
321
323
 
322
324
  @coroutine_with_priority(100.0)
323
325
  async def to_code(config):
324
- cg.add_define("USE_NUMBER")
325
326
  cg.add_global(number_ns.using)
326
327
 
327
328
 
@@ -18,13 +18,12 @@ def one_wire_device_schema():
18
18
 
19
19
  :return: The 1-wire device schema, `extend` this in your config schema.
20
20
  """
21
- schema = cv.Schema(
21
+ return cv.Schema(
22
22
  {
23
23
  cv.GenerateID(CONF_ONE_WIRE_ID): cv.use_id(OneWireBus),
24
24
  cv.Optional(CONF_ADDRESS): cv.hex_uint64_t,
25
25
  }
26
26
  )
27
- return schema
28
27
 
29
28
 
30
29
  async def register_one_wire_device(var, config):
@@ -11,8 +11,6 @@ const std::string &OneWireDevice::get_address_name() {
11
11
  return this->address_name_;
12
12
  }
13
13
 
14
- std::string OneWireDevice::unique_id() { return "dallas-" + str_lower_case(format_hex(this->address_)); }
15
-
16
14
  bool OneWireDevice::send_command_(uint8_t cmd) {
17
15
  if (!this->bus_->select(this->address_))
18
16
  return false;
@@ -24,8 +24,6 @@ class OneWireDevice {
24
24
  /// Helper to create (and cache) the name for this sensor. For example "0xfe0000031f1eaf29".
25
25
  const std::string &get_address_name();
26
26
 
27
- std::string unique_id();
28
-
29
27
  protected:
30
28
  uint64_t address_{0};
31
29
  OneWireBus *bus_{nullptr}; ///< pointer to OneWireBus instance
@@ -145,7 +145,6 @@ void OpenthermHub::process_response(OpenthermData &data) {
145
145
  }
146
146
 
147
147
  void OpenthermHub::setup() {
148
- ESP_LOGD(TAG, "Setting up OpenTherm component");
149
148
  this->opentherm_ = make_unique<OpenTherm>(this->in_pin_, this->out_pin_);
150
149
  if (!this->opentherm_->initialize()) {
151
150
  ESP_LOGE(TAG, "Failed to initialize OpenTherm protocol. See previous log messages for details.");
@@ -25,9 +25,9 @@ async def new_openthermnumber(config: dict[str, Any]) -> cg.Pvariable:
25
25
  await cg.register_component(var, config)
26
26
  input.generate_setters(var, config)
27
27
 
28
- if (initial_value := config.get(CONF_INITIAL_VALUE, None)) is not None:
28
+ if (initial_value := config.get(CONF_INITIAL_VALUE)) is not None:
29
29
  cg.add(var.set_initial_value(initial_value))
30
- if (restore_value := config.get(CONF_RESTORE_VALUE, None)) is not None:
30
+ if (restore_value := config.get(CONF_RESTORE_VALUE)) is not None:
31
31
  cg.add(var.set_restore_value(restore_value))
32
32
 
33
33
  return var
@@ -79,9 +79,8 @@ def set_sdkconfig_options(config):
79
79
  "CONFIG_OPENTHREAD_NETWORK_PSKC", f"{pskc:X}".lower()
80
80
  )
81
81
 
82
- if force_dataset := config.get(CONF_FORCE_DATASET):
83
- if force_dataset:
84
- cg.add_define("USE_OPENTHREAD_FORCE_DATASET")
82
+ if config.get(CONF_FORCE_DATASET):
83
+ cg.add_define("USE_OPENTHREAD_FORCE_DATASET")
85
84
 
86
85
  add_idf_sdkconfig_option("CONFIG_OPENTHREAD_DNS64_CLIENT", True)
87
86
  add_idf_sdkconfig_option("CONFIG_OPENTHREAD_SRP_CLIENT", True)
@@ -1,6 +1,9 @@
1
1
  #include "esphome/core/defines.h"
2
2
  #ifdef USE_OPENTHREAD
3
3
  #include "openthread.h"
4
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)
5
+ #include "esp_openthread.h"
6
+ #endif
4
7
 
5
8
  #include <freertos/portmacro.h>
6
9
 
@@ -28,18 +31,6 @@ OpenThreadComponent *global_openthread_component = // NOLINT(cppcoreguidelines-
28
31
 
29
32
  OpenThreadComponent::OpenThreadComponent() { global_openthread_component = this; }
30
33
 
31
- OpenThreadComponent::~OpenThreadComponent() {
32
- auto lock = InstanceLock::try_acquire(100);
33
- if (!lock) {
34
- ESP_LOGW(TAG, "Failed to acquire OpenThread lock in destructor, leaking memory");
35
- return;
36
- }
37
- otInstance *instance = lock->get_instance();
38
- otSrpClientClearHostAndServices(instance);
39
- otSrpClientBuffersFreeAllServices(instance);
40
- global_openthread_component = nullptr;
41
- }
42
-
43
34
  bool OpenThreadComponent::is_connected() {
44
35
  auto lock = InstanceLock::try_acquire(100);
45
36
  if (!lock) {
@@ -189,7 +180,6 @@ void OpenThreadSrpComponent::setup() {
189
180
  }
190
181
 
191
182
  otSrpClientEnableAutoStartMode(instance, srp_start_callback, nullptr);
192
- ESP_LOGD(TAG, "Finished SRP setup");
193
183
  }
194
184
 
195
185
  void *OpenThreadSrpComponent::pool_alloc_(size_t size) {
@@ -200,6 +190,33 @@ void *OpenThreadSrpComponent::pool_alloc_(size_t size) {
200
190
 
201
191
  void OpenThreadSrpComponent::set_mdns(esphome::mdns::MDNSComponent *mdns) { this->mdns_ = mdns; }
202
192
 
193
+ bool OpenThreadComponent::teardown() {
194
+ if (!this->teardown_started_) {
195
+ this->teardown_started_ = true;
196
+ ESP_LOGD(TAG, "Clear Srp");
197
+ auto lock = InstanceLock::try_acquire(100);
198
+ if (!lock) {
199
+ ESP_LOGW(TAG, "Failed to acquire OpenThread lock during teardown, leaking memory");
200
+ return true;
201
+ }
202
+ otInstance *instance = lock->get_instance();
203
+ otSrpClientClearHostAndServices(instance);
204
+ otSrpClientBuffersFreeAllServices(instance);
205
+ global_openthread_component = nullptr;
206
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)
207
+ ESP_LOGD(TAG, "Exit main loop ");
208
+ int error = esp_openthread_mainloop_exit();
209
+ if (error != ESP_OK) {
210
+ ESP_LOGW(TAG, "Failed attempt to stop main loop %d", error);
211
+ this->teardown_complete_ = true;
212
+ }
213
+ #else
214
+ this->teardown_complete_ = true;
215
+ #endif
216
+ }
217
+ return this->teardown_complete_;
218
+ }
219
+
203
220
  } // namespace openthread
204
221
  } // namespace esphome
205
222
 
@@ -21,6 +21,7 @@ class OpenThreadComponent : public Component {
21
21
  OpenThreadComponent();
22
22
  ~OpenThreadComponent();
23
23
  void setup() override;
24
+ bool teardown() override;
24
25
  float get_setup_priority() const override { return setup_priority::WIFI; }
25
26
 
26
27
  bool is_connected();
@@ -30,6 +31,8 @@ class OpenThreadComponent : public Component {
30
31
 
31
32
  protected:
32
33
  std::optional<otIp6Address> get_omr_address_(InstanceLock &lock);
34
+ bool teardown_started_{false};
35
+ bool teardown_complete_{false};
33
36
  };
34
37
 
35
38
  extern OpenThreadComponent *global_openthread_component; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
@@ -28,7 +28,6 @@ namespace esphome {
28
28
  namespace openthread {
29
29
 
30
30
  void OpenThreadComponent::setup() {
31
- ESP_LOGCONFIG(TAG, "Running setup");
32
31
  // Used eventfds:
33
32
  // * netif
34
33
  // * ot task queue
@@ -144,10 +143,13 @@ void OpenThreadComponent::ot_main() {
144
143
  esp_openthread_launch_mainloop();
145
144
 
146
145
  // Clean up
146
+ esp_openthread_deinit();
147
147
  esp_openthread_netif_glue_deinit();
148
148
  esp_netif_destroy(openthread_netif);
149
149
 
150
150
  esp_vfs_eventfd_unregister();
151
+ this->teardown_complete_ = true;
152
+ vTaskDelete(NULL);
151
153
  }
152
154
 
153
155
  network::IPAddresses OpenThreadComponent::get_ip_addresses() {
@@ -1,11 +1,7 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import i2c, sensor
4
- from esphome.const import (
5
- DEVICE_CLASS_ILLUMINANCE,
6
- STATE_CLASS_MEASUREMENT,
7
- UNIT_LUX,
8
- )
3
+ import esphome.config_validation as cv
4
+ from esphome.const import DEVICE_CLASS_ILLUMINANCE, STATE_CLASS_MEASUREMENT, UNIT_LUX
9
5
 
10
6
  DEPENDENCIES = ["i2c"]
11
7
  CODEOWNERS = ["@ccutrer"]
@@ -43,6 +43,8 @@ FloatOutputPtr = FloatOutput.operator("ptr")
43
43
  TurnOffAction = output_ns.class_("TurnOffAction", automation.Action)
44
44
  TurnOnAction = output_ns.class_("TurnOnAction", automation.Action)
45
45
  SetLevelAction = output_ns.class_("SetLevelAction", automation.Action)
46
+ SetMinPowerAction = output_ns.class_("SetMinPowerAction", automation.Action)
47
+ SetMaxPowerAction = output_ns.class_("SetMaxPowerAction", automation.Action)
46
48
 
47
49
 
48
50
  async def setup_output_platform_(obj, config):
@@ -104,6 +106,42 @@ async def output_set_level_to_code(config, action_id, template_arg, args):
104
106
  return var
105
107
 
106
108
 
109
+ @automation.register_action(
110
+ "output.set_min_power",
111
+ SetMinPowerAction,
112
+ cv.Schema(
113
+ {
114
+ cv.Required(CONF_ID): cv.use_id(FloatOutput),
115
+ cv.Required(CONF_MIN_POWER): cv.templatable(cv.percentage),
116
+ }
117
+ ),
118
+ )
119
+ async def output_set_min_power_to_code(config, action_id, template_arg, args):
120
+ paren = await cg.get_variable(config[CONF_ID])
121
+ var = cg.new_Pvariable(action_id, template_arg, paren)
122
+ template_ = await cg.templatable(config[CONF_MIN_POWER], args, float)
123
+ cg.add(var.set_min_power(template_))
124
+ return var
125
+
126
+
127
+ @automation.register_action(
128
+ "output.set_max_power",
129
+ SetMaxPowerAction,
130
+ cv.Schema(
131
+ {
132
+ cv.Required(CONF_ID): cv.use_id(FloatOutput),
133
+ cv.Required(CONF_MAX_POWER): cv.templatable(cv.percentage),
134
+ }
135
+ ),
136
+ )
137
+ async def output_set_max_power_to_code(config, action_id, template_arg, args):
138
+ paren = await cg.get_variable(config[CONF_ID])
139
+ var = cg.new_Pvariable(action_id, template_arg, paren)
140
+ template_ = await cg.templatable(config[CONF_MAX_POWER], args, float)
141
+ cg.add(var.set_max_power(template_))
142
+ return var
143
+
144
+
107
145
  async def to_code(config):
108
146
  cg.add_define("USE_OUTPUT")
109
147
  cg.add_global(output_ns.using)
@@ -40,5 +40,29 @@ template<typename... Ts> class SetLevelAction : public Action<Ts...> {
40
40
  FloatOutput *output_;
41
41
  };
42
42
 
43
+ template<typename... Ts> class SetMinPowerAction : public Action<Ts...> {
44
+ public:
45
+ SetMinPowerAction(FloatOutput *output) : output_(output) {}
46
+
47
+ TEMPLATABLE_VALUE(float, min_power)
48
+
49
+ void play(Ts... x) override { this->output_->set_min_power(this->min_power_.value(x...)); }
50
+
51
+ protected:
52
+ FloatOutput *output_;
53
+ };
54
+
55
+ template<typename... Ts> class SetMaxPowerAction : public Action<Ts...> {
56
+ public:
57
+ SetMaxPowerAction(FloatOutput *output) : output_(output) {}
58
+
59
+ TEMPLATABLE_VALUE(float, max_power)
60
+
61
+ void play(Ts... x) override { this->output_->set_max_power(this->max_power_.value(x...)); }
62
+
63
+ protected:
64
+ FloatOutput *output_;
65
+ };
66
+
43
67
  } // namespace output
44
68
  } // namespace esphome
@@ -8,8 +8,6 @@ static const char *const TAG = "output.switch";
8
8
 
9
9
  void OutputSwitch::dump_config() { LOG_SWITCH("", "Output Switch", this); }
10
10
  void OutputSwitch::setup() {
11
- ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
12
-
13
11
  bool initial_state = this->get_initial_state_with_restore_mode().value_or(false);
14
12
 
15
13
  if (initial_state) {
@@ -186,8 +186,7 @@ def _process_package(package_config, config):
186
186
  package_config = _process_base_package(package_config)
187
187
  if isinstance(package_config, dict):
188
188
  recursive_package = do_packages_pass(package_config)
189
- config = merge_config(recursive_package, config)
190
- return config
189
+ return merge_config(recursive_package, config)
191
190
 
192
191
 
193
192
  def do_packages_pass(config: dict):