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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (758) hide show
  1. esphome/__main__.py +190 -83
  2. esphome/automation.py +2 -4
  3. esphome/build_gen/__init__.py +0 -0
  4. esphome/build_gen/platformio.py +102 -0
  5. esphome/components/a4988/a4988.cpp +0 -1
  6. esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
  7. esphome/components/absolute_humidity/sensor.py +2 -2
  8. esphome/components/adc/__init__.py +123 -85
  9. esphome/components/adc/adc_sensor.h +98 -35
  10. esphome/components/adc/adc_sensor_common.cpp +10 -4
  11. esphome/components/adc/adc_sensor_esp32.cpp +291 -123
  12. esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
  13. esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
  14. esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
  15. esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
  16. esphome/components/adc/sensor.py +61 -27
  17. esphome/components/adc128s102/adc128s102.cpp +1 -4
  18. esphome/components/ade7880/sensor.py +75 -49
  19. esphome/components/ads1115/ads1115.cpp +0 -1
  20. esphome/components/ads1118/ads1118.cpp +0 -1
  21. esphome/components/ags10/ags10.cpp +0 -4
  22. esphome/components/aht10/aht10.cpp +0 -4
  23. esphome/components/aic3204/aic3204.cpp +0 -2
  24. esphome/components/airthings_wave_plus/__init__.py +1 -1
  25. esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
  26. esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
  27. esphome/components/airthings_wave_plus/sensor.py +55 -28
  28. esphome/components/alarm_control_panel/__init__.py +4 -9
  29. esphome/components/am2315c/am2315c.cpp +0 -2
  30. esphome/components/am2320/am2320.cpp +0 -1
  31. esphome/components/animation/__init__.py +14 -11
  32. esphome/components/apds9306/apds9306.cpp +0 -4
  33. esphome/components/apds9960/apds9960.cpp +0 -1
  34. esphome/components/api/__init__.py +29 -4
  35. esphome/components/api/api_connection.cpp +378 -401
  36. esphome/components/api/api_connection.h +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 +475 -116
  73. esphome/components/atm90e32/atm90e32.h +43 -5
  74. esphome/components/audio/audio.h +2 -2
  75. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
  76. esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
  77. esphome/components/bh1750/bh1750.cpp +0 -1
  78. esphome/components/binary_sensor/__init__.py +14 -12
  79. esphome/components/ble_client/__init__.py +4 -7
  80. esphome/components/bluetooth_proxy/__init__.py +40 -3
  81. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +392 -81
  82. esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
  83. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
  84. esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
  85. esphome/components/bme280_base/bme280_base.cpp +15 -16
  86. esphome/components/bme680/bme680.cpp +2 -3
  87. esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
  88. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
  89. esphome/components/bmi160/bmi160.cpp +0 -1
  90. esphome/components/bmp085/bmp085.cpp +0 -1
  91. esphome/components/bmp280_base/bmp280_base.cpp +13 -14
  92. esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
  93. esphome/components/bmp581/bmp581.cpp +0 -2
  94. esphome/components/bp1658cj/bp1658cj.cpp +0 -1
  95. esphome/components/bp5758d/bp5758d.cpp +0 -1
  96. esphome/components/button/__init__.py +0 -1
  97. esphome/components/canbus/__init__.py +2 -3
  98. esphome/components/canbus/canbus.cpp +0 -1
  99. esphome/components/cap1188/cap1188.cpp +0 -2
  100. esphome/components/captive_portal/__init__.py +1 -1
  101. esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
  102. esphome/components/ch422g/ch422g.cpp +0 -1
  103. esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
  104. esphome/components/climate/__init__.py +0 -1
  105. esphome/components/climate/climate_traits.h +24 -0
  106. esphome/components/cm1106/cm1106.cpp +0 -1
  107. esphome/components/const/__init__.py +6 -0
  108. esphome/components/cover/__init__.py +0 -1
  109. esphome/components/cover/cover.cpp +9 -13
  110. esphome/components/cs5460a/cs5460a.cpp +0 -2
  111. esphome/components/cse7761/cse7761.cpp +0 -1
  112. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
  113. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
  114. esphome/components/dac7678/dac7678_output.cpp +0 -2
  115. esphome/components/dallas_temp/dallas_temp.cpp +0 -1
  116. esphome/components/datetime/__init__.py +0 -2
  117. esphome/components/debug/__init__.py +15 -1
  118. esphome/components/debug/debug_zephyr.cpp +281 -0
  119. esphome/components/debug/sensor.py +2 -1
  120. esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
  121. esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
  122. esphome/components/dfrobot_sen0395/__init__.py +1 -2
  123. esphome/components/dht/dht.cpp +0 -1
  124. esphome/components/dht12/dht12.cpp +0 -1
  125. esphome/components/display/__init__.py +16 -3
  126. esphome/components/display_menu_base/__init__.py +1 -1
  127. esphome/components/dps310/dps310.cpp +0 -2
  128. esphome/components/ds1307/ds1307.cpp +0 -1
  129. esphome/components/ds2484/ds2484.cpp +0 -1
  130. esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
  131. esphome/components/ee895/ee895.cpp +0 -1
  132. esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
  133. esphome/components/emc2101/emc2101.cpp +0 -2
  134. esphome/components/ens160_base/ens160_base.cpp +0 -2
  135. esphome/components/ens210/ens210.cpp +0 -1
  136. esphome/components/es7210/es7210.cpp +0 -2
  137. esphome/components/es7243e/es7243e.cpp +0 -2
  138. esphome/components/es8156/es8156.cpp +0 -2
  139. esphome/components/es8311/es8311.cpp +0 -2
  140. esphome/components/es8388/es8388.cpp +0 -2
  141. esphome/components/esp32/__init__.py +203 -60
  142. esphome/components/esp32/boards.py +17 -0
  143. esphome/components/esp32/gpio.cpp +0 -1
  144. esphome/components/esp32/gpio.py +1 -2
  145. esphome/components/esp32/gpio_esp32_h2.py +2 -7
  146. esphome/components/esp32/gpio_esp32_p4.py +2 -7
  147. esphome/components/esp32/post_build.py.script +112 -61
  148. esphome/components/esp32_ble/__init__.py +41 -2
  149. esphome/components/esp32_ble/ble.cpp +14 -10
  150. esphome/components/esp32_ble/ble.h +18 -18
  151. esphome/components/esp32_ble/ble_advertising.cpp +5 -5
  152. esphome/components/esp32_ble/ble_advertising.h +7 -5
  153. esphome/components/esp32_ble/ble_event.h +139 -73
  154. esphome/components/esp32_ble/ble_scan_result.h +2 -4
  155. esphome/components/esp32_ble/ble_uuid.cpp +5 -5
  156. esphome/components/esp32_ble/ble_uuid.h +6 -5
  157. esphome/components/esp32_ble_beacon/__init__.py +4 -0
  158. esphome/components/esp32_ble_client/__init__.py +1 -1
  159. esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
  160. esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
  161. esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
  162. esphome/components/esp32_ble_client/ble_client_base.h +17 -6
  163. esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
  164. esphome/components/esp32_ble_client/ble_service.cpp +4 -4
  165. esphome/components/esp32_ble_client/ble_service.h +6 -4
  166. esphome/components/esp32_ble_server/__init__.py +15 -12
  167. esphome/components/esp32_ble_tracker/__init__.py +79 -11
  168. esphome/components/esp32_ble_tracker/automation.h +4 -4
  169. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
  170. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
  171. esphome/components/esp32_camera/__init__.py +13 -1
  172. esphome/components/esp32_camera/esp32_camera.cpp +7 -2
  173. esphome/components/esp32_camera/esp32_camera.h +1 -0
  174. esphome/components/esp32_dac/esp32_dac.cpp +3 -19
  175. esphome/components/esp32_dac/esp32_dac.h +4 -8
  176. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
  177. esphome/components/esp32_rmt_led_strip/light.py +1 -1
  178. esphome/components/esp32_touch/__init__.py +2 -3
  179. esphome/components/esp32_touch/esp32_touch.h +9 -6
  180. esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
  181. esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
  182. esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
  183. esphome/components/esp8266/__init__.py +3 -1
  184. esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
  185. esphome/components/esphome/ota/__init__.py +1 -2
  186. esphome/components/esphome/ota/ota_esphome.cpp +150 -77
  187. esphome/components/esphome/ota/ota_esphome.h +8 -1
  188. esphome/components/espnow/__init__.py +309 -0
  189. esphome/components/espnow/automation.h +175 -0
  190. esphome/components/espnow/espnow_component.cpp +468 -0
  191. esphome/components/espnow/espnow_component.h +183 -0
  192. esphome/components/espnow/espnow_err.h +19 -0
  193. esphome/components/espnow/espnow_packet.h +166 -0
  194. esphome/components/ethernet/__init__.py +7 -1
  195. esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
  196. esphome/components/ethernet/ethernet_component.cpp +0 -1
  197. esphome/components/ethernet/ethernet_component.h +4 -0
  198. esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
  199. esphome/components/event/__init__.py +0 -1
  200. esphome/components/factory_reset/__init__.py +92 -0
  201. esphome/components/factory_reset/factory_reset.cpp +76 -0
  202. esphome/components/factory_reset/factory_reset.h +43 -0
  203. esphome/components/fan/__init__.py +0 -1
  204. esphome/components/fan/fan_traits.h +16 -0
  205. esphome/components/fastled_base/fastled_light.cpp +0 -1
  206. esphome/components/fastled_spi/light.py +1 -3
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
  208. esphome/components/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 +2 -2
  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/pipsolar.cpp +54 -42
  501. esphome/components/pipsolar/pipsolar.h +5 -4
  502. esphome/components/pipsolar/sensor/__init__.py +1 -1
  503. esphome/components/pm2005/pm2005.cpp +0 -1
  504. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  505. esphome/components/pmwcs3/sensor.py +1 -2
  506. esphome/components/pn532/pn532.cpp +0 -2
  507. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  508. esphome/components/power_supply/power_supply.cpp +7 -10
  509. esphome/components/power_supply/power_supply.h +1 -1
  510. esphome/components/psram/__init__.py +6 -1
  511. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  512. esphome/components/pulse_counter/sensor.py +9 -6
  513. esphome/components/pylontech/pylontech.cpp +0 -1
  514. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  515. esphome/components/qmp6988/qmp6988.cpp +0 -2
  516. esphome/components/qspi_dbi/display.py +2 -3
  517. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  518. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  519. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  520. esphome/components/rc522/rc522.cpp +9 -31
  521. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  522. esphome/components/remote_base/__init__.py +5 -6
  523. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  524. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  525. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  526. esphome/components/remote_transmitter/__init__.py +26 -0
  527. esphome/components/remote_transmitter/automation.h +18 -0
  528. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  529. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  530. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  531. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  532. esphome/components/resampler/speaker/__init__.py +4 -5
  533. esphome/components/rf_bridge/__init__.py +4 -8
  534. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  535. esphome/components/rp2040/__init__.py +3 -1
  536. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  537. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  538. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  539. esphome/components/rpi_dpi_rgb/display.py +13 -15
  540. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  541. esphome/components/runtime_stats/__init__.py +34 -0
  542. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  543. esphome/components/runtime_stats/runtime_stats.h +132 -0
  544. esphome/components/scd30/scd30.cpp +0 -2
  545. esphome/components/scd30/sensor.py +1 -2
  546. esphome/components/scd4x/scd4x.cpp +0 -1
  547. esphome/components/scd4x/sensor.py +1 -3
  548. esphome/components/sdl/display.py +3 -1
  549. esphome/components/sdl/sdl_esphome.cpp +0 -2
  550. esphome/components/sdp3x/sdp3x.cpp +0 -2
  551. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  552. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  553. esphome/components/select/__init__.py +2 -3
  554. esphome/components/select/select_traits.cpp +1 -1
  555. esphome/components/select/select_traits.h +1 -1
  556. esphome/components/sen0321/sen0321.cpp +0 -1
  557. esphome/components/sen5x/sen5x.cpp +0 -2
  558. esphome/components/senseair/senseair.cpp +7 -3
  559. esphome/components/senseair/senseair.h +11 -0
  560. esphome/components/sensor/__init__.py +36 -4
  561. esphome/components/sensor/filter.cpp +49 -10
  562. esphome/components/sensor/filter.h +22 -7
  563. esphome/components/sensor/sensor.cpp +0 -1
  564. esphome/components/sensor/sensor.h +0 -9
  565. esphome/components/sfa30/sfa30.cpp +0 -4
  566. esphome/components/sgp30/sgp30.cpp +0 -2
  567. esphome/components/sgp4x/sensor.py +1 -1
  568. esphome/components/sgp4x/sgp4x.cpp +0 -2
  569. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  570. esphome/components/sht3xd/sht3xd.cpp +0 -2
  571. esphome/components/sht4x/sht4x.cpp +0 -2
  572. esphome/components/shtcx/shtcx.cpp +0 -1
  573. esphome/components/sim800l/__init__.py +2 -4
  574. esphome/components/sm16716/sm16716.cpp +0 -1
  575. esphome/components/sm2135/sm2135.cpp +0 -1
  576. esphome/components/sm2235/sm2235.cpp +0 -1
  577. esphome/components/sm2335/sm2335.cpp +0 -1
  578. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  579. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  580. esphome/components/sntp/sntp_component.cpp +0 -1
  581. esphome/components/sound_level/sensor.py +1 -1
  582. esphome/components/speaker/media_player/__init__.py +21 -33
  583. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  584. esphome/components/spi/__init__.py +29 -13
  585. esphome/components/spi/spi.cpp +0 -2
  586. esphome/components/spi_device/spi_device.cpp +1 -4
  587. esphome/components/sprinkler/__init__.py +4 -4
  588. esphome/components/sps30/sps30.cpp +0 -1
  589. esphome/components/ssd1306_base/__init__.py +11 -11
  590. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  591. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  592. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  593. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  594. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  595. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  596. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  597. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  598. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  599. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  600. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  601. esphome/components/st7701s/display.py +10 -14
  602. esphome/components/st7701s/st7701s.cpp +0 -3
  603. esphome/components/st7735/st7735.cpp +0 -1
  604. esphome/components/st7789v/st7789v.cpp +0 -1
  605. esphome/components/st7920/st7920.cpp +0 -1
  606. esphome/components/status_led/light/status_led_light.cpp +0 -2
  607. esphome/components/status_led/status_led.cpp +0 -1
  608. esphome/components/stepper/__init__.py +2 -4
  609. esphome/components/sts3x/sts3x.cpp +0 -1
  610. esphome/components/substitutions/__init__.py +10 -16
  611. esphome/components/substitutions/jinja.py +24 -1
  612. esphome/components/sun/__init__.py +2 -3
  613. esphome/components/switch/__init__.py +31 -1
  614. esphome/components/switch/automation.h +24 -0
  615. esphome/components/switch/switch.cpp +8 -0
  616. esphome/components/switch/switch.h +8 -0
  617. esphome/components/sx126x/sx126x.cpp +0 -2
  618. esphome/components/sx127x/sx127x.cpp +0 -2
  619. esphome/components/sx1509/__init__.py +7 -5
  620. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  621. esphome/components/sx1509/sx1509.cpp +0 -2
  622. esphome/components/syslog/esphome_syslog.cpp +1 -1
  623. esphome/components/tc74/tc74.cpp +0 -1
  624. esphome/components/tca9548a/tca9548a.cpp +0 -1
  625. esphome/components/tca9555/tca9555.cpp +0 -1
  626. esphome/components/tcs34725/tcs34725.cpp +0 -1
  627. esphome/components/tee501/tee501.cpp +0 -1
  628. esphome/components/tem3200/tem3200.cpp +0 -2
  629. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  630. esphome/components/template/cover/template_cover.cpp +0 -1
  631. esphome/components/template/select/template_select.cpp +0 -1
  632. esphome/components/template/text/template_text.cpp +0 -2
  633. esphome/components/template/valve/template_valve.cpp +0 -1
  634. esphome/components/text/__init__.py +0 -1
  635. esphome/components/text/text_traits.h +2 -0
  636. esphome/components/text_sensor/__init__.py +2 -1
  637. esphome/components/text_sensor/text_sensor.cpp +0 -2
  638. esphome/components/text_sensor/text_sensor.h +0 -8
  639. esphome/components/thermostat/climate.py +4 -4
  640. esphome/components/time/__init__.py +7 -4
  641. esphome/components/time/real_time_clock.cpp +16 -3
  642. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  643. esphome/components/tlc5947/tlc5947.cpp +0 -2
  644. esphome/components/tlc5971/tlc5971.cpp +0 -2
  645. esphome/components/tm1621/tm1621.cpp +0 -2
  646. esphome/components/tm1637/tm1637.cpp +0 -2
  647. esphome/components/tm1638/tm1638.cpp +0 -2
  648. esphome/components/tm1651/__init__.py +45 -48
  649. esphome/components/tm1651/tm1651.cpp +213 -47
  650. esphome/components/tm1651/tm1651.h +37 -32
  651. esphome/components/tmp117/tmp117.cpp +0 -2
  652. esphome/components/tsl2561/tsl2561.cpp +0 -1
  653. esphome/components/tsl2591/tsl2591.cpp +0 -1
  654. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  655. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  656. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  657. esphome/components/tuya/climate/__init__.py +9 -10
  658. esphome/components/tuya/number/__init__.py +8 -6
  659. esphome/components/tx20/tx20.cpp +0 -1
  660. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  661. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  662. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  663. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  664. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  665. esphome/components/udp/__init__.py +1 -1
  666. esphome/components/ufire_ec/sensor.py +1 -2
  667. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  668. esphome/components/ufire_ise/sensor.py +1 -2
  669. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  670. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  671. esphome/components/update/__init__.py +0 -1
  672. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  673. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  674. esphome/components/usb_host/usb_host_client.cpp +0 -1
  675. esphome/components/usb_host/usb_host_component.cpp +0 -1
  676. esphome/components/valve/__init__.py +0 -1
  677. esphome/components/veml3235/veml3235.cpp +0 -3
  678. esphome/components/veml7700/veml7700.cpp +0 -2
  679. esphome/components/version/version_text_sensor.cpp +0 -1
  680. esphome/components/version/version_text_sensor.h +0 -1
  681. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  682. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  683. esphome/components/web_server/__init__.py +13 -0
  684. esphome/components/web_server/web_server.cpp +188 -353
  685. esphome/components/web_server/web_server.h +61 -1
  686. esphome/components/web_server_base/__init__.py +1 -1
  687. esphome/components/web_server_base/web_server_base.cpp +2 -0
  688. esphome/components/web_server_base/web_server_base.h +6 -0
  689. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  690. esphome/components/web_server_idf/web_server_idf.h +2 -0
  691. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  692. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  693. esphome/components/wifi/__init__.py +17 -43
  694. esphome/components/wifi/wifi_component.cpp +100 -36
  695. esphome/components/wifi/wifi_component.h +5 -1
  696. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  697. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  698. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  699. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  700. esphome/components/wireguard/wireguard.cpp +0 -2
  701. esphome/components/x9c/x9c.cpp +0 -2
  702. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  703. esphome/components/xl9535/xl9535.cpp +0 -2
  704. esphome/components/zephyr/__init__.py +252 -0
  705. esphome/components/zephyr/const.py +16 -0
  706. esphome/components/zephyr/core.cpp +90 -0
  707. esphome/components/zephyr/gpio.cpp +120 -0
  708. esphome/components/zephyr/gpio.h +38 -0
  709. esphome/components/zephyr/pre_build.py.script +4 -0
  710. esphome/components/zephyr/preferences.cpp +156 -0
  711. esphome/components/zephyr/preferences.h +13 -0
  712. esphome/config.py +38 -16
  713. esphome/config_helpers.py +1 -2
  714. esphome/config_validation.py +12 -16
  715. esphome/const.py +26 -1
  716. esphome/core/__init__.py +92 -51
  717. esphome/core/application.cpp +75 -21
  718. esphome/core/application.h +106 -171
  719. esphome/core/color.h +10 -0
  720. esphome/core/component.cpp +41 -25
  721. esphome/core/component.h +9 -6
  722. esphome/core/component_iterator.cpp +61 -261
  723. esphome/core/component_iterator.h +15 -0
  724. esphome/core/config.py +26 -11
  725. esphome/core/defines.h +40 -2
  726. esphome/core/entity_base.h +18 -0
  727. esphome/core/entity_helpers.py +45 -10
  728. esphome/core/helpers.cpp +8 -15
  729. esphome/core/helpers.h +60 -6
  730. esphome/core/lock_free_queue.h +1 -1
  731. esphome/core/scheduler.cpp +311 -77
  732. esphome/core/scheduler.h +141 -28
  733. esphome/cpp_generator.py +2 -6
  734. esphome/cpp_helpers.py +1 -1
  735. esphome/dashboard/dashboard.py +2 -3
  736. esphome/dashboard/dns.py +2 -8
  737. esphome/dashboard/web_server.py +34 -19
  738. esphome/espota2.py +1 -4
  739. esphome/git.py +3 -1
  740. esphome/helpers.py +23 -4
  741. esphome/log.py +3 -1
  742. esphome/mqtt.py +3 -5
  743. esphome/platformio_api.py +7 -4
  744. esphome/types.py +12 -0
  745. esphome/util.py +20 -8
  746. esphome/voluptuous_schema.py +4 -3
  747. esphome/vscode.py +1 -2
  748. esphome/wizard.py +1 -4
  749. esphome/writer.py +16 -108
  750. esphome/yaml_util.py +7 -5
  751. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
  752. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/RECORD +757 -677
  753. esphome/components/mipi_spi/models/commands.py +0 -82
  754. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  755. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
  756. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
  757. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
  758. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
@@ -11,8 +11,6 @@ static const char *const TAG = "npi19";
11
11
  static const uint8_t READ_COMMAND = 0xAC;
12
12
 
13
13
  void NPI19Component::setup() {
14
- ESP_LOGCONFIG(TAG, "Running setup");
15
-
16
14
  uint16_t raw_temperature(0);
17
15
  uint16_t raw_pressure(0);
18
16
  i2c::ErrorCode err = this->read_(raw_temperature, raw_pressure);
@@ -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) {