esphome 2025.7.5__py3-none-any.whl → 2025.8.0b2__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 (752) 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 +102 -52
  37. esphome/components/api/api_frame_helper.cpp +69 -896
  38. esphome/components/api/api_frame_helper.h +31 -126
  39. esphome/components/api/api_frame_helper_noise.cpp +583 -0
  40. esphome/components/api/api_frame_helper_noise.h +68 -0
  41. esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
  42. esphome/components/api/api_frame_helper_plaintext.h +53 -0
  43. esphome/components/api/api_noise_context.h +2 -4
  44. esphome/components/api/api_pb2.cpp +1601 -1808
  45. esphome/components/api/api_pb2.h +367 -323
  46. esphome/components/api/api_pb2_dump.cpp +1137 -3466
  47. esphome/components/api/api_pb2_includes.h +34 -0
  48. esphome/components/api/api_pb2_service.cpp +94 -105
  49. esphome/components/api/api_pb2_service.h +27 -16
  50. esphome/components/api/api_server.cpp +18 -17
  51. esphome/components/api/api_server.h +8 -5
  52. esphome/components/api/client.py +16 -8
  53. esphome/components/api/custom_api_device.h +68 -14
  54. esphome/components/api/homeassistant_service.h +24 -19
  55. esphome/components/api/list_entities.cpp +3 -5
  56. esphome/components/api/list_entities.h +2 -4
  57. esphome/components/api/proto.cpp +3 -5
  58. esphome/components/api/proto.h +239 -274
  59. esphome/components/api/subscribe_state.cpp +2 -4
  60. esphome/components/api/subscribe_state.h +2 -4
  61. esphome/components/api/user_services.cpp +2 -4
  62. esphome/components/api/user_services.h +8 -8
  63. esphome/components/as3935/as3935.cpp +0 -2
  64. esphome/components/as3935_spi/as3935_spi.cpp +0 -2
  65. esphome/components/as5600/__init__.py +1 -1
  66. esphome/components/as5600/as5600.cpp +0 -2
  67. esphome/components/as5600/sensor/__init__.py +0 -1
  68. esphome/components/as7341/as7341.cpp +0 -1
  69. esphome/components/async_tcp/__init__.py +1 -1
  70. esphome/components/at581x/at581x.cpp +1 -1
  71. esphome/components/atm90e26/atm90e26.cpp +0 -1
  72. esphome/components/atm90e32/atm90e32.cpp +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/fs3000/fs3000.cpp +0 -2
  209. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  210. esphome/components/ft63x6/ft63x6.cpp +0 -1
  211. esphome/components/gdk101/gdk101.cpp +0 -1
  212. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  213. esphome/components/gl_r01_i2c/sensor.py +1 -1
  214. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  215. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  216. esphome/components/gpio_expander/cached_gpio.h +24 -15
  217. esphome/components/gps/__init__.py +6 -2
  218. esphome/components/gps/gps.cpp +50 -49
  219. esphome/components/gps/gps.h +4 -8
  220. esphome/components/gps/time/gps_time.cpp +3 -9
  221. esphome/components/gps/time/gps_time.h +4 -7
  222. esphome/components/graph/__init__.py +1 -1
  223. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  224. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  225. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  227. esphome/components/haier/climate.py +5 -10
  228. esphome/components/haier/haier_base.cpp +0 -1
  229. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  230. esphome/components/hdc1080/hdc1080.cpp +0 -2
  231. esphome/components/heatpumpir/climate.py +2 -2
  232. esphome/components/hlw8012/hlw8012.cpp +0 -1
  233. esphome/components/hm3301/hm3301.cpp +0 -1
  234. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  235. esphome/components/homeassistant/__init__.py +1 -0
  236. esphome/components/homeassistant/number/__init__.py +1 -0
  237. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  238. esphome/components/homeassistant/switch/__init__.py +1 -0
  239. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  240. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  241. esphome/components/host/__init__.py +2 -0
  242. esphome/components/hte501/hte501.cpp +0 -1
  243. esphome/components/http_request/__init__.py +2 -3
  244. esphome/components/http_request/http_request_idf.cpp +2 -2
  245. esphome/components/htu21d/htu21d.cpp +0 -2
  246. esphome/components/htu31d/htu31d.cpp +0 -2
  247. esphome/components/hx711/hx711.cpp +0 -1
  248. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  249. esphome/components/hydreon_rgxx/sensor.py +4 -5
  250. esphome/components/i2c/i2c_bus.h +1 -1
  251. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  252. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  253. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  254. esphome/components/i2s_audio/__init__.py +6 -5
  255. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  256. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  257. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  258. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +0 -1
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +2 -2
  260. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  262. esphome/components/ili9xxx/display.py +4 -3
  263. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  264. esphome/components/image/__init__.py +123 -92
  265. esphome/components/improv_serial/__init__.py +7 -8
  266. esphome/components/ina219/ina219.cpp +0 -1
  267. esphome/components/ina226/ina226.cpp +0 -2
  268. esphome/components/ina260/ina260.cpp +0 -2
  269. esphome/components/ina2xx_base/__init__.py +2 -5
  270. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  271. esphome/components/ina3221/ina3221.cpp +0 -1
  272. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  273. esphome/components/interval/interval.h +5 -9
  274. esphome/components/json/__init__.py +1 -1
  275. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  276. esphome/components/lc709203f/lc709203f.cpp +0 -2
  277. esphome/components/lcd_gpio/display.py +1 -3
  278. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  279. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  280. esphome/components/ld2410/__init__.py +4 -6
  281. esphome/components/ld2410/binary_sensor.py +4 -0
  282. esphome/components/ld2410/ld2410.cpp +56 -100
  283. esphome/components/ld2410/ld2410.h +17 -15
  284. esphome/components/ld2410/sensor.py +24 -10
  285. esphome/components/ld2412/__init__.py +46 -0
  286. esphome/components/ld2412/binary_sensor.py +70 -0
  287. esphome/components/ld2412/button/__init__.py +74 -0
  288. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  289. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  290. esphome/components/ld2412/button/query_button.cpp +9 -0
  291. esphome/components/ld2412/button/query_button.h +18 -0
  292. esphome/components/ld2412/button/restart_button.cpp +9 -0
  293. esphome/components/ld2412/button/restart_button.h +18 -0
  294. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  296. esphome/components/ld2412/ld2412.cpp +861 -0
  297. esphome/components/ld2412/ld2412.h +141 -0
  298. esphome/components/ld2412/number/__init__.py +126 -0
  299. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  300. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  301. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  302. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  303. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  305. esphome/components/ld2412/select/__init__.py +82 -0
  306. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  307. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  308. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  309. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  310. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  311. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  312. esphome/components/ld2412/sensor.py +124 -0
  313. esphome/components/ld2412/switch/__init__.py +45 -0
  314. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  316. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  318. esphome/components/ld2412/text_sensor.py +34 -0
  319. esphome/components/ld2420/ld2420.cpp +0 -1
  320. esphome/components/ld2450/__init__.py +3 -4
  321. esphome/components/ld2450/binary_sensor.py +3 -0
  322. esphome/components/ld2450/ld2450.cpp +77 -165
  323. esphome/components/ld2450/ld2450.h +26 -54
  324. esphome/components/ld2450/sensor.py +120 -6
  325. esphome/components/ld2450/text_sensor.py +5 -4
  326. esphome/components/ld24xx/__init__.py +1 -0
  327. esphome/components/ld24xx/ld24xx.h +65 -0
  328. esphome/components/ledc/ledc_output.cpp +0 -1
  329. esphome/components/libretiny/__init__.py +2 -0
  330. esphome/components/light/__init__.py +0 -1
  331. esphome/components/light/effects.py +70 -45
  332. esphome/components/light/light_call.cpp +101 -66
  333. esphome/components/light/light_color_values.h +16 -11
  334. esphome/components/light/light_json_schema.cpp +46 -44
  335. esphome/components/light/light_state.cpp +8 -11
  336. esphome/components/light/light_traits.h +17 -0
  337. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  338. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  339. esphome/components/lock/__init__.py +0 -1
  340. esphome/components/logger/__init__.py +31 -9
  341. esphome/components/logger/logger.cpp +12 -7
  342. esphome/components/logger/logger.h +25 -14
  343. esphome/components/logger/logger_esp32.cpp +2 -7
  344. esphome/components/logger/logger_esp8266.cpp +2 -4
  345. esphome/components/logger/logger_host.cpp +2 -4
  346. esphome/components/logger/logger_libretiny.cpp +2 -4
  347. esphome/components/logger/logger_rp2040.cpp +2 -4
  348. esphome/components/logger/logger_zephyr.cpp +86 -0
  349. esphome/components/logger/select/logger_level_select.cpp +2 -4
  350. esphome/components/logger/select/logger_level_select.h +2 -4
  351. esphome/components/logger/task_log_buffer.cpp +2 -4
  352. esphome/components/logger/task_log_buffer.h +2 -4
  353. esphome/components/lps22/sensor.py +5 -5
  354. esphome/components/ltr390/ltr390.cpp +0 -2
  355. esphome/components/ltr501/ltr501.cpp +0 -1
  356. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  357. esphome/components/lvgl/__init__.py +14 -13
  358. esphome/components/lvgl/automation.py +2 -4
  359. esphome/components/lvgl/defines.py +0 -2
  360. esphome/components/lvgl/helpers.py +1 -1
  361. esphome/components/lvgl/lv_validation.py +7 -4
  362. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  363. esphome/components/lvgl/styles.py +2 -2
  364. esphome/components/lvgl/types.py +1 -1
  365. esphome/components/lvgl/widgets/__init__.py +2 -2
  366. esphome/components/lvgl/widgets/arc.py +14 -11
  367. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  368. esphome/components/lvgl/widgets/qrcode.py +7 -7
  369. esphome/components/lvgl/widgets/spinner.py +6 -6
  370. esphome/components/lvgl/widgets/switch.py +2 -2
  371. esphome/components/lvgl/widgets/tabview.py +3 -3
  372. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  373. esphome/components/matrix_keypad/__init__.py +4 -3
  374. esphome/components/max17043/max17043.cpp +0 -2
  375. esphome/components/max31855/max31855.cpp +1 -4
  376. esphome/components/max31856/max31856.cpp +0 -4
  377. esphome/components/max31865/max31865.cpp +0 -1
  378. esphome/components/max44009/max44009.cpp +0 -1
  379. esphome/components/max6675/max6675.cpp +1 -4
  380. esphome/components/max6956/max6956.cpp +0 -1
  381. esphome/components/max7219/max7219.cpp +0 -1
  382. esphome/components/max7219digit/display.py +1 -1
  383. esphome/components/max7219digit/max7219digit.cpp +0 -1
  384. esphome/components/max9611/max9611.cpp +0 -1
  385. esphome/components/mcp23008/__init__.py +1 -1
  386. esphome/components/mcp23008/mcp23008.cpp +0 -1
  387. esphome/components/mcp23016/mcp23016.cpp +0 -1
  388. esphome/components/mcp23017/__init__.py +1 -1
  389. esphome/components/mcp23017/mcp23017.cpp +0 -1
  390. esphome/components/mcp23s08/__init__.py +1 -1
  391. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  392. esphome/components/mcp23s17/__init__.py +1 -1
  393. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  394. esphome/components/mcp23x08_base/__init__.py +2 -0
  395. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  396. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  397. esphome/components/mcp23x17_base/__init__.py +2 -0
  398. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  399. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  400. esphome/components/mcp23xxx_base/__init__.py +11 -5
  401. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  402. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  403. esphome/components/mcp3008/mcp3008.cpp +1 -4
  404. esphome/components/mcp3204/mcp3204.cpp +1 -4
  405. esphome/components/mcp4461/mcp4461.cpp +0 -1
  406. esphome/components/mcp4725/mcp4725.cpp +0 -1
  407. esphome/components/mcp4728/mcp4728.cpp +0 -1
  408. esphome/components/mcp9600/mcp9600.cpp +0 -2
  409. esphome/components/mcp9808/mcp9808.cpp +0 -2
  410. esphome/components/mdns/__init__.py +3 -0
  411. esphome/components/mdns/mdns_component.cpp +2 -0
  412. esphome/components/mdns/mdns_component.h +4 -0
  413. esphome/components/media_player/__init__.py +40 -0
  414. esphome/components/media_player/automation.h +16 -0
  415. esphome/components/media_player/media_player.cpp +13 -0
  416. esphome/components/media_player/media_player.h +50 -3
  417. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  418. esphome/components/mics_4514/mics_4514.cpp +1 -6
  419. esphome/components/midea/ir_transmitter.h +4 -4
  420. esphome/components/mipi/__init__.py +416 -0
  421. esphome/components/mipi_dsi/__init__.py +5 -0
  422. esphome/components/mipi_dsi/display.py +233 -0
  423. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  424. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  425. esphome/components/mipi_dsi/models/__init__.py +0 -0
  426. esphome/components/mipi_dsi/models/guition.py +38 -0
  427. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  428. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  429. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  430. esphome/components/mipi_spi/__init__.py +0 -9
  431. esphome/components/mipi_spi/display.py +220 -256
  432. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  433. esphome/components/mipi_spi/mipi_spi.h +556 -108
  434. esphome/components/mipi_spi/models/__init__.py +0 -65
  435. esphome/components/mipi_spi/models/adafruit.py +30 -0
  436. esphome/components/mipi_spi/models/amoled.py +41 -5
  437. esphome/components/mipi_spi/models/ili.py +5 -5
  438. esphome/components/mipi_spi/models/jc.py +1 -3
  439. esphome/components/mipi_spi/models/lilygo.py +1 -1
  440. esphome/components/mipi_spi/models/waveshare.py +16 -1
  441. esphome/components/mixer/speaker/__init__.py +4 -5
  442. esphome/components/mlx90393/sensor.py +7 -5
  443. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  444. esphome/components/mlx90614/mlx90614.cpp +0 -1
  445. esphome/components/mmc5603/mmc5603.cpp +0 -1
  446. esphome/components/mmc5983/mmc5983.cpp +0 -2
  447. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  448. esphome/components/mpr121/__init__.py +7 -6
  449. esphome/components/mpr121/mpr121.cpp +0 -1
  450. esphome/components/mpu6050/mpu6050.cpp +0 -1
  451. esphome/components/mpu6886/mpu6886.cpp +0 -1
  452. esphome/components/mqtt/__init__.py +1 -2
  453. esphome/components/mqtt/mqtt_button.cpp +1 -1
  454. esphome/components/mqtt/mqtt_client.cpp +0 -1
  455. esphome/components/mqtt/mqtt_component.cpp +8 -14
  456. esphome/components/mqtt/mqtt_component.h +0 -7
  457. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  458. esphome/components/mqtt/mqtt_sensor.h +0 -1
  459. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  461. esphome/components/ms5611/ms5611.cpp +0 -1
  462. esphome/components/ms8607/ms8607.cpp +0 -1
  463. esphome/components/msa3xx/msa3xx.cpp +0 -2
  464. esphome/components/my9231/my9231.cpp +0 -2
  465. esphome/components/nau7802/nau7802.cpp +0 -1
  466. esphome/components/neopixelbus/light.py +3 -0
  467. esphome/components/network/util.cpp +29 -0
  468. esphome/components/nextion/nextion.cpp +0 -1
  469. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  470. esphome/components/npi19/npi19.cpp +0 -2
  471. esphome/components/nrf52/__init__.py +223 -0
  472. esphome/components/nrf52/boards.py +34 -0
  473. esphome/components/nrf52/const.py +18 -0
  474. esphome/components/nrf52/gpio.py +79 -0
  475. esphome/components/number/__init__.py +2 -1
  476. esphome/components/one_wire/__init__.py +1 -2
  477. esphome/components/one_wire/one_wire.cpp +0 -2
  478. esphome/components/one_wire/one_wire.h +0 -2
  479. esphome/components/opentherm/hub.cpp +0 -1
  480. esphome/components/opentherm/number/__init__.py +2 -2
  481. esphome/components/openthread/__init__.py +2 -3
  482. esphome/components/openthread/openthread.cpp +30 -13
  483. esphome/components/openthread/openthread.h +3 -0
  484. esphome/components/openthread/openthread_esp.cpp +3 -1
  485. esphome/components/opt3001/sensor.py +2 -6
  486. esphome/components/output/__init__.py +38 -0
  487. esphome/components/output/automation.h +24 -0
  488. esphome/components/output/switch/output_switch.cpp +0 -2
  489. esphome/components/packages/__init__.py +1 -2
  490. esphome/components/packet_transport/__init__.py +4 -3
  491. esphome/components/pca6416a/pca6416a.cpp +0 -1
  492. esphome/components/pca9554/pca9554.cpp +0 -1
  493. esphome/components/pca9685/pca9685_output.cpp +0 -2
  494. esphome/components/pcf85063/pcf85063.cpp +0 -1
  495. esphome/components/pcf8563/pcf8563.cpp +0 -1
  496. esphome/components/pcf8574/pcf8574.cpp +0 -1
  497. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  498. esphome/components/pipsolar/sensor/__init__.py +1 -1
  499. esphome/components/pm2005/pm2005.cpp +0 -1
  500. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  501. esphome/components/pmwcs3/sensor.py +1 -2
  502. esphome/components/pn532/pn532.cpp +0 -2
  503. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  504. esphome/components/power_supply/power_supply.cpp +7 -10
  505. esphome/components/power_supply/power_supply.h +1 -1
  506. esphome/components/psram/__init__.py +6 -1
  507. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  508. esphome/components/pulse_counter/sensor.py +9 -6
  509. esphome/components/pylontech/pylontech.cpp +0 -1
  510. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  511. esphome/components/qmp6988/qmp6988.cpp +0 -2
  512. esphome/components/qspi_dbi/display.py +2 -3
  513. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  514. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  515. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  516. esphome/components/rc522/rc522.cpp +9 -31
  517. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  518. esphome/components/remote_base/__init__.py +5 -6
  519. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  520. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  521. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  522. esphome/components/remote_transmitter/__init__.py +26 -0
  523. esphome/components/remote_transmitter/automation.h +18 -0
  524. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  525. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  526. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  527. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  528. esphome/components/resampler/speaker/__init__.py +4 -5
  529. esphome/components/rf_bridge/__init__.py +4 -8
  530. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  531. esphome/components/rp2040/__init__.py +3 -1
  532. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  533. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  534. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  535. esphome/components/rpi_dpi_rgb/display.py +13 -15
  536. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  537. esphome/components/runtime_stats/__init__.py +34 -0
  538. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  539. esphome/components/runtime_stats/runtime_stats.h +132 -0
  540. esphome/components/scd30/scd30.cpp +0 -2
  541. esphome/components/scd30/sensor.py +1 -2
  542. esphome/components/scd4x/scd4x.cpp +0 -1
  543. esphome/components/scd4x/sensor.py +1 -3
  544. esphome/components/sdl/display.py +3 -1
  545. esphome/components/sdl/sdl_esphome.cpp +0 -2
  546. esphome/components/sdp3x/sdp3x.cpp +0 -2
  547. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  548. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  549. esphome/components/select/__init__.py +2 -3
  550. esphome/components/select/select_traits.cpp +1 -1
  551. esphome/components/select/select_traits.h +1 -1
  552. esphome/components/sen0321/sen0321.cpp +0 -1
  553. esphome/components/sen5x/sen5x.cpp +0 -2
  554. esphome/components/sensor/__init__.py +36 -4
  555. esphome/components/sensor/filter.cpp +49 -10
  556. esphome/components/sensor/filter.h +22 -7
  557. esphome/components/sensor/sensor.cpp +0 -1
  558. esphome/components/sensor/sensor.h +0 -9
  559. esphome/components/sfa30/sfa30.cpp +0 -4
  560. esphome/components/sgp30/sgp30.cpp +0 -2
  561. esphome/components/sgp4x/sensor.py +1 -1
  562. esphome/components/sgp4x/sgp4x.cpp +0 -2
  563. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  564. esphome/components/sht3xd/sht3xd.cpp +0 -2
  565. esphome/components/sht4x/sht4x.cpp +0 -2
  566. esphome/components/shtcx/shtcx.cpp +0 -1
  567. esphome/components/sim800l/__init__.py +2 -4
  568. esphome/components/sm16716/sm16716.cpp +0 -1
  569. esphome/components/sm2135/sm2135.cpp +0 -1
  570. esphome/components/sm2235/sm2235.cpp +0 -1
  571. esphome/components/sm2335/sm2335.cpp +0 -1
  572. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  573. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  574. esphome/components/sntp/sntp_component.cpp +0 -1
  575. esphome/components/sound_level/sensor.py +1 -1
  576. esphome/components/speaker/media_player/__init__.py +21 -33
  577. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  578. esphome/components/spi/__init__.py +29 -13
  579. esphome/components/spi/spi.cpp +0 -2
  580. esphome/components/spi_device/spi_device.cpp +1 -4
  581. esphome/components/sprinkler/__init__.py +4 -4
  582. esphome/components/sps30/sps30.cpp +0 -1
  583. esphome/components/ssd1306_base/__init__.py +11 -11
  584. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  585. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  586. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  587. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  588. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  589. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  590. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  591. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  592. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  593. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  594. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  595. esphome/components/st7701s/display.py +10 -14
  596. esphome/components/st7701s/st7701s.cpp +0 -3
  597. esphome/components/st7735/st7735.cpp +0 -1
  598. esphome/components/st7789v/st7789v.cpp +0 -1
  599. esphome/components/st7920/st7920.cpp +0 -1
  600. esphome/components/status_led/light/status_led_light.cpp +0 -2
  601. esphome/components/status_led/status_led.cpp +0 -1
  602. esphome/components/stepper/__init__.py +2 -4
  603. esphome/components/sts3x/sts3x.cpp +0 -1
  604. esphome/components/substitutions/__init__.py +10 -16
  605. esphome/components/substitutions/jinja.py +24 -1
  606. esphome/components/sun/__init__.py +2 -3
  607. esphome/components/switch/__init__.py +31 -1
  608. esphome/components/switch/automation.h +24 -0
  609. esphome/components/switch/switch.cpp +8 -0
  610. esphome/components/switch/switch.h +8 -0
  611. esphome/components/sx126x/sx126x.cpp +0 -2
  612. esphome/components/sx127x/sx127x.cpp +0 -2
  613. esphome/components/sx1509/__init__.py +7 -5
  614. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  615. esphome/components/sx1509/sx1509.cpp +0 -2
  616. esphome/components/syslog/esphome_syslog.cpp +1 -1
  617. esphome/components/tc74/tc74.cpp +0 -1
  618. esphome/components/tca9548a/tca9548a.cpp +0 -1
  619. esphome/components/tca9555/tca9555.cpp +0 -1
  620. esphome/components/tcs34725/tcs34725.cpp +0 -1
  621. esphome/components/tee501/tee501.cpp +0 -1
  622. esphome/components/tem3200/tem3200.cpp +0 -2
  623. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  624. esphome/components/template/cover/template_cover.cpp +0 -1
  625. esphome/components/template/select/template_select.cpp +0 -1
  626. esphome/components/template/text/template_text.cpp +0 -2
  627. esphome/components/template/valve/template_valve.cpp +0 -1
  628. esphome/components/text/__init__.py +0 -1
  629. esphome/components/text/text_traits.h +2 -0
  630. esphome/components/text_sensor/__init__.py +2 -1
  631. esphome/components/text_sensor/text_sensor.cpp +0 -2
  632. esphome/components/text_sensor/text_sensor.h +0 -8
  633. esphome/components/thermostat/climate.py +4 -4
  634. esphome/components/time/__init__.py +7 -4
  635. esphome/components/time/real_time_clock.cpp +16 -3
  636. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  637. esphome/components/tlc5947/tlc5947.cpp +0 -2
  638. esphome/components/tlc5971/tlc5971.cpp +0 -2
  639. esphome/components/tm1621/tm1621.cpp +0 -2
  640. esphome/components/tm1637/tm1637.cpp +0 -2
  641. esphome/components/tm1638/tm1638.cpp +0 -2
  642. esphome/components/tm1651/__init__.py +45 -48
  643. esphome/components/tm1651/tm1651.cpp +213 -47
  644. esphome/components/tm1651/tm1651.h +37 -32
  645. esphome/components/tmp117/tmp117.cpp +0 -2
  646. esphome/components/tsl2561/tsl2561.cpp +0 -1
  647. esphome/components/tsl2591/tsl2591.cpp +0 -1
  648. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  649. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  650. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  651. esphome/components/tuya/climate/__init__.py +9 -10
  652. esphome/components/tuya/number/__init__.py +8 -6
  653. esphome/components/tx20/tx20.cpp +0 -1
  654. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  655. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  656. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  657. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  658. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  659. esphome/components/udp/__init__.py +1 -1
  660. esphome/components/ufire_ec/sensor.py +1 -2
  661. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  662. esphome/components/ufire_ise/sensor.py +1 -2
  663. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  664. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  665. esphome/components/update/__init__.py +0 -1
  666. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  667. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  668. esphome/components/usb_host/usb_host_client.cpp +0 -1
  669. esphome/components/usb_host/usb_host_component.cpp +0 -1
  670. esphome/components/valve/__init__.py +0 -1
  671. esphome/components/veml3235/veml3235.cpp +0 -3
  672. esphome/components/veml7700/veml7700.cpp +0 -2
  673. esphome/components/version/version_text_sensor.cpp +0 -1
  674. esphome/components/version/version_text_sensor.h +0 -1
  675. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  676. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  677. esphome/components/web_server/__init__.py +13 -0
  678. esphome/components/web_server/web_server.cpp +187 -352
  679. esphome/components/web_server/web_server.h +61 -1
  680. esphome/components/web_server_base/__init__.py +1 -1
  681. esphome/components/web_server_base/web_server_base.cpp +2 -0
  682. esphome/components/web_server_base/web_server_base.h +6 -0
  683. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  684. esphome/components/web_server_idf/web_server_idf.h +2 -0
  685. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  686. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  687. esphome/components/wifi/__init__.py +8 -43
  688. esphome/components/wifi/wifi_component.cpp +100 -36
  689. esphome/components/wifi/wifi_component.h +5 -1
  690. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  691. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  692. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  693. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  694. esphome/components/wireguard/wireguard.cpp +0 -2
  695. esphome/components/x9c/x9c.cpp +0 -2
  696. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  697. esphome/components/xl9535/xl9535.cpp +0 -2
  698. esphome/components/zephyr/__init__.py +252 -0
  699. esphome/components/zephyr/const.py +16 -0
  700. esphome/components/zephyr/core.cpp +90 -0
  701. esphome/components/zephyr/gpio.cpp +120 -0
  702. esphome/components/zephyr/gpio.h +38 -0
  703. esphome/components/zephyr/pre_build.py.script +4 -0
  704. esphome/components/zephyr/preferences.cpp +156 -0
  705. esphome/components/zephyr/preferences.h +13 -0
  706. esphome/config.py +38 -16
  707. esphome/config_helpers.py +1 -2
  708. esphome/config_validation.py +12 -16
  709. esphome/const.py +26 -1
  710. esphome/core/__init__.py +88 -51
  711. esphome/core/application.cpp +75 -21
  712. esphome/core/application.h +106 -171
  713. esphome/core/color.h +10 -0
  714. esphome/core/component.cpp +41 -25
  715. esphome/core/component.h +9 -6
  716. esphome/core/component_iterator.cpp +61 -261
  717. esphome/core/component_iterator.h +15 -0
  718. esphome/core/config.py +26 -11
  719. esphome/core/defines.h +40 -2
  720. esphome/core/entity_base.h +18 -0
  721. esphome/core/entity_helpers.py +45 -10
  722. esphome/core/helpers.cpp +8 -15
  723. esphome/core/helpers.h +60 -6
  724. esphome/core/lock_free_queue.h +1 -1
  725. esphome/core/scheduler.cpp +277 -74
  726. esphome/core/scheduler.h +89 -27
  727. esphome/cpp_generator.py +2 -6
  728. esphome/cpp_helpers.py +1 -1
  729. esphome/dashboard/dashboard.py +2 -3
  730. esphome/dashboard/dns.py +2 -8
  731. esphome/dashboard/web_server.py +34 -19
  732. esphome/espota2.py +1 -4
  733. esphome/git.py +3 -1
  734. esphome/helpers.py +23 -4
  735. esphome/log.py +3 -1
  736. esphome/mqtt.py +3 -5
  737. esphome/platformio_api.py +7 -4
  738. esphome/types.py +12 -0
  739. esphome/util.py +20 -8
  740. esphome/voluptuous_schema.py +4 -3
  741. esphome/vscode.py +1 -2
  742. esphome/wizard.py +1 -4
  743. esphome/writer.py +5 -107
  744. esphome/yaml_util.py +7 -5
  745. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/METADATA +13 -14
  746. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/RECORD +751 -671
  747. esphome/components/mipi_spi/models/commands.py +0 -82
  748. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  749. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/WHEEL +0 -0
  750. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/entry_points.txt +0 -0
  751. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/licenses/LICENSE +0 -0
  752. {esphome-2025.7.5.dist-info → esphome-2025.8.0b2.dist-info}/top_level.txt +0 -0
@@ -6,19 +6,21 @@ namespace mcp23x08_base {
6
6
 
7
7
  static const char *const TAG = "mcp23x08_base";
8
8
 
9
- bool MCP23X08Base::digital_read(uint8_t pin) {
10
- uint8_t bit = pin % 8;
11
- uint8_t reg_addr = mcp23x08_base::MCP23X08_GPIO;
12
- uint8_t value = 0;
13
- this->read_reg(reg_addr, &value);
14
- return value & (1 << bit);
9
+ bool MCP23X08Base::digital_read_hw(uint8_t pin) {
10
+ if (!this->read_reg(mcp23x08_base::MCP23X08_GPIO, &this->input_mask_)) {
11
+ this->status_set_warning(ESP_LOG_MSG_COMM_FAIL);
12
+ return false;
13
+ }
14
+ return true;
15
15
  }
16
16
 
17
- void MCP23X08Base::digital_write(uint8_t pin, bool value) {
17
+ void MCP23X08Base::digital_write_hw(uint8_t pin, bool value) {
18
18
  uint8_t reg_addr = mcp23x08_base::MCP23X08_OLAT;
19
19
  this->update_reg(pin, value, reg_addr);
20
20
  }
21
21
 
22
+ bool MCP23X08Base::digital_read_cache(uint8_t pin) { return this->input_mask_ & (1 << pin); }
23
+
22
24
  void MCP23X08Base::pin_mode(uint8_t pin, gpio::Flags flags) {
23
25
  uint8_t iodir = mcp23x08_base::MCP23X08_IODIR;
24
26
  uint8_t gppu = mcp23x08_base::MCP23X08_GPPU;
@@ -1,7 +1,7 @@
1
1
  #pragma once
2
2
 
3
- #include "esphome/core/component.h"
4
3
  #include "esphome/components/mcp23xxx_base/mcp23xxx_base.h"
4
+ #include "esphome/core/component.h"
5
5
  #include "esphome/core/hal.h"
6
6
 
7
7
  namespace esphome {
@@ -22,10 +22,12 @@ enum MCP23S08GPIORegisters {
22
22
  MCP23X08_OLAT = 0x0A,
23
23
  };
24
24
 
25
- class MCP23X08Base : public mcp23xxx_base::MCP23XXXBase {
25
+ class MCP23X08Base : public mcp23xxx_base::MCP23XXXBase<8> {
26
26
  public:
27
- bool digital_read(uint8_t pin) override;
28
- void digital_write(uint8_t pin, bool value) override;
27
+ bool digital_read_hw(uint8_t pin) override;
28
+ void digital_write_hw(uint8_t pin, bool value) override;
29
+ bool digital_read_cache(uint8_t pin) override;
30
+
29
31
  void pin_mode(uint8_t pin, gpio::Flags flags) override;
30
32
  void pin_interrupt_mode(uint8_t pin, mcp23xxx_base::MCP23XXXInterruptMode interrupt_mode) override;
31
33
 
@@ -33,6 +35,9 @@ class MCP23X08Base : public mcp23xxx_base::MCP23XXXBase {
33
35
  void update_reg(uint8_t pin, bool pin_value, uint8_t reg_a) override;
34
36
 
35
37
  uint8_t olat_{0x00};
38
+
39
+ /// State read in digital_read_hw
40
+ uint8_t input_mask_{0x00};
36
41
  };
37
42
 
38
43
  } // namespace mcp23x08_base
@@ -4,5 +4,7 @@ from esphome.components import mcp23xxx_base
4
4
  AUTO_LOAD = ["mcp23xxx_base"]
5
5
  CODEOWNERS = ["@jesserockz"]
6
6
 
7
+ NUM_PINS = 16
8
+
7
9
  mcp23x17_base_ns = cg.esphome_ns.namespace("mcp23x17_base")
8
10
  MCP23X17Base = mcp23x17_base_ns.class_("MCP23X17Base", mcp23xxx_base.MCP23XXXBase)
@@ -1,4 +1,5 @@
1
1
  #include "mcp23x17_base.h"
2
+ #include "esphome/core/helpers.h"
2
3
  #include "esphome/core/log.h"
3
4
 
4
5
  namespace esphome {
@@ -6,19 +7,31 @@ namespace mcp23x17_base {
6
7
 
7
8
  static const char *const TAG = "mcp23x17_base";
8
9
 
9
- bool MCP23X17Base::digital_read(uint8_t pin) {
10
- uint8_t bit = pin % 8;
11
- uint8_t reg_addr = pin < 8 ? mcp23x17_base::MCP23X17_GPIOA : mcp23x17_base::MCP23X17_GPIOB;
12
- uint8_t value = 0;
13
- this->read_reg(reg_addr, &value);
14
- return value & (1 << bit);
10
+ bool MCP23X17Base::digital_read_hw(uint8_t pin) {
11
+ uint8_t data;
12
+ if (pin < 8) {
13
+ if (!this->read_reg(mcp23x17_base::MCP23X17_GPIOA, &data)) {
14
+ this->status_set_warning(ESP_LOG_MSG_COMM_FAIL);
15
+ return false;
16
+ }
17
+ this->input_mask_ = encode_uint16(this->input_mask_ >> 8, data);
18
+ } else {
19
+ if (!this->read_reg(mcp23x17_base::MCP23X17_GPIOB, &data)) {
20
+ this->status_set_warning(ESP_LOG_MSG_COMM_FAIL);
21
+ return false;
22
+ }
23
+ this->input_mask_ = encode_uint16(data, this->input_mask_ & 0xFF);
24
+ }
25
+ return true;
15
26
  }
16
27
 
17
- void MCP23X17Base::digital_write(uint8_t pin, bool value) {
28
+ void MCP23X17Base::digital_write_hw(uint8_t pin, bool value) {
18
29
  uint8_t reg_addr = pin < 8 ? mcp23x17_base::MCP23X17_OLATA : mcp23x17_base::MCP23X17_OLATB;
19
30
  this->update_reg(pin, value, reg_addr);
20
31
  }
21
32
 
33
+ bool MCP23X17Base::digital_read_cache(uint8_t pin) { return this->input_mask_ & (1 << pin); }
34
+
22
35
  void MCP23X17Base::pin_mode(uint8_t pin, gpio::Flags flags) {
23
36
  uint8_t iodir = pin < 8 ? mcp23x17_base::MCP23X17_IODIRA : mcp23x17_base::MCP23X17_IODIRB;
24
37
  uint8_t gppu = pin < 8 ? mcp23x17_base::MCP23X17_GPPUA : mcp23x17_base::MCP23X17_GPPUB;
@@ -1,7 +1,7 @@
1
1
  #pragma once
2
2
 
3
- #include "esphome/core/component.h"
4
3
  #include "esphome/components/mcp23xxx_base/mcp23xxx_base.h"
4
+ #include "esphome/core/component.h"
5
5
  #include "esphome/core/hal.h"
6
6
 
7
7
  namespace esphome {
@@ -34,10 +34,12 @@ enum MCP23X17GPIORegisters {
34
34
  MCP23X17_OLATB = 0x15,
35
35
  };
36
36
 
37
- class MCP23X17Base : public mcp23xxx_base::MCP23XXXBase {
37
+ class MCP23X17Base : public mcp23xxx_base::MCP23XXXBase<16> {
38
38
  public:
39
- bool digital_read(uint8_t pin) override;
40
- void digital_write(uint8_t pin, bool value) override;
39
+ bool digital_read_hw(uint8_t pin) override;
40
+ void digital_write_hw(uint8_t pin, bool value) override;
41
+ bool digital_read_cache(uint8_t pin) override;
42
+
41
43
  void pin_mode(uint8_t pin, gpio::Flags flags) override;
42
44
  void pin_interrupt_mode(uint8_t pin, mcp23xxx_base::MCP23XXXInterruptMode interrupt_mode) override;
43
45
 
@@ -46,6 +48,9 @@ class MCP23X17Base : public mcp23xxx_base::MCP23XXXBase {
46
48
 
47
49
  uint8_t olat_a_{0x00};
48
50
  uint8_t olat_b_{0x00};
51
+
52
+ /// State read in digital_read_hw
53
+ uint16_t input_mask_{0x00};
49
54
  };
50
55
 
51
56
  } // namespace mcp23x17_base
@@ -12,8 +12,9 @@ from esphome.const import (
12
12
  CONF_OUTPUT,
13
13
  CONF_PULLUP,
14
14
  )
15
- from esphome.core import coroutine
15
+ from esphome.core import CORE, ID, coroutine
16
16
 
17
+ AUTO_LOAD = ["gpio_expander"]
17
18
  CODEOWNERS = ["@jesserockz"]
18
19
 
19
20
  mcp23xxx_base_ns = cg.esphome_ns.namespace("mcp23xxx_base")
@@ -36,9 +37,11 @@ MCP23XXX_CONFIG_SCHEMA = cv.Schema(
36
37
 
37
38
 
38
39
  @coroutine
39
- async def register_mcp23xxx(config):
40
- var = cg.new_Pvariable(config[CONF_ID])
40
+ async def register_mcp23xxx(config, num_pins):
41
+ id: ID = config[CONF_ID]
42
+ var = cg.new_Pvariable(id)
41
43
  await cg.register_component(var, config)
44
+ CORE.data.setdefault(CONF_MCP23XXX, {})[id.id] = num_pins
42
45
  cg.add(var.set_open_drain_ints(config[CONF_OPEN_DRAIN_INTERRUPT]))
43
46
  return var
44
47
 
@@ -73,9 +76,12 @@ MCP23XXX_PIN_SCHEMA = pins.gpio_base_schema(
73
76
 
74
77
  @pins.PIN_SCHEMA_REGISTRY.register(CONF_MCP23XXX, MCP23XXX_PIN_SCHEMA)
75
78
  async def mcp23xxx_pin_to_code(config):
76
- var = cg.new_Pvariable(config[CONF_ID])
77
- parent = await cg.get_variable(config[CONF_MCP23XXX])
79
+ parent_id: ID = config[CONF_MCP23XXX]
80
+ parent = await cg.get_variable(parent_id)
78
81
 
82
+ num_pins = cg.TemplateArguments(CORE.data[CONF_MCP23XXX][parent_id.id])
83
+
84
+ var = cg.new_Pvariable(config[CONF_ID], num_pins)
79
85
  cg.add(var.set_parent(parent))
80
86
 
81
87
  num = config[CONF_NUMBER]
@@ -1,24 +1,27 @@
1
1
  #include "mcp23xxx_base.h"
2
+ #include "esphome/core/helpers.h"
2
3
  #include "esphome/core/log.h"
3
4
 
4
5
  namespace esphome {
5
6
  namespace mcp23xxx_base {
6
7
 
7
- float MCP23XXXBase::get_setup_priority() const { return setup_priority::IO; }
8
-
9
- void MCP23XXXGPIOPin::setup() {
10
- pin_mode(flags_);
8
+ template<uint8_t N> void MCP23XXXGPIOPin<N>::setup() {
9
+ this->pin_mode(flags_);
11
10
  this->parent_->pin_interrupt_mode(this->pin_, this->interrupt_mode_);
12
11
  }
13
-
14
- void MCP23XXXGPIOPin::pin_mode(gpio::Flags flags) { this->parent_->pin_mode(this->pin_, flags); }
15
- bool MCP23XXXGPIOPin::digital_read() { return this->parent_->digital_read(this->pin_) != this->inverted_; }
16
- void MCP23XXXGPIOPin::digital_write(bool value) { this->parent_->digital_write(this->pin_, value != this->inverted_); }
17
- std::string MCP23XXXGPIOPin::dump_summary() const {
18
- char buffer[32];
19
- snprintf(buffer, sizeof(buffer), "%u via MCP23XXX", pin_);
20
- return buffer;
12
+ template<uint8_t N> void MCP23XXXGPIOPin<N>::pin_mode(gpio::Flags flags) { this->parent_->pin_mode(this->pin_, flags); }
13
+ template<uint8_t N> bool MCP23XXXGPIOPin<N>::digital_read() {
14
+ return this->parent_->digital_read(this->pin_) != this->inverted_;
15
+ }
16
+ template<uint8_t N> void MCP23XXXGPIOPin<N>::digital_write(bool value) {
17
+ this->parent_->digital_write(this->pin_, value != this->inverted_);
21
18
  }
19
+ template<uint8_t N> std::string MCP23XXXGPIOPin<N>::dump_summary() const {
20
+ return str_snprintf("%u via MCP23XXX", 15, pin_);
21
+ }
22
+
23
+ template class MCP23XXXGPIOPin<8>;
24
+ template class MCP23XXXGPIOPin<16>;
22
25
 
23
26
  } // namespace mcp23xxx_base
24
27
  } // namespace esphome
@@ -1,5 +1,6 @@
1
1
  #pragma once
2
2
 
3
+ #include "esphome/components/gpio_expander/cached_gpio.h"
3
4
  #include "esphome/core/component.h"
4
5
  #include "esphome/core/hal.h"
5
6
 
@@ -8,15 +9,15 @@ namespace mcp23xxx_base {
8
9
 
9
10
  enum MCP23XXXInterruptMode : uint8_t { MCP23XXX_NO_INTERRUPT = 0, MCP23XXX_CHANGE, MCP23XXX_RISING, MCP23XXX_FALLING };
10
11
 
11
- class MCP23XXXBase : public Component {
12
+ template<uint8_t N> class MCP23XXXBase : public Component, public gpio_expander::CachedGpioExpander<uint8_t, N> {
12
13
  public:
13
- virtual bool digital_read(uint8_t pin);
14
- virtual void digital_write(uint8_t pin, bool value);
15
14
  virtual void pin_mode(uint8_t pin, gpio::Flags flags);
16
15
  virtual void pin_interrupt_mode(uint8_t pin, MCP23XXXInterruptMode interrupt_mode);
17
16
 
18
17
  void set_open_drain_ints(const bool value) { this->open_drain_ints_ = value; }
19
- float get_setup_priority() const override;
18
+ float get_setup_priority() const override { return setup_priority::IO; }
19
+
20
+ void loop() override { this->reset_pin_cache_(); }
20
21
 
21
22
  protected:
22
23
  // read a given register
@@ -29,7 +30,7 @@ class MCP23XXXBase : public Component {
29
30
  bool open_drain_ints_;
30
31
  };
31
32
 
32
- class MCP23XXXGPIOPin : public GPIOPin {
33
+ template<uint8_t N> class MCP23XXXGPIOPin : public GPIOPin {
33
34
  public:
34
35
  void setup() override;
35
36
  void pin_mode(gpio::Flags flags) override;
@@ -37,7 +38,7 @@ class MCP23XXXGPIOPin : public GPIOPin {
37
38
  void digital_write(bool value) override;
38
39
  std::string dump_summary() const override;
39
40
 
40
- void set_parent(MCP23XXXBase *parent) { parent_ = parent; }
41
+ void set_parent(MCP23XXXBase<N> *parent) { parent_ = parent; }
41
42
  void set_pin(uint8_t pin) { pin_ = pin; }
42
43
  void set_inverted(bool inverted) { inverted_ = inverted; }
43
44
  void set_flags(gpio::Flags flags) { flags_ = flags; }
@@ -46,7 +47,7 @@ class MCP23XXXGPIOPin : public GPIOPin {
46
47
  gpio::Flags get_flags() const override { return this->flags_; }
47
48
 
48
49
  protected:
49
- MCP23XXXBase *parent_;
50
+ MCP23XXXBase<N> *parent_;
50
51
  uint8_t pin_;
51
52
  bool inverted_;
52
53
  gpio::Flags flags_;
@@ -10,10 +10,7 @@ static const char *const TAG = "mcp3008";
10
10
 
11
11
  float MCP3008::get_setup_priority() const { return setup_priority::HARDWARE; }
12
12
 
13
- void MCP3008::setup() {
14
- ESP_LOGCONFIG(TAG, "Running setup");
15
- this->spi_setup();
16
- }
13
+ void MCP3008::setup() { this->spi_setup(); }
17
14
 
18
15
  void MCP3008::dump_config() {
19
16
  ESP_LOGCONFIG(TAG, "MCP3008:");
@@ -8,10 +8,7 @@ static const char *const TAG = "mcp3204";
8
8
 
9
9
  float MCP3204::get_setup_priority() const { return setup_priority::HARDWARE; }
10
10
 
11
- void MCP3204::setup() {
12
- ESP_LOGCONFIG(TAG, "Running setup");
13
- this->spi_setup();
14
- }
11
+ void MCP3204::setup() { this->spi_setup(); }
15
12
 
16
13
  void MCP3204::dump_config() {
17
14
  ESP_LOGCONFIG(TAG, "MCP3204:");
@@ -10,7 +10,6 @@ static const char *const TAG = "mcp4461";
10
10
  constexpr uint8_t EEPROM_WRITE_TIMEOUT_MS = 10;
11
11
 
12
12
  void Mcp4461Component::setup() {
13
- ESP_LOGCONFIG(TAG, "Running setup for address 0x%02X", this->address_);
14
13
  auto err = this->write(nullptr, 0);
15
14
  if (err != i2c::ERROR_OK) {
16
15
  this->error_code_ = MCP4461_STATUS_I2C_ERROR;
@@ -7,7 +7,6 @@ namespace mcp4725 {
7
7
  static const char *const TAG = "mcp4725";
8
8
 
9
9
  void MCP4725::setup() {
10
- ESP_LOGCONFIG(TAG, "Running setup for address 0x%02X", this->address_);
11
10
  auto err = this->write(nullptr, 0);
12
11
  if (err != i2c::ERROR_OK) {
13
12
  this->error_code_ = COMMUNICATION_FAILED;
@@ -9,7 +9,6 @@ namespace mcp4728 {
9
9
  static const char *const TAG = "mcp4728";
10
10
 
11
11
  void MCP4728Component::setup() {
12
- ESP_LOGCONFIG(TAG, "Running setup for address 0x%02X", this->address_);
13
12
  auto err = this->write(nullptr, 0);
14
13
  if (err != i2c::ERROR_OK) {
15
14
  this->mark_failed();
@@ -28,8 +28,6 @@ static const uint8_t MCP9600_REGISTER_ALERT4_LIMIT = 0x13;
28
28
  static const uint8_t MCP9600_REGISTER_DEVICE_ID = 0x20;
29
29
 
30
30
  void MCP9600Component::setup() {
31
- ESP_LOGCONFIG(TAG, "Running setup");
32
-
33
31
  uint16_t dev_id = 0;
34
32
  this->read_byte_16(MCP9600_REGISTER_DEVICE_ID, &dev_id);
35
33
  this->device_id_ = (uint8_t) (dev_id >> 8);
@@ -18,8 +18,6 @@ static const uint8_t MCP9808_AMBIENT_TEMP_NEGATIVE = 0x10;
18
18
  static const char *const TAG = "mcp9808";
19
19
 
20
20
  void MCP9808Sensor::setup() {
21
- ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
22
-
23
21
  uint16_t manu = 0;
24
22
  if (!this->read_byte_16(MCP9808_REG_MANUF_ID, &manu) || manu != MCP9808_MANUF_ID) {
25
23
  this->mark_failed();
@@ -93,6 +93,9 @@ async def to_code(config):
93
93
  var = cg.new_Pvariable(config[CONF_ID])
94
94
  await cg.register_component(var, config)
95
95
 
96
+ if config[CONF_SERVICES]:
97
+ cg.add_define("USE_MDNS_EXTRA_SERVICES")
98
+
96
99
  for service in config[CONF_SERVICES]:
97
100
  txt = [
98
101
  cg.StructInitializer(
@@ -104,7 +104,9 @@ void MDNSComponent::compile_records_() {
104
104
  }
105
105
  #endif
106
106
 
107
+ #ifdef USE_MDNS_EXTRA_SERVICES
107
108
  this->services_.insert(this->services_.end(), this->services_extra_.begin(), this->services_extra_.end());
109
+ #endif
108
110
 
109
111
  if (this->services_.empty()) {
110
112
  // Publish "http" service if not using native API
@@ -35,14 +35,18 @@ class MDNSComponent : public Component {
35
35
  #endif
36
36
  float get_setup_priority() const override { return setup_priority::AFTER_CONNECTION; }
37
37
 
38
+ #ifdef USE_MDNS_EXTRA_SERVICES
38
39
  void add_extra_service(MDNSService service) { services_extra_.push_back(std::move(service)); }
40
+ #endif
39
41
 
40
42
  std::vector<MDNSService> get_services();
41
43
 
42
44
  void on_shutdown() override;
43
45
 
44
46
  protected:
47
+ #ifdef USE_MDNS_EXTRA_SERVICES
45
48
  std::vector<MDNSService> services_extra_{};
49
+ #endif
46
50
  std::vector<MDNSService> services_{};
47
51
  std::string hostname_;
48
52
  void compile_records_();
@@ -7,6 +7,8 @@ from esphome.const import (
7
7
  CONF_ID,
8
8
  CONF_ON_IDLE,
9
9
  CONF_ON_STATE,
10
+ CONF_ON_TURN_OFF,
11
+ CONF_ON_TURN_ON,
10
12
  CONF_TRIGGER_ID,
11
13
  CONF_VOLUME,
12
14
  )
@@ -58,6 +60,12 @@ VolumeDownAction = media_player_ns.class_(
58
60
  VolumeSetAction = media_player_ns.class_(
59
61
  "VolumeSetAction", automation.Action, cg.Parented.template(MediaPlayer)
60
62
  )
63
+ TurnOnAction = media_player_ns.class_(
64
+ "TurnOnAction", automation.Action, cg.Parented.template(MediaPlayer)
65
+ )
66
+ TurnOffAction = media_player_ns.class_(
67
+ "TurnOffAction", automation.Action, cg.Parented.template(MediaPlayer)
68
+ )
61
69
 
62
70
  CONF_ANNOUNCEMENT = "announcement"
63
71
  CONF_ON_PLAY = "on_play"
@@ -72,12 +80,16 @@ PauseTrigger = media_player_ns.class_("PauseTrigger", automation.Trigger.templat
72
80
  AnnoucementTrigger = media_player_ns.class_(
73
81
  "AnnouncementTrigger", automation.Trigger.template()
74
82
  )
83
+ OnTrigger = media_player_ns.class_("OnTrigger", automation.Trigger.template())
84
+ OffTrigger = media_player_ns.class_("OffTrigger", automation.Trigger.template())
75
85
  IsIdleCondition = media_player_ns.class_("IsIdleCondition", automation.Condition)
76
86
  IsPausedCondition = media_player_ns.class_("IsPausedCondition", automation.Condition)
77
87
  IsPlayingCondition = media_player_ns.class_("IsPlayingCondition", automation.Condition)
78
88
  IsAnnouncingCondition = media_player_ns.class_(
79
89
  "IsAnnouncingCondition", automation.Condition
80
90
  )
91
+ IsOnCondition = media_player_ns.class_("IsOnCondition", automation.Condition)
92
+ IsOffCondition = media_player_ns.class_("IsOffCondition", automation.Condition)
81
93
 
82
94
 
83
95
  async def setup_media_player_core_(var, config):
@@ -97,6 +109,12 @@ async def setup_media_player_core_(var, config):
97
109
  for conf in config.get(CONF_ON_ANNOUNCEMENT, []):
98
110
  trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
99
111
  await automation.build_automation(trigger, [], conf)
112
+ for conf in config.get(CONF_ON_TURN_ON, []):
113
+ trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
114
+ await automation.build_automation(trigger, [], conf)
115
+ for conf in config.get(CONF_ON_TURN_OFF, []):
116
+ trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
117
+ await automation.build_automation(trigger, [], conf)
100
118
 
101
119
 
102
120
  async def register_media_player(var, config):
@@ -140,6 +158,16 @@ _MEDIA_PLAYER_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(
140
158
  cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(AnnoucementTrigger),
141
159
  }
142
160
  ),
161
+ cv.Optional(CONF_ON_TURN_ON): automation.validate_automation(
162
+ {
163
+ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(OnTrigger),
164
+ }
165
+ ),
166
+ cv.Optional(CONF_ON_TURN_OFF): automation.validate_automation(
167
+ {
168
+ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(OffTrigger),
169
+ }
170
+ ),
143
171
  }
144
172
  )
145
173
 
@@ -218,6 +246,12 @@ async def media_player_play_media_action(config, action_id, template_arg, args):
218
246
  @automation.register_action(
219
247
  "media_player.volume_down", VolumeDownAction, MEDIA_PLAYER_ACTION_SCHEMA
220
248
  )
249
+ @automation.register_action(
250
+ "media_player.turn_on", TurnOnAction, MEDIA_PLAYER_ACTION_SCHEMA
251
+ )
252
+ @automation.register_action(
253
+ "media_player.turn_off", TurnOffAction, MEDIA_PLAYER_ACTION_SCHEMA
254
+ )
221
255
  async def media_player_action(config, action_id, template_arg, args):
222
256
  var = cg.new_Pvariable(action_id, template_arg)
223
257
  await cg.register_parented(var, config[CONF_ID])
@@ -238,6 +272,12 @@ async def media_player_action(config, action_id, template_arg, args):
238
272
  @automation.register_condition(
239
273
  "media_player.is_announcing", IsAnnouncingCondition, MEDIA_PLAYER_CONDITION_SCHEMA
240
274
  )
275
+ @automation.register_condition(
276
+ "media_player.is_on", IsOnCondition, MEDIA_PLAYER_CONDITION_SCHEMA
277
+ )
278
+ @automation.register_condition(
279
+ "media_player.is_off", IsOffCondition, MEDIA_PLAYER_CONDITION_SCHEMA
280
+ )
241
281
  async def media_player_condition(config, action_id, template_arg, args):
242
282
  var = cg.new_Pvariable(action_id, template_arg)
243
283
  await cg.register_parented(var, config[CONF_ID])
@@ -28,6 +28,10 @@ template<typename... Ts>
28
28
  using VolumeUpAction = MediaPlayerCommandAction<MediaPlayerCommand::MEDIA_PLAYER_COMMAND_VOLUME_UP, Ts...>;
29
29
  template<typename... Ts>
30
30
  using VolumeDownAction = MediaPlayerCommandAction<MediaPlayerCommand::MEDIA_PLAYER_COMMAND_VOLUME_DOWN, Ts...>;
31
+ template<typename... Ts>
32
+ using TurnOnAction = MediaPlayerCommandAction<MediaPlayerCommand::MEDIA_PLAYER_COMMAND_TURN_ON, Ts...>;
33
+ template<typename... Ts>
34
+ using TurnOffAction = MediaPlayerCommandAction<MediaPlayerCommand::MEDIA_PLAYER_COMMAND_TURN_OFF, Ts...>;
31
35
 
32
36
  template<typename... Ts> class PlayMediaAction : public Action<Ts...>, public Parented<MediaPlayer> {
33
37
  TEMPLATABLE_VALUE(std::string, media_url)
@@ -66,6 +70,8 @@ using IdleTrigger = MediaPlayerStateTrigger<MediaPlayerState::MEDIA_PLAYER_STATE
66
70
  using PlayTrigger = MediaPlayerStateTrigger<MediaPlayerState::MEDIA_PLAYER_STATE_PLAYING>;
67
71
  using PauseTrigger = MediaPlayerStateTrigger<MediaPlayerState::MEDIA_PLAYER_STATE_PAUSED>;
68
72
  using AnnouncementTrigger = MediaPlayerStateTrigger<MediaPlayerState::MEDIA_PLAYER_STATE_ANNOUNCING>;
73
+ using OnTrigger = MediaPlayerStateTrigger<MediaPlayerState::MEDIA_PLAYER_STATE_ON>;
74
+ using OffTrigger = MediaPlayerStateTrigger<MediaPlayerState::MEDIA_PLAYER_STATE_OFF>;
69
75
 
70
76
  template<typename... Ts> class IsIdleCondition : public Condition<Ts...>, public Parented<MediaPlayer> {
71
77
  public:
@@ -87,5 +93,15 @@ template<typename... Ts> class IsAnnouncingCondition : public Condition<Ts...>,
87
93
  bool check(Ts... x) override { return this->parent_->state == MediaPlayerState::MEDIA_PLAYER_STATE_ANNOUNCING; }
88
94
  };
89
95
 
96
+ template<typename... Ts> class IsOnCondition : public Condition<Ts...>, public Parented<MediaPlayer> {
97
+ public:
98
+ bool check(Ts... x) override { return this->parent_->state == MediaPlayerState::MEDIA_PLAYER_STATE_ON; }
99
+ };
100
+
101
+ template<typename... Ts> class IsOffCondition : public Condition<Ts...>, public Parented<MediaPlayer> {
102
+ public:
103
+ bool check(Ts... x) override { return this->parent_->state == MediaPlayerState::MEDIA_PLAYER_STATE_OFF; }
104
+ };
105
+
90
106
  } // namespace media_player
91
107
  } // namespace esphome
@@ -9,6 +9,10 @@ static const char *const TAG = "media_player";
9
9
 
10
10
  const char *media_player_state_to_string(MediaPlayerState state) {
11
11
  switch (state) {
12
+ case MEDIA_PLAYER_STATE_ON:
13
+ return "ON";
14
+ case MEDIA_PLAYER_STATE_OFF:
15
+ return "OFF";
12
16
  case MEDIA_PLAYER_STATE_IDLE:
13
17
  return "IDLE";
14
18
  case MEDIA_PLAYER_STATE_PLAYING:
@@ -18,6 +22,7 @@ const char *media_player_state_to_string(MediaPlayerState state) {
18
22
  case MEDIA_PLAYER_STATE_ANNOUNCING:
19
23
  return "ANNOUNCING";
20
24
  case MEDIA_PLAYER_STATE_NONE:
25
+ return "NONE";
21
26
  default:
22
27
  return "UNKNOWN";
23
28
  }
@@ -49,6 +54,10 @@ const char *media_player_command_to_string(MediaPlayerCommand command) {
49
54
  return "REPEAT_OFF";
50
55
  case MEDIA_PLAYER_COMMAND_CLEAR_PLAYLIST:
51
56
  return "CLEAR_PLAYLIST";
57
+ case MEDIA_PLAYER_COMMAND_TURN_ON:
58
+ return "TURN_ON";
59
+ case MEDIA_PLAYER_COMMAND_TURN_OFF:
60
+ return "TURN_OFF";
52
61
  default:
53
62
  return "UNKNOWN";
54
63
  }
@@ -110,6 +119,10 @@ MediaPlayerCall &MediaPlayerCall::set_command(const std::string &command) {
110
119
  this->set_command(MEDIA_PLAYER_COMMAND_UNMUTE);
111
120
  } else if (str_equals_case_insensitive(command, "TOGGLE")) {
112
121
  this->set_command(MEDIA_PLAYER_COMMAND_TOGGLE);
122
+ } else if (str_equals_case_insensitive(command, "TURN_ON")) {
123
+ this->set_command(MEDIA_PLAYER_COMMAND_TURN_ON);
124
+ } else if (str_equals_case_insensitive(command, "TURN_OFF")) {
125
+ this->set_command(MEDIA_PLAYER_COMMAND_TURN_OFF);
113
126
  } else {
114
127
  ESP_LOGW(TAG, "'%s' - Unrecognized command %s", this->parent_->get_name().c_str(), command.c_str());
115
128
  }
@@ -6,12 +6,40 @@
6
6
  namespace esphome {
7
7
  namespace media_player {
8
8
 
9
+ enum MediaPlayerEntityFeature : uint32_t {
10
+ PAUSE = 1 << 0,
11
+ SEEK = 1 << 1,
12
+ VOLUME_SET = 1 << 2,
13
+ VOLUME_MUTE = 1 << 3,
14
+ PREVIOUS_TRACK = 1 << 4,
15
+ NEXT_TRACK = 1 << 5,
16
+
17
+ TURN_ON = 1 << 7,
18
+ TURN_OFF = 1 << 8,
19
+ PLAY_MEDIA = 1 << 9,
20
+ VOLUME_STEP = 1 << 10,
21
+ SELECT_SOURCE = 1 << 11,
22
+ STOP = 1 << 12,
23
+ CLEAR_PLAYLIST = 1 << 13,
24
+ PLAY = 1 << 14,
25
+ SHUFFLE_SET = 1 << 15,
26
+ SELECT_SOUND_MODE = 1 << 16,
27
+ BROWSE_MEDIA = 1 << 17,
28
+ REPEAT_SET = 1 << 18,
29
+ GROUPING = 1 << 19,
30
+ MEDIA_ANNOUNCE = 1 << 20,
31
+ MEDIA_ENQUEUE = 1 << 21,
32
+ SEARCH_MEDIA = 1 << 22,
33
+ };
34
+
9
35
  enum MediaPlayerState : uint8_t {
10
36
  MEDIA_PLAYER_STATE_NONE = 0,
11
37
  MEDIA_PLAYER_STATE_IDLE = 1,
12
38
  MEDIA_PLAYER_STATE_PLAYING = 2,
13
39
  MEDIA_PLAYER_STATE_PAUSED = 3,
14
- MEDIA_PLAYER_STATE_ANNOUNCING = 4
40
+ MEDIA_PLAYER_STATE_ANNOUNCING = 4,
41
+ MEDIA_PLAYER_STATE_OFF = 5,
42
+ MEDIA_PLAYER_STATE_ON = 6,
15
43
  };
16
44
  const char *media_player_state_to_string(MediaPlayerState state);
17
45
 
@@ -28,6 +56,8 @@ enum MediaPlayerCommand : uint8_t {
28
56
  MEDIA_PLAYER_COMMAND_REPEAT_ONE = 9,
29
57
  MEDIA_PLAYER_COMMAND_REPEAT_OFF = 10,
30
58
  MEDIA_PLAYER_COMMAND_CLEAR_PLAYLIST = 11,
59
+ MEDIA_PLAYER_COMMAND_TURN_ON = 12,
60
+ MEDIA_PLAYER_COMMAND_TURN_OFF = 13,
31
61
  };
32
62
  const char *media_player_command_to_string(MediaPlayerCommand command);
33
63
 
@@ -51,14 +81,31 @@ class MediaPlayerTraits {
51
81
  MediaPlayerTraits() = default;
52
82
 
53
83
  void set_supports_pause(bool supports_pause) { this->supports_pause_ = supports_pause; }
54
-
55
84
  bool get_supports_pause() const { return this->supports_pause_; }
56
85
 
86
+ void set_supports_turn_off_on(bool supports_turn_off_on) { this->supports_turn_off_on_ = supports_turn_off_on; }
87
+ bool get_supports_turn_off_on() const { return this->supports_turn_off_on_; }
88
+
57
89
  std::vector<MediaPlayerSupportedFormat> &get_supported_formats() { return this->supported_formats_; }
58
90
 
91
+ uint32_t get_feature_flags() const {
92
+ uint32_t flags = 0;
93
+ flags |= MediaPlayerEntityFeature::PLAY_MEDIA | MediaPlayerEntityFeature::BROWSE_MEDIA |
94
+ MediaPlayerEntityFeature::STOP | MediaPlayerEntityFeature::VOLUME_SET |
95
+ MediaPlayerEntityFeature::VOLUME_MUTE | MediaPlayerEntityFeature::MEDIA_ANNOUNCE;
96
+ if (this->get_supports_pause()) {
97
+ flags |= MediaPlayerEntityFeature::PAUSE | MediaPlayerEntityFeature::PLAY;
98
+ }
99
+ if (this->get_supports_turn_off_on()) {
100
+ flags |= MediaPlayerEntityFeature::TURN_OFF | MediaPlayerEntityFeature::TURN_ON;
101
+ }
102
+ return flags;
103
+ }
104
+
59
105
  protected:
60
- bool supports_pause_{false};
61
106
  std::vector<MediaPlayerSupportedFormat> supported_formats_{};
107
+ bool supports_pause_{false};
108
+ bool supports_turn_off_on_{false};
62
109
  };
63
110
 
64
111
  class MediaPlayerCall {