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

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

Potentially problematic release.


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

Files changed (754) hide show
  1. esphome/__main__.py +189 -82
  2. esphome/automation.py +2 -4
  3. esphome/build_gen/__init__.py +0 -0
  4. esphome/build_gen/platformio.py +102 -0
  5. esphome/components/a4988/a4988.cpp +0 -1
  6. esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
  7. esphome/components/absolute_humidity/sensor.py +2 -2
  8. esphome/components/adc/__init__.py +123 -85
  9. esphome/components/adc/adc_sensor.h +98 -35
  10. esphome/components/adc/adc_sensor_common.cpp +10 -4
  11. esphome/components/adc/adc_sensor_esp32.cpp +291 -123
  12. esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
  13. esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
  14. esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
  15. esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
  16. esphome/components/adc/sensor.py +61 -27
  17. esphome/components/adc128s102/adc128s102.cpp +1 -4
  18. esphome/components/ade7880/sensor.py +75 -49
  19. esphome/components/ads1115/ads1115.cpp +0 -1
  20. esphome/components/ads1118/ads1118.cpp +0 -1
  21. esphome/components/ags10/ags10.cpp +0 -4
  22. esphome/components/aht10/aht10.cpp +0 -4
  23. esphome/components/aic3204/aic3204.cpp +0 -2
  24. esphome/components/airthings_wave_plus/__init__.py +1 -1
  25. esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
  26. esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
  27. esphome/components/airthings_wave_plus/sensor.py +55 -28
  28. esphome/components/alarm_control_panel/__init__.py +4 -9
  29. esphome/components/am2315c/am2315c.cpp +0 -2
  30. esphome/components/am2320/am2320.cpp +0 -1
  31. esphome/components/animation/__init__.py +14 -11
  32. esphome/components/apds9306/apds9306.cpp +0 -4
  33. esphome/components/apds9960/apds9960.cpp +0 -1
  34. esphome/components/api/__init__.py +29 -4
  35. esphome/components/api/api_connection.cpp +378 -401
  36. esphome/components/api/api_connection.h +112 -56
  37. esphome/components/api/api_frame_helper.cpp +69 -896
  38. esphome/components/api/api_frame_helper.h +31 -126
  39. esphome/components/api/api_frame_helper_noise.cpp +583 -0
  40. esphome/components/api/api_frame_helper_noise.h +68 -0
  41. esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
  42. esphome/components/api/api_frame_helper_plaintext.h +53 -0
  43. esphome/components/api/api_noise_context.h +2 -4
  44. esphome/components/api/api_pb2.cpp +1601 -1808
  45. esphome/components/api/api_pb2.h +367 -323
  46. esphome/components/api/api_pb2_dump.cpp +1137 -3466
  47. esphome/components/api/api_pb2_includes.h +34 -0
  48. esphome/components/api/api_pb2_service.cpp +94 -105
  49. esphome/components/api/api_pb2_service.h +27 -16
  50. esphome/components/api/api_server.cpp +18 -17
  51. esphome/components/api/api_server.h +8 -5
  52. esphome/components/api/client.py +16 -8
  53. esphome/components/api/custom_api_device.h +68 -14
  54. esphome/components/api/homeassistant_service.h +24 -19
  55. esphome/components/api/list_entities.cpp +3 -5
  56. esphome/components/api/list_entities.h +2 -4
  57. esphome/components/api/proto.cpp +3 -5
  58. esphome/components/api/proto.h +239 -274
  59. esphome/components/api/subscribe_state.cpp +2 -4
  60. esphome/components/api/subscribe_state.h +2 -4
  61. esphome/components/api/user_services.cpp +2 -4
  62. esphome/components/api/user_services.h +8 -8
  63. esphome/components/as3935/as3935.cpp +0 -2
  64. esphome/components/as3935_spi/as3935_spi.cpp +0 -2
  65. esphome/components/as5600/__init__.py +1 -1
  66. esphome/components/as5600/as5600.cpp +0 -2
  67. esphome/components/as5600/sensor/__init__.py +0 -1
  68. esphome/components/as7341/as7341.cpp +0 -1
  69. esphome/components/async_tcp/__init__.py +1 -1
  70. esphome/components/at581x/at581x.cpp +1 -1
  71. esphome/components/atm90e26/atm90e26.cpp +0 -1
  72. esphome/components/atm90e32/atm90e32.cpp +488 -118
  73. esphome/components/atm90e32/atm90e32.h +44 -5
  74. esphome/components/audio/audio.h +2 -2
  75. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
  76. esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
  77. esphome/components/bh1750/bh1750.cpp +0 -1
  78. esphome/components/binary_sensor/__init__.py +14 -12
  79. esphome/components/ble_client/__init__.py +4 -7
  80. esphome/components/bluetooth_proxy/__init__.py +40 -3
  81. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +387 -82
  82. esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
  83. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
  84. esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
  85. esphome/components/bme280_base/bme280_base.cpp +15 -16
  86. esphome/components/bme680/bme680.cpp +2 -3
  87. esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
  88. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
  89. esphome/components/bmi160/bmi160.cpp +0 -1
  90. esphome/components/bmp085/bmp085.cpp +0 -1
  91. esphome/components/bmp280_base/bmp280_base.cpp +13 -14
  92. esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
  93. esphome/components/bmp581/bmp581.cpp +0 -2
  94. esphome/components/bp1658cj/bp1658cj.cpp +0 -1
  95. esphome/components/bp5758d/bp5758d.cpp +0 -1
  96. esphome/components/button/__init__.py +0 -1
  97. esphome/components/canbus/__init__.py +2 -3
  98. esphome/components/canbus/canbus.cpp +0 -1
  99. esphome/components/cap1188/cap1188.cpp +0 -2
  100. esphome/components/captive_portal/__init__.py +1 -1
  101. esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
  102. esphome/components/ch422g/ch422g.cpp +0 -1
  103. esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
  104. esphome/components/climate/__init__.py +0 -1
  105. esphome/components/climate/climate_traits.h +24 -0
  106. esphome/components/cm1106/cm1106.cpp +0 -1
  107. esphome/components/const/__init__.py +6 -0
  108. esphome/components/cover/__init__.py +0 -1
  109. esphome/components/cover/cover.cpp +9 -13
  110. esphome/components/cs5460a/cs5460a.cpp +0 -2
  111. esphome/components/cse7761/cse7761.cpp +0 -1
  112. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
  113. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
  114. esphome/components/dac7678/dac7678_output.cpp +0 -2
  115. esphome/components/dallas_temp/dallas_temp.cpp +0 -1
  116. esphome/components/datetime/__init__.py +0 -2
  117. esphome/components/debug/__init__.py +15 -1
  118. esphome/components/debug/debug_zephyr.cpp +281 -0
  119. esphome/components/debug/sensor.py +2 -1
  120. esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
  121. esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
  122. esphome/components/dfrobot_sen0395/__init__.py +1 -2
  123. esphome/components/dht/dht.cpp +0 -1
  124. esphome/components/dht12/dht12.cpp +0 -1
  125. esphome/components/display/__init__.py +16 -3
  126. esphome/components/display_menu_base/__init__.py +1 -1
  127. esphome/components/dps310/dps310.cpp +0 -2
  128. esphome/components/ds1307/ds1307.cpp +0 -1
  129. esphome/components/ds2484/ds2484.cpp +0 -1
  130. esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
  131. esphome/components/ee895/ee895.cpp +0 -1
  132. esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
  133. esphome/components/emc2101/emc2101.cpp +0 -2
  134. esphome/components/ens160_base/ens160_base.cpp +0 -2
  135. esphome/components/ens210/ens210.cpp +0 -1
  136. esphome/components/es7210/es7210.cpp +0 -2
  137. esphome/components/es7243e/es7243e.cpp +0 -2
  138. esphome/components/es8156/es8156.cpp +0 -2
  139. esphome/components/es8311/es8311.cpp +0 -2
  140. esphome/components/es8388/es8388.cpp +0 -2
  141. esphome/components/esp32/__init__.py +199 -58
  142. esphome/components/esp32/boards.py +17 -0
  143. esphome/components/esp32/gpio.cpp +0 -1
  144. esphome/components/esp32/gpio.py +1 -2
  145. esphome/components/esp32/gpio_esp32_h2.py +2 -7
  146. esphome/components/esp32/gpio_esp32_p4.py +2 -7
  147. esphome/components/esp32/post_build.py.script +112 -61
  148. esphome/components/esp32_ble/__init__.py +40 -2
  149. esphome/components/esp32_ble/ble.cpp +12 -8
  150. esphome/components/esp32_ble/ble.h +18 -18
  151. esphome/components/esp32_ble/ble_advertising.cpp +5 -5
  152. esphome/components/esp32_ble/ble_advertising.h +7 -5
  153. esphome/components/esp32_ble/ble_event.h +2 -4
  154. esphome/components/esp32_ble/ble_scan_result.h +2 -4
  155. esphome/components/esp32_ble/ble_uuid.cpp +5 -5
  156. esphome/components/esp32_ble/ble_uuid.h +6 -5
  157. esphome/components/esp32_ble_beacon/__init__.py +4 -0
  158. esphome/components/esp32_ble_client/__init__.py +1 -1
  159. esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
  160. esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
  161. esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
  162. esphome/components/esp32_ble_client/ble_client_base.h +17 -6
  163. esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
  164. esphome/components/esp32_ble_client/ble_service.cpp +4 -4
  165. esphome/components/esp32_ble_client/ble_service.h +6 -4
  166. esphome/components/esp32_ble_server/__init__.py +15 -12
  167. esphome/components/esp32_ble_tracker/__init__.py +79 -11
  168. esphome/components/esp32_ble_tracker/automation.h +4 -4
  169. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
  170. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
  171. esphome/components/esp32_camera/__init__.py +13 -1
  172. esphome/components/esp32_camera/esp32_camera.cpp +7 -2
  173. esphome/components/esp32_camera/esp32_camera.h +1 -0
  174. esphome/components/esp32_dac/esp32_dac.cpp +3 -19
  175. esphome/components/esp32_dac/esp32_dac.h +4 -8
  176. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
  177. esphome/components/esp32_rmt_led_strip/light.py +1 -1
  178. esphome/components/esp32_touch/__init__.py +2 -3
  179. esphome/components/esp32_touch/esp32_touch.h +9 -6
  180. esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
  181. esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
  182. esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
  183. esphome/components/esp8266/__init__.py +3 -1
  184. esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
  185. esphome/components/esphome/ota/__init__.py +1 -2
  186. esphome/components/esphome/ota/ota_esphome.cpp +150 -77
  187. esphome/components/esphome/ota/ota_esphome.h +8 -1
  188. esphome/components/espnow/__init__.py +309 -0
  189. esphome/components/espnow/automation.h +175 -0
  190. esphome/components/espnow/espnow_component.cpp +468 -0
  191. esphome/components/espnow/espnow_component.h +183 -0
  192. esphome/components/espnow/espnow_err.h +19 -0
  193. esphome/components/espnow/espnow_packet.h +166 -0
  194. esphome/components/ethernet/__init__.py +7 -1
  195. esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
  196. esphome/components/ethernet/ethernet_component.cpp +0 -1
  197. esphome/components/ethernet/ethernet_component.h +4 -0
  198. esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
  199. esphome/components/event/__init__.py +0 -1
  200. esphome/components/factory_reset/__init__.py +92 -0
  201. esphome/components/factory_reset/factory_reset.cpp +76 -0
  202. esphome/components/factory_reset/factory_reset.h +43 -0
  203. esphome/components/fan/__init__.py +0 -1
  204. esphome/components/fan/fan_traits.h +16 -0
  205. esphome/components/fastled_base/fastled_light.cpp +0 -1
  206. esphome/components/fastled_spi/light.py +1 -3
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
  208. esphome/components/font/__init__.py +9 -1
  209. esphome/components/fs3000/fs3000.cpp +0 -2
  210. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  211. esphome/components/ft63x6/ft63x6.cpp +0 -1
  212. esphome/components/gdk101/gdk101.cpp +0 -1
  213. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  214. esphome/components/gl_r01_i2c/sensor.py +1 -1
  215. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  216. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  217. esphome/components/gpio_expander/cached_gpio.h +24 -15
  218. esphome/components/gps/__init__.py +6 -2
  219. esphome/components/gps/gps.cpp +50 -49
  220. esphome/components/gps/gps.h +4 -8
  221. esphome/components/gps/time/gps_time.cpp +3 -9
  222. esphome/components/gps/time/gps_time.h +4 -7
  223. esphome/components/graph/__init__.py +1 -1
  224. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  225. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  227. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  228. esphome/components/haier/climate.py +5 -10
  229. esphome/components/haier/haier_base.cpp +0 -1
  230. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  231. esphome/components/hdc1080/hdc1080.cpp +0 -2
  232. esphome/components/heatpumpir/climate.py +2 -2
  233. esphome/components/hlw8012/hlw8012.cpp +0 -1
  234. esphome/components/hm3301/hm3301.cpp +0 -1
  235. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  236. esphome/components/homeassistant/__init__.py +1 -0
  237. esphome/components/homeassistant/number/__init__.py +1 -0
  238. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  239. esphome/components/homeassistant/switch/__init__.py +1 -0
  240. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  241. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  242. esphome/components/host/__init__.py +2 -0
  243. esphome/components/hte501/hte501.cpp +0 -1
  244. esphome/components/http_request/__init__.py +2 -3
  245. esphome/components/http_request/http_request_idf.cpp +2 -2
  246. esphome/components/htu21d/htu21d.cpp +0 -2
  247. esphome/components/htu31d/htu31d.cpp +0 -2
  248. esphome/components/hx711/hx711.cpp +0 -1
  249. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  250. esphome/components/hydreon_rgxx/sensor.py +4 -5
  251. esphome/components/i2c/i2c_bus.h +1 -1
  252. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  253. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  254. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  255. esphome/components/i2s_audio/__init__.py +6 -5
  256. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  257. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  258. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +46 -19
  260. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -3
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  262. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  263. esphome/components/ili9xxx/display.py +4 -3
  264. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  265. esphome/components/image/__init__.py +123 -92
  266. esphome/components/improv_serial/__init__.py +7 -8
  267. esphome/components/ina219/ina219.cpp +0 -1
  268. esphome/components/ina226/ina226.cpp +0 -2
  269. esphome/components/ina260/ina260.cpp +0 -2
  270. esphome/components/ina2xx_base/__init__.py +2 -5
  271. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  272. esphome/components/ina3221/ina3221.cpp +0 -1
  273. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  274. esphome/components/interval/interval.h +5 -9
  275. esphome/components/json/__init__.py +1 -1
  276. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  277. esphome/components/lc709203f/lc709203f.cpp +0 -2
  278. esphome/components/lcd_gpio/display.py +1 -3
  279. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  280. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  281. esphome/components/ld2410/__init__.py +4 -6
  282. esphome/components/ld2410/binary_sensor.py +4 -0
  283. esphome/components/ld2410/ld2410.cpp +56 -100
  284. esphome/components/ld2410/ld2410.h +17 -15
  285. esphome/components/ld2410/sensor.py +24 -10
  286. esphome/components/ld2412/__init__.py +46 -0
  287. esphome/components/ld2412/binary_sensor.py +70 -0
  288. esphome/components/ld2412/button/__init__.py +74 -0
  289. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  290. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  291. esphome/components/ld2412/button/query_button.cpp +9 -0
  292. esphome/components/ld2412/button/query_button.h +18 -0
  293. esphome/components/ld2412/button/restart_button.cpp +9 -0
  294. esphome/components/ld2412/button/restart_button.h +18 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  296. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  297. esphome/components/ld2412/ld2412.cpp +861 -0
  298. esphome/components/ld2412/ld2412.h +141 -0
  299. esphome/components/ld2412/number/__init__.py +126 -0
  300. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  301. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  302. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  303. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  305. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  306. esphome/components/ld2412/select/__init__.py +82 -0
  307. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  308. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  309. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  310. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  311. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  312. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  313. esphome/components/ld2412/sensor.py +124 -0
  314. esphome/components/ld2412/switch/__init__.py +45 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  316. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  318. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  319. esphome/components/ld2412/text_sensor.py +34 -0
  320. esphome/components/ld2420/ld2420.cpp +0 -1
  321. esphome/components/ld2450/__init__.py +3 -4
  322. esphome/components/ld2450/binary_sensor.py +3 -0
  323. esphome/components/ld2450/ld2450.cpp +77 -165
  324. esphome/components/ld2450/ld2450.h +26 -54
  325. esphome/components/ld2450/sensor.py +120 -6
  326. esphome/components/ld2450/text_sensor.py +5 -4
  327. esphome/components/ld24xx/__init__.py +1 -0
  328. esphome/components/ld24xx/ld24xx.h +65 -0
  329. esphome/components/ledc/ledc_output.cpp +0 -1
  330. esphome/components/libretiny/__init__.py +2 -0
  331. esphome/components/light/__init__.py +0 -1
  332. esphome/components/light/effects.py +70 -45
  333. esphome/components/light/light_call.cpp +101 -66
  334. esphome/components/light/light_color_values.h +16 -11
  335. esphome/components/light/light_json_schema.cpp +46 -44
  336. esphome/components/light/light_state.cpp +8 -11
  337. esphome/components/light/light_traits.h +17 -0
  338. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  339. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  340. esphome/components/lock/__init__.py +0 -1
  341. esphome/components/logger/__init__.py +31 -9
  342. esphome/components/logger/logger.cpp +12 -7
  343. esphome/components/logger/logger.h +25 -14
  344. esphome/components/logger/logger_esp32.cpp +2 -7
  345. esphome/components/logger/logger_esp8266.cpp +2 -4
  346. esphome/components/logger/logger_host.cpp +2 -4
  347. esphome/components/logger/logger_libretiny.cpp +2 -4
  348. esphome/components/logger/logger_rp2040.cpp +2 -4
  349. esphome/components/logger/logger_zephyr.cpp +86 -0
  350. esphome/components/logger/select/logger_level_select.cpp +2 -4
  351. esphome/components/logger/select/logger_level_select.h +2 -4
  352. esphome/components/logger/task_log_buffer.cpp +2 -4
  353. esphome/components/logger/task_log_buffer.h +2 -4
  354. esphome/components/lps22/sensor.py +5 -5
  355. esphome/components/ltr390/ltr390.cpp +0 -2
  356. esphome/components/ltr501/ltr501.cpp +0 -1
  357. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  358. esphome/components/lvgl/__init__.py +14 -13
  359. esphome/components/lvgl/automation.py +2 -4
  360. esphome/components/lvgl/defines.py +0 -2
  361. esphome/components/lvgl/helpers.py +1 -1
  362. esphome/components/lvgl/lv_validation.py +7 -4
  363. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  364. esphome/components/lvgl/styles.py +2 -2
  365. esphome/components/lvgl/types.py +1 -1
  366. esphome/components/lvgl/widgets/__init__.py +2 -2
  367. esphome/components/lvgl/widgets/arc.py +14 -11
  368. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  369. esphome/components/lvgl/widgets/qrcode.py +7 -7
  370. esphome/components/lvgl/widgets/spinner.py +6 -6
  371. esphome/components/lvgl/widgets/switch.py +2 -2
  372. esphome/components/lvgl/widgets/tabview.py +3 -3
  373. esphome/components/lvgl/widgets/tileview.py +15 -7
  374. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  375. esphome/components/matrix_keypad/__init__.py +4 -3
  376. esphome/components/max17043/max17043.cpp +0 -2
  377. esphome/components/max31855/max31855.cpp +1 -4
  378. esphome/components/max31856/max31856.cpp +0 -4
  379. esphome/components/max31865/max31865.cpp +0 -1
  380. esphome/components/max44009/max44009.cpp +0 -1
  381. esphome/components/max6675/max6675.cpp +1 -4
  382. esphome/components/max6956/max6956.cpp +0 -1
  383. esphome/components/max7219/max7219.cpp +0 -1
  384. esphome/components/max7219digit/display.py +1 -1
  385. esphome/components/max7219digit/max7219digit.cpp +0 -1
  386. esphome/components/max9611/max9611.cpp +0 -1
  387. esphome/components/mcp23008/__init__.py +1 -1
  388. esphome/components/mcp23008/mcp23008.cpp +0 -1
  389. esphome/components/mcp23016/mcp23016.cpp +0 -1
  390. esphome/components/mcp23017/__init__.py +1 -1
  391. esphome/components/mcp23017/mcp23017.cpp +0 -1
  392. esphome/components/mcp23s08/__init__.py +1 -1
  393. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  394. esphome/components/mcp23s17/__init__.py +1 -1
  395. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  396. esphome/components/mcp23x08_base/__init__.py +2 -0
  397. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  398. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  399. esphome/components/mcp23x17_base/__init__.py +2 -0
  400. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  401. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  402. esphome/components/mcp23xxx_base/__init__.py +11 -5
  403. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  404. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  405. esphome/components/mcp3008/mcp3008.cpp +1 -4
  406. esphome/components/mcp3204/mcp3204.cpp +1 -4
  407. esphome/components/mcp4461/mcp4461.cpp +0 -1
  408. esphome/components/mcp4725/mcp4725.cpp +0 -1
  409. esphome/components/mcp4728/mcp4728.cpp +0 -1
  410. esphome/components/mcp9600/mcp9600.cpp +0 -2
  411. esphome/components/mcp9808/mcp9808.cpp +0 -2
  412. esphome/components/mdns/__init__.py +3 -0
  413. esphome/components/mdns/mdns_component.cpp +2 -0
  414. esphome/components/mdns/mdns_component.h +4 -0
  415. esphome/components/media_player/__init__.py +40 -0
  416. esphome/components/media_player/automation.h +16 -0
  417. esphome/components/media_player/media_player.cpp +13 -0
  418. esphome/components/media_player/media_player.h +50 -3
  419. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  420. esphome/components/mics_4514/mics_4514.cpp +1 -6
  421. esphome/components/midea/ir_transmitter.h +4 -4
  422. esphome/components/mipi/__init__.py +416 -0
  423. esphome/components/mipi_dsi/__init__.py +5 -0
  424. esphome/components/mipi_dsi/display.py +233 -0
  425. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  426. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  427. esphome/components/mipi_dsi/models/__init__.py +0 -0
  428. esphome/components/mipi_dsi/models/guition.py +38 -0
  429. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  430. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  431. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  432. esphome/components/mipi_spi/__init__.py +0 -9
  433. esphome/components/mipi_spi/display.py +220 -256
  434. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  435. esphome/components/mipi_spi/mipi_spi.h +556 -108
  436. esphome/components/mipi_spi/models/__init__.py +0 -65
  437. esphome/components/mipi_spi/models/adafruit.py +30 -0
  438. esphome/components/mipi_spi/models/amoled.py +41 -5
  439. esphome/components/mipi_spi/models/ili.py +5 -5
  440. esphome/components/mipi_spi/models/jc.py +1 -3
  441. esphome/components/mipi_spi/models/lilygo.py +1 -1
  442. esphome/components/mipi_spi/models/waveshare.py +16 -1
  443. esphome/components/mixer/speaker/__init__.py +4 -5
  444. esphome/components/mlx90393/sensor.py +7 -5
  445. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  446. esphome/components/mlx90614/mlx90614.cpp +0 -1
  447. esphome/components/mmc5603/mmc5603.cpp +0 -1
  448. esphome/components/mmc5983/mmc5983.cpp +0 -2
  449. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  450. esphome/components/mpr121/__init__.py +7 -6
  451. esphome/components/mpr121/mpr121.cpp +0 -1
  452. esphome/components/mpu6050/mpu6050.cpp +0 -1
  453. esphome/components/mpu6886/mpu6886.cpp +0 -1
  454. esphome/components/mqtt/__init__.py +1 -2
  455. esphome/components/mqtt/mqtt_button.cpp +1 -1
  456. esphome/components/mqtt/mqtt_client.cpp +0 -1
  457. esphome/components/mqtt/mqtt_component.cpp +8 -14
  458. esphome/components/mqtt/mqtt_component.h +0 -7
  459. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_sensor.h +0 -1
  461. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  462. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  463. esphome/components/ms5611/ms5611.cpp +0 -1
  464. esphome/components/ms8607/ms8607.cpp +0 -1
  465. esphome/components/msa3xx/msa3xx.cpp +0 -2
  466. esphome/components/my9231/my9231.cpp +0 -2
  467. esphome/components/nau7802/nau7802.cpp +0 -1
  468. esphome/components/neopixelbus/light.py +3 -0
  469. esphome/components/network/util.cpp +29 -0
  470. esphome/components/nextion/nextion.cpp +0 -1
  471. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  472. esphome/components/npi19/npi19.cpp +0 -2
  473. esphome/components/nrf52/__init__.py +223 -0
  474. esphome/components/nrf52/boards.py +34 -0
  475. esphome/components/nrf52/const.py +18 -0
  476. esphome/components/nrf52/gpio.py +79 -0
  477. esphome/components/number/__init__.py +2 -1
  478. esphome/components/one_wire/__init__.py +1 -2
  479. esphome/components/one_wire/one_wire.cpp +0 -2
  480. esphome/components/one_wire/one_wire.h +0 -2
  481. esphome/components/opentherm/hub.cpp +0 -1
  482. esphome/components/opentherm/number/__init__.py +2 -2
  483. esphome/components/openthread/__init__.py +2 -3
  484. esphome/components/openthread/openthread.cpp +30 -13
  485. esphome/components/openthread/openthread.h +3 -0
  486. esphome/components/openthread/openthread_esp.cpp +3 -1
  487. esphome/components/opt3001/sensor.py +2 -6
  488. esphome/components/output/__init__.py +38 -0
  489. esphome/components/output/automation.h +24 -0
  490. esphome/components/output/switch/output_switch.cpp +0 -2
  491. esphome/components/packages/__init__.py +1 -2
  492. esphome/components/packet_transport/__init__.py +4 -3
  493. esphome/components/pca6416a/pca6416a.cpp +0 -1
  494. esphome/components/pca9554/pca9554.cpp +0 -1
  495. esphome/components/pca9685/pca9685_output.cpp +0 -2
  496. esphome/components/pcf85063/pcf85063.cpp +0 -1
  497. esphome/components/pcf8563/pcf8563.cpp +0 -1
  498. esphome/components/pcf8574/pcf8574.cpp +0 -1
  499. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  500. esphome/components/pipsolar/sensor/__init__.py +1 -1
  501. esphome/components/pm2005/pm2005.cpp +0 -1
  502. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  503. esphome/components/pmwcs3/sensor.py +1 -2
  504. esphome/components/pn532/pn532.cpp +0 -2
  505. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  506. esphome/components/power_supply/power_supply.cpp +7 -10
  507. esphome/components/power_supply/power_supply.h +1 -1
  508. esphome/components/psram/__init__.py +2 -1
  509. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  510. esphome/components/pulse_counter/sensor.py +9 -6
  511. esphome/components/pylontech/pylontech.cpp +0 -1
  512. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  513. esphome/components/qmp6988/qmp6988.cpp +0 -2
  514. esphome/components/qspi_dbi/display.py +2 -3
  515. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  516. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  517. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  518. esphome/components/rc522/rc522.cpp +9 -31
  519. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  520. esphome/components/remote_base/__init__.py +5 -6
  521. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  522. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  523. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  524. esphome/components/remote_transmitter/__init__.py +26 -0
  525. esphome/components/remote_transmitter/automation.h +18 -0
  526. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  527. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  528. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  529. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  530. esphome/components/resampler/speaker/__init__.py +4 -5
  531. esphome/components/rf_bridge/__init__.py +4 -8
  532. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  533. esphome/components/rp2040/__init__.py +3 -1
  534. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  535. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  536. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  537. esphome/components/rpi_dpi_rgb/display.py +13 -15
  538. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  539. esphome/components/runtime_stats/__init__.py +34 -0
  540. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  541. esphome/components/runtime_stats/runtime_stats.h +132 -0
  542. esphome/components/scd30/scd30.cpp +0 -2
  543. esphome/components/scd30/sensor.py +1 -2
  544. esphome/components/scd4x/scd4x.cpp +0 -1
  545. esphome/components/scd4x/sensor.py +1 -3
  546. esphome/components/sdl/display.py +3 -1
  547. esphome/components/sdl/sdl_esphome.cpp +0 -2
  548. esphome/components/sdp3x/sdp3x.cpp +0 -2
  549. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  550. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  551. esphome/components/select/__init__.py +2 -3
  552. esphome/components/select/select_traits.cpp +1 -1
  553. esphome/components/select/select_traits.h +1 -1
  554. esphome/components/sen0321/sen0321.cpp +0 -1
  555. esphome/components/sen5x/sen5x.cpp +0 -2
  556. esphome/components/sensor/__init__.py +36 -4
  557. esphome/components/sensor/filter.cpp +49 -10
  558. esphome/components/sensor/filter.h +22 -7
  559. esphome/components/sensor/sensor.cpp +0 -1
  560. esphome/components/sensor/sensor.h +0 -9
  561. esphome/components/sfa30/sfa30.cpp +0 -4
  562. esphome/components/sgp30/sgp30.cpp +0 -2
  563. esphome/components/sgp4x/sensor.py +1 -1
  564. esphome/components/sgp4x/sgp4x.cpp +0 -2
  565. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  566. esphome/components/sht3xd/sht3xd.cpp +0 -2
  567. esphome/components/sht4x/sht4x.cpp +0 -2
  568. esphome/components/shtcx/shtcx.cpp +0 -1
  569. esphome/components/sim800l/__init__.py +2 -4
  570. esphome/components/sm16716/sm16716.cpp +0 -1
  571. esphome/components/sm2135/sm2135.cpp +0 -1
  572. esphome/components/sm2235/sm2235.cpp +0 -1
  573. esphome/components/sm2335/sm2335.cpp +0 -1
  574. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  575. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  576. esphome/components/sntp/sntp_component.cpp +0 -1
  577. esphome/components/sound_level/sensor.py +1 -1
  578. esphome/components/speaker/media_player/__init__.py +21 -33
  579. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  580. esphome/components/spi/__init__.py +29 -13
  581. esphome/components/spi/spi.cpp +0 -2
  582. esphome/components/spi_device/spi_device.cpp +1 -4
  583. esphome/components/sprinkler/__init__.py +4 -4
  584. esphome/components/sps30/sps30.cpp +0 -1
  585. esphome/components/ssd1306_base/__init__.py +11 -11
  586. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  587. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  588. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  589. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  590. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  591. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  592. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  593. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  594. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  595. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  596. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  597. esphome/components/st7701s/display.py +10 -14
  598. esphome/components/st7701s/st7701s.cpp +0 -3
  599. esphome/components/st7735/st7735.cpp +0 -1
  600. esphome/components/st7789v/st7789v.cpp +0 -1
  601. esphome/components/st7920/st7920.cpp +0 -1
  602. esphome/components/status_led/light/status_led_light.cpp +0 -2
  603. esphome/components/status_led/status_led.cpp +0 -1
  604. esphome/components/stepper/__init__.py +2 -4
  605. esphome/components/sts3x/sts3x.cpp +0 -1
  606. esphome/components/substitutions/__init__.py +10 -16
  607. esphome/components/substitutions/jinja.py +24 -1
  608. esphome/components/sun/__init__.py +2 -3
  609. esphome/components/switch/__init__.py +31 -1
  610. esphome/components/switch/automation.h +24 -0
  611. esphome/components/switch/switch.cpp +8 -0
  612. esphome/components/switch/switch.h +8 -0
  613. esphome/components/sx126x/sx126x.cpp +0 -2
  614. esphome/components/sx127x/sx127x.cpp +0 -2
  615. esphome/components/sx1509/__init__.py +7 -5
  616. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  617. esphome/components/sx1509/sx1509.cpp +0 -2
  618. esphome/components/syslog/esphome_syslog.cpp +1 -1
  619. esphome/components/tc74/tc74.cpp +0 -1
  620. esphome/components/tca9548a/tca9548a.cpp +0 -1
  621. esphome/components/tca9555/tca9555.cpp +0 -1
  622. esphome/components/tcs34725/tcs34725.cpp +0 -1
  623. esphome/components/tee501/tee501.cpp +0 -1
  624. esphome/components/tem3200/tem3200.cpp +0 -2
  625. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  626. esphome/components/template/cover/template_cover.cpp +0 -1
  627. esphome/components/template/select/template_select.cpp +0 -1
  628. esphome/components/template/text/template_text.cpp +0 -2
  629. esphome/components/template/valve/template_valve.cpp +0 -1
  630. esphome/components/text/__init__.py +0 -1
  631. esphome/components/text/text_traits.h +2 -0
  632. esphome/components/text_sensor/__init__.py +2 -1
  633. esphome/components/text_sensor/text_sensor.cpp +0 -2
  634. esphome/components/text_sensor/text_sensor.h +0 -8
  635. esphome/components/thermostat/climate.py +4 -4
  636. esphome/components/time/__init__.py +7 -4
  637. esphome/components/time/real_time_clock.cpp +16 -3
  638. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  639. esphome/components/tlc5947/tlc5947.cpp +0 -2
  640. esphome/components/tlc5971/tlc5971.cpp +0 -2
  641. esphome/components/tm1621/tm1621.cpp +0 -2
  642. esphome/components/tm1637/tm1637.cpp +0 -2
  643. esphome/components/tm1638/tm1638.cpp +0 -2
  644. esphome/components/tm1651/__init__.py +45 -48
  645. esphome/components/tm1651/tm1651.cpp +213 -47
  646. esphome/components/tm1651/tm1651.h +37 -32
  647. esphome/components/tmp117/tmp117.cpp +0 -2
  648. esphome/components/tsl2561/tsl2561.cpp +0 -1
  649. esphome/components/tsl2591/tsl2591.cpp +0 -1
  650. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  651. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  652. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  653. esphome/components/tuya/climate/__init__.py +9 -10
  654. esphome/components/tuya/number/__init__.py +8 -6
  655. esphome/components/tx20/tx20.cpp +0 -1
  656. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  657. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  658. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  659. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  660. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  661. esphome/components/udp/__init__.py +1 -1
  662. esphome/components/ufire_ec/sensor.py +1 -2
  663. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  664. esphome/components/ufire_ise/sensor.py +1 -2
  665. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  666. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  667. esphome/components/update/__init__.py +0 -1
  668. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  669. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  670. esphome/components/usb_host/usb_host_client.cpp +0 -1
  671. esphome/components/usb_host/usb_host_component.cpp +0 -1
  672. esphome/components/valve/__init__.py +0 -1
  673. esphome/components/veml3235/veml3235.cpp +0 -3
  674. esphome/components/veml7700/veml7700.cpp +0 -2
  675. esphome/components/version/version_text_sensor.cpp +0 -1
  676. esphome/components/version/version_text_sensor.h +0 -1
  677. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  678. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  679. esphome/components/web_server/__init__.py +13 -0
  680. esphome/components/web_server/web_server.cpp +187 -352
  681. esphome/components/web_server/web_server.h +61 -1
  682. esphome/components/web_server_base/__init__.py +1 -1
  683. esphome/components/web_server_base/web_server_base.cpp +2 -0
  684. esphome/components/web_server_base/web_server_base.h +6 -0
  685. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  686. esphome/components/web_server_idf/web_server_idf.h +2 -0
  687. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  688. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  689. esphome/components/wifi/__init__.py +8 -43
  690. esphome/components/wifi/wifi_component.cpp +100 -36
  691. esphome/components/wifi/wifi_component.h +5 -1
  692. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  693. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  694. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  695. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  696. esphome/components/wireguard/wireguard.cpp +0 -2
  697. esphome/components/x9c/x9c.cpp +0 -2
  698. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  699. esphome/components/xl9535/xl9535.cpp +0 -2
  700. esphome/components/zephyr/__init__.py +252 -0
  701. esphome/components/zephyr/const.py +16 -0
  702. esphome/components/zephyr/core.cpp +90 -0
  703. esphome/components/zephyr/gpio.cpp +120 -0
  704. esphome/components/zephyr/gpio.h +38 -0
  705. esphome/components/zephyr/pre_build.py.script +4 -0
  706. esphome/components/zephyr/preferences.cpp +156 -0
  707. esphome/components/zephyr/preferences.h +13 -0
  708. esphome/config.py +38 -16
  709. esphome/config_helpers.py +1 -2
  710. esphome/config_validation.py +8 -15
  711. esphome/const.py +26 -1
  712. esphome/core/__init__.py +88 -51
  713. esphome/core/application.cpp +75 -21
  714. esphome/core/application.h +106 -171
  715. esphome/core/color.h +10 -0
  716. esphome/core/component.cpp +41 -25
  717. esphome/core/component.h +9 -6
  718. esphome/core/component_iterator.cpp +61 -261
  719. esphome/core/component_iterator.h +15 -0
  720. esphome/core/config.py +26 -11
  721. esphome/core/defines.h +40 -2
  722. esphome/core/entity_base.h +18 -0
  723. esphome/core/entity_helpers.py +41 -6
  724. esphome/core/helpers.cpp +8 -15
  725. esphome/core/helpers.h +60 -6
  726. esphome/core/lock_free_queue.h +1 -1
  727. esphome/core/scheduler.cpp +277 -74
  728. esphome/core/scheduler.h +89 -27
  729. esphome/cpp_generator.py +2 -6
  730. esphome/cpp_helpers.py +1 -1
  731. esphome/dashboard/dashboard.py +2 -3
  732. esphome/dashboard/dns.py +2 -8
  733. esphome/dashboard/web_server.py +34 -19
  734. esphome/espota2.py +1 -4
  735. esphome/git.py +3 -1
  736. esphome/helpers.py +23 -4
  737. esphome/log.py +3 -1
  738. esphome/mqtt.py +3 -5
  739. esphome/platformio_api.py +7 -4
  740. esphome/types.py +12 -0
  741. esphome/util.py +20 -8
  742. esphome/voluptuous_schema.py +4 -3
  743. esphome/vscode.py +1 -2
  744. esphome/wizard.py +1 -4
  745. esphome/writer.py +5 -107
  746. esphome/yaml_util.py +7 -5
  747. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/METADATA +12 -13
  748. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/RECORD +753 -673
  749. esphome/components/mipi_spi/models/commands.py +0 -82
  750. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  751. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/WHEEL +0 -0
  752. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/entry_points.txt +0 -0
  753. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/licenses/LICENSE +0 -0
  754. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/top_level.txt +0 -0
@@ -6,8 +6,7 @@
6
6
 
7
7
  #include "api_pb2.h"
8
8
 
9
- namespace esphome {
10
- namespace api {
9
+ namespace esphome::api {
11
10
 
12
11
  class APIServerConnectionBase : public ProtoService {
13
12
  public:
@@ -18,11 +17,11 @@ class APIServerConnectionBase : public ProtoService {
18
17
  public:
19
18
  #endif
20
19
 
21
- template<typename T> bool send_message(const T &msg) {
20
+ bool send_message(const ProtoMessage &msg, uint8_t message_type) {
22
21
  #ifdef HAS_PROTO_MESSAGE_DUMP
23
22
  this->log_send_message_(msg.message_name(), msg.dump());
24
23
  #endif
25
- return this->send_message_(msg, T::MESSAGE_TYPE);
24
+ return this->send_message_(msg, message_type);
26
25
  }
27
26
 
28
27
  virtual void on_hello_request(const HelloRequest &value){};
@@ -61,11 +60,17 @@ class APIServerConnectionBase : public ProtoService {
61
60
  virtual void on_noise_encryption_set_key_request(const NoiseEncryptionSetKeyRequest &value){};
62
61
  #endif
63
62
 
63
+ #ifdef USE_API_HOMEASSISTANT_SERVICES
64
64
  virtual void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &value){};
65
+ #endif
65
66
 
67
+ #ifdef USE_API_HOMEASSISTANT_STATES
66
68
  virtual void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &value){};
69
+ #endif
67
70
 
71
+ #ifdef USE_API_HOMEASSISTANT_STATES
68
72
  virtual void on_home_assistant_state_response(const HomeAssistantStateResponse &value){};
73
+ #endif
69
74
  virtual void on_get_time_request(const GetTimeRequest &value){};
70
75
  virtual void on_get_time_response(const GetTimeResponse &value){};
71
76
 
@@ -207,22 +212,26 @@ class APIServerConnectionBase : public ProtoService {
207
212
 
208
213
  class APIServerConnection : public APIServerConnectionBase {
209
214
  public:
210
- virtual HelloResponse hello(const HelloRequest &msg) = 0;
211
- virtual ConnectResponse connect(const ConnectRequest &msg) = 0;
212
- virtual DisconnectResponse disconnect(const DisconnectRequest &msg) = 0;
213
- virtual PingResponse ping(const PingRequest &msg) = 0;
214
- virtual DeviceInfoResponse device_info(const DeviceInfoRequest &msg) = 0;
215
+ virtual bool send_hello_response(const HelloRequest &msg) = 0;
216
+ virtual bool send_connect_response(const ConnectRequest &msg) = 0;
217
+ virtual bool send_disconnect_response(const DisconnectRequest &msg) = 0;
218
+ virtual bool send_ping_response(const PingRequest &msg) = 0;
219
+ virtual bool send_device_info_response(const DeviceInfoRequest &msg) = 0;
215
220
  virtual void list_entities(const ListEntitiesRequest &msg) = 0;
216
221
  virtual void subscribe_states(const SubscribeStatesRequest &msg) = 0;
217
222
  virtual void subscribe_logs(const SubscribeLogsRequest &msg) = 0;
223
+ #ifdef USE_API_HOMEASSISTANT_SERVICES
218
224
  virtual void subscribe_homeassistant_services(const SubscribeHomeassistantServicesRequest &msg) = 0;
225
+ #endif
226
+ #ifdef USE_API_HOMEASSISTANT_STATES
219
227
  virtual void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) = 0;
220
- virtual GetTimeResponse get_time(const GetTimeRequest &msg) = 0;
228
+ #endif
229
+ virtual bool send_get_time_response(const GetTimeRequest &msg) = 0;
221
230
  #ifdef USE_API_SERVICES
222
231
  virtual void execute_service(const ExecuteServiceRequest &msg) = 0;
223
232
  #endif
224
233
  #ifdef USE_API_NOISE
225
- virtual NoiseEncryptionSetKeyResponse noise_encryption_set_key(const NoiseEncryptionSetKeyRequest &msg) = 0;
234
+ virtual bool send_noise_encryption_set_key_response(const NoiseEncryptionSetKeyRequest &msg) = 0;
226
235
  #endif
227
236
  #ifdef USE_BUTTON
228
237
  virtual void button_command(const ButtonCommandRequest &msg) = 0;
@@ -303,7 +312,7 @@ class APIServerConnection : public APIServerConnectionBase {
303
312
  virtual void bluetooth_gatt_notify(const BluetoothGATTNotifyRequest &msg) = 0;
304
313
  #endif
305
314
  #ifdef USE_BLUETOOTH_PROXY
306
- virtual BluetoothConnectionsFreeResponse subscribe_bluetooth_connections_free(
315
+ virtual bool send_subscribe_bluetooth_connections_free_response(
307
316
  const SubscribeBluetoothConnectionsFreeRequest &msg) = 0;
308
317
  #endif
309
318
  #ifdef USE_BLUETOOTH_PROXY
@@ -316,8 +325,7 @@ class APIServerConnection : public APIServerConnectionBase {
316
325
  virtual void subscribe_voice_assistant(const SubscribeVoiceAssistantRequest &msg) = 0;
317
326
  #endif
318
327
  #ifdef USE_VOICE_ASSISTANT
319
- virtual VoiceAssistantConfigurationResponse voice_assistant_get_configuration(
320
- const VoiceAssistantConfigurationRequest &msg) = 0;
328
+ virtual bool send_voice_assistant_get_configuration_response(const VoiceAssistantConfigurationRequest &msg) = 0;
321
329
  #endif
322
330
  #ifdef USE_VOICE_ASSISTANT
323
331
  virtual void voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) = 0;
@@ -334,8 +342,12 @@ class APIServerConnection : public APIServerConnectionBase {
334
342
  void on_list_entities_request(const ListEntitiesRequest &msg) override;
335
343
  void on_subscribe_states_request(const SubscribeStatesRequest &msg) override;
336
344
  void on_subscribe_logs_request(const SubscribeLogsRequest &msg) override;
345
+ #ifdef USE_API_HOMEASSISTANT_SERVICES
337
346
  void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &msg) override;
347
+ #endif
348
+ #ifdef USE_API_HOMEASSISTANT_STATES
338
349
  void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &msg) override;
350
+ #endif
339
351
  void on_get_time_request(const GetTimeRequest &msg) override;
340
352
  #ifdef USE_API_SERVICES
341
353
  void on_execute_service_request(const ExecuteServiceRequest &msg) override;
@@ -445,5 +457,4 @@ class APIServerConnection : public APIServerConnectionBase {
445
457
  #endif
446
458
  };
447
459
 
448
- } // namespace api
449
- } // namespace esphome
460
+ } // namespace esphome::api
@@ -16,8 +16,7 @@
16
16
 
17
17
  #include <algorithm>
18
18
 
19
- namespace esphome {
20
- namespace api {
19
+ namespace esphome::api {
21
20
 
22
21
  static const char *const TAG = "api";
23
22
 
@@ -31,7 +30,6 @@ APIServer::APIServer() {
31
30
  }
32
31
 
33
32
  void APIServer::setup() {
34
- ESP_LOGCONFIG(TAG, "Running setup");
35
33
  this->setup_controller();
36
34
 
37
35
  #ifdef USE_API_NOISE
@@ -105,7 +103,7 @@ void APIServer::setup() {
105
103
  return;
106
104
  }
107
105
  for (auto &c : this->clients_) {
108
- if (!c->flags_.remove)
106
+ if (!c->flags_.remove && c->get_log_subscription_level() >= level)
109
107
  c->try_send_log_message(level, tag, message, message_len);
110
108
  }
111
109
  });
@@ -185,9 +183,9 @@ void APIServer::loop() {
185
183
 
186
184
  // Rare case: handle disconnection
187
185
  #ifdef USE_API_CLIENT_DISCONNECTED_TRIGGER
188
- this->client_disconnected_trigger_->trigger(client->client_info_, client->client_peername_);
186
+ this->client_disconnected_trigger_->trigger(client->client_info_.name, client->client_info_.peername);
189
187
  #endif
190
- ESP_LOGV(TAG, "Remove connection %s", client->client_info_.c_str());
188
+ ESP_LOGV(TAG, "Remove connection %s", client->client_info_.name.c_str());
191
189
 
192
190
  // Swap with the last element and pop (avoids expensive vector shifts)
193
191
  if (client_index < this->clients_.size() - 1) {
@@ -205,22 +203,20 @@ void APIServer::loop() {
205
203
 
206
204
  void APIServer::dump_config() {
207
205
  ESP_LOGCONFIG(TAG,
208
- "API Server:\n"
206
+ "Server:\n"
209
207
  " Address: %s:%u",
210
208
  network::get_use_address().c_str(), this->port_);
211
209
  #ifdef USE_API_NOISE
212
- ESP_LOGCONFIG(TAG, " Using noise encryption: %s", YESNO(this->noise_ctx_->has_psk()));
210
+ ESP_LOGCONFIG(TAG, " Noise encryption: %s", YESNO(this->noise_ctx_->has_psk()));
213
211
  if (!this->noise_ctx_->has_psk()) {
214
- ESP_LOGCONFIG(TAG, " Supports noise encryption: YES");
212
+ ESP_LOGCONFIG(TAG, " Supports encryption: YES");
215
213
  }
216
214
  #else
217
- ESP_LOGCONFIG(TAG, " Using noise encryption: NO");
215
+ ESP_LOGCONFIG(TAG, " Noise encryption: NO");
218
216
  #endif
219
217
  }
220
218
 
221
219
  #ifdef USE_API_PASSWORD
222
- bool APIServer::uses_password() const { return !this->password_.empty(); }
223
-
224
220
  bool APIServer::check_password(const std::string &password) const {
225
221
  // depend only on input password length
226
222
  const char *a = this->password_.c_str();
@@ -373,12 +369,15 @@ void APIServer::set_password(const std::string &password) { this->password_ = pa
373
369
 
374
370
  void APIServer::set_batch_delay(uint16_t batch_delay) { this->batch_delay_ = batch_delay; }
375
371
 
372
+ #ifdef USE_API_HOMEASSISTANT_SERVICES
376
373
  void APIServer::send_homeassistant_service_call(const HomeassistantServiceResponse &call) {
377
374
  for (auto &client : this->clients_) {
378
375
  client->send_homeassistant_service_call(call);
379
376
  }
380
377
  }
378
+ #endif
381
379
 
380
+ #ifdef USE_API_HOMEASSISTANT_STATES
382
381
  void APIServer::subscribe_home_assistant_state(std::string entity_id, optional<std::string> attribute,
383
382
  std::function<void(std::string)> f) {
384
383
  this->state_subs_.push_back(HomeAssistantStateSubscription{
@@ -402,6 +401,7 @@ void APIServer::get_home_assistant_state(std::string entity_id, optional<std::st
402
401
  const std::vector<APIServer::HomeAssistantStateSubscription> &APIServer::get_state_subs() const {
403
402
  return this->state_subs_;
404
403
  }
404
+ #endif
405
405
 
406
406
  uint16_t APIServer::get_port() const { return this->port_; }
407
407
 
@@ -428,10 +428,11 @@ bool APIServer::save_noise_psk(psk_t psk, bool make_active) {
428
428
  ESP_LOGD(TAG, "Noise PSK saved");
429
429
  if (make_active) {
430
430
  this->set_timeout(100, [this, psk]() {
431
- ESP_LOGW(TAG, "Disconnecting all clients to reset connections");
431
+ ESP_LOGW(TAG, "Disconnecting all clients to reset PSK");
432
432
  this->set_noise_psk(psk);
433
433
  for (auto &c : this->clients_) {
434
- c->send_message(DisconnectRequest());
434
+ DisconnectRequest req;
435
+ c->send_message(req, DisconnectRequest::MESSAGE_TYPE);
435
436
  }
436
437
  });
437
438
  }
@@ -464,7 +465,8 @@ void APIServer::on_shutdown() {
464
465
 
465
466
  // Send disconnect requests to all connected clients
466
467
  for (auto &c : this->clients_) {
467
- if (!c->send_message(DisconnectRequest())) {
468
+ DisconnectRequest req;
469
+ if (!c->send_message(req, DisconnectRequest::MESSAGE_TYPE)) {
468
470
  // If we can't send the disconnect request directly (tx_buffer full),
469
471
  // schedule it at the front of the batch so it will be sent with priority
470
472
  c->schedule_message_front_(nullptr, &APIConnection::try_send_disconnect_request, DisconnectRequest::MESSAGE_TYPE,
@@ -484,6 +486,5 @@ bool APIServer::teardown() {
484
486
  return this->clients_.empty();
485
487
  }
486
488
 
487
- } // namespace api
488
- } // namespace esphome
489
+ } // namespace esphome::api
489
490
  #endif
@@ -18,8 +18,7 @@
18
18
 
19
19
  #include <vector>
20
20
 
21
- namespace esphome {
22
- namespace api {
21
+ namespace esphome::api {
23
22
 
24
23
  #ifdef USE_API_NOISE
25
24
  struct SavedNoisePsk {
@@ -39,7 +38,6 @@ class APIServer : public Component, public Controller {
39
38
  bool teardown() override;
40
39
  #ifdef USE_API_PASSWORD
41
40
  bool check_password(const std::string &password) const;
42
- bool uses_password() const;
43
41
  void set_password(const std::string &password);
44
42
  #endif
45
43
  void set_port(uint16_t port);
@@ -108,7 +106,9 @@ class APIServer : public Component, public Controller {
108
106
  #ifdef USE_MEDIA_PLAYER
109
107
  void on_media_player_update(media_player::MediaPlayer *obj) override;
110
108
  #endif
109
+ #ifdef USE_API_HOMEASSISTANT_SERVICES
111
110
  void send_homeassistant_service_call(const HomeassistantServiceResponse &call);
111
+ #endif
112
112
  #ifdef USE_API_SERVICES
113
113
  void register_user_service(UserServiceDescriptor *descriptor) { this->user_services_.push_back(descriptor); }
114
114
  #endif
@@ -128,6 +128,7 @@ class APIServer : public Component, public Controller {
128
128
 
129
129
  bool is_connected() const;
130
130
 
131
+ #ifdef USE_API_HOMEASSISTANT_STATES
131
132
  struct HomeAssistantStateSubscription {
132
133
  std::string entity_id;
133
134
  optional<std::string> attribute;
@@ -140,6 +141,7 @@ class APIServer : public Component, public Controller {
140
141
  void get_home_assistant_state(std::string entity_id, optional<std::string> attribute,
141
142
  std::function<void(std::string)> f);
142
143
  const std::vector<HomeAssistantStateSubscription> &get_state_subs() const;
144
+ #endif
143
145
  #ifdef USE_API_SERVICES
144
146
  const std::vector<UserServiceDescriptor *> &get_user_services() const { return this->user_services_; }
145
147
  #endif
@@ -173,7 +175,9 @@ class APIServer : public Component, public Controller {
173
175
  std::string password_;
174
176
  #endif
175
177
  std::vector<uint8_t> shared_write_buffer_; // Shared proto write buffer for all connections
178
+ #ifdef USE_API_HOMEASSISTANT_STATES
176
179
  std::vector<HomeAssistantStateSubscription> state_subs_;
180
+ #endif
177
181
  #ifdef USE_API_SERVICES
178
182
  std::vector<UserServiceDescriptor *> user_services_;
179
183
  #endif
@@ -197,6 +201,5 @@ template<typename... Ts> class APIConnectedCondition : public Condition<Ts...> {
197
201
  bool check(Ts... x) override { return global_api_server->is_connected(); }
198
202
  };
199
203
 
200
- } // namespace api
201
- } // namespace esphome
204
+ } // namespace esphome::api
202
205
  #endif
@@ -14,6 +14,8 @@ with warnings.catch_warnings():
14
14
  from aioesphomeapi import APIClient, parse_log_message
15
15
  from aioesphomeapi.log_runner import async_run
16
16
 
17
+ import contextlib
18
+
17
19
  from esphome.const import CONF_KEY, CONF_PASSWORD, CONF_PORT, __version__
18
20
  from esphome.core import CORE
19
21
 
@@ -28,7 +30,7 @@ if TYPE_CHECKING:
28
30
  _LOGGER = logging.getLogger(__name__)
29
31
 
30
32
 
31
- async def async_run_logs(config: dict[str, Any], address: str) -> None:
33
+ async def async_run_logs(config: dict[str, Any], addresses: list[str]) -> None:
32
34
  """Run the logs command in the event loop."""
33
35
  conf = config["api"]
34
36
  name = config["esphome"]["name"]
@@ -37,13 +39,21 @@ async def async_run_logs(config: dict[str, Any], address: str) -> None:
37
39
  noise_psk: str | None = None
38
40
  if (encryption := conf.get(CONF_ENCRYPTION)) and (key := encryption.get(CONF_KEY)):
39
41
  noise_psk = key
40
- _LOGGER.info("Starting log output from %s using esphome API", address)
42
+
43
+ if len(addresses) == 1:
44
+ _LOGGER.info("Starting log output from %s using esphome API", addresses[0])
45
+ else:
46
+ _LOGGER.info(
47
+ "Starting log output from %s using esphome API", " or ".join(addresses)
48
+ )
49
+
41
50
  cli = APIClient(
42
- address,
51
+ addresses[0], # Primary address for compatibility
43
52
  port,
44
53
  password,
45
54
  client_info=f"ESPHome Logs {__version__}",
46
55
  noise_psk=noise_psk,
56
+ addresses=addresses, # Pass all addresses for automatic retry
47
57
  )
48
58
  dashboard = CORE.dashboard
49
59
 
@@ -64,9 +74,7 @@ async def async_run_logs(config: dict[str, Any], address: str) -> None:
64
74
  await stop()
65
75
 
66
76
 
67
- def run_logs(config: dict[str, Any], address: str) -> None:
77
+ def run_logs(config: dict[str, Any], addresses: list[str]) -> None:
68
78
  """Run the logs command."""
69
- try:
70
- asyncio.run(async_run_logs(config, address))
71
- except KeyboardInterrupt:
72
- pass
79
+ with contextlib.suppress(KeyboardInterrupt):
80
+ asyncio.run(async_run_logs(config, addresses))
@@ -6,8 +6,7 @@
6
6
  #ifdef USE_API_SERVICES
7
7
  #include "user_services.h"
8
8
  #endif
9
- namespace esphome {
10
- namespace api {
9
+ namespace esphome::api {
11
10
 
12
11
  #ifdef USE_API_SERVICES
13
12
  template<typename T, typename... Ts> class CustomAPIDeviceService : public UserServiceBase<Ts...> {
@@ -57,6 +56,14 @@ class CustomAPIDevice {
57
56
  auto *service = new CustomAPIDeviceService<T, Ts...>(name, arg_names, (T *) this, callback); // NOLINT
58
57
  global_api_server->register_user_service(service);
59
58
  }
59
+ #else
60
+ template<typename T, typename... Ts>
61
+ void register_service(void (T::*callback)(Ts...), const std::string &name,
62
+ const std::array<std::string, sizeof...(Ts)> &arg_names) {
63
+ static_assert(
64
+ sizeof(T) == 0,
65
+ "register_service() requires 'custom_services: true' in the 'api:' section of your YAML configuration");
66
+ }
60
67
  #endif
61
68
 
62
69
  /** Register a custom native API service that will show up in Home Assistant.
@@ -82,8 +89,15 @@ class CustomAPIDevice {
82
89
  auto *service = new CustomAPIDeviceService<T>(name, {}, (T *) this, callback); // NOLINT
83
90
  global_api_server->register_user_service(service);
84
91
  }
92
+ #else
93
+ template<typename T> void register_service(void (T::*callback)(), const std::string &name) {
94
+ static_assert(
95
+ sizeof(T) == 0,
96
+ "register_service() requires 'custom_services: true' in the 'api:' section of your YAML configuration");
97
+ }
85
98
  #endif
86
99
 
100
+ #ifdef USE_API_HOMEASSISTANT_STATES
87
101
  /** Subscribe to the state (or attribute state) of an entity from Home Assistant.
88
102
  *
89
103
  * Usage:
@@ -135,7 +149,25 @@ class CustomAPIDevice {
135
149
  auto f = std::bind(callback, (T *) this, entity_id, std::placeholders::_1);
136
150
  global_api_server->subscribe_home_assistant_state(entity_id, optional<std::string>(attribute), f);
137
151
  }
152
+ #else
153
+ template<typename T>
154
+ void subscribe_homeassistant_state(void (T::*callback)(std::string), const std::string &entity_id,
155
+ const std::string &attribute = "") {
156
+ static_assert(sizeof(T) == 0,
157
+ "subscribe_homeassistant_state() requires 'homeassistant_states: true' in the 'api:' section "
158
+ "of your YAML configuration");
159
+ }
160
+
161
+ template<typename T>
162
+ void subscribe_homeassistant_state(void (T::*callback)(std::string, std::string), const std::string &entity_id,
163
+ const std::string &attribute = "") {
164
+ static_assert(sizeof(T) == 0,
165
+ "subscribe_homeassistant_state() requires 'homeassistant_states: true' in the 'api:' section "
166
+ "of your YAML configuration");
167
+ }
168
+ #endif
138
169
 
170
+ #ifdef USE_API_HOMEASSISTANT_SERVICES
139
171
  /** Call a Home Assistant service from ESPHome.
140
172
  *
141
173
  * Usage:
@@ -148,7 +180,7 @@ class CustomAPIDevice {
148
180
  */
149
181
  void call_homeassistant_service(const std::string &service_name) {
150
182
  HomeassistantServiceResponse resp;
151
- resp.service = service_name;
183
+ resp.set_service(StringRef(service_name));
152
184
  global_api_server->send_homeassistant_service_call(resp);
153
185
  }
154
186
 
@@ -168,12 +200,12 @@ class CustomAPIDevice {
168
200
  */
169
201
  void call_homeassistant_service(const std::string &service_name, const std::map<std::string, std::string> &data) {
170
202
  HomeassistantServiceResponse resp;
171
- resp.service = service_name;
203
+ resp.set_service(StringRef(service_name));
172
204
  for (auto &it : data) {
173
- HomeassistantServiceMap kv;
174
- kv.key = it.first;
205
+ resp.data.emplace_back();
206
+ auto &kv = resp.data.back();
207
+ kv.set_key(StringRef(it.first));
175
208
  kv.value = it.second;
176
- resp.data.push_back(kv);
177
209
  }
178
210
  global_api_server->send_homeassistant_service_call(resp);
179
211
  }
@@ -190,7 +222,7 @@ class CustomAPIDevice {
190
222
  */
191
223
  void fire_homeassistant_event(const std::string &event_name) {
192
224
  HomeassistantServiceResponse resp;
193
- resp.service = event_name;
225
+ resp.set_service(StringRef(event_name));
194
226
  resp.is_event = true;
195
227
  global_api_server->send_homeassistant_service_call(resp);
196
228
  }
@@ -210,18 +242,40 @@ class CustomAPIDevice {
210
242
  */
211
243
  void fire_homeassistant_event(const std::string &service_name, const std::map<std::string, std::string> &data) {
212
244
  HomeassistantServiceResponse resp;
213
- resp.service = service_name;
245
+ resp.set_service(StringRef(service_name));
214
246
  resp.is_event = true;
215
247
  for (auto &it : data) {
216
- HomeassistantServiceMap kv;
217
- kv.key = it.first;
248
+ resp.data.emplace_back();
249
+ auto &kv = resp.data.back();
250
+ kv.set_key(StringRef(it.first));
218
251
  kv.value = it.second;
219
- resp.data.push_back(kv);
220
252
  }
221
253
  global_api_server->send_homeassistant_service_call(resp);
222
254
  }
255
+ #else
256
+ template<typename T = void> void call_homeassistant_service(const std::string &service_name) {
257
+ static_assert(sizeof(T) == 0, "call_homeassistant_service() requires 'homeassistant_services: true' in the 'api:' "
258
+ "section of your YAML configuration");
259
+ }
260
+
261
+ template<typename T = void>
262
+ void call_homeassistant_service(const std::string &service_name, const std::map<std::string, std::string> &data) {
263
+ static_assert(sizeof(T) == 0, "call_homeassistant_service() requires 'homeassistant_services: true' in the 'api:' "
264
+ "section of your YAML configuration");
265
+ }
266
+
267
+ template<typename T = void> void fire_homeassistant_event(const std::string &event_name) {
268
+ static_assert(sizeof(T) == 0, "fire_homeassistant_event() requires 'homeassistant_services: true' in the 'api:' "
269
+ "section of your YAML configuration");
270
+ }
271
+
272
+ template<typename T = void>
273
+ void fire_homeassistant_event(const std::string &service_name, const std::map<std::string, std::string> &data) {
274
+ static_assert(sizeof(T) == 0, "fire_homeassistant_event() requires 'homeassistant_services: true' in the 'api:' "
275
+ "section of your YAML configuration");
276
+ }
277
+ #endif
223
278
  };
224
279
 
225
- } // namespace api
226
- } // namespace esphome
280
+ } // namespace esphome::api
227
281
  #endif
@@ -2,13 +2,13 @@
2
2
 
3
3
  #include "api_server.h"
4
4
  #ifdef USE_API
5
+ #ifdef USE_API_HOMEASSISTANT_SERVICES
5
6
  #include "api_pb2.h"
6
7
  #include "esphome/core/automation.h"
7
8
  #include "esphome/core/helpers.h"
8
9
  #include <vector>
9
10
 
10
- namespace esphome {
11
- namespace api {
11
+ namespace esphome::api {
12
12
 
13
13
  template<typename... X> class TemplatableStringValue : public TemplatableValue<std::string, X...> {
14
14
  private:
@@ -36,6 +36,9 @@ template<typename... X> class TemplatableStringValue : public TemplatableValue<s
36
36
 
37
37
  template<typename... Ts> class TemplatableKeyValuePair {
38
38
  public:
39
+ // Keys are always string literals from YAML dictionary keys (e.g., "code", "event")
40
+ // and never templatable values or lambdas. Only the value parameter can be a lambda/template.
41
+ // Using pass-by-value with std::move allows optimal performance for both lvalues and rvalues.
39
42
  template<typename T> TemplatableKeyValuePair(std::string key, T value) : key(std::move(key)), value(value) {}
40
43
  std::string key;
41
44
  TemplatableStringValue<Ts...> value;
@@ -47,37 +50,39 @@ template<typename... Ts> class HomeAssistantServiceCallAction : public Action<Ts
47
50
 
48
51
  template<typename T> void set_service(T service) { this->service_ = service; }
49
52
 
50
- template<typename T> void add_data(std::string key, T value) {
51
- this->data_.push_back(TemplatableKeyValuePair<Ts...>(key, value));
52
- }
53
+ // Keys are always string literals from the Python code generation (e.g., cg.add(var.add_data("tag_id", templ))).
54
+ // The value parameter can be a lambda/template, but keys are never templatable.
55
+ // Using pass-by-value allows the compiler to optimize for both lvalues and rvalues.
56
+ template<typename T> void add_data(std::string key, T value) { this->data_.emplace_back(std::move(key), value); }
53
57
  template<typename T> void add_data_template(std::string key, T value) {
54
- this->data_template_.push_back(TemplatableKeyValuePair<Ts...>(key, value));
58
+ this->data_template_.emplace_back(std::move(key), value);
55
59
  }
56
60
  template<typename T> void add_variable(std::string key, T value) {
57
- this->variables_.push_back(TemplatableKeyValuePair<Ts...>(key, value));
61
+ this->variables_.emplace_back(std::move(key), value);
58
62
  }
59
63
 
60
64
  void play(Ts... x) override {
61
65
  HomeassistantServiceResponse resp;
62
- resp.service = this->service_.value(x...);
66
+ std::string service_value = this->service_.value(x...);
67
+ resp.set_service(StringRef(service_value));
63
68
  resp.is_event = this->is_event_;
64
69
  for (auto &it : this->data_) {
65
- HomeassistantServiceMap kv;
66
- kv.key = it.key;
70
+ resp.data.emplace_back();
71
+ auto &kv = resp.data.back();
72
+ kv.set_key(StringRef(it.key));
67
73
  kv.value = it.value.value(x...);
68
- resp.data.push_back(kv);
69
74
  }
70
75
  for (auto &it : this->data_template_) {
71
- HomeassistantServiceMap kv;
72
- kv.key = it.key;
76
+ resp.data_template.emplace_back();
77
+ auto &kv = resp.data_template.back();
78
+ kv.set_key(StringRef(it.key));
73
79
  kv.value = it.value.value(x...);
74
- resp.data_template.push_back(kv);
75
80
  }
76
81
  for (auto &it : this->variables_) {
77
- HomeassistantServiceMap kv;
78
- kv.key = it.key;
82
+ resp.variables.emplace_back();
83
+ auto &kv = resp.variables.back();
84
+ kv.set_key(StringRef(it.key));
79
85
  kv.value = it.value.value(x...);
80
- resp.variables.push_back(kv);
81
86
  }
82
87
  this->parent_->send_homeassistant_service_call(resp);
83
88
  }
@@ -91,6 +96,6 @@ template<typename... Ts> class HomeAssistantServiceCallAction : public Action<Ts
91
96
  std::vector<TemplatableKeyValuePair<Ts...>> variables_;
92
97
  };
93
98
 
94
- } // namespace api
95
- } // namespace esphome
99
+ } // namespace esphome::api
100
+ #endif
96
101
  #endif
@@ -6,8 +6,7 @@
6
6
  #include "esphome/core/log.h"
7
7
  #include "esphome/core/util.h"
8
8
 
9
- namespace esphome {
10
- namespace api {
9
+ namespace esphome::api {
11
10
 
12
11
  // Generate entity handler implementations using macros
13
12
  #ifdef USE_BINARY_SENSOR
@@ -86,10 +85,9 @@ ListEntitiesIterator::ListEntitiesIterator(APIConnection *client) : client_(clie
86
85
  #ifdef USE_API_SERVICES
87
86
  bool ListEntitiesIterator::on_service(UserServiceDescriptor *service) {
88
87
  auto resp = service->encode_list_service_response();
89
- return this->client_->send_message(resp);
88
+ return this->client_->send_message(resp, ListEntitiesServicesResponse::MESSAGE_TYPE);
90
89
  }
91
90
  #endif
92
91
 
93
- } // namespace api
94
- } // namespace esphome
92
+ } // namespace esphome::api
95
93
  #endif
@@ -4,8 +4,7 @@
4
4
  #ifdef USE_API
5
5
  #include "esphome/core/component.h"
6
6
  #include "esphome/core/component_iterator.h"
7
- namespace esphome {
8
- namespace api {
7
+ namespace esphome::api {
9
8
 
10
9
  class APIConnection;
11
10
 
@@ -96,6 +95,5 @@ class ListEntitiesIterator : public ComponentIterator {
96
95
  APIConnection *client_;
97
96
  };
98
97
 
99
- } // namespace api
100
- } // namespace esphome
98
+ } // namespace esphome::api
101
99
  #endif
@@ -3,12 +3,11 @@
3
3
  #include "esphome/core/helpers.h"
4
4
  #include "esphome/core/log.h"
5
5
 
6
- namespace esphome {
7
- namespace api {
6
+ namespace esphome::api {
8
7
 
9
8
  static const char *const TAG = "api.proto";
10
9
 
11
- void ProtoMessage::decode(const uint8_t *buffer, size_t length) {
10
+ void ProtoDecodableMessage::decode(const uint8_t *buffer, size_t length) {
12
11
  uint32_t i = 0;
13
12
  bool error = false;
14
13
  while (i < length) {
@@ -89,5 +88,4 @@ std::string ProtoMessage::dump() const {
89
88
  }
90
89
  #endif
91
90
 
92
- } // namespace api
93
- } // namespace esphome
91
+ } // namespace esphome::api