esphome 2025.6.2__py3-none-any.whl → 2025.7.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +42 -20
  22. esphome/components/api/api_connection.cpp +318 -391
  23. esphome/components/api/api_connection.h +206 -126
  24. esphome/components/api/api_frame_helper.cpp +89 -124
  25. esphome/components/api/api_frame_helper.h +57 -45
  26. esphome/components/api/api_pb2.cpp +414 -4350
  27. esphome/components/api/api_pb2.h +287 -198
  28. esphome/components/api/api_pb2_dump.cpp +4333 -0
  29. esphome/components/api/api_pb2_service.cpp +180 -425
  30. esphome/components/api/api_pb2_service.h +7 -6
  31. esphome/components/api/api_pb2_size.h +2 -4
  32. esphome/components/api/api_server.cpp +138 -167
  33. esphome/components/api/api_server.h +66 -12
  34. esphome/components/api/client.py +10 -4
  35. esphome/components/api/list_entities.cpp +36 -105
  36. esphome/components/api/list_entities.h +31 -23
  37. esphome/components/api/proto.h +26 -3
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/as5600/as5600.h +0 -1
  41. esphome/components/async_tcp/__init__.py +14 -5
  42. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  43. esphome/components/atm90e32/atm90e32.cpp +2 -1
  44. esphome/components/audio/audio_decoder.cpp +1 -1
  45. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  46. esphome/components/b_parasite/b_parasite.h +0 -1
  47. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  48. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  49. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  50. esphome/components/bh1750/bh1750.cpp +5 -5
  51. esphome/components/binary_sensor/__init__.py +82 -5
  52. esphome/components/binary_sensor/automation.h +19 -1
  53. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  54. esphome/components/binary_sensor/binary_sensor.h +11 -25
  55. esphome/components/binary_sensor/filter.cpp +29 -24
  56. esphome/components/binary_sensor/filter.h +20 -10
  57. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  58. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  60. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  62. esphome/components/ble_client/switch/ble_switch.h +0 -1
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  65. esphome/components/ble_presence/ble_presence_device.h +0 -1
  66. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  67. esphome/components/ble_scanner/ble_scanner.h +0 -1
  68. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  69. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  71. esphome/components/bme680/sensor.py +1 -1
  72. esphome/components/bmp581/bmp581.h +0 -2
  73. esphome/components/button/__init__.py +5 -2
  74. esphome/components/camera/__init__.py +1 -0
  75. esphome/components/camera/camera.cpp +22 -0
  76. esphome/components/camera/camera.h +80 -0
  77. esphome/components/canbus/__init__.py +1 -0
  78. esphome/components/cap1188/cap1188.h +0 -1
  79. esphome/components/captive_portal/__init__.py +12 -2
  80. esphome/components/captive_portal/captive_portal.cpp +12 -2
  81. esphome/components/captive_portal/captive_portal.h +5 -2
  82. esphome/components/ccs811/ccs811.h +0 -2
  83. esphome/components/climate/__init__.py +5 -2
  84. esphome/components/cm1106/sensor.py +2 -2
  85. esphome/components/const/__init__.py +2 -0
  86. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  87. esphome/components/copy/button/copy_button.h +0 -1
  88. esphome/components/copy/cover/copy_cover.h +0 -1
  89. esphome/components/copy/fan/copy_fan.h +0 -1
  90. esphome/components/copy/lock/copy_lock.h +0 -1
  91. esphome/components/copy/number/copy_number.h +0 -1
  92. esphome/components/copy/select/copy_select.h +0 -1
  93. esphome/components/copy/sensor/copy_sensor.h +0 -1
  94. esphome/components/copy/switch/copy_switch.h +0 -1
  95. esphome/components/copy/text/copy_text.h +0 -1
  96. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  97. esphome/components/cover/__init__.py +5 -2
  98. esphome/components/cs5460a/cs5460a.h +0 -1
  99. esphome/components/datetime/__init__.py +4 -2
  100. esphome/components/debug/__init__.py +20 -0
  101. esphome/components/deep_sleep/__init__.py +43 -9
  102. esphome/components/demo/__init__.py +2 -2
  103. esphome/components/display/display.cpp +4 -3
  104. esphome/components/display/display.h +0 -2
  105. esphome/components/display/display_buffer.cpp +1 -1
  106. esphome/components/ds2484/__init__.py +1 -0
  107. esphome/components/ds2484/ds2484.cpp +209 -0
  108. esphome/components/ds2484/ds2484.h +43 -0
  109. esphome/components/ds2484/one_wire.py +37 -0
  110. esphome/components/duty_time/duty_time_sensor.h +0 -1
  111. esphome/components/ens160_base/ens160_base.h +0 -1
  112. esphome/components/es7210/es7210.h +0 -1
  113. esphome/components/es7243e/es7243e.h +0 -1
  114. esphome/components/es8156/es8156.h +0 -1
  115. esphome/components/es8311/es8311.h +0 -1
  116. esphome/components/es8388/es8388.h +0 -1
  117. esphome/components/esp32/__init__.py +102 -135
  118. esphome/components/esp32/core.cpp +0 -4
  119. esphome/components/esp32/gpio.h +1 -1
  120. esphome/components/esp32/helpers.cpp +69 -0
  121. esphome/components/esp32_ble/ble.cpp +5 -6
  122. esphome/components/esp32_ble/ble.h +29 -14
  123. esphome/components/esp32_ble/ble_event.h +6 -6
  124. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  125. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  126. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  127. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  128. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  129. esphome/components/esp32_camera/__init__.py +111 -97
  130. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  131. esphome/components/esp32_camera/esp32_camera.h +35 -30
  132. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  133. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  134. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  135. esphome/components/esp32_hall/sensor.py +2 -21
  136. esphome/components/esp32_hosted/__init__.py +101 -0
  137. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  138. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  139. esphome/components/esp32_rmt/__init__.py +0 -58
  140. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  141. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  142. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  143. esphome/components/esp32_touch/esp32_touch.h +174 -28
  144. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  145. esphome/components/esp32_touch/esp32_touch_v1.cpp +238 -0
  146. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  147. esphome/components/esp8266/__init__.py +1 -0
  148. esphome/components/esp8266/gpio.cpp +10 -10
  149. esphome/components/esp8266/helpers.cpp +31 -0
  150. esphome/components/esphome/ota/__init__.py +1 -0
  151. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  152. esphome/components/ethernet/__init__.py +42 -23
  153. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  154. esphome/components/ethernet/ethernet_component.cpp +69 -29
  155. esphome/components/ethernet/ethernet_component.h +18 -10
  156. esphome/components/event/__init__.py +5 -2
  157. esphome/components/ezo/ezo.h +0 -1
  158. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  159. esphome/components/fan/__init__.py +5 -2
  160. esphome/components/feedback/feedback_cover.h +0 -1
  161. esphome/components/font/__init__.py +92 -82
  162. esphome/components/font/font.cpp +9 -2
  163. esphome/components/font/font.h +20 -5
  164. esphome/components/fs3000/fs3000.h +0 -1
  165. esphome/components/gcja5/gcja5.h +0 -1
  166. esphome/components/gl_r01_i2c/__init__.py +0 -0
  167. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  168. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  169. esphome/components/gl_r01_i2c/sensor.py +36 -0
  170. esphome/components/gp8403/gp8403.h +0 -1
  171. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  172. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  173. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  174. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  175. esphome/components/he60r/he60r.h +0 -1
  176. esphome/components/heatpumpir/climate.py +2 -1
  177. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  178. esphome/components/heatpumpir/heatpumpir.h +1 -0
  179. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  180. esphome/components/host/__init__.py +2 -1
  181. esphome/components/host/helpers.cpp +57 -0
  182. esphome/components/http_request/__init__.py +19 -1
  183. esphome/components/http_request/http_request.h +1 -1
  184. esphome/components/http_request/http_request_arduino.cpp +0 -1
  185. esphome/components/http_request/http_request_arduino.h +1 -0
  186. esphome/components/http_request/http_request_idf.cpp +0 -1
  187. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  188. esphome/components/http_request/update/http_request_update.cpp +28 -9
  189. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  190. esphome/components/hydreon_rgxx/sensor.py +1 -1
  191. esphome/components/i2c/__init__.py +23 -11
  192. esphome/components/i2c/i2c_bus.h +8 -1
  193. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  194. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  195. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  196. esphome/components/i2c_device/i2c_device.h +0 -1
  197. esphome/components/i2s_audio/__init__.py +2 -10
  198. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  199. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  200. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  201. esphome/components/iaqcore/iaqcore.h +0 -2
  202. esphome/components/image/__init__.py +123 -24
  203. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  204. esphome/components/ina219/ina219.cpp +7 -0
  205. esphome/components/ina219/ina219.h +1 -0
  206. esphome/components/ina260/ina260.h +0 -2
  207. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  208. esphome/components/inkplate6/display.py +15 -0
  209. esphome/components/inkplate6/inkplate.cpp +2 -2
  210. esphome/components/integration/integration_sensor.h +0 -1
  211. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  212. esphome/components/internal_temperature/sensor.py +0 -26
  213. esphome/components/interval/interval.h +0 -2
  214. esphome/components/ld2410/button/__init__.py +3 -3
  215. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  216. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  217. esphome/components/ld2410/ld2410.cpp +430 -261
  218. esphome/components/ld2410/ld2410.h +44 -146
  219. esphome/components/ld2410/number/__init__.py +2 -2
  220. esphome/components/ld2410/sensor.py +1 -1
  221. esphome/components/ld2410/switch/__init__.py +1 -1
  222. esphome/components/ld2420/ld2420.cpp +196 -100
  223. esphome/components/ld2420/ld2420.h +46 -118
  224. esphome/components/ld2420/number/__init__.py +2 -2
  225. esphome/components/ld2420/sensor/__init__.py +6 -2
  226. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  227. esphome/components/ld2450/button/__init__.py +3 -3
  228. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  229. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  230. esphome/components/ld2450/ld2450.cpp +384 -232
  231. esphome/components/ld2450/ld2450.h +60 -69
  232. esphome/components/ld2450/switch/__init__.py +1 -1
  233. esphome/components/ledc/ledc_output.cpp +1 -63
  234. esphome/components/libretiny/__init__.py +4 -3
  235. esphome/components/libretiny/const.py +5 -0
  236. esphome/components/libretiny/generate_components.py +1 -0
  237. esphome/components/libretiny/helpers.cpp +35 -0
  238. esphome/components/libretiny/lt_component.cpp +5 -3
  239. esphome/components/light/__init__.py +4 -2
  240. esphome/components/light/addressable_light.h +3 -3
  241. esphome/components/light/light_call.cpp +180 -243
  242. esphome/components/light/light_call.h +72 -20
  243. esphome/components/light/light_color_values.h +14 -14
  244. esphome/components/light/light_state.h +15 -13
  245. esphome/components/light/transformers.h +2 -2
  246. esphome/components/ln882x/__init__.py +52 -0
  247. esphome/components/ln882x/boards.py +285 -0
  248. esphome/components/lock/__init__.py +5 -2
  249. esphome/components/logger/__init__.py +40 -3
  250. esphome/components/logger/logger.cpp +47 -12
  251. esphome/components/logger/logger.h +80 -49
  252. esphome/components/logger/logger_esp32.cpp +3 -3
  253. esphome/components/lps22/__init__.py +0 -0
  254. esphome/components/lps22/lps22.cpp +75 -0
  255. esphome/components/lps22/lps22.h +27 -0
  256. esphome/components/lps22/sensor.py +58 -0
  257. esphome/components/ltr390/ltr390.h +0 -1
  258. esphome/components/ltr501/ltr501.h +0 -1
  259. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  260. esphome/components/lvgl/__init__.py +1 -1
  261. esphome/components/lvgl/schemas.py +66 -6
  262. esphome/components/lvgl/styles.py +24 -16
  263. esphome/components/lvgl/widgets/__init__.py +12 -2
  264. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  265. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  266. esphome/components/max9611/max9611.h +0 -1
  267. esphome/components/mcp23016/__init__.py +1 -1
  268. esphome/components/mcp23xxx_base/__init__.py +1 -1
  269. esphome/components/mcp4461/__init__.py +1 -1
  270. esphome/components/mcp4461/output/__init__.py +3 -2
  271. esphome/components/mcp9600/mcp9600.h +0 -2
  272. esphome/components/md5/md5.cpp +3 -3
  273. esphome/components/md5/md5.h +1 -6
  274. esphome/components/mdns/__init__.py +22 -11
  275. esphome/components/media_player/__init__.py +4 -3
  276. esphome/components/micro_wake_word/__init__.py +1 -5
  277. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  278. esphome/components/microphone/microphone.cpp +7 -9
  279. esphome/components/microphone/microphone.h +0 -2
  280. esphome/components/mipi_spi/display.py +1 -0
  281. esphome/components/mmc5603/mmc5603.cpp +1 -1
  282. esphome/components/modbus/modbus.cpp +33 -15
  283. esphome/components/modbus/modbus.h +9 -0
  284. esphome/components/modbus_controller/__init__.py +42 -10
  285. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  286. esphome/components/modbus_controller/modbus_controller.h +61 -7
  287. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  288. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  289. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  290. esphome/components/mqtt/__init__.py +16 -0
  291. esphome/components/mqtt/mqtt_backend.h +2 -1
  292. esphome/components/mqtt/mqtt_backend_esp32.cpp +126 -45
  293. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  294. esphome/components/mqtt/mqtt_client.cpp +15 -9
  295. esphome/components/mqtt/mqtt_client.h +8 -3
  296. esphome/components/ms8607/ms8607.h +0 -1
  297. esphome/components/neopixelbus/light.py +4 -1
  298. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  299. esphome/components/network/__init__.py +4 -1
  300. esphome/components/network/ip_address.h +1 -0
  301. esphome/components/nextion/__init__.py +16 -0
  302. esphome/components/nextion/base_component.py +1 -0
  303. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  304. esphome/components/nextion/display.py +14 -4
  305. esphome/components/nextion/nextion.cpp +166 -101
  306. esphome/components/nextion/nextion.h +84 -53
  307. esphome/components/nextion/nextion_commands.cpp +11 -10
  308. esphome/components/nextion/nextion_component.cpp +28 -28
  309. esphome/components/nextion/nextion_component.h +53 -18
  310. esphome/components/nextion/nextion_component_base.h +3 -0
  311. esphome/components/nextion/nextion_upload.cpp +36 -0
  312. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  313. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  314. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  315. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  316. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  317. esphome/components/nfc/nfc.cpp +3 -22
  318. esphome/components/nfc/nfc.h +3 -3
  319. esphome/components/number/__init__.py +5 -2
  320. esphome/components/online_image/__init__.py +5 -0
  321. esphome/components/online_image/online_image.cpp +6 -2
  322. esphome/components/online_image/online_image.h +4 -1
  323. esphome/components/opentherm/opentherm.cpp +7 -12
  324. esphome/components/openthread/__init__.py +47 -40
  325. esphome/components/openthread/const.py +1 -0
  326. esphome/components/openthread/openthread_esp.cpp +27 -5
  327. esphome/components/opt3001/__init__.py +0 -0
  328. esphome/components/opt3001/opt3001.cpp +122 -0
  329. esphome/components/opt3001/opt3001.h +27 -0
  330. esphome/components/opt3001/sensor.py +35 -0
  331. esphome/components/ota/__init__.py +17 -0
  332. esphome/components/ota/ota_backend.h +27 -1
  333. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  334. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  336. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  338. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  339. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  340. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  341. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  342. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  343. esphome/components/packages/__init__.py +5 -2
  344. esphome/components/packet_transport/binary_sensor.py +61 -4
  345. esphome/components/packet_transport/packet_transport.cpp +31 -1
  346. esphome/components/packet_transport/packet_transport.h +11 -5
  347. esphome/components/pcf8574/__init__.py +1 -1
  348. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  349. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  350. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  351. esphome/components/pmsa003i/pmsa003i.h +0 -1
  352. esphome/components/pmsx003/pmsx003.h +0 -1
  353. esphome/components/pn7150/pn7150.cpp +7 -7
  354. esphome/components/pn7150/pn7150.h +0 -1
  355. esphome/components/pn7160/pn7160.cpp +7 -7
  356. esphome/components/pn7160/pn7160.h +0 -1
  357. esphome/components/preferences/syncer.h +2 -0
  358. esphome/components/prometheus/prometheus_handler.h +1 -1
  359. esphome/components/psram/psram.cpp +0 -20
  360. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  361. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  362. esphome/components/pulse_width/pulse_width.h +0 -1
  363. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  364. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  365. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  366. esphome/components/qr_code/__init__.py +13 -10
  367. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  368. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  369. esphome/components/rc522/rc522.h +0 -1
  370. esphome/components/rdm6300/rdm6300.h +0 -2
  371. esphome/components/remote_base/__init__.py +7 -5
  372. esphome/components/remote_base/remote_base.cpp +24 -21
  373. esphome/components/remote_base/remote_base.h +3 -26
  374. esphome/components/remote_receiver/__init__.py +40 -46
  375. esphome/components/remote_receiver/remote_receiver.h +4 -18
  376. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  377. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  378. esphome/components/remote_transmitter/__init__.py +42 -43
  379. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  380. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  381. esphome/components/resistance/resistance_sensor.h +0 -1
  382. esphome/components/rp2040/__init__.py +1 -0
  383. esphome/components/rp2040/helpers.cpp +55 -0
  384. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  385. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  386. esphome/components/rtttl/__init__.py +4 -4
  387. esphome/components/rtttl/rtttl.cpp +10 -1
  388. esphome/components/ruuvitag/ruuvitag.h +0 -1
  389. esphome/components/safe_mode/safe_mode.cpp +2 -0
  390. esphome/components/safe_mode/safe_mode.h +4 -1
  391. esphome/components/scd30/scd30.h +0 -1
  392. esphome/components/scd30/sensor.py +2 -2
  393. esphome/components/scd4x/scd4x.cpp +61 -54
  394. esphome/components/scd4x/scd4x.h +17 -15
  395. esphome/components/scd4x/sensor.py +4 -4
  396. esphome/components/script/script.h +0 -2
  397. esphome/components/sdp3x/sensor.py +1 -1
  398. esphome/components/select/__init__.py +5 -2
  399. esphome/components/sen5x/sen5x.h +0 -1
  400. esphome/components/senseair/senseair.h +0 -1
  401. esphome/components/sensor/__init__.py +4 -2
  402. esphome/components/sensor/filter.cpp +1 -1
  403. esphome/components/sensor/sensor.cpp +12 -6
  404. esphome/components/sensor/sensor.h +13 -5
  405. esphome/components/servo/servo.h +0 -1
  406. esphome/components/sfa30/sfa30.h +0 -1
  407. esphome/components/sgp30/sgp30.h +0 -1
  408. esphome/components/sgp4x/sgp4x.h +0 -1
  409. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  410. esphome/components/sht4x/sht4x.h +0 -1
  411. esphome/components/sm300d2/sm300d2.h +0 -2
  412. esphome/components/smt100/sensor.py +8 -4
  413. esphome/components/smt100/smt100.cpp +5 -5
  414. esphome/components/smt100/smt100.h +3 -3
  415. esphome/components/sn74hc595/__init__.py +1 -1
  416. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  417. esphome/components/sntp/sntp_component.cpp +9 -3
  418. esphome/components/sntp/time.py +2 -0
  419. esphome/components/socket/__init__.py +17 -0
  420. esphome/components/spi/__init__.py +27 -6
  421. esphome/components/spi/spi.cpp +3 -2
  422. esphome/components/spi/spi.h +9 -3
  423. esphome/components/spi/spi_arduino.cpp +3 -5
  424. esphome/components/spi/spi_esp_idf.cpp +40 -21
  425. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  426. esphome/components/sps30/sps30.h +0 -1
  427. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  428. esphome/components/st7701s/st7701s.cpp +0 -4
  429. esphome/components/status/status_binary_sensor.h +0 -2
  430. esphome/components/substitutions/__init__.py +76 -19
  431. esphome/components/substitutions/jinja.py +99 -0
  432. esphome/components/sun/sun.cpp +3 -4
  433. esphome/components/switch/__init__.py +5 -2
  434. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  435. esphome/components/sx126x/__init__.py +317 -0
  436. esphome/components/sx126x/automation.h +62 -0
  437. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  438. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  439. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  440. esphome/components/sx126x/sx126x.cpp +523 -0
  441. esphome/components/sx126x/sx126x.h +140 -0
  442. esphome/components/sx126x/sx126x_reg.h +163 -0
  443. esphome/components/sx127x/__init__.py +325 -0
  444. esphome/components/sx127x/automation.h +62 -0
  445. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  446. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  447. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  448. esphome/components/sx127x/sx127x.cpp +498 -0
  449. esphome/components/sx127x/sx127x.h +128 -0
  450. esphome/components/sx127x/sx127x_reg.h +295 -0
  451. esphome/components/syslog/esphome_syslog.cpp +5 -3
  452. esphome/components/syslog/esphome_syslog.h +1 -1
  453. esphome/components/tca9555/__init__.py +1 -1
  454. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  455. esphome/components/text/__init__.py +5 -2
  456. esphome/components/text_sensor/__init__.py +5 -2
  457. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  458. esphome/components/thermostat/thermostat_climate.h +43 -39
  459. esphome/components/time/__init__.py +16 -2
  460. esphome/components/time/real_time_clock.cpp +4 -0
  461. esphome/components/time/real_time_clock.h +5 -1
  462. esphome/components/tlc5971/tlc5971.cpp +4 -1
  463. esphome/components/tmp1075/tmp1075.h +0 -2
  464. esphome/components/tof10120/tof10120_sensor.h +0 -1
  465. esphome/components/tormatic/tormatic_cover.h +0 -1
  466. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  467. esphome/components/tsl2591/tsl2591.cpp +1 -1
  468. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  469. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  470. esphome/components/tx20/tx20.cpp +2 -2
  471. esphome/components/uart/__init__.py +18 -0
  472. esphome/components/uart/uart_component_esp_idf.cpp +1 -5
  473. esphome/components/update/__init__.py +5 -2
  474. esphome/components/update/update_entity.h +8 -0
  475. esphome/components/usb_host/__init__.py +5 -2
  476. esphome/components/valve/__init__.py +5 -2
  477. esphome/components/vbus/vbus.h +0 -1
  478. esphome/components/veml3235/veml3235.h +0 -1
  479. esphome/components/veml7700/veml7700.h +0 -1
  480. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  481. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  482. esphome/components/watchdog/watchdog.cpp +0 -4
  483. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  484. esphome/components/web_server/__init__.py +34 -19
  485. esphome/components/web_server/ota/__init__.py +32 -0
  486. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  487. esphome/components/web_server/ota/ota_web_server.h +26 -0
  488. esphome/components/web_server/web_server.cpp +311 -430
  489. esphome/components/web_server/web_server.h +33 -23
  490. esphome/components/web_server/web_server_v1.cpp +4 -5
  491. esphome/components/web_server_base/__init__.py +5 -2
  492. esphome/components/web_server_base/web_server_base.cpp +2 -94
  493. esphome/components/web_server_base/web_server_base.h +5 -25
  494. esphome/components/web_server_idf/multipart.cpp +254 -0
  495. esphome/components/web_server_idf/multipart.h +86 -0
  496. esphome/components/web_server_idf/utils.cpp +32 -0
  497. esphome/components/web_server_idf/utils.h +10 -0
  498. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  499. esphome/components/web_server_idf/web_server_idf.h +11 -10
  500. esphome/components/wiegand/wiegand.cpp +2 -2
  501. esphome/components/wifi/__init__.py +18 -0
  502. esphome/components/wifi/wifi_component.cpp +17 -22
  503. esphome/components/wifi/wifi_component.h +27 -23
  504. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  505. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  506. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  507. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  508. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  509. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  510. esphome/components/wireguard/__init__.py +2 -11
  511. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  512. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  513. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  514. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  515. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  516. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  517. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  518. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  519. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  520. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  521. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  522. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  523. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  524. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  525. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  526. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  527. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  528. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  529. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  530. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  531. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  532. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  533. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  534. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  535. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  536. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  537. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  538. esphome/components/zyaura/zyaura.h +0 -1
  539. esphome/config.py +88 -22
  540. esphome/config_helpers.py +74 -1
  541. esphome/config_validation.py +12 -1
  542. esphome/const.py +65 -10
  543. esphome/core/__init__.py +18 -2
  544. esphome/core/application.cpp +163 -10
  545. esphome/core/application.h +145 -165
  546. esphome/core/area.h +19 -0
  547. esphome/core/automation.h +58 -9
  548. esphome/core/color.cpp +3 -5
  549. esphome/core/color.h +16 -16
  550. esphome/core/component.cpp +151 -18
  551. esphome/core/component.h +98 -4
  552. esphome/core/component_iterator.cpp +7 -7
  553. esphome/core/component_iterator.h +9 -7
  554. esphome/core/config.py +155 -6
  555. esphome/core/controller.cpp +4 -2
  556. esphome/core/controller.h +1 -1
  557. esphome/core/datatypes.h +2 -2
  558. esphome/core/defines.h +17 -2
  559. esphome/core/device.h +20 -0
  560. esphome/core/entity_base.cpp +20 -15
  561. esphome/core/entity_base.h +76 -0
  562. esphome/core/entity_helpers.py +162 -1
  563. esphome/core/event_pool.h +81 -0
  564. esphome/core/helpers.cpp +75 -230
  565. esphome/core/helpers.h +164 -104
  566. esphome/core/lock_free_queue.h +151 -0
  567. esphome/core/log.cpp +2 -2
  568. esphome/core/log.h +2 -0
  569. esphome/core/optional.h +5 -0
  570. esphome/core/ring_buffer.cpp +2 -2
  571. esphome/core/scheduler.cpp +278 -103
  572. esphome/core/scheduler.h +157 -17
  573. esphome/core/time.cpp +5 -5
  574. esphome/core/time.h +5 -5
  575. esphome/cpp_generator.py +17 -0
  576. esphome/cpp_helpers.py +0 -22
  577. esphome/cpp_types.py +3 -1
  578. esphome/dashboard/entries.py +1 -1
  579. esphome/dashboard/util/text.py +5 -21
  580. esphome/dashboard/web_server.py +9 -1
  581. esphome/helpers.py +47 -0
  582. esphome/loader.py +15 -1
  583. esphome/pins.py +14 -8
  584. esphome/wizard.py +16 -3
  585. esphome/writer.py +21 -3
  586. esphome/yaml_util.py +0 -2
  587. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
  588. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +593 -533
  589. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  590. esphome/components/esp32_ble/queue.h +0 -85
  591. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  592. esphome/components/esp32_hall/esp32_hall.h +0 -23
  593. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  594. esphome/components/ld2410/button/reset_button.cpp +0 -9
  595. esphome/components/ld2450/button/reset_button.cpp +0 -9
  596. esphome/components/openthread/tlv.py +0 -65
  597. /esphome/{dashboard/enum.py → enum.py} +0 -0
  598. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/WHEEL +0 -0
  599. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  600. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
  601. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,58 @@
1
+ import esphome.codegen as cg
2
+ import esphome.config_validation as cv
3
+ from esphome.components import i2c, sensor
4
+ from esphome.const import (
5
+ CONF_ID,
6
+ CONF_TEMPERATURE,
7
+ CONF_PRESSURE,
8
+ STATE_CLASS_MEASUREMENT,
9
+ UNIT_CELSIUS,
10
+ UNIT_HECTOPASCAL,
11
+ ICON_THERMOMETER,
12
+ DEVICE_CLASS_TEMPERATURE,
13
+ DEVICE_CLASS_PRESSURE,
14
+ )
15
+
16
+ CODEOWNERS = ["@nagisa"]
17
+ DEPENDENCIES = ["i2c"]
18
+
19
+ lps22 = cg.esphome_ns.namespace("lps22")
20
+
21
+ LPS22Component = lps22.class_("LPS22Component", cg.PollingComponent, i2c.I2CDevice)
22
+
23
+ CONFIG_SCHEMA = (
24
+ cv.Schema(
25
+ {
26
+ cv.GenerateID(): cv.declare_id(LPS22Component),
27
+ cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
28
+ unit_of_measurement=UNIT_CELSIUS,
29
+ icon=ICON_THERMOMETER,
30
+ accuracy_decimals=2,
31
+ device_class=DEVICE_CLASS_TEMPERATURE,
32
+ state_class=STATE_CLASS_MEASUREMENT,
33
+ ),
34
+ cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
35
+ unit_of_measurement=UNIT_HECTOPASCAL,
36
+ accuracy_decimals=2,
37
+ device_class=DEVICE_CLASS_PRESSURE,
38
+ state_class=STATE_CLASS_MEASUREMENT,
39
+ ),
40
+ }
41
+ )
42
+ .extend(cv.polling_component_schema("60s"))
43
+ .extend(i2c.i2c_device_schema(0x5D)) # can also be 0x5C
44
+ )
45
+
46
+
47
+ async def to_code(config):
48
+ var = cg.new_Pvariable(config[CONF_ID])
49
+ await cg.register_component(var, config)
50
+ await i2c.register_i2c_device(var, config)
51
+
52
+ if temperature_config := config.get(CONF_TEMPERATURE):
53
+ sens = await sensor.new_sensor(temperature_config)
54
+ cg.add(var.set_temperature_sensor(sens))
55
+
56
+ if pressure_config := config.get(CONF_PRESSURE):
57
+ sens = await sensor.new_sensor(pressure_config)
58
+ cg.add(var.set_pressure_sensor(sens))
@@ -44,7 +44,6 @@ enum LTR390RESOLUTION {
44
44
 
45
45
  class LTR390Component : public PollingComponent, public i2c::I2CDevice {
46
46
  public:
47
- float get_setup_priority() const override { return setup_priority::DATA; }
48
47
  void setup() override;
49
48
  void dump_config() override;
50
49
  void update() override;
@@ -25,7 +25,6 @@ class LTRAlsPs501Component : public PollingComponent, public i2c::I2CDevice {
25
25
  //
26
26
  // EspHome framework functions
27
27
  //
28
- float get_setup_priority() const override { return setup_priority::DATA; }
29
28
  void setup() override;
30
29
  void dump_config() override;
31
30
  void update() override;
@@ -25,7 +25,6 @@ class LTRAlsPsComponent : public PollingComponent, public i2c::I2CDevice {
25
25
  //
26
26
  // EspHome framework functions
27
27
  //
28
- float get_setup_priority() const override { return setup_priority::DATA; }
29
28
  void setup() override;
30
29
  void dump_config() override;
31
30
  void update() override;
@@ -466,7 +466,7 @@ LVGL_SCHEMA = cv.All(
466
466
  ): lvalid.lv_color,
467
467
  cv.Optional(df.CONF_THEME): cv.Schema(
468
468
  {
469
- cv.Optional(name): obj_schema(w)
469
+ cv.Optional(name): obj_schema(w).extend(FULL_STYLE_SCHEMA)
470
470
  for name, w in WIDGET_TYPES.items()
471
471
  }
472
472
  ),
@@ -21,7 +21,7 @@ from esphome.core.config import StartupTrigger
21
21
  from esphome.schema_extractors import SCHEMA_EXTRACT
22
22
 
23
23
  from . import defines as df, lv_validation as lvalid
24
- from .defines import CONF_TIME_FORMAT, LV_GRAD_DIR
24
+ from .defines import CONF_TIME_FORMAT, LV_GRAD_DIR, TYPE_GRID
25
25
  from .helpers import add_lv_use, requires_component, validate_printf
26
26
  from .lv_validation import lv_color, lv_font, lv_gradient, lv_image, opacity
27
27
  from .lvcode import LvglComponent, lv_event_t_ptr
@@ -349,7 +349,60 @@ def obj_schema(widget_type: WidgetType):
349
349
  )
350
350
 
351
351
 
352
+ def _validate_grid_layout(config):
353
+ layout = config[df.CONF_LAYOUT]
354
+ rows = len(layout[df.CONF_GRID_ROWS])
355
+ columns = len(layout[df.CONF_GRID_COLUMNS])
356
+ used_cells = [[None] * columns for _ in range(rows)]
357
+ for index, widget in enumerate(config[df.CONF_WIDGETS]):
358
+ _, w = next(iter(widget.items()))
359
+ if (df.CONF_GRID_CELL_COLUMN_POS in w) != (df.CONF_GRID_CELL_ROW_POS in w):
360
+ # pylint: disable=raise-missing-from
361
+ raise cv.Invalid(
362
+ "Both row and column positions must be specified, or both omitted",
363
+ [df.CONF_WIDGETS, index],
364
+ )
365
+ if df.CONF_GRID_CELL_ROW_POS in w:
366
+ row = w[df.CONF_GRID_CELL_ROW_POS]
367
+ column = w[df.CONF_GRID_CELL_COLUMN_POS]
368
+ else:
369
+ try:
370
+ row, column = next(
371
+ (r_idx, c_idx)
372
+ for r_idx, row in enumerate(used_cells)
373
+ for c_idx, value in enumerate(row)
374
+ if value is None
375
+ )
376
+ except StopIteration:
377
+ # pylint: disable=raise-missing-from
378
+ raise cv.Invalid(
379
+ "No free cells available in grid layout", [df.CONF_WIDGETS, index]
380
+ )
381
+ w[df.CONF_GRID_CELL_ROW_POS] = row
382
+ w[df.CONF_GRID_CELL_COLUMN_POS] = column
383
+
384
+ for i in range(w[df.CONF_GRID_CELL_ROW_SPAN]):
385
+ for j in range(w[df.CONF_GRID_CELL_COLUMN_SPAN]):
386
+ if row + i >= rows or column + j >= columns:
387
+ # pylint: disable=raise-missing-from
388
+ raise cv.Invalid(
389
+ f"Cell at {row}/{column} span {w[df.CONF_GRID_CELL_ROW_SPAN]}x{w[df.CONF_GRID_CELL_COLUMN_SPAN]} "
390
+ f"exceeds grid size {rows}x{columns}",
391
+ [df.CONF_WIDGETS, index],
392
+ )
393
+ if used_cells[row + i][column + j] is not None:
394
+ # pylint: disable=raise-missing-from
395
+ raise cv.Invalid(
396
+ f"Cell span {row + i}/{column + j} already occupied by widget at index {used_cells[row + i][column + j]}",
397
+ [df.CONF_WIDGETS, index],
398
+ )
399
+ used_cells[row + i][column + j] = index
400
+
401
+ return config
402
+
403
+
352
404
  LAYOUT_SCHEMAS = {}
405
+ LAYOUT_VALIDATORS = {TYPE_GRID: _validate_grid_layout}
353
406
 
354
407
  ALIGN_TO_SCHEMA = {
355
408
  cv.Optional(df.CONF_ALIGN_TO): cv.Schema(
@@ -402,8 +455,8 @@ LAYOUT_SCHEMA = {
402
455
  }
403
456
 
404
457
  GRID_CELL_SCHEMA = {
405
- cv.Required(df.CONF_GRID_CELL_ROW_POS): cv.positive_int,
406
- cv.Required(df.CONF_GRID_CELL_COLUMN_POS): cv.positive_int,
458
+ cv.Optional(df.CONF_GRID_CELL_ROW_POS): cv.positive_int,
459
+ cv.Optional(df.CONF_GRID_CELL_COLUMN_POS): cv.positive_int,
407
460
  cv.Optional(df.CONF_GRID_CELL_ROW_SPAN, default=1): cv.positive_int,
408
461
  cv.Optional(df.CONF_GRID_CELL_COLUMN_SPAN, default=1): cv.positive_int,
409
462
  cv.Optional(df.CONF_GRID_CELL_X_ALIGN): grid_alignments,
@@ -454,9 +507,13 @@ def container_validator(schema, widget_type: WidgetType):
454
507
  """
455
508
 
456
509
  def validator(value):
457
- result = schema
458
510
  if w_sch := widget_type.schema:
459
- result = result.extend(w_sch)
511
+ if isinstance(w_sch, dict):
512
+ w_sch = cv.Schema(w_sch)
513
+ # order is important here to preserve extras
514
+ result = w_sch.extend(schema)
515
+ else:
516
+ result = schema
460
517
  ltype = df.TYPE_NONE
461
518
  if value and (layout := value.get(df.CONF_LAYOUT)):
462
519
  if not isinstance(layout, dict):
@@ -470,7 +527,10 @@ def container_validator(schema, widget_type: WidgetType):
470
527
  result = result.extend(
471
528
  LAYOUT_SCHEMAS.get(ltype.lower(), LAYOUT_SCHEMAS[df.TYPE_NONE])
472
529
  )
473
- return result(value)
530
+ value = result(value)
531
+ if layout_validator := LAYOUT_VALIDATORS.get(ltype):
532
+ value = layout_validator(value)
533
+ return value
474
534
 
475
535
  return validator
476
536
 
@@ -3,7 +3,6 @@ import esphome.codegen as cg
3
3
  import esphome.config_validation as cv
4
4
  from esphome.const import CONF_ID
5
5
  from esphome.core import ID
6
- from esphome.cpp_generator import MockObj
7
6
 
8
7
  from .defines import (
9
8
  CONF_STYLE_DEFINITIONS,
@@ -13,12 +12,13 @@ from .defines import (
13
12
  literal,
14
13
  )
15
14
  from .helpers import add_lv_use
16
- from .lvcode import LambdaContext, LocalVariable, lv, lv_assign, lv_variable
15
+ from .lvcode import LambdaContext, LocalVariable, lv
17
16
  from .schemas import ALL_STYLES, FULL_STYLE_SCHEMA, STYLE_REMAP
18
- from .types import ObjUpdateAction, lv_lambda_t, lv_obj_t, lv_obj_t_ptr, lv_style_t
17
+ from .types import ObjUpdateAction, lv_obj_t, lv_style_t
19
18
  from .widgets import (
20
19
  Widget,
21
20
  add_widgets,
21
+ collect_parts,
22
22
  set_obj_properties,
23
23
  theme_widget_map,
24
24
  wait_for_widgets,
@@ -37,12 +37,18 @@ async def style_set(svar, style):
37
37
  lv.call(f"style_set_{remapped_prop}", svar, literal(value))
38
38
 
39
39
 
40
+ async def create_style(style, id_name):
41
+ style_id = ID(id_name, True, lv_style_t)
42
+ svar = cg.new_Pvariable(style_id)
43
+ lv.style_init(svar)
44
+ await style_set(svar, style)
45
+ return svar
46
+
47
+
40
48
  async def styles_to_code(config):
41
49
  """Convert styles to C__ code."""
42
50
  for style in config.get(CONF_STYLE_DEFINITIONS, ()):
43
- svar = cg.new_Pvariable(style[CONF_ID])
44
- lv.style_init(svar)
45
- await style_set(svar, style)
51
+ await create_style(style, style[CONF_ID].id)
46
52
 
47
53
 
48
54
  @automation.register_action(
@@ -68,16 +74,18 @@ async def theme_to_code(config):
68
74
  if theme := config.get(CONF_THEME):
69
75
  add_lv_use(CONF_THEME)
70
76
  for w_name, style in theme.items():
71
- if not isinstance(style, dict):
72
- continue
73
-
74
- lname = "lv_theme_apply_" + w_name
75
- apply = lv_variable(lv_lambda_t, lname)
76
- theme_widget_map[w_name] = apply
77
- ow = Widget.create("obj", MockObj(ID("obj")), obj_spec)
78
- async with LambdaContext([(lv_obj_t_ptr, "obj")], where=w_name) as context:
79
- await set_obj_properties(ow, style)
80
- lv_assign(apply, await context.get_lambda())
77
+ # Work around Python 3.10 bug with nested async comprehensions
78
+ # With Python 3.11 this could be simplified
79
+ styles = {}
80
+ for part, states in collect_parts(style).items():
81
+ styles[part] = {
82
+ state: await create_style(
83
+ props,
84
+ "_lv_theme_style_" + w_name + "_" + part + "_" + state,
85
+ )
86
+ for state, props in states.items()
87
+ }
88
+ theme_widget_map[w_name] = styles
81
89
 
82
90
 
83
91
  async def add_top_layer(lv_component, config):
@@ -6,7 +6,7 @@ from esphome.config_validation import Invalid
6
6
  from esphome.const import CONF_DEFAULT, CONF_GROUP, CONF_ID, CONF_STATE, CONF_TYPE
7
7
  from esphome.core import ID, TimePeriod
8
8
  from esphome.coroutine import FakeAwaitable
9
- from esphome.cpp_generator import CallExpression, MockObj
9
+ from esphome.cpp_generator import MockObj
10
10
 
11
11
  from ..defines import (
12
12
  CONF_FLEX_ALIGN_CROSS,
@@ -453,7 +453,17 @@ async def widget_to_code(w_cnfig, w_type: WidgetType, parent):
453
453
 
454
454
  w = Widget.create(wid, var, spec, w_cnfig)
455
455
  if theme := theme_widget_map.get(w_type):
456
- lv_add(CallExpression(theme, w.obj))
456
+ for part, states in theme.items():
457
+ part = "LV_PART_" + part.upper()
458
+ for state, style in states.items():
459
+ state = "LV_STATE_" + state.upper()
460
+ if state == "LV_STATE_DEFAULT":
461
+ lv_state = literal(part)
462
+ elif part == "LV_PART_MAIN":
463
+ lv_state = literal(state)
464
+ else:
465
+ lv_state = join_enums((state, part))
466
+ lv.obj_add_style(w.obj, style, lv_state)
457
467
  await set_obj_properties(w, w_cnfig)
458
468
  await add_widgets(w, w_cnfig)
459
469
  await spec.to_code(w, w_cnfig)
@@ -1,8 +1,15 @@
1
1
  import esphome.config_validation as cv
2
2
  from esphome.const import CONF_MAX_VALUE, CONF_MIN_VALUE, CONF_MODE, CONF_VALUE
3
3
 
4
- from ..defines import BAR_MODES, CONF_ANIMATED, CONF_INDICATOR, CONF_MAIN, literal
5
- from ..lv_validation import animated, get_start_value, lv_float
4
+ from ..defines import (
5
+ BAR_MODES,
6
+ CONF_ANIMATED,
7
+ CONF_INDICATOR,
8
+ CONF_MAIN,
9
+ CONF_START_VALUE,
10
+ literal,
11
+ )
12
+ from ..lv_validation import animated, lv_int
6
13
  from ..lvcode import lv
7
14
  from ..types import LvNumber, NumberType
8
15
  from . import Widget
@@ -10,22 +17,30 @@ from . import Widget
10
17
  # Note this file cannot be called "bar.py" because that name is disallowed.
11
18
 
12
19
  CONF_BAR = "bar"
13
- BAR_MODIFY_SCHEMA = cv.Schema(
14
- {
15
- cv.Optional(CONF_VALUE): lv_float,
16
- cv.Optional(CONF_ANIMATED, default=True): animated,
17
- }
18
- )
20
+
21
+
22
+ def validate_bar(config):
23
+ if config.get(CONF_MODE) != "LV_BAR_MODE_RANGE" and CONF_START_VALUE in config:
24
+ raise cv.Invalid(
25
+ f"{CONF_START_VALUE} is only allowed when {CONF_MODE} is set to 'RANGE'"
26
+ )
27
+ if (CONF_MIN_VALUE in config) != (CONF_MAX_VALUE in config):
28
+ raise cv.Invalid(
29
+ f"If either {CONF_MIN_VALUE} or {CONF_MAX_VALUE} is set, both must be set"
30
+ )
31
+ return config
32
+
19
33
 
20
34
  BAR_SCHEMA = cv.Schema(
21
35
  {
22
- cv.Optional(CONF_VALUE): lv_float,
23
- cv.Optional(CONF_MIN_VALUE, default=0): cv.int_,
24
- cv.Optional(CONF_MAX_VALUE, default=100): cv.int_,
25
- cv.Optional(CONF_MODE, default="NORMAL"): BAR_MODES.one_of,
36
+ cv.Optional(CONF_VALUE): lv_int,
37
+ cv.Optional(CONF_START_VALUE): lv_int,
38
+ cv.Optional(CONF_MIN_VALUE): lv_int,
39
+ cv.Optional(CONF_MAX_VALUE): lv_int,
40
+ cv.Optional(CONF_MODE): BAR_MODES.one_of,
26
41
  cv.Optional(CONF_ANIMATED, default=True): animated,
27
42
  }
28
- )
43
+ ).add_extra(validate_bar)
29
44
 
30
45
 
31
46
  class BarType(NumberType):
@@ -35,17 +50,23 @@ class BarType(NumberType):
35
50
  LvNumber("lv_bar_t"),
36
51
  parts=(CONF_MAIN, CONF_INDICATOR),
37
52
  schema=BAR_SCHEMA,
38
- modify_schema=BAR_MODIFY_SCHEMA,
39
53
  )
40
54
 
41
55
  async def to_code(self, w: Widget, config):
42
56
  var = w.obj
57
+ if mode := config.get(CONF_MODE):
58
+ lv.bar_set_mode(var, literal(mode))
59
+ is_animated = literal(config[CONF_ANIMATED])
43
60
  if CONF_MIN_VALUE in config:
44
- lv.bar_set_range(var, config[CONF_MIN_VALUE], config[CONF_MAX_VALUE])
45
- lv.bar_set_mode(var, literal(config[CONF_MODE]))
46
- value = await get_start_value(config)
47
- if value is not None:
48
- lv.bar_set_value(var, value, literal(config[CONF_ANIMATED]))
61
+ lv.bar_set_range(
62
+ var,
63
+ await lv_int.process(config[CONF_MIN_VALUE]),
64
+ await lv_int.process(config[CONF_MAX_VALUE]),
65
+ )
66
+ if value := await lv_int.process(config.get(CONF_VALUE)):
67
+ lv.bar_set_value(var, value, is_animated)
68
+ if start_value := await lv_int.process(config.get(CONF_START_VALUE)):
69
+ lv.bar_set_start_value(var, start_value, is_animated)
49
70
 
50
71
  @property
51
72
  def animated(self):
@@ -8,7 +8,7 @@ namespace m5stack_8angle {
8
8
  static const char *const TAG = "m5stack_8angle.light";
9
9
 
10
10
  void M5Stack8AngleLightOutput::setup() {
11
- ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
11
+ RAMAllocator<uint8_t> allocator;
12
12
  this->buf_ = allocator.allocate(M5STACK_8ANGLE_NUM_LEDS * M5STACK_8ANGLE_BYTES_PER_LED);
13
13
  if (this->buf_ == nullptr) {
14
14
  ESP_LOGE(TAG, "Failed to allocate buffer of size %u", M5STACK_8ANGLE_NUM_LEDS * M5STACK_8ANGLE_BYTES_PER_LED);
@@ -38,7 +38,6 @@ class MAX9611Component : public PollingComponent, public i2c::I2CDevice {
38
38
  public:
39
39
  void setup() override;
40
40
  void dump_config() override;
41
- float get_setup_priority() const override { return setup_priority::DATA; }
42
41
  void update() override;
43
42
  void set_voltage_sensor(sensor::Sensor *vs) { voltage_sensor_ = vs; }
44
43
  void set_current_sensor(sensor::Sensor *cs) { current_sensor_ = cs; }
@@ -50,7 +50,7 @@ MCP23016_PIN_SCHEMA = pins.gpio_base_schema(
50
50
  cv.int_range(min=0, max=15),
51
51
  modes=[CONF_INPUT, CONF_OUTPUT],
52
52
  mode_validator=validate_mode,
53
- invertable=True,
53
+ invertible=True,
54
54
  ).extend(
55
55
  {
56
56
  cv.Required(CONF_MCP23016): cv.use_id(MCP23016),
@@ -60,7 +60,7 @@ MCP23XXX_PIN_SCHEMA = pins.gpio_base_schema(
60
60
  cv.int_range(min=0, max=15),
61
61
  modes=[CONF_INPUT, CONF_OUTPUT, CONF_PULLUP],
62
62
  mode_validator=validate_mode,
63
- invertable=True,
63
+ invertible=True,
64
64
  ).extend(
65
65
  {
66
66
  cv.Required(CONF_MCP23XXX): cv.use_id(MCP23XXXBase),
@@ -1,6 +1,6 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import i2c
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import CONF_ID
5
5
 
6
6
  CODEOWNERS = ["@p1ngb4ck"]
@@ -1,8 +1,9 @@
1
1
  import esphome.codegen as cg
2
- import esphome.config_validation as cv
3
2
  from esphome.components import output
3
+ import esphome.config_validation as cv
4
4
  from esphome.const import CONF_CHANNEL, CONF_ID, CONF_INITIAL_VALUE
5
- from .. import Mcp4461Component, CONF_MCP4461_ID, mcp4461_ns
5
+
6
+ from .. import CONF_MCP4461_ID, Mcp4461Component, mcp4461_ns
6
7
 
7
8
  DEPENDENCIES = ["mcp4461"]
8
9
 
@@ -24,8 +24,6 @@ class MCP9600Component : public PollingComponent, public i2c::I2CDevice {
24
24
  void dump_config() override;
25
25
  void update() override;
26
26
 
27
- float get_setup_priority() const override { return setup_priority::DATA; }
28
-
29
27
  void set_hot_junction(sensor::Sensor *hot_junction) { this->hot_junction_sensor_ = hot_junction; }
30
28
  void set_cold_junction(sensor::Sensor *cold_junction) { this->cold_junction_sensor_ = cold_junction; }
31
29
  void set_thermocouple_type(MCP9600ThermocoupleType thermocouple_type) {
@@ -7,7 +7,7 @@
7
7
  namespace esphome {
8
8
  namespace md5 {
9
9
 
10
- #if defined(USE_ARDUINO) && !defined(USE_RP2040)
10
+ #if defined(USE_ARDUINO) && !defined(USE_RP2040) && !defined(USE_ESP32)
11
11
  void MD5Digest::init() {
12
12
  memset(this->digest_, 0, 16);
13
13
  MD5Init(&this->ctx_);
@@ -18,7 +18,7 @@ void MD5Digest::add(const uint8_t *data, size_t len) { MD5Update(&this->ctx_, da
18
18
  void MD5Digest::calculate() { MD5Final(this->digest_, &this->ctx_); }
19
19
  #endif // USE_ARDUINO && !USE_RP2040
20
20
 
21
- #ifdef USE_ESP_IDF
21
+ #ifdef USE_ESP32
22
22
  void MD5Digest::init() {
23
23
  memset(this->digest_, 0, 16);
24
24
  esp_rom_md5_init(&this->ctx_);
@@ -27,7 +27,7 @@ void MD5Digest::init() {
27
27
  void MD5Digest::add(const uint8_t *data, size_t len) { esp_rom_md5_update(&this->ctx_, data, len); }
28
28
 
29
29
  void MD5Digest::calculate() { esp_rom_md5_final(this->digest_, &this->ctx_); }
30
- #endif // USE_ESP_IDF
30
+ #endif // USE_ESP32
31
31
 
32
32
  #ifdef USE_RP2040
33
33
  void MD5Digest::init() {
@@ -3,16 +3,11 @@
3
3
  #include "esphome/core/defines.h"
4
4
  #ifdef USE_MD5
5
5
 
6
- #ifdef USE_ESP_IDF
6
+ #ifdef USE_ESP32
7
7
  #include "esp_rom_md5.h"
8
8
  #define MD5_CTX_TYPE md5_context_t
9
9
  #endif
10
10
 
11
- #if defined(USE_ARDUINO) && defined(USE_ESP32)
12
- #include "rom/md5_hash.h"
13
- #define MD5_CTX_TYPE MD5Context
14
- #endif
15
-
16
11
  #if defined(USE_ARDUINO) && defined(USE_ESP8266)
17
12
  #include <md5.h>
18
13
  #define MD5_CTX_TYPE md5_context_t
@@ -1,5 +1,6 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components.esp32 import add_idf_component
3
+ from esphome.config_helpers import filter_source_files_from_platform
3
4
  import esphome.config_validation as cv
4
5
  from esphome.const import (
5
6
  CONF_DISABLED,
@@ -8,8 +9,7 @@ from esphome.const import (
8
9
  CONF_PROTOCOL,
9
10
  CONF_SERVICE,
10
11
  CONF_SERVICES,
11
- KEY_CORE,
12
- KEY_FRAMEWORK_VERSION,
12
+ PlatformFramework,
13
13
  )
14
14
  from esphome.core import CORE, coroutine_with_priority
15
15
 
@@ -85,15 +85,8 @@ async def to_code(config):
85
85
  elif CORE.is_rp2040:
86
86
  cg.add_library("LEAmDNS", None)
87
87
 
88
- if CORE.using_esp_idf and CORE.data[KEY_CORE][KEY_FRAMEWORK_VERSION] >= cv.Version(
89
- 5, 0, 0
90
- ):
91
- add_idf_component(
92
- name="mdns",
93
- repo="https://github.com/espressif/esp-protocols.git",
94
- ref="mdns-v1.8.2",
95
- path="components/mdns",
96
- )
88
+ if CORE.using_esp_idf:
89
+ add_idf_component(name="espressif/mdns", ref="1.8.2")
97
90
 
98
91
  cg.add_define("USE_MDNS")
99
92
 
@@ -117,3 +110,21 @@ async def to_code(config):
117
110
  )
118
111
 
119
112
  cg.add(var.add_extra_service(exp))
113
+
114
+
115
+ FILTER_SOURCE_FILES = filter_source_files_from_platform(
116
+ {
117
+ "mdns_esp32.cpp": {
118
+ PlatformFramework.ESP32_ARDUINO,
119
+ PlatformFramework.ESP32_IDF,
120
+ },
121
+ "mdns_esp8266.cpp": {PlatformFramework.ESP8266_ARDUINO},
122
+ "mdns_host.cpp": {PlatformFramework.HOST_NATIVE},
123
+ "mdns_rp2040.cpp": {PlatformFramework.RP2040_ARDUINO},
124
+ "mdns_libretiny.cpp": {
125
+ PlatformFramework.BK72XX_ARDUINO,
126
+ PlatformFramework.RTL87XX_ARDUINO,
127
+ PlatformFramework.LN882X_ARDUINO,
128
+ },
129
+ }
130
+ )
@@ -11,9 +11,9 @@ from esphome.const import (
11
11
  CONF_VOLUME,
12
12
  )
13
13
  from esphome.core import CORE
14
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
14
15
  from esphome.coroutine import coroutine_with_priority
15
16
  from esphome.cpp_generator import MockObjClass
16
- from esphome.cpp_helpers import setup_entity
17
17
 
18
18
  CODEOWNERS = ["@jesserockz"]
19
19
 
@@ -81,7 +81,7 @@ IsAnnouncingCondition = media_player_ns.class_(
81
81
 
82
82
 
83
83
  async def setup_media_player_core_(var, config):
84
- await setup_entity(var, config)
84
+ await setup_entity(var, config, "media_player")
85
85
  for conf in config.get(CONF_ON_STATE, []):
86
86
  trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
87
87
  await automation.build_automation(trigger, [], conf)
@@ -143,6 +143,8 @@ _MEDIA_PLAYER_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(
143
143
  }
144
144
  )
145
145
 
146
+ _MEDIA_PLAYER_SCHEMA.add_extra(entity_duplicate_validator("media_player"))
147
+
146
148
 
147
149
  def media_player_schema(
148
150
  class_: MockObjClass,
@@ -166,7 +168,6 @@ def media_player_schema(
166
168
  MEDIA_PLAYER_SCHEMA = media_player_schema(MediaPlayer)
167
169
  MEDIA_PLAYER_SCHEMA.add_extra(cv.deprecated_schema_constant("media_player"))
168
170
 
169
-
170
171
  MEDIA_PLAYER_ACTION_SCHEMA = automation.maybe_simple_id(
171
172
  cv.Schema(
172
173
  {
@@ -449,11 +449,7 @@ async def to_code(config):
449
449
  cg.add_define("USE_MICRO_WAKE_WORD")
450
450
  cg.add_define("USE_OTA_STATE_CALLBACK")
451
451
 
452
- esp32.add_idf_component(
453
- name="esp-tflite-micro",
454
- repo="https://github.com/espressif/esp-tflite-micro",
455
- ref="v1.3.3.1",
456
- )
452
+ esp32.add_idf_component(name="espressif/esp-tflite-micro", ref="1.3.3~1")
457
453
 
458
454
  cg.add_build_flag("-DTF_LITE_STATIC_MEMORY")
459
455
  cg.add_build_flag("-DTF_LITE_DISABLE_X86_NEON")
@@ -27,7 +27,7 @@ void VADModel::log_model_config() {
27
27
  }
28
28
 
29
29
  bool StreamingModel::load_model_() {
30
- RAMAllocator<uint8_t> arena_allocator(RAMAllocator<uint8_t>::ALLOW_FAILURE);
30
+ RAMAllocator<uint8_t> arena_allocator;
31
31
 
32
32
  if (this->tensor_arena_ == nullptr) {
33
33
  this->tensor_arena_ = arena_allocator.allocate(this->tensor_arena_size_);
@@ -96,7 +96,7 @@ bool StreamingModel::load_model_() {
96
96
  void StreamingModel::unload_model() {
97
97
  this->interpreter_.reset();
98
98
 
99
- RAMAllocator<uint8_t> arena_allocator(RAMAllocator<uint8_t>::ALLOW_FAILURE);
99
+ RAMAllocator<uint8_t> arena_allocator;
100
100
 
101
101
  if (this->tensor_arena_ != nullptr) {
102
102
  arena_allocator.deallocate(this->tensor_arena_, this->tensor_arena_size_);
@@ -5,17 +5,15 @@ namespace microphone {
5
5
 
6
6
  void Microphone::add_data_callback(std::function<void(const std::vector<uint8_t> &)> &&data_callback) {
7
7
  std::function<void(const std::vector<uint8_t> &)> mute_handled_callback =
8
- [this, data_callback](const std::vector<uint8_t> &data) { data_callback(this->silence_audio_(data)); };
8
+ [this, data_callback](const std::vector<uint8_t> &data) {
9
+ if (this->mute_state_) {
10
+ data_callback(std::vector<uint8_t>(data.size(), 0));
11
+ } else {
12
+ data_callback(data);
13
+ };
14
+ };
9
15
  this->data_callbacks_.add(std::move(mute_handled_callback));
10
16
  }
11
17
 
12
- std::vector<uint8_t> Microphone::silence_audio_(std::vector<uint8_t> data) {
13
- if (this->mute_state_) {
14
- std::memset((void *) data.data(), 0, data.size());
15
- }
16
-
17
- return data;
18
- }
19
-
20
18
  } // namespace microphone
21
19
  } // namespace esphome